项目总结报告
一、所选任务介绍
任务名称:
【RP2040游戏机】重力迷宫滚球小游戏
任务要求:
1.使用姿态传感器(IMU)俯仰和横滚控制小球在迷宫中移动,LCD实时显示。
2.设计至少3关固定迷宫;按键实现开始、暂停、重开与关卡切换。
3.计时与得分显示在屏幕;蜂鸣器提示碰壁与通关。
二、项目介绍
这次寒假我参加了硬禾学习平台“电子森林”活动,我选择的项目是“RP2040游戏机”方向下的重力迷宫滚球小游戏。该项目聚焦于嵌入式系统的“输入—处理—输出”完整链路:通过姿态传感器(IMU)采集俯仰/横滚数据作为输入信号,经单片机处理后映射为游戏逻辑中的移动方向,再通过LCD实时显示迷宫、球的位置、计时与关卡信息,并通过蜂鸣器对碰壁、通关等事件做声音反馈。同时任务还要求加入按键交互,实现开始/暂停/重开/切关等功能,至少设计三关固定迷宫。
三、硬件简介
本次项目基于硬禾的RP2040学习平台板卡。平台核心芯片为 RP2040,并搭配屏幕、传感器与多种输入/输出外设。
本项目实际用到的硬件模块主要包括:
1.树莓派Pico核心芯片RP2040:
主要特点及组成为双核Arm Cortex M0+内核,可以运行到133MHz;具有264KB内存;有性能强大、高度灵活的可编程IO可用于高速数字接口;片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps、12位精度;支持MicroPython、C、C++编程;
2.相关的板上功能:
(1)240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789
(2)四向摇杆+ 2个轻触按键+一个三轴姿态传感器MMA7660用做输入控制
(3)板上外扩2MB Flash,预刷MicroPython的UF2固件
(4)一个红外接收管+一个红外发射管
(5)一个三轴姿态传感器MMA7660
(6)一个蜂鸣器
(7)双排16Pin连接器,有SPI、I2C以及2路模拟信号输入
(8)可以使用MicroPython、C、C++编程
(9)USB Type C连接器用于供电、程序下载
四、方案框图与设计思路
方案框图为:

在设计思路上,我把项目当成一个“小型游戏系统”来做,重点不是把功能堆上去,而是保证交互顺畅:倾斜控制要稳定、按键响应要可靠、屏幕刷新不能闪烁,核心是状态机+数据驱动地图+局部刷新 这几个点。
五、软件说明
1)开发环境与语言选择
本项目采用MicroPython 开发,编程语言选择为python语言。
2)软件流程

3)关键代码模块说明
1.状态机设计:STATE_MENU / STATE_PLAYING / STATE_PAUSED三态,按键触发状态切换。

2.迷宫数据结构:每关一个15×15二维数组,0表示路,1表示墙,3表示出口;起点单独配置,加载关卡时统一重置。这样的数据驱动方式便于扩展更多关卡。
3.坐标映射、滤波与imu逻辑:IMU原始数据先做轴交换与正负方向修正,再做简单一阶低通滤波(ALPHA)。

4.屏幕刷新优化:采用“局部擦除上一格+绘制新位置”的方式;HUD也采用缓存对比+时间间隔刷新,避免闪烁。

5.异常保护:IMU初始化与读取都try/except,确保硬件偶发异常时程序仍可运行,最多失去重力控制但不死机。
六、功能展示说明
1.开始界面:黑底标题“Gravity Maze”,提示“Press START”,并说明“倾斜移动红色方块”。
2.关卡界面:
(1)上方为迷宫区域:白色为道路,黑色为墙,绿色为出口,红色为玩家方块
(2)下方HUD:显示计时(MM:SS)、关卡(Lv.x/3)、当前位置坐标
(3)暂停效果:按START暂停后,小球停止响应倾斜输入,HUD时间保持在暂停时刻不再增长;再次按START继续并校正计时。
(4)碰壁反馈:当玩家试图进入墙格,蜂鸣器短促“滴”一声,同时位置不改变。
(5)通关流程:进入出口格后蜂鸣器发出更高音提示,并自动加载下一关;第三关通关后显示“You Win!”并回到菜单等待再次开始。
七、项目中遇到的难题与解决方法
1.IMU数据抖动导致移动不稳定
(1)问题:传感器原始数据波动较明显,轻微晃动也会触发方向变化,小球“乱飘”。
(2)解决:加入一阶低通滤波(ALPHA)对ax/ay平滑;同时引入TILT_THRESHOLD(倾斜阈值),只有超过阈值才移动。这样既稳定又保留灵敏度。
2.移动过快影响可玩性
(1)问题:循环频率高时,小球会连续移动,玩家难以控制,像“滑行失控”。
(2)解决:加入MOVE_COOLDOWN_MS限制连续移动的最短间隔,让移动呈现“格子步进”,更符合迷宫玩法。
3.屏幕刷新闪烁与性能压力
(1)问题:若每次移动都全屏重绘,MicroPython下会明显闪烁且耗时。
(2)解决:采用局部刷新策略:只重绘旧位置的背景格子,再绘制新位置的球;HUD也做缓存比较,只有时间/关卡/坐标变化时才刷新,并设置HUD_UPDATE_MS。体验明显提升。
八、心得体会与收获
说到心得与体会,这次寒假项目我最大的收获是第一次把“多个外设+游戏逻辑+ UI展示”真正做成一个完整作品。以前做嵌入式练习常常是单点式的:点亮屏幕、读一个传感器、按键控制LED……而这次需要把它们串起来,才会发现工程里最关键的是系统性思维:输入如何可靠、处理如何清晰、输出如何高效、体验如何稳定。
在技术层面,我对SPI/I2C/PWM/GPIO的使用更熟练了,也真正理解了“数据采集→滤波→阈值决策→控制输出”的闭环流程。尤其是IMU的处理,让我意识到传感器数据不是“读出来就能用”,必须结合滤波、阈值与节奏控制,否则交互会很糟糕。
这个小游戏的开发也让我对以后的项目设计更有信心,未来如果继续深入,我希望尝试加入更多关卡编辑机制、加入积分规则(碰壁扣分/用时评分)、甚至利用红外或更多外设实现双人互动。总之,这次电子森林项目让我真正体会到“从零到一做出能玩的东西”的成就感,也让我对嵌入式学习的兴趣更强了。