[作品提交] 【得捷电子Follow me第1期】任务2:驱动外设

你家吃的   2023-4-15 21:15 楼主

驱动LED、OLED显示屏、蜂鸣器等外设。

搭配器件:Raspberry Pi Pico w开发板、GROVE SHIELD、GROVE OLED扩展板、GROVE BUZZER扩展板

 


    外设模块如下图

image.png   image.png  

    对于LED的点亮闪烁,在第一篇已经点过了。

    下文主要开始对蜂鸣器和OLED的驱动。




  1. 驱动蜂鸣器

                蜂鸣器的引脚如下图所示,在板子引脚槽里找到匹配的插口,怼进去。

image.png

蜂鸣器的测试代码如下

import machine
import time

led = machine.Pin(26)
pwm1 = machine.PWM(led)

frep1 = 100

pwm1.freq(frep1)
pwm1.duty_u16(32768)

while True:
    frep1 += 100
    pwm1.freq(frep1)
    time.sleep(.5)
    if frep1 > 2400:
        frep1 = 200

效果视频如下

304_1681564269

 

功能实现方法很多,或者手动更改引脚的高低电平,或者使用定时器的中断模拟电平变换的频率。我代码里使用定时器生成了pwm,占空比为50。

没想到还有什么花样可玩,简单感受一下各个频率下的声音。

 

下面是OLED的测试。



  1. OLED 0.96测试

    需要的依赖ssd1306文件导入到pico中

image.png  

代码如下

import machine
import time
import ssd1306
import ufont

led = machine.Pin("LED",machine.Pin.OUT)
i2c1 = machine.I2C(0, sda=machine.Pin("GP8"), scl=machine.Pin("GP9"), freq=400000)

display = ssd1306.SSD1306_I2C(128,64,i2c1)



display.fill(0)
display.fill_rect(0, 0, 32, 32, 1)
display.fill_rect(2, 2, 28, 28, 0)
display.vline(9, 8, 22, 1)
display.vline(16, 2, 22, 1)
display.vline(23, 8, 22, 1)
display.fill_rect(26, 24, 2, 4, 1)
display.text('MicroPython', 40, 0, 1)
display.text('SSD1306', 40, 12, 1)
display.text('OLED 128x64', 40, 24, 1)
display.text('zhangyongqiang!!', 5, 36, 1)



display.show()
while True:
    time.sleep(.5)
    led.on()
    time.sleep(.5)
    led.off()


显示效果如下

image.png

 

    如果要显示汉字,除了自己造一些字库,还可以使用开源的,地址:github   。懒的话也可从我这里下一个
MicroPython-uFont-master.zip (305.95 KB)
(下载次数: 11, 2023-4-21 22:12 上传)
,压缩包里有用例。
 
 

main.py代码如下

import machine
import time
import ssd1306
import ufont

led = machine.Pin("LED",machine.Pin.OUT)
i2c1 = machine.I2C(0, sda=machine.Pin("GP8"), scl=machine.Pin("GP9"), freq=400000)

display = ssd1306.SSD1306_I2C(128,64,i2c1)
f = ufont.BMFont("./unifont-14-12917-16.v3.bmf")


f.text(display, "你好", 0, 0, color=0xf8, show=True)
f.text(display, "helloworld", 0, 14, color=0xf8, show=True)

while True:
    time.sleep(.5)
    led.on()
    time.sleep(.5)
    led.off()


显示效果很喜人

image.png   

micropython的理解,纯白菜鸟,理解错误,请批评,一定改正:

    看官方的github,可以看到,micropython解释环境都是用c语言写,然后编译出来,感觉多少可以使用c语言的逻辑去理解micropython运行逻辑。

    下图高亮所示,当引用类的时候,括号是被引用进来使用的模块,成为本类的子类,而我们使用某个模块,按照类中_  init_函数传入参数,相似于c++方式,有默认参数的可以不传参。

    framebuffer用于保存位图数据,用于显示,其中包含了fill text等成员函数。 image.png image.png    

------------------------------------------------------

像素虽然低,只有亮灭两种表现形式,不过仍然可以显示一些简单的图片,这是抄袭地址,有图片转换地址,还有测试代码

main.py代码

import machine
import time
import ssd1306
import framebuf
import base64
import math

led = machine.Pin("LED",machine.Pin.OUT)
i2c1 = machine.I2C(0, sda=machine.Pin("GP8"), scl=machine.Pin("GP9"), freq=400000)

display = ssd1306.SSD1306_I2C(128,64,i2c1)

showDis=b'gED//////////////////////////////+Af//////////////////gAA//////////////////B//j/////////////////D//+f//////////wAD///H///z//////////wfwB//n///+f/////////5//+A/z////z/////////+///+Ax////+f4f///////v////B/////3wB///////7////8/////8w/P//////+f///+f/8///h/7///////z////n/+H//4/+///////+P///z//h///P/P///////w///5//4f//zwAP///////B//8//+H//+cHgP//////+A//P//////n//w////////AP3//////9///H////////gB///////P//8/////////4///////z///P/////////P//////8///7/////////z///////n//8/////////9///////5//+P/////////f//////+f/+H/////////n///////n//H/////////5///////5//3/////////+f///4//+f/9//////////v////n//n//f/////////7////5//5//3/////////+///+Of//f/9//////////v///AP//3//f/////////7///wD//9//3/////////+///+Af//f/9//////////v///jn//3//f/////////7////5//5//3/////////+f///8f/+f/9//////////n///+P//n//f/////////5///////5//3/////////+f//////+f/8//////////3///////n//D/////////8///////5//+f/////////P//////+f//z/////////7///////n//+/////////8f//////7///v////////gH//////8///z///////4B9///////P//5///////Af/P//////z//4//////+D//5//8///9x/gf/////+P//+f/+H//+cAA//////+P///z//h///n+P///////P///+f/4f//5/7///////n////z/+H//8f+///////7////+f/////D/P//////+////+D/////mDH///////v///4Gf////78D///////5///Afx////8//////////H/4B//P///+f/////////4AAf//4///+P////////////////j//+P////////////////+H/+H/////////////////4D4H//////////////////4Af////////////////////////////////////////////////////'

def custom_to_buff(data):
    width = data[0]
    height = data[1]
    fbuff = framebuf.FrameBuffer(data[2:],width,height, framebuf.MONO_HLSB)
    return fbuff

ziva_image = custom_to_buff(bytearray(base64.b64decode(showDis)))

def show_image(image):
    display.blit(image, 0, 0)
    display.show()

while True:
    display.fill(0)
    show_image(ziva_image )
    time.sleep(.5)
    led.on()
    time.sleep(.5)
    led.off()


显示效果

image.png 项目文件列表如下

image.png  其中图片可以通过此网站(https://www.sojson.com/image/change.html),调整一下分辨率,再通过网址(https://gurgleapps.com/tools/image-to-code)转换出来一个base64编码就可以使用了。

 

第二任务到此结束!!!

 

 

 

本帖最后由 你家吃的 于 2023-4-22 14:25 编辑

回复评论 (4)

奇怪了,帖子已发表,就没机会编辑了,很可惜第一篇已经发了,很好奇你们是怎么不发表而预览效果的呢
点赞  2023-4-22 19:50

micropython解释环境都是用c语言写,然后编译出来,感觉多少可以使用c语言的逻辑去理解micropython运行逻辑,确实方便不少

点赞  2023-4-26 22:27
大佬,字库文件是怎么上传的?麻烦教一下,谢谢了。
点赞  2023-5-9 19:17
引用: lugl4313820 发表于 2023-5-9 19:17 大佬,字库文件是怎么上传的?麻烦教一下,谢谢了。

抱歉抱歉,最近忙其他事情了。这个不难,在本地文件列表文件上右键,选择下载到设备,就可以了。

点赞  2023-5-20 21:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复