项目总结报告
一.任务介绍:
本次设计任务要求基于Raspberry Pi Pico(RP2040)平台,开发一款体感控制的重力迷宫游戏。玩家通过倾斜开发板,利用姿态传感器检测俯仰和横滚角度,控制小球在LCD屏幕上实时移动,穿越固定迷宫。系统需包含至少3个难度递增的关卡,并具备完整的游戏控制功能:按键实现开始、暂停、重开与关卡切换。游戏界面需实时显示计时与得分,并通过蜂鸣器提供碰壁与通关的音频反馈。该任务综合运用了嵌入式系统的多项核心技术,包括传感器数据采集与处理、实时图形渲染、人机交互设计以及状态机编程思想。
二.项目介绍:
本项目"重力迷宫滚球"是一款基于RP2040游戏开发套件的体感益智游戏。游戏的核心机制源于经典的滚珠迷宫玩具:玩家通过物理倾斜整个设备,利用重力引导小球从起点抵达终点。与传统物理迷宫不同,本项目采用姿态传感器实时感知设备姿态,并将角度数据映射为小球在二维平面上的加速度,从而实现虚拟小球的平滑运动。
游戏设计了三个固定迷宫关卡,从简单障碍训练到复杂通道探索,难度逐级递增。玩家可通过板载按键控制游戏状态,系统实时记录通关时间并显示得分。当小球触碰迷宫墙壁时,蜂鸣器发出短促提示音;成功抵达终点时,则播放特定通关旋律。项目旨在通过趣味性游戏展示嵌入式系统的综合应用能力,同时为玩家带来新颖的体感交互体验。
三.硬件介绍
硬件组件 | 型号 | 功能说明 |
主控芯片 | Raspberry Pi RP2040 | 双核Arm Cortex M0+处理器,主频133MHz,负责所有逻辑控制与数据处理 |
姿态传感器 | MMA7660 | 三轴数字加速度计,I2C接口,用于检测设备倾斜角度
|
液晶屏幕 | 1.3英寸IPS LCD,分辨率240×240 | ST7789控制器,SPI接口,用于实时显示迷宫与小球 |
蜂鸣器 | 无源电磁式蜂鸣器 | GPIO驱动,PWM控制,提供游戏音效反馈 |
输入设备 | 四向摇杆+ 2个轻触按键 | 用于游戏控制(开始/暂停/重开/关卡切换) |
四.方案框图和项目设计思路介绍
1. 方案框图
2.项目设计思路
(1)核心设计理念:
将物理世界的倾斜转化为虚拟小球的运动,关键在于建立"传感器角度→小球加速度→小球速度→小球位置"的映射链。
(2)姿态映射算法:
从MMA7660读取三轴加速度数据,计算俯仰角(X轴)和横滚角(Y轴)。角度值映射为小球在X/Y方向的加速度分量。例如,向右倾斜产生正向X加速度,向上倾斜产生正向Y加速度。通过调节映射系数,控制游戏的灵敏度。
(3)物理引擎设计:
采用简易欧拉积分法,每帧更新小球的速度和位置。引入摩擦系数实现自然减速,避免小球无限滑动。位置更新公式:
v_x += ax * deltaTime - friction * v_x * deltaTime
x += v_x * deltaTime
(4)碰撞检测机制:
基于迷宫地图的像素级碰撞检测。迷宫存储为二维数组(0表示通路,1表示墙壁)。小球位置映射到地图坐标,检查周围区域是否触碰墙壁。若检测到碰撞,回退位置并重置对应方向速度,同时触发蜂鸣器提示。
五.调试软件及使用的编程语言说明、软件流程图及关键代码介绍
1.软件说明
本项目采用MicroPython 作为主要编程语言。MicroPython为RP2040提供了丰富的硬件库支持,能够快速开发原型,特别适合需要频繁调试传感器和显示逻辑的教学项目场景。
2.开发工具
Thonny IDE:轻量级Python编辑器,支持RP2040直接连接和文件传输
RP2040固件:预刷MicroPython的UF2固件
3. 关键代码介绍
(1)实时姿态数据获取:
# === 读取 IMU ===
tilt_x, tilt_y = 0.0, 0.0
try:
tilt_x, tilt_y = imu.get_tilt()
except:
pass
从MMA7660传感器读取当前倾斜角度。get_tilt()方法返回归一化后的X轴和Y轴倾斜值,范围约-1.0~1.0。异常处理确保在传感器通信失败时程序继续运行。
(2)碰撞响应机制
if hit_wall:
if current_time >= invincible_until:
lives -= 1
draw_lives(lives)
play_sound(200, 100) # 碰壁音效
invincible_until = current_time + 1000 # 1秒无敌时间
if lives <= 0:
game_state = "DEFEAT"
draw_defeat(lives)
else:
safe_x, safe_y = new_x, new_y # 无碰撞时更新位置
六.功能展示图及说明(实物展示、软件或工具调试)

实际运行游戏过程如图,具体游戏元素包括倒计时,生命值,起始点,终点等等,通过倾斜游戏机改变重力方向来改变方块移动方向,躲避墙体在有限时间内到达终点即为通关。
七.项目中遇到的难题及解决方法
难题1:
姿态传感器数据噪声导致小球抖动
现象表现为静止放置时,小球在屏幕上仍有微小抖动,影响游戏体验。
分析:MMA7660作为低功耗加速度计,原始数据存在±0.05g的随机噪声,直接映射到小球位置导致视觉抖动。
解决方法:
1.低通滤波:对传感器读数采用一阶低通滤波,filtered = 0.8*filtered + 0.2*raw,有效平滑瞬时跳变。
2.降低灵敏度:适当减小sensitivity系数,使小球响应更平缓
难题2:
碰撞检测边缘卡顿
现象为小球靠近墙壁时,有时会卡在墙壁边缘无法移动,或发生"穿墙"现象。
分析:初始碰撞检测采用单点检测(只检查小球中心点),当小球半径较大时,边缘部分可能已进入墙壁但中心点仍在通路,导致检测失效或物理响应异常。
解决方法:
1.多点检测:改为检测小球圆周上的多个采样点(上下左右四点),任一触点进入墙壁即视为碰撞。
2.位置回退机制:检测到碰撞后,将小球位置回退到前一有效位置,并反向速度,模拟物理反弹效果。
八.心得体会
通过本次"重力迷宫"项目的设计与实现,我对嵌入式系统开发有了更深入的理解和实践经验。
理论与实践结合的重要性:课堂上学习的传感器原理、数字滤波算法、状态机设计等理论知识,在项目中得到了实际应用。尤其是物理引擎的设计,需要综合运用运动学公式、碰撞检测算法和实时系统调度,让我深刻体会到理论指导实践的价值。
调试技巧的提升:项目开发过程中遇到了各种预料之外的问题,如传感器噪声、碰撞检测异常等。学会使用串口输出关键变量、逐步隔离测试模块、借助示波器观察信号波形等调试方法,这些技能对于解决复杂系统问题至关重要。