[作品提交] 【得捷电子Follow me第1期】002:驱动蜂鸣器和OLED

sipower   2023-5-22 21:37 楼主

上一帖搞定了开发环境,本文介绍驱动两个外设:蜂鸣器和OLED。参考大佬给的文档和代码,我的试验过程如下。

先把外设硬件接好,如下图。OLED屏幕连接到I2C1接口,蜂鸣器连接到GPIO16。

 

213359ushoa8scz8dsxho3.jpg

图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测试程序

然后就能在屏幕上看到显示结果了。如下图。

 

213359rcq2jddc8es048qs.jpg

图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、综合应用

实际效果如下视频。

003

 

视频1、综合应用

参考资料:

https://github.com/LingDong-/chinese-hershey-font

https://shenlb.blog.csdn.net/article/details/121440994

https://blog.csdn.net/fatway/article/details/118859714

回复评论 (1)

蜂鸣器演奏的代码是楼主写的吧

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