硬件介绍:STEP Pico的嵌入式系统学习平台,是电子森林推出的2023寒假一起练活动中的一款开发板。此款开发板为电子森林设计制作。采用树莓派Pico核心芯片P2040。核心为双核Arm Cortex M0+内核,可以运行到133MHz,拥有264KB内存。性能强大、高度灵活的可编程IO可用于高速数字接口,片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps、12位精度支持MicroPython、C、C++编程。
任务选择:这次我选择的是项目4 - 制作一个电压表。具体要求:利用板上的电位计调节电压从0-3.3V之间变化,在OLED显示屏上显示电压值,可以以数字的方式,也可以以图形的方式来显示。实现方式:调节电位计产生0-3.3V之间变化的电压,树莓派Pico内部的ADC对该电压进行采集,得到0-4095之间的数值,经过计算以后对应到相应的电压值,再通过OLED显示屏显示出来。
任务实现:选定了任务,就要选择开发工具了。Pico支持Arduino、C、MicroPython的编程,MicroPython相对简单,再加上电子森林提供的课程都是基于MicroPython的,所以这了就选择了MicroPython作为开发语言,Thonny作为开发工具。分析任务,整体流程并不复杂。
首先要获得电位器的电压值。于是查看电路图。可以电位器接在GPIO28口。电压范围是0~3.3v。
MicroPython中模拟数字转换的函数为machine.ADC(id):
ADC对象构造函数,并初始化对应通道。id:可为GPIO对象,也可为ADC通道;ADC对象构造函数,作用为初始化对应ADC通道。
读取具体的AD值的函数:ADC.read_u16()。read_u16函数,其作用读取对应通道ADC,并返回读取数值 数值;这里需要注意一点,该函数返回值并不是直接返回ADC读取的数值,而是处理过的数值,其数值范围为0-65535;故ADC读取电压还需做转换。
通过AD获得电位器上的电压后,就是展示了。这里有个126x64的oled屏幕。屏幕是通过SPI接口驱动的,阅读电子森林的例程,已经有将屏幕驱动起来的例程。这里参考了“太空人”的例程,将太空人搬到了自己的项目中,例程中“太空人”的展示使用了缓冲帧,这样就使得“太空人”的动画很平滑。在自己的项目中设计让“太空人”在屏幕的左侧飞翔。屏幕右侧安排展示当前电压值和电位器旋转位置的百分比。这里使用了一个MicroPython的字体类库,使用了24像素、16像素两种大小的字体,24像素字体较大,用来显示当前的电压值,16像素字体略小,用来显示占比的百分比。
from machine import Pin, SPI
from ssd1306 import SSD1306_SPI
import framebuf
import time
from utime import sleep_ms
from board import pin_cfg
from astronaut import frames
from font import Font
import machine
sensor_v = machine.ADC(2)
v_step = 3.3 / 65535
spi = SPI(1, 100000, mosi=Pin(pin_cfg.spi1_mosi), sck=Pin(pin_cfg.spi1_sck))
oled = SSD1306_SPI(128, 64, spi, Pin(pin_cfg.spi1_dc),Pin(pin_cfg.spi1_rstn), Pin(pin_cfg.spi1_cs))
# Clear the oled display in case it has junk on it.
oled.fill(0)
dispnum=Font(oled)
while True:
curr_v = sensor_v.read_u16() * v_step
for i in range(0, 48):
fb = framebuf.FrameBuffer(frames[i], 64, 64, framebuf.MONO_HLSB)
time.sleep_ms(15)
oled.blit(fb, 0, 0)
dispnum.text("%.2fV"%(curr_v),64,10,24)
str="%3d"%(curr_v/0.033)
dispnum.text(str+'%',77,46,16)
oled.show()
程序每15ms读取一次AD值,然后显示当前电压,绘制一次太空人。实际测试中,有少许显示时需要注意,这里使用的显示函数能够很好地覆盖显示,但在百分比位置遇到问题,百分比显示从0%~100%,会有字符串长度的变化,导致当长度变化时,会有高位字符留在屏幕上。解决方法就是使用定长输出,如同C语言中的printf一般,使用3d%将数字固定成3位字符串,左边补空格即可。
心得体会:非常感谢电子森林举办的寒假一起练活动。在这里能学习到很多知识,还能认识很多大佬!电子森林设计的这款树莓派Pico功能更丰富,端口全部引出,还有炫目的LED灯,期待学习大家的作品。