基于RP2040 Game Kit实现电子沙漏
基于RP2040 Game Kit和两个LED灯板实现电子沙漏,可以通过按键来设置沙漏变化的周期,通过姿态传感器来感知沙漏的方向变化,并开始新的沙漏变化。
标签
嵌入式系统
显示
RP2040
2022寒假在家练
cong
更新2022-09-06
沈阳理工大学
688

1  项目描述

1.1 项目介绍

具体要求:

  • 自行设计一个电子沙漏的物理结构,将提供的两个LED灯板和RP2040 Game Kit固定
  • 通过RP2040 Game Kit上的按键和LCD屏幕设定沙漏一个周期的时间,实现如上图中LED的效果
  • 通过RP2040 Game Kit上的姿态传感器来感知沙漏的方向变化,并开始新的沙漏操作

所需器件:

  • RP2040 Game Kit一套
  • 8*8 LED灯板 2块 + 连接RP2040 Game Kit 和灯板的杜邦线

1.2 设计思路

1、首先对LED灯板进行取样,取样数据保存到数组shalou中,然后通过延时达到流沙效果。

2、在LCD屏幕上显示沙漏的流沙时间(Quicksand time),通过改变四向遥感的方向改变流沙时间,延时时间与设置的流沙时间有关。

3、通过感受三轴姿态传感器MMA7660的变化改变流沙方向。

2  硬件

2.1 RP2040介绍

RP2040 是 Raspberry Pi 的首款微控制器。它为微控制器领域带来了我们高性能、低成本和易用性的标志性价值。

 RP2040 Game Kit是基于树莓派RP2040的嵌入式系统学习平台,通过USB Type-C连接器供电,采用RP2040作为主控,具有双核Arm Cortex M0+内核和264KB内存,可通过MicroPython或C/C++编程,性能强大。板上四向摇杆 + 2个轻触按键 + 一个三轴姿态传感器MMA7660用做输入控制,并有240*240分辨率的彩色LCD屏显示,片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps。可玩性极高,可移植多款复古游戏,还可作为电赛的控制、显示接口平台,搭配传感器、模拟电路外还可以完成更多创意项目。

  • 采用树莓派Pico核心芯片RP2040:

    • 双核Arm Cortex M0+内核,可以运行到133MHz

    • 264KB内存
    • 性能强大、高度灵活的可编程IO可用于高速数字接口

    • 片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps、12位精度

    • 支持MicroPython、C、C++编程

  • 板上功能:

    • 240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789

    • 四向摇杆 + 2个轻触按键 + 一个三轴姿态传感器MMA7660用做输入控制

    • 板上外扩2MB Flash,预刷MicroPython的UF2固件

    • 一个红外接收管 + 一个红外发射管

    • 一个三轴姿态传感器MMA7660
    • 一个蜂鸣器

    • 双排16Pin连接器,有SPI、I2C以及2路模拟信号输入

    • 可以使用MicroPython、C、C++编程

    • USB Type C连接器用于供电、程序下载
  • 电路图

FvlIuONDPPO5K_Vxmu8x-T-HWodw

2.2 MMA7660姿态传感器

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

产品特性
  • I2C输出
  • 可配置每秒采样率1到120次
  • 低功耗的自动唤醒/休眠功能
  • 低功耗:  关机模式:0.4 µA 待机模式:2 µA 工作模式:可配置,低至47 µA
  • 工作电压:2.4V – 3.6V

3 实现的功能及图片展示

本项目由RP2040 Game Kit、两个8*8LED灯板、杜邦线和数据线构成,从而实现电子沙漏的制作。图3.1为电子沙漏的实物图,图3.2为LCD显示图,图3.3为运行时沙漏流沙图。

FiIj9FVgqbT3sq2BTA-pERCesjex

图3.1 电子沙漏实物图

FsbBCoDxs3XNwV00usUVQadA_oYq

图3.2 LCD页面

FoyeQtA3UDJD3hIcvJK9-jAz9JZt

图3.3 沙漏流沙图

相关功能:

1、沙漏显示流沙

2、每一秒自动校准沙漏的方向

3、按下A键重置沙漏

4、按下B键,控制遥感的方向改变沙漏的流沙时间

4  实现过程

4.1 程序流程图

FuK7d6By68G84YUQZSwUdthUD3Wo

4.2 主要代码片段及说明

初始化配置

#配置MMA7660
i2c1 = I2C(1, scl=Pin(11), sda=Pin(10))
acc = MMA7660(i2c1)
acc.on(True)
d = bytearray(3)
r = [0 for x in range(3)]
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
#配置LCD显示驱动
st7789_res = 0
st7789_dc  = 1
width = 240
height = 240
CENTER_Y = int(width/2)
CENTER_X = int(height/2)
spi_sck=machine.Pin(2)
spi_tx=machine.Pin(3)
spi0=machine.SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
display = st7789.ST7789(spi0, width, width,
                          reset=machine.Pin(st7789_res, machine.Pin.OUT),
                          dc=machine.Pin(st7789_dc, machine.Pin.OUT),
                          xstart=0, ystart=0, rotation=0)

LCD屏幕显示相关代码

display.fill(st7789.BLACK)
display.text(font2, "Quicksand time", 5, 0)
display.text(font2, "(s)", 170, 40)

调用st7789文件中的相关函数,用于显示流沙时间Quicksand time及单位

摇杆控制模块部分代码

for i in range(0,30):
        adc=control.read_u16()
        duty=int(adc*(6553-3276)/0xffff)+3276
        pwm.duty_u16(duty)
        if duty <= 4000:
            per=per+156.25
            p=str(int(per*64)/1000)
            display.text(font2, p, 80, 40)
            time.sleep(0.5)
        elif duty >= 6000:
            per=per-156.25
            p=str(int(per*64)/1000)
            display.text(font2, p, 80, 40)
            time.sleep(0.5)
        tim1.init(period=int(per),mode=Timer.PERIODIC,callback=gaijudge)

摇杆控制模块是基于servo模块进行修改,对ADC数据区分进实现对摇杆控制方向的逻辑判断,从而实现流沙时间的改变。

流沙效果相关代码

def xiaoguo():
        global judge1
        global judge2
        global judge3
        if judge1!=judge2:
            i2=2*judge1
            i1=i2+1
            j1=8*judge1+128
            j2=j1+1
            j3=j2+1
            j4=j3+1
            j5=j4+1
            j6=j5+1
            j7=j6+1
            j8=j7+1
            if judge3==0:
                liusha1(i1,i2,j1,j2,j3,j4,j5,j6,j7,j8)
            elif judge3==1:
                liusha2(i1,i2,j1,j2,j3,j4,j5,j6,j7,j8)
            judge2=judge1
        i=2*judge1
        j=8*judge1+135
        if judge3==0:
            display1(shalou[i][7],shalou[i][6],shalou[i][5],shalou[i][4],shalou[i][3],shalou[i][2],shalou[i][1],shalou[i][0])
            display2(shalou[j][7],shalou[j][6],shalou[j][5],shalou[j][4],shalou[j][3],shalou[j][2],shalou[j][1],shalou[j][0])
        elif judge3==1:
            display2(shalou[i][0],shalou[i][1],shalou[i][2],shalou[i][3],shalou[i][4],shalou[i][5],shalou[i][6],shalou[i][7])
            display1(shalou[j][0],shalou[j][1],shalou[j][2],shalou[j][3],shalou[j][4],shalou[j][5],shalou[j][6],shalou[j][7])

采用指针的方式展现流沙的效果,可以减少数组中元素的个数。

5  遇到的主要难题及解决方法

首先是编程语言的问题,由于我只接触过C、C++,对于嵌入式、python的知识不是很了解。尤其是,RP2040不能采用C语言编程。考虑到编程语言micropython,所以我现学了python的基本知识。

流沙的效果展示是本项目的核心,因为要出现流沙的效果,需要先对LED灯板进行取样,数据保存到数组中,通过控制定时器的时间达到延时的效果。数组流沙和进沙的展示需要对数组进行相应的编程。为了减少数组的取样个数,采用指针变量,改变地址,减少了部分数据的采样。

6  未来的计划及建议

感谢硬禾学堂给予的机会,很高兴能在假期中参加暑假在家练活动,在这次活动中我收获了很多。之前我没有过自己独自做项目的经验,通过这次,我知道面对一个新的课题,新的开发板,应该如何进行下去,而不是在那发懵不知道从哪里下手。在接下来的寒暑假如果有时间我会继续参加类似的活动,来锻炼自己。

附件下载
项目1:电子沙漏.rar
团队介绍
沈阳理工大学在校学生
团队成员
cong
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号