
低成本Arduino便携迷你游戏机
简介
使用不到1元成本Arduino芯片Air001 制作的迷你掌上游戏机
简介:使用不到1元成本Arduino芯片Air001 制作的迷你掌上游戏机开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
视频链接:
【合宙Air001 Arduino便携迷你游戏机】
项目简介
本项目使用合宙Air001 Cortex M0+作为主控单片机,基于Arduino环境开发的便携式迷你游戏机。
项目学习要点
- ARM指令集Cortex M0+核心MCU的学习
- Arduino For STM32的学习
- SSD1306 OLED的使用
- u8g2图形库以及XBM格式图片的使用
项目功能
- 板上有一个2032电池座,使用纽扣电池供电。
- 板上设计有电源开关、D-Pad和A、B两个按键,可适用于多种游戏的开发。
- 板上有一个适用于DAP Link的调试接口。
- 板上还有一个适用于合宙烧录器的调试接口,并有自动烧录、自动重启的功能电路,支持串口+Arduino进行程序的自动烧录和串口通讯,也可单独使用此接口的串口和合宙串口烧录工具进行固件的手动下载。
- 板上有SSD1306/SSD1315的驱动电路,以及一个30Pin的FPC屏线接口,可直接接入FPC接口的12864 OLED屏幕。
- 软件部分开发了一个2048的游戏,可使用D-Pad进行游玩。
硬件原理解析
- 主控部分
- 按键部分
D-Pad的四个方向键和A、B两个按键的检测引脚使用电阻进行下拉
- 屏幕驱动部分
- 电源部分
- 下载电路
其中JP1和JP2是合宙下载器的下载接口,JP3是DAP-Link下载器的下载接口。右侧使用两个三极管,根据串口DTR和RTS的信号对主控的RST复位引脚以及BOOT引脚进行操作,以实现Arduino的自动进入下载模式还有下载结束后的自动重启。
软件解析
软件使用基于Arduino编程环境编写,分为公共数据定义部分、初始化部分、按键中断部分、定时器中断部分 以及 主绘制循环 四大板块
- 在公共数据定义部分,我们依次定义程序中将要使用的[按键状态组]、[游戏状态]、[2048游戏16格的数据]、[2048游戏剩余可使用格子数量]、[游戏得分]的存储变量,还有要在屏幕上绘制的数字、字母、图标等要素的绘制数据。
- 在初始化部分,我们首先依次初始化OLED屏幕,设置所有按键对应的引脚并将其设置为输入模式,初始化硬件定时器,将D-Pad四个方向键和A键的中断开启
- 在按键中断部分,首先新建一个可以根据传入引脚号以及按键编号两个数据,从而对按键的状态进行检测,在按键抬起的时候修改公共定义中[按键状态组]对应编号的状态数值。然后将D-Pad四个按键的中断都转发给此函数进行处理。
而按键A则在抬起时,根据公共数据中的[游戏状态值]进行响应的逻辑。
当游戏状态是未开始时,开启主定时器并在棋盘16个位置中随机选择两个位置,将公共定义中的[2048游戏16格的数据]对应的位置从0(无数据)改为1(这个游戏数据不会直接保存每个格子的数字,而是保存每个格子的数字是由几个2相乘得来的,比如2048是11个2相乘),然后将公共定义中[2048游戏剩余可使用格子数量]设置为14。
若游戏是进行状态,则将其切换为暂停状态
若游戏是暂停状态,则将其切换为进行状态
若游戏是结束状态,则将其切换为未开始状态
- 在定时器中断部分,我们将在每个0.1秒(定时器的触发频率)根据D-Pad四个方向按键是否按下依次对公共定义中[2048游戏16格的数据]的每个格子数据进行判定,每行每列的数据根据游戏规则进行合并、移动。同时同步操作公共定义中[2048游戏剩余可使用格子数量]。并在每次数据合并移位完毕后,再随机挑选一个空白格子将其数字修改为初始的2(这里实际存储的是1)。若公共定义中[2048游戏剩余可使用格子数量]只剩下一个,则需要检测所有的16个格子,每个格子的上下左右是否还有可以进行合并的数字,若没有任何可以合并的数字,则判定游戏失败,将公共定义中的[游戏状态]修改为结束状态。
- 在主绘制循环部分,我们根据公共定义中[游戏状态]进行响应界面的绘制。
未开始状态则绘制2048的logo和按A开始的提示。
游戏进行状态则根据公共定义中[2048游戏16格的数据]依次绘制棋盘每个格子,并在屏幕的最左上角绘制按键A的暂停提示。
游戏暂停状态则在屏幕显示暂停提示以及当前的游戏分数。
游戏结束状态则在屏幕显示结束提示以及本局游戏的分数。
设计图

BOM


评论