DIY 春季主题飞行线 Chunithm 手机台制作教程
前言
最近想玩Chunithm,虽然之前也用平板玩过一段时间但是终究没内味,看到网上有自制手台的相关资料,然后查了一下,一个主控30块钱,其他的电子元件几块钱一抓一大把,一个手台贵有3个原因:
- pcb打样只能一次打五片,多了4片没处用。
- 外壳,亚克力外壳的价格也是比较贵的,随便切几块就要一两百块钱
- 技术,从集成电路线路设计到主控程序的算法实现,凝聚了技术成本
最后还是决定自己试着做一下,理由有以下几点:
- 我的显示器是24寸的,直接买手台适配的是32寸的,玩着不爽
- 手台太贵,太占地方
- 不确定自己会玩多久
- 自己有大概的设计思路,想要验证是否可行
大概就是这样,于是记录一下主要的制作和学习过程。
用到的材料
以下是自己学习过程中用到的材料,而不是说制作一个手台必备这些材料:
- 面包板,越大越好,随便玩玩的话买个840孔的,我是先买了400的,结果太小,又买了个840的,不想太多焊接操作的话买个大点的
- 面包板的插针,问下卖家有没有送的,没有的话得另外买
- 电烙铁+焊锡丝+松香,飞线焊接必备
- 导线,多买点否则吃亏
- 还有就是多少pin多少pin的杜邦线和插座啥的,我至今没有想好买哪些比较实用
- 电阻,买了那种一包一套的每种10个,又100、1k、10k、47k、1m欧姆等等,如果知道自己要用多少欧的话直接买就行了,不知道的话多买反正便宜
- AMS1117-3.3V,可以将5v电压转化为3.3V输出,最后好像没用上,最好还是用一下。
- 940nm红外led发射和接收灯管,发射是白色的,接收是黑色的,一般配套卖的别单独买了,都是两个脚的,别买成3脚的,虽然也应该能用。
- 主控芯片,我用的是pro micro,比较便宜,网上的Arduino教程一般用uno来演示,但是后面的代码可能写不进uno,具体原因忘了,好像是usb问题
- microusb数据线,切记数据线要好一点的,有些数据线是只能充电而不能传数据的
- mpr121电容触控芯片,一个芯片能提供12路触摸,中二是16key或者32key的,如果想做16key需要两个芯片,32key的则需要3个,反正便宜我买了10个,因为后面需要割断add可能会割坏
- WS2812B灯带,暂时没用上,后面升级版本应该会用上,比较炫酷
- 铜片,用于触摸感应区域,以24寸显示器的16key版本为参考,尺寸大概是2cm*10cm,其他尺寸自己算
Pro Micro引脚介绍
首先参考一下官方文档
其中蓝色的为数字IO、绿色的为模拟IO、黄色的是串口IO、灰色的是I2C相关,紫色用不上不管它,注意到一个引脚可能有多个用途但是问题不大,想怎么用就怎么用,不清楚数字、模拟和串口IO的先去看下Arduino教程,一般跳过前言部分第一章就会讲。 然后RAW是芯片电流输入,如果没有usb口可以从这里供电,有usb供电的情况下可以看作和VCC相同,提供5v电压输出,GND就是ground接地,可以简单理解为VCC是正极GND是负极,这里搞不明白为啥要搞3个GND,多设计个模拟IO不好吗?最后RST是reset,用于重置芯片,想要重置的话可以不用每次都插拔USB,只要把RST和GND短接一下就好了。
WS2812B灯带使用
了解完各个引脚的作用,最好先连上电脑,打开Arduino写点代码熟悉一下,连个LED测试一下,手头只有ws2812b灯带,正好顺便学习一下灯带的使用,从最后面剪下来一个,拿来测试吧
+5v 连vcc,gnd连gnd,中间的din随便连一个数字IO 代码,没FastLED.h的话记得先去导入一下这个库
#include "FastLED.h" // 此示例程序需要使用FastLED库
#define NUM_LEDS 1 // LED灯珠数量
#define DATA_PIN 21 // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 255; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高
CRGB leds[NUM_LEDS]; // 建立灯带leds
void setup() {
LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // 初始化灯带
FastLED.setBrightness(max_bright); // 设置灯带亮度
}
void loop() {
for(int i =0;i < NUM_LEDS;i++){
leds[i] = CRGB::Red; // 设置灯带中第一个灯珠颜色为红色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
FastLED.show(); // 更新LED色彩
delay(500); // 等待500毫秒
leds[i] = CRGB::Black; // 设置灯带中第一个灯珠熄灭
FastLED.show(); // 更新LED色彩
delay(500); // 等待500毫秒
}
}
就是手压着有点酸,所以把pro micro的引脚给焊上,方便插面包板
测试一下控制多个led,把上边代码改下NUM_LEDS就行,然后连灯带的头
发现是能群控的,这里有些不理解为啥,明明输出引脚选的是普通的数字输出也能做到群控,记住结论吧。
总之灯带的使用还是非常简单的。
红外传感使用
很容易想到,用红外传感连接模拟输入引脚来实现抬手判断,于是先给发射端接上电源正负极,然后接收端的短脚接模拟输入引脚,然后用analogyRead函数来读取电压就行了。然而问题很大。 直接给发射端接了5v的电压,只听啪的一声直接炸了,当然肉眼是看不到的,勉强能闻到味道。。。不信邪再试一次,又炸了。还好我买的多,又便宜,接个100欧的电阻或者是用AMS1117就能解决。 然后看接收端,先用Serial.print函数打印一下读取到的电压,结果和想象的不一样,一开始以为电压应该一直会稳定在某一个数值小幅度波动,等手挡到红外的时候数值大幅度变动,结果不是这样的,数值一直在乱跳,查了一下资料说是要给模拟输入引脚加电阻后接地才行,好吧是我肤浅了。于是给它接了100欧的电阻,结果主控芯片灯灭关机了,应该是短路了?。然后一点一点的加大电阻,最后加到1M终于不会短路了,这是我最大的电阻了。。。然后没有红外光照射的时候模拟输入读到的数字是个位数,照到红外光就会飙到1023,用手挡掉红外光就掉回2位数,大概就这么回事了。
MPR121芯片使用
首先要了解一下mpr121的引脚,有个较详细的文档 下面0到11是用来提供触摸输入的,关键是上边的6个引脚要连好才行,ADD和IRQ先不管,其他的直接连主控对应的引脚就行了,3.3v的话最好先降下压,不过文档里写了就算不降压也没事,不会烧坏,就是可能会不太准,那我就偷懒直连5v电压了。 IRQ用不到,最关键的是ADD,如果4片MPR121并联接到主控的话主控是需要一个地址来区分这四个芯片的,地址是0x5A、0x5B、0x5C、0x5D这4个数字,根据文档,默认情况下芯片的地址是0x5A,也就是说直接使用4个芯片的话4个都是0x5A,无法进行区分。文档中讲到想要更改地址,需要将ADD引脚进行连接,其中ADD如果连到GND,那么这个芯片的地址是0x5A,如果连到3.3v,那么地址是0x5B,如果连到SDA,那么地址是0x5C,如果连到SCL,那么地址是0x5D。但是芯片的原理图中显示,ADD引脚默认就和GND相连,所以默认地址是0x5A,就算你手动去连了其他引脚最后地址也是不变的。所以要将ADD与GND先进行物理打击使其断开连接,具体有个视频 断开后按照上边的地址进行连接,然后下载一个mpr121的库用它的示例进行测试一下就行了,还是很容易使用的。
手台方案设计
有了上边的铺垫,相信大家都有了自己的思路设计一个手台,无非就是两大件,红外传感和触控感应,外加一个可有可无的炫光功能,这边我也只是做了个试制品,各方面都很烂没啥好说的。 红外的话接收端放左手边,用6个接收传感器并联,然后负极直连模拟输入的同时用1M的电阻接地。发射端犹豫导线不够了所以就放了3个灯管并联,但是连接VCC而是每一个灯管单独给一个数字输出引脚,方便用代码单独进行开关,后续如果算法有改动可以灵活控制,最好可以做成6个灯管单独可控的,就是引脚可能不够多。。。目前的算法非常简陋,就是发射端常亮,假如模拟输入读到的值低于某个阈值了,那么判定有手遮挡了,然后触发模拟键盘输入就行了,这样勉强能用,不是我不想优化代码,而是现在的雏形问题太多根本没资格优化。。。后续等我用上pcb了应该会修改方案增加抗干扰能力。 触控部分就是4个mpr121并联,然后各自不同地址,虽然目前只做了16key的但是这个设计最高支持48key。需要注意的是触控芯片的供电最好能和红外的供电隔开点,否则会影响它的稳定性。然后是贴铜片,最后玩的时候肯定不会去摸0-11引脚吧,那就要把引脚用导线通出来,接到铜片,然后手摸铜片也离谱,割出破伤风医疗费够买个新手台了,随便贴点纸或者用薄一点的磨砂亚克力板也行。 最后灯带部分属实还没想好往哪加,就这样了。
结语
最后感想就是,想要做出来是比较简单的,但是想要做好还是要花一定功夫来优化,可惜我时间有限,而且我本身也不是干这行的,只能抽出国庆的一段时间来稍微玩一玩。最后放点成品图吧,代码啥的就不贴了,属实丢人。