基于STEP Pico的嵌入式系统制作一个电压表
基于STEP Pico的嵌入式系统,利用板上的电位计调节电压从0-3.3V之间变化,树莓派Pico内部的ADC对该电压进行采集,得到0-4095之间的数值,经过计算以后对应到相应的电压值,在OLED显示屏上以数字的方式显示电压值。
标签
嵌入式系统
2023寒假在家练
STEP Pico
LilDot
更新2023-03-28
北京理工大学
343

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 配合使用。

硬禾学堂为“暑期一起练”制作了一个平台,这平台正是我视频中演示用到的板子。

Fr4bJoOd0UUlyxLAQOrlCzbWTp9d

板卡上的硬件包括:

  • 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,用于显示采集的电压数。

FpWJ7C46Y9ftgxtMawOE8QdoVt0J

3.3. 软件流程图

软件流程图如下所示。首先会进行这次设计采用需要的硬件初始化,主要包括ADC和OLED。初始化结束之后会进行ADC的采集,经过计算,得出实际的电压。然后通过OLED的驱动函数,将实际电压显示出来,最后LED闪烁一次表示一次转换完成。然后会重复进行采集过程。

FmhYCg-We0pGCrIqMU2-BjJpUdhA

总体软件结构图:

FhRcwNh9-K9WmSepJtNys3iblrxW

4. 设计代码   4.1. 板载资源声明

为了能够便于后续的开发,首先对应step pico的引脚电路图,对pico的引脚进行了定义。在后续的开发当中,可以直接引入这个文件,利用有意义的名字操作引脚,而不再是数字。

FmtmIhaSHOfRy4SwAExWKdZDSRLh

以下代码作为一个单独文件存为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由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

FtWesRfqWByfpxKzY_30ESIgcj3w

 本文采用的是7针的0.96寸OLED显示进行讲解,采用的是SPI协议,速度会比采用I2C协议的更快,但这两者的显示驱动都一样,本质上没有太大差别。屏幕整体分辨率为128*64,有黄蓝、白、蓝三种颜色可选,驱动芯片为SSD1306,下面是引脚功能介绍。

Fo4qqmwS1NDehCDPFA7SOrUJHF4o

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)

FmO5ndCaeXxY6-npezSNkexNBW0t

1, 引入必要的包;

2, 进行SPI初始化,OLED初始化;

3, ADC采集,获得电压;

4, 将电压显示在OLED上

5, LED闪烁指示一次转换完成。

5. 实际效果

FnFG2bnKWQRKzjIz0laSnXLT4lts

FgQe2iWjkimQwm7ViTYl-j74oYW9

 

6. 总结

 

在当下的大学生学习生活中,往往是重理论而轻实践。书本上的知识学了一大顿,最后真正实操起来发现还是什么都不会。非常幸运能参加这次寒假一起练的活动,锻炼了自己的python编码能力,还有硬件实操能力。树莓派pico板子上还有非常多的资源,计划在之后的学习中将课程能够仔细再学一遍,熟练掌握各种资源的操作。

再进一步,要锻炼自己的硬件设计能力。设计出自己的硬件系统并进行编码,这样就能拥有一个比较复杂的系统,而不是简单的例程。

Micropython的编程比起C/C++要简单的很多,而pico也提供了C方面完整支持。后续的学习中也会去体验一下C语言对pico进行开发。

软硬件
元器件
附件下载
main.py
ssd1306.py
board.py
团队介绍
赵永新 北京理工大学
团队成员
赵永新
北京理工大学
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号