一.项目介绍
1.RP2040开发板:
引用部分官方介绍:RP2040开发板主控采用树莓派Pico芯片RP2040:双核Arm Cortex M0+内核,主频133MHz (200MHz Max.),264KB内存。开发板上有:外扩2MB Flash,一个240*240彩色IPS LCD,SPI接口,控制器ST7789, 板载温度传感器,三轴姿态传感器MMA7660。还有SPI、I2C以及2路模拟信号输入。
下面是外观图和原理框图。
2.IDE:
RP2040是树莓派主控,按说现在树莓派用Micropython来做比较多,当使用Micropython时,IDE可用Thonny,在2021年12月的Fastbond活动中,是第一次使用Micropython+Thonny,当时非常惊叹于入门方便,所以本次刚开始也使用Micropython,但因为对Micropython了解实在太少,经过一番学习和试错,最后只能放弃,在群里大佬帮助下,最终选用了Arduino IDE.
Arduino IDE设置适配树莓派Pi PICO也有一番波折,可参照这个网站,这是机翻网站,读起来很怪,但是有用,在这里建议将pico-setup-windows先下载下来,如果通过Arduino的开发板设置中查找PICO来下载,会让人发狂,很容易下载最后失败,特别是在Arduino首选项设置:
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
这个网址单独打开也可以,就是在Arduino IDE中无法连续下载,目前没搞清楚原因。
当Arduino IDE设置好了后,开发板选项会像如下这样:
二.任务完成思路和实现过程
此次活动我选取了任务8:在LCD屏上设计一款水平仪,通过一个滚动的小球或气泡,来显示当前板子的倾斜度,当板子处于水平位置的时候,小球停在屏幕的正中间,倾斜板子,小球偏移,并能够显示偏移的角度(二维信息)。
以下对本次任务进行分解:
第一步:读取姿态传感器数据(代码和对应库文件详见附件中)
RP2040开发板自带MMA7660三轴姿态传感器,这颗传感器的库很容易找,MicroPython和C的库都有,如果是Arduino里面,建议直接从Github或者Gitee上下载,电子森林上也有,
在开发板上线路如下,可看出来是用I2C总线。
arduino中的库下载好了后,有一个demo可以看,这个demo比较简单,我这个程序小白也能看明白,调用传感器数据显示在串口上,具体的细节在附件程序中。
第二步:在LCD上显示,包括参考图片中的圆圈,标线,以及倾斜时小球的运动等。(代码和对应库文件在附件中,所需TFT_eSPI库文件非通用,已重新适配该RP2040开发板)
1.LCD部分:240*240,彩色IPS LCD,SPI接口,控制器ST7789,这里特别备注,因为这个开发板的ST7789据说采用了国产替代,同时LCD模块内部接线不确定,导致TFT_eSPI的库无法适配,需要在库文件~Arduino\libraries\TFT_eSPI\TFT_Drivers里面的ST7789相关文件中修改Pin对应关系和一些指令(具体不详,我采用群里大佬修改后的库)
第三步:实现和调试(完整代码详见附件)
程序中需要载入的库如下:
其中,TFT_eSPI库是更新适配这个开发板后的版本
#include <TFT_eSPI.h> // Graphics and font library for ST7735 driver chip
#include <SPI.h>
#include <Wire.h>
#include "MMA7660.h"
需要调试的部分:
(1)调用三轴传感器的数据,因为这个传感器的数据输出线性不好,我能想到的办法是多次取值做均分,本来也查到一些平滑处理数据的方法,多次尝试后因为没搞清楚原理,最后只能放弃使用那些高大上的方法。
部分代码如下:
.
.
acc.getXYZ(&x1,&y1,&z1);
delay(6);
acc.getXYZ(&x2,&y2,&z1);
delay(6);
acc.getXYZ(&x3,&y3,&z1);
delay(6);
acc.getXYZ(&x4,&y4,&z1);
delay(6);
acc.getXYZ(&x5,&y5,&z1);
delay(6);
.
.
x = (x1+x2+x3+x4+x5)/5;
y = (y1+y2+y3+y4+y5)/5;
Y0 = (x + 22)*5;
X0 = abs(y - 24)*5;//传感器输出值映射到坐标X,Y
.
.
(3)显示部分:TFT_eSPI库中有现成的指令划圈,很省事,但是因为需要调用传感器数据,同时要保持传感器数据刷新,来直观显示变动小圆球,所以需要显示刷新,这个问题在之前没遇到过,最粗暴的方法是用全局刷新,但是会导致屏闪,看TFT_eSPI库的例程,有DMA的方法,结果花了两周来琢磨DMA的显示,因为对软件原理了解太少了,出现很多问题,比如在loop中放入传感器数据刷新这段的时候,貌似会导致开发板死机,个人猜测是因为数据溢出,但也想不到办法确认和调试,最终也只能放弃,用全局刷新来做。
部分代码如下:
.
. //划圈
tft.fillScreen(TFT_SILVER);
tft.drawCircle(120, 120, 20, TFT_BLUE);//内1蓝
.
. //打mark点
tft.setTextSize(1);
tft.setTextColor(TFT_BLACK);
tft.drawString("15", 1, 123);//左1黑
.
. //显示小球全局刷新
tft.fillCircle(X0, Y0, 7, TFT_RED);
delay(70);
补充说明几点:
1. 因为RP2040出厂默认内部固件是Micropython,所以如果需要用Arduino IDE来编译,需要重新刷对应的固件(刷固件操作:即关机-->同时按住B键和RESET键-->USB连接电脑-->打开开关-->松开B键-->此时电脑中会出现新文件夹-->此时再松开RESET键),在附件中已经注明(需要进行两步,第一步1st. firmware.uf2,第二步2nd. rp2-pico-20220117-v1.18.uf2),然后在Arduino IDE中才会出现对应的端口。
2. 另需要再注意,第一次在Arduino中上传文件时,需要按刷固件操作来做,然后需要在Arduino IDE中快编译结束时再松开B键,此时电脑中有文件夹出现了,那才能让第一次上传文件成功,第一次上传成功后,Arduino 中的端口会再次出现变化,这时要重新选择对应的端口一次(如果操作有实在不清楚,可电话联系本人)
第四步:演示效果
贴上演示效果如下:
三.活动总结,一些感想
本次活动是寒假练参加的第二个活动,留下来不少遗憾,比如没能搞清楚Micropython下的显示画圆圈的方法,没能搞清楚Arduino 下TFT_eSPI中DMA刷新的原理,同时也学到了很多,对Micropython语法和TFT_eSPI库的设置更改都有了更多了解。
感谢硬禾学堂在2021年的活动,让我从对软件一无所知,到现在能简单完成一些小项目,学习了很多,也认识了群里很多大佬,接下来2022年,自己要更努力,也会一如既往支持硬禾学堂后面的活动。