上一帖搞定了开发环境,本文介绍驱动两个外设:蜂鸣器和OLED。参考大佬给的文档和代码,我的试验过程如下。
先把外设硬件接好,如下图。OLED屏幕连接到I2C1接口,蜂鸣器连接到GPIO16。
图1、外设接线
一、蜂鸣器PWM驱动。
按照raspberry-pi-pico-python-sdk.pdf的3.8. PWM的介绍,编写以下代码。
# Example using PWM to fade an BEEP.
import time
from machine import Pin, PWM
# Construct PWM object, with BEEP on Pin(16).
pwm = PWM(Pin(16))
# Set the PWM frequency.
pwm.freq(1000)
# Fade the BEEP in and out a few times.
duty = 0
direction = 1
for _ in range(4 * 256):
duty += direction
if duty > 255:
duty = 255
direction = -1
elif duty < 0:
duty = 0
direction = 1
pwm.duty_u16(duty * duty)
time.sleep(0.001)
代码1、蜂鸣器测试
运行代码可以听到蜂鸣器响度逐渐变化。
二、OLED驱动
开始我参照大佬们的文章,想在Thonny的包管理器搜索ssd1306的驱动,并添加,可惜我的网络不给力,能搜到,但是不能安装,我索性不管包管理器了,直接将驱动程序文件《ssd1306.py》另存到PICO板内存里,一样好用。
编写测试程序如下。
from machine import Pin,I2C
from ssd1306 import SSD1306_I2C
import time
i2c=machine.I2C(1, sda=machine.Pin("GP6"), scl=machine.Pin("GP7"), freq=400000)
display = SSD1306_I2C(128, 64, i2c)
display.fill(0)
display.show()
display.text("hello eeworld",5,10)
display.show()
time.sleep(1)
代码2、OLED测试程序
然后就能在屏幕上看到显示结果了。如下图。
图2、OLED测试
由于代码各个大佬都给弄好了,所以基础测试程序基本拿过来就好用。
三、蜂鸣器和OLED显示综合应用
上面通过基础测试程序确认蜂鸣器和OLED显示都没问题,下面做一个这两个外设的综合应用,我要在屏幕上显示小星星,并且用蜂鸣器演奏出来,在演奏同事,LED灯按照节拍闪烁。
具体的代码如下。
from machine import Pin,I2C
from ssd1306 import SSD1306_I2C
from machine import Pin, PWM
import time
led = machine.Pin('LED', machine.Pin.OUT)
i2c=machine.I2C(1, sda=machine.Pin("GP6"), scl=machine.Pin("GP7"), freq=400000)
display = SSD1306_I2C(128, 64, i2c)
display.fill(0)
display.show()
display.text("hello eeworld",5,10)
display.show()
time.sleep(1)
strokes_lib = {
"小":[[[0.48, 0.05], [0.48, 0.98]], [[0.28, 0.96], [0.51, 0.96]], [[0.76, 0.32], [0.99, 0.78]], [[0.21, 0.38], [0.02, 0.76]]],
"星":[[[0.49, 0.49], [0.49, 1.0]], [[0.14, 0.08], [0.87, 0.08], [0.85, 0.45]], [[0.14, 0.25], [0.89, 0.25]], [[0.14, 0.08], [0.14, 0.435], [0.89, 0.42]], [[0.13, 0.62], [0.93, 0.62]], [[0.16, 0.77], [0.89, 0.77]], [[0.02, 0.97], [1.0, 0.97]], [[0.22, 0.54], [0.02, 0.74]]],
}
display.fill(0)
def draw_hz(hz, x0, y0, font_size=16):
for stroke in strokes_lib[hz]:
for i in range(1, len(stroke)):
x1 = x0 + round(stroke[i-1][0] * font_size)
y1 = y0 + round(stroke[i-1][1] * font_size)
x2 = x0 + round(stroke[i][0] * font_size)
y2 = y0 + round(stroke[i][1] * font_size)
display.line(x1, y1, x2, y2, 1)
font_size = 40
(x0, y0) = (0, 0)
for hz in "小星星":
draw_hz(hz, x0, y0, font_size)
x0 += font_size
display.show()
# Construct PWM object, with BEEP on Pin(16).
pwm = PWM(Pin(16))
# 定义音调频率
tones = {'1': 262, '2': 294, '3': 330, '4': 349, '5': 392, '6': 440, '7': 494, '-': 0}
# 定义小星星旋律
melody = "1155665-4433221-5544332-5544332-1155665-4433221"
for tone in melody:
freq = tones[tone]
if freq:
pwm.freq(freq) # 调整PWM的频率,使其发出指定的音调
pwm.duty_u16(10000)
led.on()
else:
pwm.duty_u16(0) # 空拍时一样不上电
led.off()
# 停顿一下 (四四拍每秒两个音,每个音节中间稍微停顿一下)
time.sleep_ms(400)
pwm.duty_u16(0) # 设备占空比为0,即不上电
led.off()
time.sleep_ms(100)
display.fill(0)
display.show()
代码3、综合应用
实际效果如下视频。
视频1、综合应用
参考资料:
https://github.com/LingDong-/chinese-hershey-font