|
|
2026年新年第一帖,新年快乐!
最近娃娃玩太鼓达人,一直用的手柄玩,感觉不是太好控制(我心疼手柄),所以就做了一个Taiko_Hitbox。
先看效果图吧,是不是很喜庆,1托2:
红钮对应红色鼓面,蓝钮对应蓝色鼓面,一看就会了
制作过程挺简单的,就一个盒子+按钮+PCB+主控mcu。记录下来,希望有人会用到
项目在github上,https://github.com/stevenpaul007-creator/Taiko_Hitbox
一,盒子设计
我也是第一次做亚克力板的盒子,之前没做过cad的项目,在3d方面感觉没什么经验。而且这也是我第一次用3d软件,之前都听他们说要用autocad什么的,查了一下都没有免费的,或者要用d版。所以我大胆的使用了freecad(v1.0.2)进行设计。完全免费,没有版权纠葛,可以放心大胆的使用。
前面说了,我不太会用建模软件,但是我会写python啊!用python直接写,用freecad就可以生成。
python文件在这:https://github.com/stevenpaul007 ... /AcrylicBox/main.py
文件里定义了各种尺寸,如果想改,可以自己改。
层高40mm(因为铜柱40mm),加上底部3mm、顶部3+2mm,一共48mm,长200mm,宽100mm,高48mm
导出了dxf文件,https://github.com/stevenpaul007 ... main/AcrylicBox/dxf
可以直接给淘宝厂家发过去。
这是效果图:
有两个顶面,中间用来夹住贴纸,为了好看。一共设计了11个按钮,上下左右abxy、lb、rb和start。完全满足太古达人的需求。
按钮采用24mm和12mm两种。24mm的是主要触发的按钮,狠狠的拍那种,其他小按钮都是功能按钮,用的不多。
7块亚克力板,顶面的用2mm(实际1.8mm),其他面和支撑使用3mm(实际2.8mm)。在某宝上找了一家,报价11元包邮,下单,几天就送到了。
二、PCB
gerber文件:https://github.com/stevenpaul007 ... _PCB_2025-12-30.zip
PCB在jlc上免费做的,这次给我了9片!!!感谢JLC!!!
在电路上,采用了国产的WCH芯片,其中CH334R是USB HUB芯片。CH552T是单片机。
我最近很喜欢用CH系列单片机,便宜,够用,写代码也比较容易。每个也就1块钱。外围也很简单,几个电容就可以。基本上不用电阻。
1. SCH
ch552:
ch334r:
2. pcb
效果图:
打板!!!!沉金走起!!!
大刑伺候!上烤肉板!
搞定!
其实1117可以不用,因为ch552和ch334都内置了ldo。不过为了稳定还是加上了。另外我手上没有小封装的钽电容,用了一个大的、一个电解电容,有点随意了。ch334需要12M晶振。
Q:为什么要用hub?
A:因为我想坐在沙发上看电视玩,距离电脑大概5m远。可以通过一根很长的usb线接hub,在通过短线连接第二个hitbox。
Q:为什么只焊接了一个usb母座?
A:因为1个就够了。其他的可要可不要。
Q:为什么不焊接下载电路?
A:用镊子怼就行
三、组装
组装比较简单,有手就行。
底面螺丝孔做一下沉头(因为螺丝是沉头的):
放4个pcb孔位的螺母儿,母儿的直径是4.1mm,孔的直径是3.9mm。用电烙铁怼进去。
背面看看效果:
插好4个支撑,这次做的有点紧,插进去就拔不出来。(cad文件里写了槽宽2.9mm,可以改为3mm)
顶面两层对好,放上“花花”的图。
图可以用铜版纸,价格比较高,我用的是10寸(23mm*45mm)的相片,淘宝上大概2块多1张,我做了2张,4块多钱4个图。
插入5根螺丝固定
用刀子裁去边边角角
拧上铜柱,扣去按钮位置
插上按钮:
翻过来,开始走线。先走共地线。(别问我为什么地线为什么是红色的,因为红色的线剩下的多呗)
线是用钳子压的,这里没用烙铁焊接,为了方便以后的更换。
然后给每个按钮接线。线留的有点长,不过还好,收在盒子里面看不见,而且太短了不好接
准备合体!!!!
拧好螺丝!!!!!
底部贴上防滑贴
螺丝我用了两种M3,为什么用两种?因为我有两种啊!
四、固件
https://github.com/stevenpaul007 ... /CH552_TAIKO_HITBOX
我找了一个倭寇人的开源依赖,可以使用ch552模拟switch手柄,我设计了12个按钮的扫描,实际使用了11个按钮。预留了ttl接口但没用上,可以扩展为额外2个按钮。
想自己编译的,可以使用arduinoide编译ino文件。不想编译的,我有编译好的hex文件:
https://github.com/stevenpaul007 ... ITBOX.ino.ch552.hex
可以使用WCHISPTool_CH54x-55x.exe通过usb接口对ch552进行编程。
通过usb口接电脑可以识别为手柄,接switch也识别。
还有一种固件我也在用,是rp2040的,叫gp2040 ce。也是很不错的固件,rp2040开发板大概10块钱一个,比ch552贵。
代码:
- // libs: https://github.com/stevenpaul007-creator/CH55xSwitchControl
- #include <CH55xSwitchControl.h>
- #define ButtonNum 12
- #define HATCOUNT 4
- #define UP 0
- #define DOWN 1
- #define LEFT 2
- #define RIGHT 3
- const uint8_t Pins[ButtonNum] = {
- 32, 14, 15, 16, //up down left right
- 10, 11, 31, 30, //A B X Y
- 17, 35, 34, 33 //LB RB - +
- };
- const uint16_t KeyCode[ButtonNum] = {
- 0, 0, 0, 0,
- BUTTON_A, BUTTON_B, BUTTON_X, BUTTON_Y,
- BUTTON_L, BUTTON_R, BUTTON_MINUS, BUTTON_PLUS
- };
- bool BUTTON_STATUS[ButtonNum] = {
- false, false, false, false,
- false, false, false, false,
- false, false, false, false
- };
- bool BUTTON_STATUS_P[ButtonNum] = {
- false, false, false, false,
- false, false, false, false,
- false, false, false, false
- };
- uint8_t DPAD_DIR = HAT_CENTER;
- uint8_t DPAD_DIR_LAST = HAT_CENTER;
- bool shouldSendReport = false;
- void setup() {
- for (int i = 0; i < ButtonNum; i++) {
- pinMode(Pins[i], INPUT_PULLUP);
- }
- setAutoSendReport(false);
- USBInit();
- }
- void loop() {
- for (byte i = 0; i < ButtonNum; i++) {
- BUTTON_STATUS[i] = !digitalRead(Pins[i]);
- }
- DPAD_DIR = HAT_CENTER;
- if (BUTTON_STATUS[UP]) {
- DPAD_DIR = HAT_UP;
- } else if (BUTTON_STATUS[DOWN]) {
- DPAD_DIR = HAT_DOWN;
- } else if (BUTTON_STATUS[LEFT]) {
- DPAD_DIR = HAT_LEFT;
- } else if (BUTTON_STATUS[RIGHT]) {
- DPAD_DIR = HAT_RIGHT;
- }
- if (BUTTON_STATUS[UP] && BUTTON_STATUS[RIGHT]) {
- DPAD_DIR = HAT_RIGHT_UP;
- } else if (BUTTON_STATUS[UP] && BUTTON_STATUS[LEFT]) {
- DPAD_DIR = HAT_UP_LEFT;
- } else if (BUTTON_STATUS[DOWN] && BUTTON_STATUS[RIGHT]) {
- DPAD_DIR = HAT_RIGHT_DOWN;
- } else if (BUTTON_STATUS[DOWN] && BUTTON_STATUS[LEFT]) {
- DPAD_DIR = HAT_DOWN_LEFT;
- }
- if (DPAD_DIR != DPAD_DIR_LAST) {
- pressHatButton(DPAD_DIR);
- shouldSendReport = true;
- DPAD_DIR_LAST = DPAD_DIR;
- }
- for (int i = HATCOUNT; i < ButtonNum; i++) {
- if (BUTTON_STATUS_P[i] != BUTTON_STATUS[i]) {
- shouldSendReport = true;
- BUTTON_STATUS_P[i] = BUTTON_STATUS[i];
- if (BUTTON_STATUS[i]) {
- pressButton(KeyCode[i]);
- } else {
- releaseButton(KeyCode[i]);
- }
- }
- }
- if (shouldSendReport)
- {
- sendReport();
- shouldSendReport = false;
- }
- delay(5); //naive debouncing
- }
复制代码
希望对你有用,完。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|