站内搜索
发作品签到
Minecraft我的世界唱片机
专业版

Minecraft我的世界唱片机

简介

本项目是一款基于STM32F103RCT6实现的我的世界唱片机,通过插入不同的NFC游戏唱片即可自动播放对应歌曲,支持音量调节、暂停继续与随机播放,兼具趣味性与实用性。

简介:本项目是一款基于STM32F103RCT6实现的我的世界唱片机,通过插入不同的NFC游戏唱片即可自动播放对应歌曲,支持音量调节、暂停继续与随机播放,兼具趣味性与实用性。
复刻成本:60

开源协议

CERN-OHL-S-2.0

(未经作者授权,禁止转载)
创建时间:2026-06-08 17:32:40更新时间:2026-06-10 17:04:58

描述

前言

一边咕咕一边做的项目(从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滤波电路,可以减少外围元件使用。(这片子还能烧一半的,我测试时不小心把片子烧了,导致一个模式不能出声另外一个模式可以)

展示如下:
image-20260606233536654.png
image-20260607000423360.png
image-20260606234834210.png
image-20260607225015100.png

二,工程结构

  • JukeBox:MCU的固件以及工程文件
  • Script:项目中使用的工具脚本
  • 3Dobj:外壳工程和STL文件
  • Reference:相关参考资料
  • source:游戏材质和素材

三,主要材料与选型

  • 注意:这里提供的链接仅供参考,请购买时多加核对
名称型号数量链接
2828腔体喇叭XHXDZ-2828-4R2W-2P1.251淘宝
1.25-2P接口1.25-2P WT1淘宝/立创C668614
功放HT5131
SD卡连接器短型TF-123-ARP9H151淘宝/立创C2982547
NFC读卡器模块RC522模块-蓝色1淘宝
拨轮开关1淘宝/立创C145915
充电芯片TP40561立创C7473158
3.3V LDORT9013-33GB1立创C47773
电源切换TPS21211立创C485916
电源开关MSK12C021淘宝/立创C431540
主控STM32F103RCT61
晶振3225-8M贴片1
4档拨动开关SK-1500-L11淘宝/立创C319025
M2x6螺丝M2x6 螺丝-固定喇叭2
M2x4螺丝M2x4螺丝-固定PCB4
3.7V锂电池603450 1200mAh1
功放电解电容贴片电解电容100UF 体积5*5.4 mm1立创C2982547
RST按钮Key_SMD_3x4x21立创C49234124
电池充电TP40561立创C725790
SD卡512M 及以上
  • 选择STM32F103RCT6主控主要是因为我手头上有板子,但是最近ST一直在涨价,性价比低

使用免费PCB和免费面板打印,总体成本约为60元。仅供参考,由于部分元件不包邮或者不单卖,实际做一个价格可能比这高(我做定制PVC的20个唱片的已经上百了)。

四,制造

电路板

PCB厚度为默认的1.6mm
主电路板焊接时,注意R9 C18 C19 C23 C24不焊L1 L2直接连锡,即无需外部LC滤波。
image-20260604165043796.png

唱片

唱片有两种制作方式,可以使用PCB打样也可以使用现成的tag贴纸,使用PCB可以一张唱片存多首歌进行切换。


唱片PCB厚度为1.2mm;使用黑色材料打印唱片.STL文件开关型号SK-1500-L1(立创C319025);IC芯片封装为COB213,F08-M1 S50兼容,我是在这家店购买的(有写入失败芯片,可能是我不小心给锁了)。

唱片电路结构参考了爱莉希雅NFC卡工程的设计,使用一个4档波动开关实现切换,但是IC芯片我使用了更小的封装。注意焊接时开关的焊接方式,可能需要减去两个固定柱。
image-20260604173827196.png
image-20260604173908897.png
当然,也可以直接使用淘宝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这种唱片更是中间一片黑):
image-20260604175626763.png
image-20260604180835183.png
image-20260604180850517.png

外壳

外壳一共使用两种颜色材料打印,主体使用黑色,装饰件推荐使用棕色(我还使用了橘橙色,因为我手有这种,而且鲜艳点也好看)。

以下模型使用黑色打印,包括:唱片.STL唱片-one.STL兜.STL零件2.STL顶壳.STL底壳.STL
image-20260606231430184.png
其他模型使用棕色打印,包括:开关.STL侧壳-小.STL侧壳-大.STL顶壳-顶.STL;其中侧壳-大.STL需要打印三个
image-20260606231508861.png
除此之外,我还给唱片打了一个收纳唱片支架.STL,尺寸基于这个工程,可以卡进这个集装箱盒子中;收纳中的分隔墙厚度0.3-0.4,有些切片软件会打的厚一点导致放不进去。
image-20260607224953881.png
image-20260604174720911.png

五,装配

主结构

对于NFC模块,焊接弯排针,然后插到板子上,并剪去排针多余的长度,如图:
image-20260604165116166.png
首先安装喇叭。将零件2如图安装到NFC模块上,然后用M2x6的螺丝将喇叭固定在支架上,不用太紧,剪去NFC模块排针多余的长度
image-20260606231556306.png
image-20260606231751788.png
再连接上电池,这样功能部分就组成一个整体了。

然后是底壳,将侧壳-小.STL侧壳-大.STL底壳.STL拼装在一起。
image-20260606231839484.png
image-20260606231858665.png
之后拼装顶壳,将兜.STL顶壳.STL顶壳-顶.STL安装到一起,兜.STL插入顶壳的孔洞:
image-20260606231930236.png
如果打印机精度比较高,这里可能有些松,需要点胶水或者熨烫一下(塑料焊接):
image-20260606232000539.png
然后安装PCB,先将开关.STL放入底壳的预留孔中,然后放入PCB,让电池卡入预留的空间,把螺丝孔对齐,拧上M2x4螺丝
image-20260606232109243.png
image-20260606232133887.png
image-20260606232231494.png
最后,盖上顶壳,同通过3D打印的误差让两者紧密贴合(可能需要用力将顶壳按进去)。
image-20260606232605998.png

唱片

  • 鉴于定制的价格,在贴之前一定要验证NFC能否正常使用

PCB唱片像这样嵌入模型中:
image-20260606231348822.png
Tag贴纸像这样贴在模型上:
image-20260606231405789.png
然后,直接将贴纸贴在唱片两面即可,注意正反,注意模型我设计的会比贴纸的尺寸大一点,防止白底露出影响效果。

六,使用教程

需要手机NFC Tag写入工具,如NFC Tools Pro。

向SD卡中拷贝进唱片音乐的WAV文件,需要为FAT、FAT32格式化.
image-20260608210916330.png
image.png
给唱片NFC写入对应的文件名(不带后缀,如cat.wav文件对应NFC写入cat),将唱片插入即可播放对应文件;可以在PCB唱片中写入random11(破损唱片)。
image-20260608211035784.png
特别的,如果唱片为random,会随机播放一个wav文件。

在播放状态下,按下拨轮开关是播放/暂停;左右拨动是调节音量,支持左右长按快速调节。

七,改进空间

  • USB接口已经引出,理论上可以写一个上位机用于写NFC和管理SD卡文件
  • 固件体积很大,主要是FatFs文件系统配置问题,实际可以根据需求减配。(我懒得搞了)
  • 定时器裸机结构导致拨轮开关响应不灵敏,可以上RTOS或者精调定时器中断时间
  • 在PCB前面有Debug灯,外壳上也开了孔,可以打个透明导光柱
  • 如果想要提升音质,可以考虑自行设计LC滤波

参考文章

MIFARE Classic 上配置 NDEF

mc唱片机

爱莉希雅NFC卡

附录-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(长文件名),需要确保 FILINFOlfnamelfsize 被正确初始化。

由于这个功能是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

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
[MCU固件]JukeBox.hex
2
2
[MCU工程文件]JukeBox.zip
4
3
[外壳工程和STL文件]3Dobj.zip
2
4
[相关参考资料]Reference.zip
1
5
[项目中使用的工具脚本]Script.zip
1
6
[游戏材质和素材]source.zip
1
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航