使用Arduino R4 WiFi和定制HAT板,无需面包板,打造一款手持复古游戏机
这是一个DIY手持式Arduino游戏机,由Arduino UNO R4 WiFi驱动。它在一块0.96英寸的SSD1306 OLED显示屏(128×64像素)上运行10款复古风格的街机游戏,通过四个触控按钮进行控制。配备5V升压转换器的锂聚合物电池使其具备完全便携性。所有元件均安装在定制的HAT型PCB板上,直接贴合Arduino主板,无需松散电线,也不需使用面包板。
包含的游戏:小行星、打砖块、恐龙、小鸟飞行、迷宫跑者、吃豆人、乒乓球、贪吃蛇、太空侵略者、俄罗斯方块。
这些并非原创的商业游戏,而是轻量级的复制品,经过重新创建和优化,以适应Arduino平台的内存和速度限制。
所需部件
•Arduino UNO R4 WiFi - 1个
•双面覆膜板 - 1块(用于HAT)
•0.96英寸I2C OLED显示屏(SSD1306,128×64)- 1个
•触控按钮 - 4个
•活动蜂鸣器 - 1个
•1SS 锂聚合物电池(3.7V)- 1个
•5V升压转换器模块 - 1个
•滑动开关 - 1个
•按需连接电线
接线 / / 引脚连接
所有组件均通过以下方式连接到Arduino R4 WiFi:
OLED显示屏(I2C)
•VCC → 5V
•GND → GND
•SDA → A4
•SCL → A5
按钮(低电平激活,另一端接地)
•UP → D4
•向下 → D2
•左 → D3
•右 → D5
蜂鸣器
•(+) → D7
•(−) → 0
电源
•5V升压转换器输出 → Arduino 5V引脚
•锂聚合物电池 → → → 滑动开关 → 电源升压转换器输入
硬件组装
所有元件均焊接在一块双面PCB板上,该PCB板尺寸与Arduino R4 WiFi接口头的引脚布局相匹配,本质上是一个定制的HAT。OLED、按钮和蜂鸣器安装在顶部,电源组件(升压转换器、电池连接器、滑动开关)则沿底部边缘排列。
让我省去烦恼的组装小贴士:
•在HAT上使用女性化头条带,以便在不焊拆的情况下取下进行重编程。
•将I2C线路(SDA/SCL)远离按钮信号线,以避免显示噪声
•在连接到Arduino之前,使用万用表确认升压转换器的输出电压恰好为5V。
•在所有锂聚合物电池的引线上使用热缩管,以防止短路。
•尽量缩短线缆,对于紧凑的构建来说,这一点比你想象的更重要。
代码架构
固件完全模块化。每个游戏都独立存在于自己的头文件中,主文件 main.inoo 只负责库的初始化、按钮读取、菜单以及游戏调度。这使得在不修改核心逻辑的情况下,轻松添加或删除游戏变得非常简单。
如果你刚接触Arduino,并希望在深入制作此类项目之前先熟悉基本操作,浏览一系列优质的Arduino项目是一个很好的方法,可以帮助你了解如何处理不同的外设,例如显示屏、按钮和蜂鸣器,然后再将它们整合成一个完整的系统。
所用库
Arduino.h - - 核心函数(pinMode、digitalRead、millis、tone)
U8g2lib.h - - 支持全帧缓冲和字体的OLED图形
Wire.h - - 显示屏的I2C通信
为什么选择 U8g222 而不是 Adafruit GFX?在开发过程中,Adafruit GFX 与 UNO R44 存在初始化问题。而 U8g2 从一开始就运行稳定,并且渲染性能更优。
引脚定义
游戏标题包含
按钮去抖功能
机械按钮在按下时会弹起,快速在高电平和低电平之间闪烁数毫秒。如果没有去抖功能,单次按键可能会被识别为5个以上的输入信号,从而破坏游戏体验。该功能通过软件来处理这一问题:
每个按钮都有其独立的静态状态和时间戳。只有在最后一次状态变化后经过40毫秒,按压才会被记录为有效——具备清晰的边缘检测,避免误触发。
设置功能
按钮使用 INPUT_PULLUP 以获得稳定读数。通过 randomSeed(analogRead(A0)) 从模拟噪声中获取随机种子,因此每次开机时,像小行星生成这样的游戏行为都会真正实现随机。
主循环
menuSelect()() 显示可滚动的游戏列表。向上/向下导航,向左/向右确认。游戏结束后,控制权会自动返回此处,无需重置。
工作原理(用户流程)
1. 开机 → → 出现启动画面 → → → 按任意按钮继续
2. 游戏列表菜单加载中,上下滚动
3. 按左或右键启动游戏
4. 游戏结束 → 自动返回菜单
我遇到的挑战
库不兼容问题:Adafruit GFX 在 Arduino UNO R4 上初始化失败。改为使用 U8g22 后立即正常工作,并且提供了更好的渲染控制。
按钮弹跳:早期版本中,菜单会随机跳过某些项目。通过实现上述边缘检测去抖功能,并设置40毫秒的阈值,已解决该问题。
本文编译自hackster.io





