内容介绍
内容介绍
基于树莓派RP2040嵌入式系统实现的水平仪
- 项目介绍:
该水平仪基于RP2040嵌入式系统实现,以mma7660三轴姿态传感器及st7789lcd显示屏实现的水平仪项目
- 设计思路:
- 硬件介绍:
RP2040-树莓派设计的微控制器芯片:凭借大型片上存储器、对称双核处理器复合体、确定性总线结构和丰富的外设集以及我们独特的可编程 I/O (PIO) 子系统,它为专业用户提供了无与伦比的功能和灵活性。支持MicroPython和C/C++的程序编写。
MMA7660姿态传感器:MMA7660FC是具有数字输出的I²C、低功耗、紧凑型电容式微机械加速度传感器,提供低通滤波器、零重力加速度偏移和增益误差补偿,并可以转化为6位数字值,用户可配置输出数据的传输速率。该器件可通过中断引脚(INT)识别传感器的数据变化、产品的朝向和姿态等。
4、功能展示:
5、代码片段:
(1)、该部分为mma7660与st7789所对应库的声明
from mma7660_2 import MMA7660
from machine import I2C, Pin, ADC
from time import sleep
import math
from breakout_colourlcd240x240 import BreakoutColourLCD240x240
(2)、建立对象,并对st7789、mma7660以及RP2040对应的按键端口进行配置和初始化
#绘图初始化
display_buffer = bytearray(240 * 240 * 2)
display = BreakoutColourLCD240x240(display_buffer)
display.set_backlight(1.0)
#姿态传感器配置
i2c = I2C(1, scl=Pin(11), sda=Pin(10))
accel = MMA7660(i2c)
accel.on(True)
#按键配置
buttonB = Pin(5,Pin.IN, Pin.PULL_UP)
buttonA = Pin(6,Pin.IN, Pin.PULL_UP)
(3)、使用建立的对象进行框架的配置和初始化,并分过程建立函数,以便后续调用
def interface():#框架绘制
display.set_pen(255, 0, 0)
display.clear()
display.rectangle(1, 1, 239, 239)
display.set_pen(0, 0, 0)
display.rectangle(5, 60, 175, 175)
display.rectangle(185, 60, 50, 175)
display.rectangle(5, 5, 175, 50)
def pattern_colour(pattern):
if pattern == 0:
display.set_pen(255, 255, 255)
display.rectangle(50, 30, 175, 50)
display.set_pen(255, 255, 255)
display.text("Horizontal mode", 10, 10, 5)
else:
display.set_pen(0, 255, 0)
display.text("Contrast mode", 10, 10, 5)
display.rectangle(185, 5, 50, 50)
def coordinate_circle():
display.set_pen(255, 0, 0)
display.circle(92, 147, 87)
display.set_pen(0, 0, 0)
display.circle(92, 147, 86)
display.set_pen(255, 0, 0)
display.circle(92, 147, 43)
display.set_pen(0, 0, 0)
display.circle(92, 147, 42)
def line():
display.set_pen(255, 0, 0)
display.rectangle(49, 5, 1, 50)
display.rectangle(92, 5, 1, 50)
display.rectangle(135, 5, 1, 50)
display.rectangle(185, 104, 50, 1)
display.rectangle(185, 147, 50, 1)
display.rectangle(185, 190, 50, 1)
display.rectangle(5, 147, 175, 1)
display.rectangle(92, 60, 1,175)
display.rectangle(82, 104, 21, 1)
display.rectangle(82, 190, 21, 1)
display.rectangle(49, 137, 1, 21)
display.rectangle(135, 137, 1, 21)
(4)、基准圆绘制函数,以圆心坐标为参数,以便后续对圆位置的更新
def circle(x,y):#基准圆绘制
display.set_pen(0, 0, 255)
display.circle(x, y, 17)
display.set_pen(0, 0, 0)
display.circle(x, y, 16)
(5)、该部分基于mma7660进行姿态捕捉,并将数据传入position()函数中,将6位bite的数值转化为二位十进制数,并以0为初始位置
def move():#姿态捕捉
p = bytearray(3)
accel.getSample(p)
y = int(position(p[0])*2.7)
x = int(position(p[1])*2.7)
z = position(p[2])
return x, y, z
def position(position):#数值换算
sign_bit = 1 << 5
if position & sign_bit == 0 :
sign = 1
else :
sign=-1
if sign > 0 :
value = position & ~sign_bit
else:
value=sign * ((sign_bit << 1) - position)
return value
(6)、该部分是对于不同模式下基准圆更新方式的定义
def pattern1():#模式一
coordinate_circle()
x,y,z = move()
circle(92-x, 30)
circle(92-x, 147+y)
circle(210, 147+y)
line()
display.update()
sleep(0.01)
def pattern2(x0,y0,z0):#模式二
coordinate_circle()
x,y,z = move()
circle(92-(x-x0), 30)
circle(92-(x-x0), 147+(y-y0))
circle(210, 147+(y-y0))
line()
display.update()
sleep(0.01)
5、遇到的问题及解决:
主要的难题是对于I2C总线的工作方式及初始化配置不明白,导致姿态传感器无法与芯片RP2040通信,也就无法实现水平仪的功能。后期通过对I2C总线时序和传输方式的学习以及向交流群中的老师同学学习,明白了I2C总线的运作方式,也就可以对姿态传感器进行配置和初始化了。
6、总结:
通过本次的实践练习,对树莓派和micro python的了解更加的深入,编程能力得到一定程度的提升,对于芯片的运行、电路的工作也有了进一步的了解,也在交流学习的过程中结实很多优秀的同学和老师。本次活动中,我收益颇丰,也有着下一次参加的打算。
附件下载
水平仪.py
mma7660_2.py
mpy-sge-pmrn-hid-v20220118.uf2
团队介绍
来自四川大学的一名大一学生杨世亮,电气工程学院电气类专业。热爱电子小制作,自学入门了python,对树莓派有所了解,将进行进一步的学习和实践。
团队成员
杨世亮
来自四川大学的一名大一学生杨世亮,电气工程学院电气类专业。热爱电子小制作,自学入门了python,对树莓派有所了解,将进行进一步的学习和实践。
评论
0 / 100
查看更多