记录制作”異議あり!-陀螺仪-音频播放器”的过程
空想阶段
start at 2025/5/12
想法来源
由于最近沉迷《逆转裁判》123系列(又称逆转裁判成步堂传),经常幻想自己在法庭上学成步堂拿手指人并大喊「異議あり!」

加上由于NS上游玩无法切换日语配音,导致其经典台词「異議あり!」只能用中文「异议!」呈现,对此耿耿于怀。又无聊时刷到b站视频有up自己DIY了一款实体版「異議あり!」的小型播放器,支持手势操作和播放bgm功能,非常中二,又想起了自己的专业,总该干点老本行了,遂有了自己制作这个播放器的想法。

画饼阶段
start at 2025/8/6
(不要问我为什么拖了这么久)
1 目标指定
能做出来一个能同时播放游戏的语音及bgm、支持手势操作切换歌曲、支持USB烧录歌曲、能通过按键调节音量、能离线使用&能充电、有外壳的音乐播放器即可,功能实现为主,大小、功耗、外观不追求太多。
2 功能划分
- 电路方面
- 主控芯片,应该没啥门槛,能使就行
- 采用STM32F103C8T6(暂定)
- 陀螺仪芯片,用来实现手势操作,通过X轴/Y轴位移手势指令,输入单片机识别,支持I2C控制
- 采用MPU6050(V老师推荐准没错)
- 语音芯片,功能包括语音编码、解码、存储、播放和识别,支持串口控制
- 采用CH7003(网上随便找的),抄一下datasheet
- 带4MB内存
- PWM音频输出,内置0.5W功放,可直接推动8Ω/0.5W喇叭
- 支持DAC输出,外界功放
- 支持外挂SPI flash,最大128Mbit
- 支持USB连接电脑拷贝音频,PC虚拟内置存储介质的U盘功能
- 30级音量自由设定
- 采用CH7003(网上随便找的),抄一下datasheet
- DAC及功放模块
- 视情况而定,先用语音芯片内置功放试试效果,不行再加喇叭
- 存储flash模块
- 视情况而定,先看看语音芯片内部够用不,不够再加SPI flash
- 蓄电池以及充电模块
- 没想好具体咋做
- USB typec电路,实现调试、连接电脑烧录音频音频、充电
- 没想好具体咋做
- 主控芯片,应该没啥门槛,能使就行
- 外壳方面
- 3D打印外壳,具体设计待定,先把电路功能做好再去求教Q老师
3 计划步骤
- 先用现成的(”这不是现成的?”)核心板+面包板+功能芯片分步实现核心功能
- 熟悉核心板相关
- 购买STM32最小系统板+面包板硬件平台,套件内容包括:
- STM32F103C8T6最小系统板(支持直插面包板)
- 面包板以及各种线
- OLED显示屏
- MPU6050陀螺仪模块
- 以及一些暂时看上去用不到的东西
- 根据套件配套视频捡回尘封的记忆
- 购买STM32最小系统板+面包板硬件平台,套件内容包括:
- 用STM32+MPU6050实现手势操作识别功能
- 核心板套件自带MPU6050套件
- 参考视频工程代码,实现MPU6050初始化配置
- 实现X轴/Y轴位移手势指令识别
- 用STM32+语音芯片实现音频播放、切换、控制功能
- 用USB模块实现调试、连接电脑烧录音频音频功能
- 用电池模块实现设备离线、充电功能
- 熟悉核心板相关
- 画原理图、PCB实现以STM32、MPU6050、语音芯片为主体的硬件电路,投稿嘉立创获得板板
- 实现外壳设计
update at 2025/8/6
4 实际开干
4.1 MPU6050学习
4.1.1 原理
- MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景

- 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
- 实际上是一个测力计
- 可以理解为坐在车里,车子突然往前开,椅背感觉到力
- 静态稳定,动态不稳定

- 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
- 静态不稳定,动态稳定
- 可以理解为游乐场甩椅子,甩起来以后测两个椅子间的距离从而获得角速度

4.1.2 参数
- 16位ADC采集传感器的模拟信号,量化范围:-32768~32767
- 加速度计满量程选择:±2、±4、±8、±16(g)
- 如选择为±2,那么32767对应的就是2g加速度
- 量程越小,测量就会更细腻
- 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)
- 运动剧烈,就把量程调高,避免加速度/角速度超出量程
- 可配置的数字低通滤波器
- 如果抖动太厉害,就开启,可以让数据平缓一点
- 可配置的时钟源,可配置的采样分频
- 控制AD采样的快慢
- I2C从机地址:1101000(AD0=0);1101001(AD0=1)
- 由于I2C读写位的存在,所以0x68(1101000)会左移一位在加上读写位,也就变成了0xD0(读),0xD1(写)

4.1.3 电路

| 引脚 | 功能 |
|---|---|
| XCL、XDA | 主机I2C通信引脚 |
| AD0 | 从机地址最低位 |
| INT | 中断信号输出 |
- SCL、SDA已经接如上拉电阻
- XCL、XDA
- 通常用于外接磁力计或磁力计,MPU6050通过I2C主动访问这些芯片,经过内部DMP进行数据融合和姿态解算
- 用于扩展功能,比如引入绕z轴角度(偏航角)(类似于指南针),或者无人机定高时,需要加气压计扩展为10轴,提供一个高度信息的稳定参考
- AD0 已接入下拉电阻,默认为0
- LDO 左上角,扩展5V供电
4.1.3 内部框图

- Self test
- 功能:自测模块,启动自测后,芯片内部会模拟一个外力施加在传感器上,导致传感器数据比平时大一些
- 使用:先开自测,再关自测,把两者数据相减得到自测响应,查阅手册,如果在范围内就没坏
update at 2025/8/10
4.1 MPU6050调试
4.1.1 思路
-
100ms为间隔测试一次
-
快速移动检测阈值为2g
1
2
// 快速移动检测阈值 (可根据实际情况调整)
#define MOVEMENT_THRESHOLD 2.0f // 2g的加速度变化
—————————————————————————————————————
Ongoing
—————————————————————————————————————