任务要求:
具体要求:利用板上的姿态传感器,在OLED屏上通过小球滚动的方式显示板子的倾斜度,板子水平的时候小球处于OLED显示器的中心位置
项目分析:
- MMA7660数据采集(后来发现并不简单,还需要进行数据的分析处理)
- OLED 显示,需要进行画图和文字的显示。
项目流程图:
环境配置:
1、Thonny:
可以在官网进行下载,简单易上手。在硬禾学堂有讲师手把手教学【ヾ(^▽^*)))】,链接如下:直播1:基于STEP Pico的嵌入式系统学习平台板卡介绍+环境搭建 (eetree.cn)
作为平时写程序的主要工具,对于界面的舒适性肯定要高一些,初始界面有点太亮了,长时间看会感到光线有点刺眼。
可以在这里调节一下Thonny的主题:
这里是我现在常用的主题,大家可以根据自己的喜好进行选择去选择 (づ ̄ 3 ̄)づ
主要程序代码分析:
#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
adc2 = 28
k1 = 12
k2 = 13
pot = 28
在board.py 部分对于引脚所接外设进行定义,例如LED、蜂鸣器、麦克风、SPI驱动的OLED、IIC驱动的MMA7660三轴加速度传感器、adc电压采集、按键等模块,增强程序的可阅读性。
main.py主要包括三个部分:
1.引入库文件
from board import pin_cfg
from machine import Pin, SPI
from ssd1306 import SSD1306_SPI
import gfx
from time import sleep
from machine import I2C, Pin
from time import sleep
from mma7660 import MMA7660
2.外设引脚定义
#oled
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))
#mma7660
i2c1 = I2C(1, scl=Pin(pin_cfg.i2c1_scl), sda=Pin(pin_cfg.i2c1_sda))
3.功能实现函数
首先开始与MMA7660进行通信,将三轴加速度传感器的数据传入数组。
acc.on(True)
d = bytearray(3)
r = [0 for x in range(3)]
k = [0,1,2]
def twos_compliment(n, nbits):
sign_bit = 1 << nbits - 1
sign = 1 if n & sign_bit == 0 else -1
val = n & ~sign_bit if sign > 0 else sign * ((sign_bit << 1) - n)
return val
# Introduce the last data, carry out negative feedback, and realize filtering
def thumb_filter():
acc.getSample(d)
for i in range(2):
r[i] = twos_compliment(d[i], 6)
k[i] = r[i]
r[i] = (int)(k[i] * 0.1 + (1.0 - 0.9) * r[i])
3.主循环
在主循环中先对MMA7660进行数据的采集及数据处理,在数据处理过程中发现在强制类型转换之后使用浮点数与整数相乘会大大降低程序的速度,于是采用两次数据相加求和的方式进行,实测速度会快很多,小球运动不会有明显的卡顿现象。
之后在OLED上进行圆形的绘制,本次采用两个不同大小,圆心相同的圆形,使单色OLED界面更加美观。
根据题目的要求,当Pico水平放置时,小球处于OLED的中心位置,在开发板中的OLED显示屏尺寸为0.96寸,分辨率 128*64,由此可知屏幕的中心位置为63,31。
while True:
#mma7660
thumb_filter()
#oled show
graphics.circle(64, 32, 20, 1)
graphics.circle(64, 32, 30, 1)
graphics.fill_circle((64-6*r[1]), (32-6*r[0]), 10, 1)
oled.text(str(64-3*r[1]),0,0)
oled.text(str(32-3*r[0]),0,10)
oled.show()
sleep(0.1)
oled.fill(0)
项目介绍:
通过MMA766三轴加速度传感器 感知 Pico扩展板的方位变化,并上传到RP2040进行数据分析,数据经过处理之后呈现在OLED显示屏上。
MCU简介:
RP2040是树莓派针对嵌入式应用设计发布的一款低功耗可嵌入式设备。可以通过C/C++/MicroPython进行设计开发。
在开发语言方面已知可用的有两种方式:
方式一:
通过C/C++进行程序的设计开发
方式二:
通过MicroPython进行程序的设计开发
最终方案:
使用MicroPython进行程序的开发,理由如下:
树莓派RP2024对于MicroPython的支持较为完善,可以直接在MicroPython官网进行固件的下载。
MicroPython程序简练,无需将时间大量花在程序的书写之中。
MicroPython有很多的库参考,可以将时间聚焦于程序的实现方法上。
MCU处理器的处理速度不断增强,Python的应用也扩展到嵌入式应用之中。
设计过程中遇到的问题:
因为MMA7660传感器精度为6BIT,输出值有三个刻度的误差,所以读取的数据是一直变化的,反映在OLED显示上为小球会不断在中心位置附近抖动,这时通过查阅资料及以往对于STM32读取传感器相关经验可知需要对加速度传感器传回数据进行滤波,尝试使用将多次数据进行求和然后求取平均,发现仍会发生抖动,尝试在OLED程序部分缩减加速度传感器的数据影响,发现小球的运动范围也会因此受到限制。
解决方法:
经过资料查找研究之后发现可以将读取的数值进行降低一个数量级之后增加2倍,降低数据的波动,同时程序的运行速度也能得到保障。
至于为什么要(1-0.9)😗
之前打算用一阶滞后滤波来进行对数据的滤波处理(发现可以经过数据处理达到与滤波所接近的效果)
未来的计划:
计划将Pico扩展板中的RGB灯作为MMA7660加速度传感器的另一个显示方式。
通过不同方向的灯来显示倾斜方向,不同颜色来显示扩展板的不同倾斜角度。
尝试板载的其他资源:
利用板载LED使用Pico定时器资源实现交通灯
使用板载麦克风检测周围环境音量,利用板载RGB灯或者OLED进行显示。