树莓派RP2040--使用姿态传感器制作水平仪
1.树莓派RP2040开发套件简介 2.使用树莓派RP2040板载姿态传感器制作水平仪
标签
嵌入式系统
显示
2022年寒假练
Titan
更新2022-03-04
1329

内容介绍

.项目介绍  

1.RP2040开发板

引用部分官方介绍:RP2040开发板主控采用树莓派Pico芯片RP2040:双核Arm Cortex M0+内核,主频133MHz (200MHz Max.),264KB内存。开发板上有:外扩2MB Flash,一个240*240彩色IPS LCD,SPI接口,控制器ST7789, 板载温度传感器,三轴姿态传感器MMA7660。还有SPI、I2C以及2路模拟信号输入。

下面是外观图和原理框图。

Flo0Ttmj96ItJyRhkeOIZv6unAmvFo_bQewUYVRVxvSA5ClIGJ8PyagJ

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设置好了后,开发板选项会像如下这样:

Fp_y1bQ-fdKlvrDBKbh0TdIf4eD5

 

.任务完成思路和实现过程  

此次活动我选取了任务8:在LCD屏上设计一款水平仪,通过一个滚动的小球或气泡,来显示当前板子的倾斜度,当板子处于水平位置的时候,小球停在屏幕的正中间,倾斜板子,小球偏移,并能够显示偏移的角度(二维信息)。

以下对本次任务进行分解:

第一步:读取姿态传感器数据(代码和对应库文件详见附件中)

RP2040开发板自带MMA7660三轴姿态传感器,这颗传感器的库很容易找,MicroPython和C的库都有,如果是Arduino里面,建议直接从Github或者Gitee上下载,电子森林上也有,

在开发板上线路如下,可看出来是用I2C总线。

FqoBtr0yJzyznKsvUdTiPqb64IjD

arduino中的库下载好了后,有一个demo可以看,这个demo比较简单,我这个程序小白也能看明白,调用传感器数据显示在串口上,具体的细节在附件程序中。

FvEQdRrayNTxEiYVOvrB0n6qprSF

第二步:在LCD上显示,包括参考图片中的圆圈,标线,以及倾斜时小球的运动等。(代码和对应库文件在附件中,所需TFT_eSPI库文件非通用,已重新适配该RP2040开发板)

1.LCD部分:240*240,彩色IPS LCD,SPI接口,控制器ST7789,这里特别备注,因为这个开发板的ST7789据说采用了国产替代,同时LCD模块内部接线不确定,导致TFT_eSPI的库无法适配,需要在库文件~Arduino\libraries\TFT_eSPI\TFT_Drivers里面的ST7789相关文件中修改Pin对应关系和一些指令(具体不详,我采用群里大佬修改后的库)

FnqM5qgLdN8z9ascqBha-EuK76Lm

第三步:实现和调试(完整代码详见附件)

程序中需要载入的库如下:

其中,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 中的端口会再次出现变化,这时要重新选择对应的端口一次(如果操作有实在不清楚,可电话联系本人)

第四步:演示效果  

贴上演示效果如下:

FjMNh9EQgEFG-oYK1GW5zOeFWJOw

FrSKNjfzQ94_9xtoYQqOFP-UtDwe

.活动总结,一些感想

本次活动是寒假练参加的第二个活动,留下来不少遗憾,比如没能搞清楚Micropython下的显示画圆圈的方法,没能搞清楚Arduino 下TFT_eSPI中DMA刷新的原理,同时也学到了很多,对Micropython语法和TFT_eSPI库的设置更改都有了更多了解。

感谢硬禾学堂在2021年的活动,让我从对软件一无所知,到现在能简单完成一些小项目,学习了很多,也认识了群里很多大佬,接下来2022年,自己要更努力,也会一如既往支持硬禾学堂后面的活动。

 

 

附件下载

源代码.zip

团队介绍

个人
团队成员
Titan

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号