自制飞线chunithm手台


前言

  最近想玩中二了,虽然之前也用平板玩过一段时间但是终究没内味,身为老家里蹲也不想天天浪费3个小时通勤出门打街机,于是想着买个手台吧,结果价格令人望而却步。然后网上查了一下相关资料,一个主控30块钱,其他的电子元件几块钱一抓一大把,一个手台贵有3个原因:

  • pcb打样,也就是集成电路板,中二手台的pcb尺寸比sdvx大得多,主体部分打样要300块钱左右打五片,就算你只要一片也不行,这也是促使我自己飞线手台的原因之一,但是对于卖家来说就没那么亏,他可以做五台然后卖掉。
  • 外壳,亚克力外壳的价格也是比较贵的,随便切几块就要一两百块钱
  • 技术,从集成电路线路设计到主控程序的算法实现,凝聚了技术成本

  最后还是决定自己试着做一下,理由有以下几点:

  • 我的显示器是24寸的,直接买手台适配的是32寸的,玩着不爽
  • 手台太贵,太占地方
  • 不确定自己会玩多久
  • 自己有大概的设计思路,想要验证是否可行
  • 不想交智商税

  大概就是这样,于是记录一下主要的制作和学习过程。

所需基础知识

  • 高中物理电学基础
  • 资料查阅能力
  • C/C++编程
  • 单片机的基本使用方法

  其中1、2一般都是默认都具备的,学软件或者计算机的3肯定没问题,4的话本科的机组实验做的比这个手台难多了,直接操作寄存器啥的还得自己设计指令集,即使是想要从零开始学也用不了多久,去B站看一小时的Arduino教程就真的差不多了。所以想要完成制作应该问题不大。

用到的材料

  以下是自己学习过程中用到的材料,而不是说制作一个手台必备这些材料:

  • 面包板,越大越好,随便玩玩的话买个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引脚介绍

  首先参考一下官方文档

promicro.png

  其中蓝色的为数字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灯带,正好顺便学习一下灯带的使用,从最后面剪下来一个,拿来测试吧

ws2812b1.jpg

+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的引脚给焊上,方便插面包板

promicro2.jpg

测试一下控制多个led,把上边代码改下NUM_LEDS就行,然后连灯带的头

ws2812b1.jpg

  发现是能群控的,这里有些不理解为啥,明明输出引脚选的是普通的数字输出也能做到群控,记住结论吧。

  总之灯带的使用还是非常简单的。

红外传感使用

  很容易想到,用红外传感连接模拟输入引脚来实现抬手判断,于是先给发射端接上电源正负极,然后接收端的短脚接模拟输入引脚,然后用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引脚吧,那就要把引脚用导线通出来,接到铜片,然后手摸铜片也离谱,割出破伤风医疗费够买个新手台了,随便贴点纸或者用薄一点的磨砂亚克力板也行。
  最后灯带部分属实还没想好往哪加,就这样了。

结语

  最后感想就是,想要做出来是比较简单的,但是想要做好还是要花一定功夫来优化,可惜我时间有限,而且我本身也不是干这行的,只能抽出国庆的一段时间来稍微玩一玩。最后放点成品图吧,代码啥的就不贴了,属实丢人。
主控
mpr121
洞洞板
触摸板
红外
成绩图


文章作者: 大A
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 大A !
评论
  目录