1. 项目需求 1.1. 具体要求
利用板上的电位计调节电压从0-3.3V之间变化,在OLED显示屏上显示电压值,可以以数字的方式,也可以以图形的方式来显示。
1.2. 实现方式
调节电位计产生0-3.3V之间变化的电压,树莓派Pico内部的ADC对该电压进行采集,得到0-4095之间的数值,经过计算以后对应到相应的电压值,再通过OLED显示屏显示出来。
2. 环境部署 2.1. 烧录固件
1. 点击https://micropython.org/download/rp2-pico/rp2-pico-latest.uf2 链接下载UF2文件;
如果连接失效,可以进入
https://www.raspberrypi.org/documentation/rp2040/getting-started/#getting-started-with-micropython官网下载。
2. 按住BOOTSEL键不放,将Pico插入电脑的USB串口,电脑上会弹出一个新的U盘文件夹,把刚刚下载的UF2文件拖拽到文件夹中,树莓派 PICO将会自动重启,此时,固件烧录完成。
2.2. 安装IDE(Thonny IDE)
1. 进入软件官网 https://thonny.org/下载软件,最好下载最新版的,否则可能不支持树莓派 PICO;
2. 安装Thonny,安装完成后打开Thonny软件,打开工具->设置-> 解释器,选择MicroPython(Raspberry Pi Pico)解释器,并在串口处选择树莓派PICO的串口号(如果板子已经连接在电脑上,软件一般会自动检测串口号)。
3. 重启软件,可以看到软件左下方显示了树莓派PICO中的文件;如果没有显示左侧文件树的话可以勾选视图->文件。
3. 设计思路 3.1. 硬件介绍
Raspberry Pi Pico 是一款低成本的微控制器。它可以像任何其他微控制器一样用于控制其他电子模块和传感器。Pico 不是 Linux 单板计算机,而是像 Arduino 一样的微控制器。因为,它是一个微控制器,它没有计算机带来的所有开销,因此消耗的电流要少得多。实际上它更像 Arduino 而不是 Raspberry Pi。Pico 不是 Raspberry Pi Zero 的竞争对手,它实际上可以与常规 Pi 配合使用。
硬禾学堂为“暑期一起练”制作了一个平台,这平台正是我视频中演示用到的板子。
板卡上的硬件包括:
- 2个按键输入
- 4个单色LED
- 12个WS2812B RGB三色灯
- 1个姿态传感器
- 1个128*64 OLED显示屏
- 1个蜂鸣器
- 1个可调电位计(用于电压表)
- 1路音频信号输入(用于示波器)
- 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
3.2. 硬件框图
本次设计主要用到的器件是可调电位器,用于采集电压;一个led,用于指示采集过程;另外一个是0.96寸OLED,用于显示采集的电压数。
3.3. 软件流程图
软件流程图如下所示。首先会进行这次设计采用需要的硬件初始化,主要包括ADC和OLED。初始化结束之后会进行ADC的采集,经过计算,得出实际的电压。然后通过OLED的驱动函数,将实际电压显示出来,最后LED闪烁一次表示一次转换完成。然后会重复进行采集过程。
总体软件结构图:
4. 设计代码 4.1. 板载资源声明
为了能够便于后续的开发,首先对应step pico的引脚电路图,对pico的引脚进行了定义。在后续的开发当中,可以直接引入这个文件,利用有意义的名字操作引脚,而不再是数字。
以下代码作为一个单独文件存为board.py。
class pin_cfg:
yellow_led = 20
blue_led = 21
green_led = 22
red_led = 26
buzzer = 19
mic = 27
i2c0_scl = 17
i2c0_sda = 16
i2c1_scl = 15
i2c1_sda = 14
spi1_mosi = 11
spi1_sck = 10
spi1_dc = 9
spi1_rstn = 8
spi1_cs = 29
adc0 = 26
adc1 = 27
k1 = 12
k2 = 13
pot = 28
4.2. OLED驱动
OLED,即有机发光二极管( Organic Light Emitting Diode )。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
本文采用的是7针的0.96寸OLED显示进行讲解,采用的是SPI协议,速度会比采用I2C协议的更快,但这两者的显示驱动都一样,本质上没有太大差别。屏幕整体分辨率为128*64,有黄蓝、白、蓝三种颜色可选,驱动芯片为SSD1306,下面是引脚功能介绍。
micropython官方发布了ssd1306的驱动库,保存为ssd1306.py。使用方法如下:
首先是初始化配置:
def __init__(self, width, height, external_vcc):
self.width = width
self.height = height
self.external_vcc = external_vcc
self.pages = self.height // 8
# Note the subclass must initialize self.framebuf to a framebuffer.
# This is necessary because the underlying data buffer is different
# between I2C and SPI implementations (I2C needs an extra byte).
self.poweron()
self.init_display()
OLED断电:
def poweroff(self):
self.write_cmd(SET_DISP | 0x00)
OLED显示:
def show(self):
x0 = 0
x1 = self.width - 1
if self.width == 64:
# displays with width of 64 pixels are shifted by 32
x0 += 32
x1 += 32
self.write_cmd(SET_COL_ADDR)
self.write_cmd(x0)
self.write_cmd(x1)
self.write_cmd(SET_PAGE_ADDR)
self.write_cmd(0)
self.write_cmd(self.pages - 1)
self.write_framebuf()
OLED填充:
def fill(self, col):
self.framebuf.fill(col)
OLED写字:
def text(self, string, x, y, col=1):
self.framebuf.text(string, x, y, col)
4.3. ADC介绍
AD转换就是模数转换,就是把模拟信号转换成数字信号。D/A转换是把数字量转变成模拟的器件。模拟信号只有通过A/D转化为数字信号后才能用软件进行处理,这一切都是通过A/D转换器(ADC)来实现的。与模数转换相对应的是数模转换,数模转换是模数转换的逆过程。
确定转换的计算比例:
conversion_voltage = 3.3/65535
采集ADC的值并计算:
Voltage = round(pot.read_u16()*conversion_voltage,1)
4.4. 主程序
主程序主要就是按照主程序流程图进行相关的编码。由于进行了模块化的设计,主程序编写起来就非常的方便,简洁易懂。
from board import pin_cfg
import time
import utime
from machine import Pin,ADC,PWM,SPI
from ssd1306 import SSD1306_SPI
import framebuf
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))
pot = ADC(Pin(pin_cfg.pot))
conversion_voltage = 3.3/65535
while True:
Voltage = round(pot.read_u16()*conversion_voltage,1)
oled.fill(0)
oled.text("Voltage",40,0);
oled.text(" ",50,30);
oled.text(str(Voltage)+'V',50,30);
oled.show()
r = Pin(pin_cfg.red_led, Pin.OUT)
r.on()
time.sleep(1)
r.off()
time.sleep(1)
1, 引入必要的包;
2, 进行SPI初始化,OLED初始化;
3, ADC采集,获得电压;
4, 将电压显示在OLED上
5, LED闪烁指示一次转换完成。
5. 实际效果
6. 总结
在当下的大学生学习生活中,往往是重理论而轻实践。书本上的知识学了一大顿,最后真正实操起来发现还是什么都不会。非常幸运能参加这次寒假一起练的活动,锻炼了自己的python编码能力,还有硬件实操能力。树莓派pico板子上还有非常多的资源,计划在之后的学习中将课程能够仔细再学一遍,熟练掌握各种资源的操作。
再进一步,要锻炼自己的硬件设计能力。设计出自己的硬件系统并进行编码,这样就能拥有一个比较复杂的系统,而不是简单的例程。
Micropython的编程比起C/C++要简单的很多,而pico也提供了C方面完整支持。后续的学习中也会去体验一下C语言对pico进行开发。