成本60元,用ESP32-S3做个开源游戏机,能玩FC/NES、GameBoy,还有专属彩色PCB

前言

之前复刻了一个基于全志 F1C200S 的模拟器游戏机,但是做下来感觉还是比较麻烦的,主要有两个痛点:

  • 一个是元件太多,像 DC-DC 就有三路,以及焊接难度大,像屏幕的 0.5mm FPC 插座
  • 另外一个是 Linux 系统的编译,过程比较复杂,也没有清晰的教程,想要定制的话比较麻烦

因此就想找找看有没有更简单的方式可以做模拟器游戏机,刚好平时用 ESP32-S3 系列比较多,并且相对于以前的游戏机来说,双核 240MHz 的性能也是足够的,应该可以用来模拟各种游戏机,就去找了一下。

然后就在 GitHub 上找到了 RetroGo 这个项目,一个完整的模拟器固件,支持 ESP32 系列 MCU,但是并没有找到直接对应的硬件项目,在立创开源平台上也没找到简单易用的,那就自己从头搞一个吧~

PS. 这个游戏机也可以当 ESP32-S3 开发板来用,具备 SPI 屏幕、TF 读卡器、I2S 功放、用户按键等多种外设 😃。

RetroGo 介绍

RetroGo 是一个开源的模拟器固件,主要支持的是乐鑫的 ESP32 系列 MCU,例如 ESP32、ESP32-S3,支持的模拟器也相当多,常见的 FC/NES、GameBoy、GameBoy Color 等都支持。

项目地址:https://github.com/ducalex/retro-go

Preview

Retro-Go is



阅读全文 »

做键盘必备,抛掉ST-Link,通过USB烧录固件,STM32F103使用STM32duino-bootloader 踩坑记录

前言

之前在 DIY 基于 QMK 固件的键盘的时候,直接借鉴了立创开源平台上的项目,使用了 ATmega32A 作为主控,ATmega32A 本身并没有硬件 USB 接口,把它作为键盘主控是通过使用 USBaspLoader 这样一个 bootloader 来实现的。

但是毕竟是软件实现,在以前复刻时,使用 ATmega32A 的键盘还是能正常配合 MacBook 使用的,但是最近发现在连接到 MacBook 之后,会很快丢掉连接,这下不得不去找一个带硬件 USB 接口的 MCU 了。

这时我就把眼光放到了 STM32F103C8T6 上,玩了这么久的 ESP32、CH32V003 什么的,还是没能逃过 STM32 😃。

而且相对 ATmega32A,STM32F103C8T6 的系统资源就丰富太多了,64KB Flash、20KB RAM 用来烧录一个 QMK 固件那是相当够用了,什么宏、层的数量,都开到最大。

最后的重点,作为习惯了使用 USB 直接烧录固件的人,也希望给 STM32F103C8T6 刷固件时也可以直接通过 USB 刷,这就找到了 STM32duino-bootloader 这个项目。

阅读全文 »

一个开源小钢网丝印台项目使用体验

自从用上嘉立创 PCB 打样之后,DIY 项目是越搞越复杂,一块 PCB 上几十个元件都是家长便饭了,一开始还会用针铜锡膏,次数多了之后,觉得这个效率还是非常低的。

然后开始尝试直接做钢网,使用钢来来刷锡膏,的确方便很多,即使元件再多,也基本上一分钟就能完成刷锡膏的操作,不用再用针筒一个一个焊盘的去点锡。

但是毕竟是 DIY,家里也不会有丝印台,通常在刷锡膏的时候,都是将钢网和 PCB 对齐后,使用胶带将钢网固定在桌面上,但是这样有一个不方便的地方,就是如果同样的 PCB 需要多次刷锡膏,就可能会存在二次刷锡膏的时候对不齐的情况。

刚好有天刷到一个视频,介绍了一个开源的桌面小钢丝丝印台,做了一个,这里分享一下。

另外配合摸索出来的牛皮网钢网,省钱技能又上一个台阶 😃

最终成品

diy-solder-paste-table-1

整体 3D 打印还算简单,大概注意一下摆放方向就可以了。

作者在项目介绍里说明了需要的配件,包含两种规格,最终实践下来我发现可以不用买多种规格,可以直接某宝搜索以下类型的螺丝螺母:

  • M3*12 内六角杯头螺丝螺母垫片套装
  • 蝶形螺母 M3

基本上这些就可以满足组装需求了。

使用过程

我使用这个丝印台的时候没有去用正经钢网,还是用的牛皮纸钢网。

测试用的 PCB 是 1.0mm 厚度,板子太小得弄两块垫在后面。

diy-solder-paste-table-2

先把钢网和 PCB 焊盘对齐,对齐之后,就可以把夹具的螺母拧紧了。

diy-solder-paste-table-3

对齐之后直接刷锡膏,由于这个是牛皮纸做的,因此要额外小心,刮板要从 PCB 内部开始,要不然就会导致牛皮纸变形了。

diy-solder-paste-table-4

最终刷锡膏效果,有点没对齐导致锡膏有点歪了。

diy-solder-paste-table-5

刷完锡膏就可以上加热台铁板烧了。

使用感受

  • 整体尺寸不算大,测量了一下 PCB 在 60x80mm 以内稍微合适一点
  • 使用牛皮纸的时候,夹具在螺母拧紧之后,会因为中间有厚度,而螺丝位置没有厚度,会整体变形,导致并不能很好地夹紧牛皮纸,不知道正经钢网会不会好一点
  • 同样因为使用牛皮网,PCB 板子比较小的时候,刮锡膏前后没有支撑,最好还是多放一块可以更好地回收锡膏


阅读全文 »

全开源!使用 7 毛钱的单片机 DIY USB 电流表教程,入坑硬件设计、固件开发、外观建模

之前已经连载完了 DIY USB 电流表的所有章节,这里汇总介绍一下这个项目,希望对电子 DIY 感兴趣的朋友们有所帮助。

这个 DIY USB 电流表的所有内容都已经开源,包括:

  • 硬件原理图
  • 硬件 PCB 布局布线
  • MCU 固件代码
  • 外壳 3D 模型 STL 文件
  • 面板生产文件

在文末可以找到开源项目的所有资料,其中硬件部分在立创开源平台,其他部分在 GitHub 中。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

项目介绍

这是一个基于沁恒 CH32V003 和德州仪器 INA219 的 DIY USB 电流表,使用 CH32V003 作为主控 MCU 来读取和显示电压电流数据,INA219 作为电压电流监测计,并且通过两个按键来进行交互。

主要元件

  • MCU:CH32V003
  • 电压电流监测:INA219
  • 显示设备:SSD1306 OLED
  • 输入输出:USB Type-C
  • 采样电阻:10mR

功能设计



阅读全文 »

DIY USB 电流表(10):完结篇,外壳和面板设计

在截止到前一篇 《DIY USB 电流表(9):Flash 模拟 EEPROM 存储累计电量》 后,我们已经完成了 DIY USB 电流表的所有硬件和软件开发工作,接下来就需要设计一个稍微正经一点的外壳将 PCB 包装起来,除了更好看一点的同时,还可以防止裸露的 PCB 接触到导体之后造成意外短路的情况。

另外,为了体验一下嘉立创的亚克力面板定制服务,这次的 USB 电流表外壳采用面板 + 外壳的方式来完成,PCB 通过 M2 自攻螺丝固定在 3D 打印的外壳上,再将面板通过双面胶粘贴到外壳上。

当然我也是 3D 建模业余选手,只会基本的长方体布尔切割操作什么的,设计的外壳主打一个能用就行 🙈。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

导出 PCB 3D 模型

为了更好的确定外壳的尺寸和各个接口、按键的位置,可以先在立创 EDA 专业版中导出 PCB 的 3D 模型文件,这样在建模软件里可以有更直观的参考。

diy-usb-meter-10-1

外壳设计

最终外壳基本上就是根据 PCB 的外形设计了一个 1.7mm 厚,带圆角的边框,并且在两个按键的位置预置了两个和外壳一体的按钮。

diy-usb-meter-10-2

PCB 上的按键为了能给按键手柄留出行程空间,是突出 …

阅读全文 »

DIY USB 电流表(9):Flash 模拟 EEPROM 存储累计电量

在前一篇 《DIY USB 电流表(8):绘制功率曲线》 中,整个 USB 电流表的固件开发已经进入尾声,目前我们已经完成了电压电流数据显示、功率计算、多页面切换、历史功率曲线绘制等功能.

为了更好地保持数据,在 USB 电流表重新上电的情况下,也可以恢复之前测量的数据,例如在测试充电宝容量时,中间会断开并重新连上负载,这个时候我们需要将之前记录的数据保存下来,继续累计负载消耗的电量。

但是在之前的原理图设计中,整个电路并没有添加 EEPROM,CH32V003 也没有自带 EEPROM,这时我们可以使用 CH32V003 的代码存储区域来模拟 EEPROM 保存数据,这次就来完成这个功能吧。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

CH32V003 存储器结构

根据 CH32V003 的数据手册可以知道,CH32V003 拥有 16KB 的用户代码区域。

diy-usb-meter-9-1

在 USB 电流表的固件编译之后,可以看到固件的大小,目前整个固件只占用约 12K 左右的空间,那可以就可以尝试使用剩余的空间来当作数据存储,模拟一下 EEPROM。

diy-usb-meter-9-2

存储器特性

在使用 Flash 来模拟 EEPROM 时,需要通过数据手册关注一下 Flash 的一些特性,例如擦写时间和擦写寿命等。

存储器特性

diy-usb-meter-9-3

从数据手册中可以看到,CH32V003 的 Flash 擦写 64 字节需要 2~3 …

阅读全文 »

DIY USB 电流表番外篇:使用 PlatformIO Inspect 分析和优化固件体积

在前一篇 《DIY USB 电流表(8):绘制功率曲线》 的开发过程中,我还碰到一个额外的问题,在最终开源的代码中虽然已经解决了,但是在文章中并没有提到,这就是编译固件体积超出 Flash 限制的问题。

这里就分享一下碰到 CH32V003 固件编译后体积超过 Flash 如何查找原因、解决问题的过程。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

编译后固件体积超标

在定义了功率历史数据缓存的变量,添加数据存储、屏幕画点驱动、按键检测等代码之后,照常编译一下固件,检查一下代码有没有错误,却突然发现编译出错了:

diy-usb-meter-inspect-1

一看错误原因: region 'FLASH' overflowed by 772 bytes,这就意味着编译完的固件体积已经超过了 CH32V003 的限制,毕竟CH32V003 只有 16KB 的用户代码空间。

在前几篇中编译完成也可以发现,固件体积已经快到达极限了,没想到这么快就已经超出不够用了。

排查固体体积构成

幸好 PlatformIO 提供了 Inspect 功能,可以用于分析固件编译产物中的各种资源使用情况,包括 Flash 占用、内存使用、静态代码检查等,通过这个工具,就可以快速分析固件编译完后,哪块代码或资源占用的体积最大。

PlatformIO Inspect 文档可以参考这里: https://docs.platformio.org/en/latest/home/index.html#project-inspect

使用 Inspect

要使用 PlatformIO Inspect 功能很简单,直接在 PlatformIO 侧边栏中通过菜单打开 …

阅读全文 »

DIY USB 电流表(8):检测按键和绘制功率曲线

在前一篇 《DIY USB 电流表(7):读取和显示 INA219 电流电压数据》 中,我们已经基本完成了这个 DIY USB 电流表的核心功能开发,已经可以在屏幕上显示当前电源输入电压、负载的电流、功率以及累计电量等数据,如果不需要更多功能,已经可以结项了 😃。

但是如果想拿这个 USB 电流表在一些分析场景使用,那么还需要再增加一些功能,例如,是否可以通过这个 USB 电流表来记录给手机充电时的功率曲线,这样可以知道手机的快充是什么样的节奏来完成充电的。

这次我们就来完成这个功能,记录负载的功率历史,并绘制成曲线来显示功率趋势。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

准备工作

在开始绘制功率曲线之前,同样有一些准备工作需要进行,例如在多了一个功率曲线页面之后,原来的电压数据页面怎么办,怎么切换多个页面?

在最早的功能设计中,我们已经给这个 DIY USB 电流表添加了两个按键,现在就可以通过这两个按键来完成页面切换操作了。

按键检测

按键原理图

在原理图中可以看到,两个按键已经接到 CH32V003 的 PD2、PD3 引脚,在初始化代码中,加上初始化两个引脚为输入模式。

diy-usb-meter-8-1
diy-usb-meter-8-2

按键状态结构体

为了维护按键的状态,我们先定义一个结构体来维护状态。在 ButtonState 结构体中,定义了一个 ts 字段,这个用来记录按键状态变化时的时间戳,这样可以在状态变化时,例如从低电平变化为高电平时,计算出来按键按下去的持续时间,如果超过 3000 毫秒,就认为是长按事件。

#pragma once

#include "drivers/clock.h"
#include "drivers/gpio.h"

#define BTN_LEFT    0
#define 


阅读全文 »

DIY USB 电流表(7):读取和显示 INA219 电流电压数据

在前一篇 《DIY USB 电流表(6):点个屏,使用 I2C 驱动 0.96 寸 OLED》 中,我们已经完成了屏幕显示驱动的开发,并且根据需求,列出了需要展示的数据项,确定了一下最终显示内容的布局。

在之前,显示的内容都是占位的测试数据,在这一节,就可以开始真正去读取 INA219 传感器的数据,将电路中测量的电压、电流等数据显示在屏幕上,这又是一节枯燥的编码工作 🙈。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

准备工作

在开始读取 INA219 的数据之前,同样也要准备一些相关的库,例如 INA219 数据的读取、参数的配置,以及在 CH32V003-GameConsole 中所使用的 I2C 封装并未提供读取 I2C 数据方法,另外,为了计算 USB 电流表运行时间内消耗的电量,也需要有相关的计时方法。

I2C 读取方法

在 CH32V003-GameConsole 的代码中,已经有了 i2c_tx.h,提供了 I2C 写入相关的方法,对于一个游戏机来说,拥有写入方法就足够了,它只需要用 I2C 来刷新屏幕,但是在我们的 USB 电流表项目中,还需要使用 I2C 去读取 INA219 的数据,因此需要去封装一个 I2C 读取方法。

在开始编写 …

阅读全文 »

DIY USB 电流表(6):点个屏,使用 I2C 驱动 0.96 寸 OLED

在前一篇 《DIY USB 电流表(5):使用 VSCode + PlatformIO 搭建固件开发环境》 中,我们已经完成了开发 USB 电流表固件的开发环境搭建,整个开发环境基于 Visual Studio Code + PlatformIO 来完成,并且跑通了一个基本的 Demo,验证了开发环境。

固件开发的第一步,我们先将最终输出数据的显示设备,0.96 寸 OLED 屏幕给点亮,这样在后续开发过程中,也可以通过屏幕来显示一个调试数据信息。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

准备工作

在开始开发之前,我们需要做一些准备工作,使用 PlatformIO 创建项目并不包含很多使用示例,例如如何使用 GPIO,如何使用 I2C 总线等,并且使用 platform-ch32v 时,它的函数定义与官方示例也不太相同,因此我们需要找一个类似的开源项目作为参考,从而可以更快速地完成 USB 电流表的固件开发。

参考项目 CH32V003-GameConsole

项目地址:https://github.com/wagiminator/CH32V003-GameConsole

diy-usb-meter-6-1

我就从 CH32V003-GameConsole 这个项目了解到 CH32V003 这款 MCU,并且开始尝试使用的,刚好这个项目本身包含了 0.96 寸 OLED 屏幕的驱动以及 GPIO、ADC …

阅读全文 »