一.项目介绍
1.基于Step Pico的嵌入式系统学习平台:
这个新的学习平台采用了Step Pico开发板,Step Pico开发板主控采用RP2040:双核Arm Cortex M0+内核,主频133MHz (200MHz Max.),264KB内存。这个开发板相比老的树莓派Pico,增加了4个WS2812可编程彩灯,1个复位按键,USB接口也换成了最新的type-c类型。
以Step Pico开发板为核心,硬禾学堂再开发出一款学习平台,集成了更多功能,比如:2个按键输入,4个单色LED,12个WS2812B RGB三色灯,1个姿态传感器,1个128*64 OLED显示屏,1个蜂鸣器,1个可调电位计(用于电压表),1路音频信号输入(用于示波器),8位R-2R电阻网络构成的DAC(用于DDS信号发生器),这些组件,对于我这样刚开始学习嵌入式系统的小白来说,非常友好,再加上配套的micropython课程,简直完美。
下面是学习平台和Step Pico开发板的外观图,原理框图可以看硬禾的链接(核心板线路图)(STEP Pico学习平台线路图)。
2.IDE:
在上次参加硬禾学堂寒假练时,第一次使用Micropython+Thonny,但因为当时对Micropython了解实在太少,经过一番学习和试错,最后只能放弃,在群里大佬帮助下,最终选用了Arduino IDE,这次,结合上次经验,和这次配套的Micropython课程,把一些示例基本做了一下,终于有一些理解,能进行简单的使用了。
Thonny编辑器的设定使用比较简单,可参照树莓派的官网设定(需要一些英文基础,点击前面链接即可)如果感觉不够本土化,硬禾学堂的免费课也有关于Pico的环境搭建课程。
有一些踩过的坑:
1.Thonny安装前,一定要先把Python安装好,认真看教程很重要。
2.Thonny在右下角有个设定,在设定中选好了树莓派选项。
3.正常到货的学习平台板中,已经有预烧录得程序了,接上电脑后,在Thonny内点击左上角控制栏STOP后,会重新开始链接树莓派,这时候在左下角的目录栏中可以看到树莓派中的预烧录程序
如果没有,那很可能还要按住STEP PICO控制板的BOOT按键,这时候再重新连接电脑,在我的电脑中出现下面这个存储设备,再往里面传入FW文件
4.最后记住要在Thonny的工具栏中,选“工具”-->“设置”,出现下面这个界面,然后选Mypython(Pico)版本,另外,前面3提到的FW文件,在这个界面右下角的“Install or update firmware”可以下载。
二.任务完成思路和实现过程
此次活动我选取了任务8:制作一个电压表,因为时间关系,做的很仓促,其他任务也很有意思。在后续抽时间还是做一遍
以下对本次任务进行分解:
第一步:读取板上电位计的电压数据
电位计在学习平台的板子上,本质上是一颗滑动电阻,其中,Pin2连接到GPIO28_ADC2,这样,当Pin2在电阻上滑动时,会因为分压出现不同的电压,从而在通过GPIO28_ADC2进行AD转换,得到需要的值。
当需要读取RV1的值时,需要先读取,通过以下指令来读取
potentiometer = machine.ADC(28)
再用以下指令来转换为实际电压值
conversion_factor = 3.3/(65535)
...
voltage = potentiometer.read_u16() * conversion_factor
其中,65535的取值,因为当我们直接读取ADC28的值时,最大会输出65535的值,但实际我们需要看电压值,所以需要用3.3V实际供电来进行均分。
在这里,我们会注意到,所用电位计是线性的,才能用均分的方式来转换数据,如果用非线性的电位计,需要根据实际情况来看。
第二步:显示采样的电压信息。
1.显示部分,是在学习平台上,采用是128*64的一块OLED屏幕,采用SSD1306驱动,SSD1306是非常通用的一款OLED驱动,128*64的OLED屏幕使用也很广泛,在很多小家电,小型的设备上都能用到,而且关键很便宜。
在micropython使用SSD1306,有现成的库,只需要在开头进行调用即可,不过需要注意,同时要把SSD1306的驱动文件(SSD1306.py)一起放在RP2040的存储里
from machine import Pin, SPI
from ssd1306 import SSD1306_SPI
...
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))
oled.rotate(1)
在这里要说明的是,在载入SSD1306的库时,因为micropython的规则,需要先载入machine库,另外,SSD1306在此处使用的是SPI模式,所以此时需要定义SPI的端口
第三步:实现和调试(完整代码详见附件)
最终程序中需要先载入的库或驱动如下:
from machine import Pin, SPI
from ssd1306 import SSD1306_SPI
import utime
from time import sleep
from utime import sleep_ms
from board import pin_cfg
需要调试的部分:
主要是显示:在显示时,预计好大概显示的内容和图形,多次尝试位置,直到达到自己满意的效果即可,显示部分代码如下:
oled.fill(0)
oled.show()
voltage1 = voltage / 0.1
print(int(voltage1) / 10 )
oled.text("RV1 Voltage:", 5, 5)
oled.text(str(voltage) +" V", 5, 20)
oled.hline(1,44,105,1)
oled.hline(1,45,105,1)
oled.hline(1,46,105,1)
oled.vline(3*int(voltage1) + 1,36,20,1)
第四步:演示效果
贴上演示效果如下:
三.活动总结,一些感想
本次活动是在参加学校模拟电子的活动之余,再另外参加的寒假练活动,因为上次参加寒假练活动,对micropython还学习的不够,趁这次活动还有在线课程,加深一点micropython的知识,学习到了更多的使用规则,也算补上一点遗憾,同时发现micropython对新手确实很友好,后续还会继续学习。
感谢硬禾学堂在2022年的活动,虽然有一个Funpack活动因为时间和对C不懂得原因,没能如期完成,总体来说,认识硬禾学堂这几年,学到了很多,也认识了很多大佬,以后,还会一如既往的支持活动。