
Minecraft我的世界唱片机
简介
本项目是一款基于STM32F103RCT6实现的我的世界唱片机,通过插入不同的NFC游戏唱片即可自动播放对应歌曲,支持音量调节、暂停继续与随机播放,兼具趣味性与实用性。
简介:本项目是一款基于STM32F103RCT6实现的我的世界唱片机,通过插入不同的NFC游戏唱片即可自动播放对应歌曲,支持音量调节、暂停继续与随机播放,兼具趣味性与实用性。开源协议
:CERN-OHL-S-2.0
(未经作者授权,禁止转载)描述
前言
一边咕咕一边做的项目(从idea到完成制作有几个月了),做完指南针后就想着能不能再做一个我的世界玩具,就选择了音乐盒。到oshwhub搜索后只看到了这个项目,基本的RFID唱片交互我想的一样,但是实现方案和样式和我的设想有较大出入,所以就自己做了一个。
一,介绍
本项目是一款基于STM32F103RCT6实现的我的世界唱片机,通过插入不同的NFC游戏唱片即可自动播放对应歌曲,支持音量调节、暂停继续与随机播放,兼具趣味性与实用性。
外壳多使用拼接结构,无需胶水和多色打印。
硬件方面,主控通过SPI连接RC522模块读取唱片上的M1标签获取歌名;音乐文件存放于SD卡,通过SDIO接口读取,音频数据经I2S发送至HT513功放驱动扬声器;用户交互采用拨轮开关。供电部分由TPS2121电源复用器(集成限流欠压保护与电源轨无缝切换)、TP4056锂电池充放电管理及RT9013 LDO组成,实现边冲边放功能。
软件上采用裸机状态机框架,利用中断机制保证实时性,管理音频数据流和处理用户输入;通过循环发送wake命令检测唱片插入状态;按键处理基于开源multi_button库,文件管理则基于HAL库的FatFs与SD卡驱动,整体结构清晰(吗?),易于维护和二次开发。(虽然我认为二次开发是伪命题)。
核心特点
首先,是使用了TPS2121这个芯片,这个电源多路复用器集成度十分高,主要功能有:
- 2.8~22V宽电压支持;导通内阻56mΩ;输出限流1~4.5A;超低静态功耗:使能 200μA、关断仅 10μA
- 无缝无掉电切换,典型切换 5μs;支持自动优先级选源 + 手动切换两种模式
- 可独立配置输入建立时间、输出软启动,抑制上电冲击电流
- 集成过流限制、过压监控、过热关断(OTP)
十分甚至九分的好用啊!
使用TPS2121同TP4056一起实现电池边充边放无缝切换。当然,要实现边充边放有更简单低成本的实现电路,这里主要是为了使用TPS2121(手头有几片)。
然后就是NFC读写,读写器驱动我是直接从Arduino复制的,这里核心是实现了NDEF格式的读写实现,也就是手机读写NFC时的标签Tag实现。这样,就可以通过手机修改唱片的内容了。
另外,本项目的功放使用了国产的HT513,这个功放支持I2S输入,并且支持BD 模式和SPW 扩频模式,外围可以选择是否需要LC滤波电路,可以减少外围元件使用。(这片子还能烧一半的,我测试时不小心把片子烧了,导致一个模式不能出声另外一个模式可以)
展示如下:




二,工程结构
JukeBox:MCU的固件以及工程文件Script:项目中使用的工具脚本3Dobj:外壳工程和STL文件Reference:相关参考资料source:游戏材质和素材
三,主要材料与选型
- 注意:这里提供的链接仅供参考,请购买时多加核对
| 名称 | 型号 | 数量 | 链接 |
|---|---|---|---|
| 2828腔体喇叭 | XHXDZ-2828-4R2W-2P1.25 | 1 | 淘宝 |
| 1.25-2P接口 | 1.25-2P WT | 1 | 淘宝/立创C668614 |
| 功放 | HT513 | 1 | |
| SD卡连接器 | 短型TF-123-ARP9H15 | 1 | 淘宝/立创C2982547 |
| NFC读卡器模块 | RC522模块-蓝色 | 1 | 淘宝 |
| 拨轮开关 | 1 | 淘宝/立创C145915 | |
| 充电芯片 | TP4056 | 1 | 立创C7473158 |
| 3.3V LDO | RT9013-33GB | 1 | 立创C47773 |
| 电源切换 | TPS2121 | 1 | 立创C485916 |
| 电源开关 | MSK12C02 | 1 | 淘宝/立创C431540 |
| 主控 | STM32F103RCT6 | 1 | |
| 晶振 | 3225-8M贴片 | 1 | |
| 4档拨动开关 | SK-1500-L1 | 1 | 淘宝/立创C319025 |
| M2x6螺丝 | M2x6 螺丝-固定喇叭 | 2 | |
| M2x4螺丝 | M2x4螺丝-固定PCB | 4 | |
| 3.7V锂电池 | 603450 1200mAh | 1 | |
| 功放电解电容 | 贴片电解电容100UF 体积5*5.4 mm | 1 | 立创C2982547 |
| RST按钮 | Key_SMD_3x4x2 | 1 | 立创C49234124 |
| 电池充电 | TP4056 | 1 | 立创C725790 |
| SD卡 | 512M 及以上 |
- 选择STM32F103RCT6主控主要是因为我手头上有板子,但是最近ST一直在涨价,性价比低
使用免费PCB和免费面板打印,总体成本约为60元。仅供参考,由于部分元件不包邮或者不单卖,实际做一个价格可能比这高(我做定制PVC的20个唱片的已经上百了)。
四,制造
电路板
PCB厚度为默认的1.6mm
主电路板焊接时,注意R9 C18 C19 C23 C24不焊,L1 L2直接连锡,即无需外部LC滤波。

唱片
唱片有两种制作方式,可以使用PCB打样也可以使用现成的tag贴纸,使用PCB可以一张唱片存多首歌进行切换。
唱片PCB厚度为1.2mm;使用黑色材料打印唱片.STL文件;开关型号SK-1500-L1(立创C319025);IC芯片封装为COB213,F08-M1 S50兼容,我是在这家店购买的(有写入失败芯片,可能是我不小心给锁了)。
唱片电路结构参考了爱莉希雅NFC卡工程的设计,使用一个4档波动开关实现切换,但是IC芯片我使用了更小的封装。注意焊接时开关的焊接方式,可能需要减去两个固定柱。


当然,也可以直接使用淘宝M1兼容的Tag贴纸,只不过每个唱片只能写入一首歌。
使用复旦M1湿柔性贴纸,使用黑色材料打印唱片-one.STL文件,我是在这家店购买的(有些NFC Tools Pro写入标签失败,但是用MCT好像又能可读可写,感觉NFC Tools Pro可能有些小问题)。
唱片最外面的上色,可以选择两种方案:JLC面板打印或者淘宝贴纸定制。
jlc面板打印最近有免费卷可以使用,只需要付8元邮费,不过需要自己设计图纸。在工程中我画了一个自绘的唱片,需要的可以自己改色变成其他唱片。不过要打完全部的唱片,不知道得多少钱。
-
面板下单选择:PET,底面,3M胶,磨砂,无鼓包,70.5*47mm,常规遮光(白底),0.125mm
-
JLC的面板色差更小,颜色更丰富,表面也更细腻,尺寸也很精准,但是价格贵,尤其是样式种类很多时
淘宝上也有定制PVC塑片或不干胶贴纸的服务,为了唱片更有质感可以选择PVC打印。不过淘宝店打印质量参差不齐还有起打价格,如果只做一种唱片的话还是JLC吧。我打印了20种,每种四张,花了100(没有打11唱片,因为形状不规则)。
淘宝定制的图片像素不能太小,原始的游戏材质不能用,需要upPixel.py脚本插值提升分辨率后的图;图打包发给商家就行。
-
PVC定制要求:70.5*47mm;形状按透明层边界;磨砂pvc;18丝;如果不能出血,注意保证黑边(和唱片打印颜色相同)
-
淘宝PVC打印颜色质量参差不齐,很多色差,相近的颜色分辨不出,磨砂更粗糙,切割尺寸有点误差(所以我模型都大了0.5mm一圈),但是价格要便宜点,效果也说得过去
不干胶没试过,成本应该更低,但是效果应该会差点。
附上淘宝的和JLC的效果对比,很明显看到表面磨砂的光滑度和颜色差别(淘宝的直接一片黑,像stal这种唱片更是中间一片黑):



外壳
外壳一共使用两种颜色材料打印,主体使用黑色,装饰件推荐使用棕色(我还使用了橘橙色,因为我手有这种,而且鲜艳点也好看)。
以下模型使用黑色打印,包括:唱片.STL,唱片-one.STL,兜.STL,零件2.STL,顶壳.STL,底壳.STL。

其他模型使用棕色打印,包括:开关.STL,侧壳-小.STL,侧壳-大.STL,顶壳-顶.STL;其中侧壳-大.STL需要打印三个。

除此之外,我还给唱片打了一个收纳唱片支架.STL,尺寸基于这个工程,可以卡进这个集装箱盒子中;收纳中的分隔墙厚度0.3-0.4,有些切片软件会打的厚一点导致放不进去。


五,装配
主结构
对于NFC模块,焊接弯排针,然后插到板子上,并剪去排针多余的长度,如图:

首先安装喇叭。将零件2如图安装到NFC模块上,然后用M2x6的螺丝将喇叭固定在支架上,不用太紧,剪去NFC模块排针多余的长度:


再连接上电池,这样功能部分就组成一个整体了。
然后是底壳,将侧壳-小.STL,侧壳-大.STL,底壳.STL拼装在一起。


之后拼装顶壳,将兜.STL,顶壳.STL,顶壳-顶.STL安装到一起,兜.STL插入顶壳的孔洞:

如果打印机精度比较高,这里可能有些松,需要点胶水或者熨烫一下(塑料焊接):

然后安装PCB,先将开关.STL放入底壳的预留孔中,然后放入PCB,让电池卡入预留的空间,把螺丝孔对齐,拧上M2x4螺丝。



最后,盖上顶壳,同通过3D打印的误差让两者紧密贴合(可能需要用力将顶壳按进去)。

唱片
- 鉴于定制的价格,在贴之前一定要验证NFC能否正常使用
PCB唱片像这样嵌入模型中:

Tag贴纸像这样贴在模型上:

然后,直接将贴纸贴在唱片两面即可,注意正反,注意模型我设计的会比贴纸的尺寸大一点,防止白底露出影响效果。
六,使用教程
需要手机NFC Tag写入工具,如NFC Tools Pro。
向SD卡中拷贝进唱片音乐的WAV文件,需要为FAT、FAT32格式化.


给唱片NFC写入对应的文件名(不带后缀,如cat.wav文件对应NFC写入cat),将唱片插入即可播放对应文件;可以在PCB唱片中写入random和11(破损唱片)。

特别的,如果唱片为random,会随机播放一个wav文件。
在播放状态下,按下拨轮开关是播放/暂停;左右拨动是调节音量,支持左右长按快速调节。
七,改进空间
- USB接口已经引出,理论上可以写一个上位机用于写NFC和管理SD卡文件
- 固件体积很大,主要是FatFs文件系统配置问题,实际可以根据需求减配。
(我懒得搞了) - 定时器裸机结构导致拨轮开关响应不灵敏,可以上RTOS或者精调定时器中断时间
- 在PCB前面有Debug灯,外壳上也开了孔,可以打个透明导光柱
- 如果想要提升音质,可以考虑自行设计LC滤波
参考文章
附录-Debug的小插曲
本来所有功能都正常了,但是再另外做一个时就出现问题,同样的板子同样的代码,一个能跑,一个开机进HardError,并且第一次烧录后是正常的,但是Reset或者断电重启后就会进HardError,非常奇怪。
经过定位发现在ScanWavFiles()的f_readdir()中跳转的。
uint8_t ScanWavFiles(void)
{
DIR dir;
FILINFO fno;
FRESULT res;
uint16_t count = 0;
res = f_opendir(&dir, SDPath);
if (res != FR_OK) {
printf("[Scan]Open dir failed: %d\n", res);
return 1;
}
for (;;) {
res = f_readdir(&dir, &fno);//Here!!!
...
结合AI辅助,发现是因为f_readdir用了fno的一个变量作为索引,如果fno没有初始化为0,就会越界。而栈空间是不会自动清0的,所以声明之后直接用会出问题。
如果启用了 LFN(长文件名),需要确保 FILINFO 的 lfname 和 lfsize 被正确初始化。
由于这个功能是AI写的,所以我也没清楚f_readdir的调用规范,但为什么上一个都没问题?
原来是我这次用了比较小的SD卡,导致拷贝进去的文件数量不同;这个函数只在开头调用一次,运行到这里时栈空间还比较干净,可能数据就是上电时的0;而当文件数量不同时,栈空间内存布局不一样了,导致变量不为0,然后就出错了。
需要在后面加上手动清0:
uint8_t ScanWavFiles(void)
{
DIR dir;
FILINFO fno;
FRESULT res;
uint16_t count = 0;
memset(&fno, 0, sizeof(FILINFO)); // Add this
如果我没换SD卡,或者拷贝的文件数相同,这个BUG就可能发现不了!
AI给我写了个bug,然后帮我修了个bug。
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。









