描述
<h1>0、视频展示</h1>
<p><a href="https://www.bilibili.com/video/BV1Th4y117CR/" target="_blank"><div style="text-align:center;"><span style="font-weight:bold;font-size:3em;padding:0px 5px;font-family:'楷体';" class="btn badge badge-pill badge-danger">点击观看视频</span></div></a></p>
<h1>1、项目功能介绍</h1>
<p>这是一款信用卡大小,基于瑞萨MCU的小型游戏机,OLED屏128*64分辨率,内置七款小游戏,可充电350毫安时锂电池,工作电流约15mA,待机电流小于100μA。板载daplink。
<img src="//image.lceda.cn/pullimage/6BZ5tXxqdZLFDHyuNg2TGWUbVWfGrtnp4uo0VKWy.png" alt="image.png"></p>
<h2>内置游戏</h2>
<ul>
<li>[x] 恐龙游戏</li>
<li>[x] 像素鸟</li>
<li>[x] 贪吃蛇</li>
<li>[x] 五子棋</li>
<li>[x] 2048</li>
<li>[x] 太空侵略者</li>
<li>[x] IKUN
<h2>功能</h2></li>
<li>[x] 超长待机</li>
<li>[x] 待机时保存游戏进度</li>
<li>[x] 板载DAP-LINK
<h1>2、项目属性</h1>
<p>首次公开,原创作品。</p>
<h1>3、开源协议</h1>
<p>The GNU General Public License v3.0</p>
<h1>4、硬件部分</h1>
<h2>电路</h2>
<table>
<tr>
<th><img src="//image.lceda.cn/pullimage/UW5eNqXUG0jP7HIo6Fs8V2hkzDb82FuVkNZovZqK.png" alt="image.png">
硬件部分比较简单,usb进来的电流通过ETA6002为锂电池充电,ETA6002同时负责电池的放电,放电分为两路,一路供给mcu,一直供电;另一路供给oled和蜂鸣器,由mcu控制对应的ldo实现在休眠模式下断开他们的供电。
另外,usb同时为板载的daplink供电并交换数据,daplink通过swd接口与ra单片机相连。
oled通过spi与mcu连接。
蜂鸣器由mcu输出4000HZ的pwm信号,经一三极管控制。</th>
<th>主要芯片</th>
<th>功能</th>
</tr>
<tr>
<td>R7FA2E1A72DFL</td>
<td>主控MCU,M23核心48M,16kb+64kb</td>
</tr>
<tr>
<td>SH1106(CH1116)</td>
<td>1.3寸OLED屏</td>
</tr>
<tr>
<td>ETA6002</td>
<td>锂电池充放电</td>
</tr>
<tr>
<td>ME6211C33M5G-N</td>
<td>LDO</td>
</tr>
<tr>
<td>CH32V203F6P6</td>
<td>daplink</td>
</tr>
</table>
<h2>结构</h2>
<p>电路板四角粘贴磁铁,面板同样粘贴磁铁,通过磁吸,夹住3D打印夹层。
磁吸的设计使外壳上没有螺丝固定,并且易拆卸。
目前3d外壳无法导出,等待立创eda修复bug。该bug与侧面开孔有关,删除侧面开孔后可导出,但usb接口的开孔也随之消失。临时的解决方案是3d打印到手后手动打磨。
已用SolidWorks重画,见附件。
<img src="//image.lceda.cn/pullimage/CFqSyG6lVuk5Z51bN8fI3URxzHKD6Ea9H1hVm9GX.png" alt="image.png">
<img src="//image.lceda.cn/pullimage/j3GoN0yrvXD6VfwK0KSPhJYFDvzyr3th7wlU9Lq1.png" alt="image.png"></p>
<h1>5、软件部分</h1>
<h2>代码获取</h2>
<p>代码托管在github上:<a href="https://github.com/liux-pro/AtomBoy" target="_blank">https://github.com/liux-pro/AtomBoy</a>
另外,daplink固件使用<code>@XIVN1987</code>大佬的固件,他的开源地址是<a href="https://github.com/XIVN1987/DAPLink" target="_blank">https://github.com/XIVN1987/DAPLink</a></p>
<h2>为板载的DAPLINK烧录固件</h2>
<ol>
<li>(可跳过此步骤,直接使用附件里的固件)下载daplink代码并使用<a href="http://www.mounriver.com/" target="_blank">MounRiver Studio</a>编译daplink固件。</li>
<li>下载并安装<a href="https://www.wch.cn/downloads/WCHISPTool_Setup_exe.html" target="_blank">WCH单片机烧录工具</a></li>
<li>如图所示选择ch32烧录,图中第六步选择附件的CH32V203_DAPLink_aa14c15.hex<img src="//image.lceda.cn/pullimage/LtrHnlz2sBdDsw1n4bBCYjze3ffcGrfltzh3YITj.png" alt="image.png"></li>
<li>短接pcb上的DAP BOOT触点。<img src="//image.lceda.cn/pullimage/m3fFgw27HJPusJGVrMLqFzndenVMG6sfd70nc2Rf.png" alt="image.png"></li>
<li>通过usb数据线插入电脑,软件会自动烧录daplink固件。</li>
<li>至此DAPLINK已就绪。<img src="//image.lceda.cn/pullimage/8QYhiGmaOVx9kdo1toZ3uKv7Jt2d9zKg4LMKXeVT.png" alt="image.png">
<h2>编译AtomBoy</h2>
<p>使用了瑞萨<a href="https://github.com/renesas/fsp/releases/tag/v4.5.0" target="_blank">RASC</a>生成基于cmake组织的工程文件,需使用<a href="https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads" target="_blank">ARM GCC</a>编译。
如果要在自己的电脑上编译,首先安装好cmake,ninja,然后下载<a href="https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads" target="_blank">ARM GCC</a>,执行如下编译命令。
假设gcc工具链解压到了D盘根目录。</p>
<pre><code class="language-bash">cmake -B build -G Ninja -DCMAKE_FIND_ROOT_PATH=D:/gcc-arm-none-eabi-10.3-2021.10-win32/gcc-arm-none-eabi-10.3-2021.10/bin
cmake --build build </code></pre>
<h2>烧录AtomBoy</h2>
<p>由于板载了DAP-LINK,不需要使用外置烧录设备,预先装好python3,通过pip安装pyocd。</p>
<pre><code class="language-bash">pip install pyocd</code></pre>
<p>之后usb链接电脑后,通过板载daplink直接烧录程序。</p>
<pre><code class="language-bash">cmake --build build --target flash</code></pre>
<h2>模拟器</h2>
<p>为方便调试,避免每次修改都要重新烧录,额外写了一个模拟器使大部分代码可以在电脑上运行。
<img src="//image.lceda.cn/pullimage/7K7FC2ISm2n9Hc87FRDm8zm4B1uxpqWTjmg3TDtO.gif" alt="1690698861953.gif"></p></li>
<li>装好 <a href="https://www.msys2.org/" target="_blank">msys2</a> 环境</li>
<li>(可选)使用 msys2-mingw64 执行<code>sed -i "s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*</code>切换国内源</li>
<li>使用 msys2-mingw64 执行<code>pacman -S mingw-w64-x86_64-SDL2</code>,安装SDL2</li>
<li>使用 msys2-mingw64 执行<code>pacman -S mingw-w64-x86_64-toolchain cmake make ninja git</code>,安装编译器等</li>
<li><code>cd emulator && cmake -G Ninja -B build</code></li>
<li><code>cd build && ninja</code></li>
<li><code>./AtomBoyEmulator.exe</code>
<h2>使用CLion</h2>
<p>使用CLion能加快开发效率,避免手动敲命令。
说不明白,看视频吧。视频中演示了如何编译,烧录,如何使用模拟器。
<a href="https://www.bilibili.com/video/BV1Nx4y1X7iN/" target="_blank">https://www.bilibili.com/video/BV1Nx4y1X7iN/</a>
<img src="//image.lceda.cn/pullimage/7w6R6P4KbqfsK6NMekqyyiwRDufS1ZnjVMKmTC5d.png" alt="image.png"></p></li>
</ol></li>
</ul>
<h2>代码结构</h2>
<h3>目录</h3>
<pre><code class="language-bash">├─.github
│ └─workflows # Github Action 自动构建hex文件
├─cmake # cmake脚本,RASC自动生成
├─emulator # 基于SDL的模拟器
├─ra # 系统代码,RASC自动生成
├─ra_cfg # 系统代码,RASC自动生成
├─ra_gen # 系统代码,RASC自动生成
├─script # 链接脚本,RASC自动生成
└─src # 源码
├─app # 应用程序
├─Arduino # 模拟Arduino形式
├─buzzer # 蜂鸣器
├─fps # 控制屏幕刷新,提供系统system tick
├─u8g2 # u8g2源码
└─u8g2_port # u8g2移植
└─main.cpp # 主函数入口
└─button.cpp # 按键扫描
└─sleep.cpp # 低功耗模式 </code></pre>
<h3>RASC生成</h3>
<p>代码基本结构通过RASC生成。可通过RASC导入本项目进行对瑞萨mcu的引脚,时钟,外设等配置。编译过程不需要rasc的参与。
RASC当前版本(v4.5)生成的cmake文件有各种问题,在本项目中已改成,自己生成新项目需注意。</p>
<ul>
<li><a href="https://github.com/renesas/fsp/issues/256" target="_blank">https://github.com/renesas/fsp/issues/256</a></li>
<li><a href="https://github.com/renesas/fsp/issues/280" target="_blank">https://github.com/renesas/fsp/issues/280</a>
<h3>整体架构</h3>
<ol>
<li>由定时器生成1ms的时钟源,每隔约16ms更新标志位,主循环轮询获取标志位后刷新一帧,算力足够的情况下能稳定帧率。</li>
<li>驱动OLED屏使用U8G2,移植采用硬件SPI。</li>
<li>每个按键直连一个GPIO,GPIO开启内部上拉,随屏幕刷新更新按钮状态,发现GPIO向低电平跳变代表按钮按下。无消抖。游戏中要每帧调用扫描函数,更新按键状态。</li>
<li>每个游戏(含主菜单)都视为一个app。主循环通过变量<code>nextApplication</code>判断进入哪个app,默认进入主菜单。</li>
<li>每个app实现run抽象方法,在内部通过u8g2操作屏幕实现游戏逻辑,run方法返回后重新进入主循环。</li>
<li>在菜单app中,选定某项后,修改<code>nextApplication</code>后return,下一轮循环根据修改后<code>nextApplication</code>进入选定的游戏。</li>
<li>power键试实现了短按、长按,超过500ms视为长按。长按重启系统。短按进入低功耗模式,通过power按键的再次按下唤醒系统。</li>
<li>通过goSleep函数进入低功耗模式,关闭无关的LDO,被唤醒后恢复oled,蜂鸣器供电,并重新初始化oled,以便继续执行谁面前的逻辑。</li>
<li>5分钟无任何操作自动进入低功耗模式。</li>
<li>整体对时钟稳定性要求不高,采用内置振荡器。</li>
<li>每个APP内尽量不使用全局变量。未开启堆内存,分配 14000kb 栈内存。</li>
</ol></li>
</ul>
<p>注:若您的项目涉及软件开发,请在附件上传对应的工程源码。这里可以详细说明您的软件流程图、功能模块框图、相关算法的解释或科普、源码结构、编译环境的搭建和配置、源码编译方法、程序烧录方法等。推荐图文并茂的形式向别人介绍您的想法。</p>
<h1>6、BOM清单</h1>
<table>
<tr>
<th>大部分器件可在立创商城购买,在嘉立创eda中所有器件均已做<strong style="color:#FF0000;">器件标准化</strong>,绑定了立创商城编号。另外的配件购买链接如下。</th>
<th>元件</th>
<th>规格</th>
<th>购买链接</th>
<th>备注</th>
</tr>
<tr>
<td>OLED屏</td>
<td>插接16PIN 白光</td>
<td><a href="https://item.taobao.com/item.htm?id=661586745978" target="_blank">https://item.taobao.com/item.htm?id=661586745978</a></td>
</tr>
<tr>
<td>锂电池</td>
<td>303040-350毫安</td>
<td><a href="https://item.taobao.com/item.htm?id=578342493353" target="_blank">https://item.taobao.com/item.htm?id=578342493353</a></td>
<td>让卖家配 <strong>1.25正向</strong> 插头</td>
</tr>
<tr>
<td>摇杆</td>
<td>10*10*9MM</td>
<td><a href="https://item.taobao.com/item.htm?id=595134302480" target="_blank">https://item.taobao.com/item.htm?id=595134302480</a></td>
<td>同时购买键帽;买两套</td>
</tr>
<tr>
<td>CH32V203F6P6</td>
<td>CH32V203F6P6</td>
<td><a href="https://item.taobao.com/item.htm?id=689965812965" target="_blank">https://item.taobao.com/item.htm?id=689965812965</a></td>
<td></td>
</tr>
<tr>
<td>磁铁</td>
<td>50片 8*2mm</td>
<td><a href="https://item.taobao.com/item.htm?id=44141739720" target="_blank">https://item.taobao.com/item.htm?id=44141739720</a></td>
<td>高温会让磁铁消磁</td>
</tr>
</table>
<h1>7、大赛LOGO验证</h1>
<p><img src="//image.lceda.cn/pullimage/e4D1l3djrkdYCTCwchHBzKuC4EA3mHLyY2SgnASS.png" alt="image.png"></p>
<h1>8、演示您的项目并录制成视频上传</h1>
<p><a href="https://www.bilibili.com/video/BV1Th4y117CR/" target="_blank">https://www.bilibili.com/video/BV1Th4y117CR/</a></p>
<h1>9、由开源软件强力驱动</h1>
<table>
<tr>
<th>功能</th>
<th>开源链接</th>
</tr>
<tr>
<td>OLED驱动</td>
<td><a href="https://github.com/olikraus/u8g2" target="_blank">https://github.com/olikraus/u8g2</a></td>
</tr>
<tr>
<td>DAPLink固件</td>
<td><a href="https://github.com/XIVN1987/DAPLink" target="_blank">https://github.com/XIVN1987/DAPLink</a></td>
</tr>
<tr>
<td>五子棋AI算法</td>
<td><a href="https://gitlab.com/nowozin/maxigoarduboy" target="_blank">https://gitlab.com/nowozin/maxigoarduboy</a></td>
</tr>
<tr>
<td>ikun动画压缩算法</td>
<td><a href="https://www.quicklz.com/" target="_blank">https://www.quicklz.com/</a> (官网打不开了)</td>
</tr>
<tr>
<td>恐龙游戏素材</td>
<td><a href="https://github.com/chromium/chromium" target="_blank">https://github.com/chromium/chromium</a></td>
</tr>
<tr>
<td>瑞萨SDK</td>
<td><a href="https://github.com/renesas/fsp" target="_blank">https://github.com/renesas/fsp</a></td>
</tr>
</table>
<h1>10、可优化部分</h1>
<p>重新排布元件使电池附近1mm无元件,减少装配难度。
usb口置于左或右侧,而不是上下的长边处。现有的设计typec口处太薄了,强度不够。另外可以埋入小铁棍加强筋。
面板磁铁粘贴处除胶,改用ab胶粘贴,自带的3m胶不足以粘强磁。
摇杆太小,方向不好控制。
无法显示电量,充电状态。</p>
评论(31)