【得捷电子Follow me第1期】任务2:驱动外设
[复制链接]
本帖最后由 你家吃的 于 2023-4-22 14:25 编辑
驱动LED、OLED显示屏、蜂鸣器等外设。
搭配器件:Raspberry Pi Pico w开发板、GROVE SHIELD、GROVE OLED扩展板、GROVE BUZZER扩展板
外设模块如下图
对于LED的点亮闪烁,在第一篇已经点过了。
下文主要开始对蜂鸣器和OLED的驱动。
- 驱动蜂鸣器
蜂鸣器的引脚如下图所示,在板子引脚槽里找到匹配的插口,怼进去。
蜂鸣器的测试代码如下
- 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
效果视频如下
播放器加载失败: 未检测到Flash Player,请到 安装
304_1681564269
功能实现方法很多,或者手动更改引脚的高低电平,或者使用定时器的中断模拟电平变换的频率。我代码里使用定时器生成了pwm,占空比为50。
没想到还有什么花样可玩,简单感受一下各个频率下的声音。
下面是OLED的测试。
- OLED 0.96测试
需要的依赖ssd1306文件导入到pico中
代码如下
- 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()
-
-
-
显示效果如下
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()
-
-
-
显示效果很喜人
micropython的理解,纯白菜鸟,理解错误,请批评,一定改正:
看官方的 ,可以看到,micropython解释环境都是用c语言写,然后编译出来,感觉多少可以使用c语言的逻辑去理解micropython运行逻辑。
下图高亮所示,当引用类的时候,括号是被引用进来使用的模块,成为本类的子类,而我们使用某个模块,按照类中_ init_函数传入参数,相似于c++方式,有默认参数的可以不传参。
framebuffer用于保存位图数据,用于显示,其中包含了fill text等成员函数。
------------------------------------------------------
像素虽然低,只有亮灭两种表现形式,不过仍然可以显示一些简单的图片,这是抄袭地址,有图片转换地址,还有测试代码
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()
-
-
-
显示效果
项目文件列表如下
其中图片可以通过此网站(https://www.sojson.com/image/change.html),调整一下分辨率,再通过网址(https://gurgleapps.com/tools/image-to-code)转换出来一个base64编码就可以使用了。
第二任务到此结束!!!
|