2022寒假在家练——基于树莓派RP2040嵌入式系统实现的水平仪
该水平仪基于RP2040嵌入式系统实现,以mma7660三轴姿态传感器及st7789lcd显示屏实现的水平仪项目
标签
嵌入式系统
测试
显示
小yang
更新2022-03-08
四川大学
780

基于树莓派RP2040嵌入式系统实现的水平仪

  • 项目介绍:

该水平仪基于RP2040嵌入式系统实现,以mma7660三轴姿态传感器及st7789lcd显示屏实现的水平仪项目

  • 设计思路:

Fsd8zzO7hYm9iNdmR1C94LJniFLS

  • 硬件介绍:
    RP2040-树莓派设计的微控制器芯片:凭借大型片上存储器、对称双核处理器复合体、确定性总线结构和丰富的外设集以及我们独特的可编程 I/O (PIO) 子系统,它为专业用户提供了无与伦比的功能和灵活性。支持MicroPython和C/C++的程序编写。

MMA7660姿态传感器:MMA7660FC是具有数字输出的I²C、低功耗、紧凑型电容式微机械加速度传感器,提供低通滤波器、零重力加速度偏移和增益误差补偿,并可以转化为6位数字值,用户可配置输出数据的传输速率。该器件可通过中断引脚(INT)识别传感器的数据变化、产品的朝向和姿态等。

4、功能展示:

FkSFnLPB-r4PlruJLafmmQa-GEqaFgwfbtqPQvLS38MUDN9OnyhoKgyn

 

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