* 程序设计
#include "Keyboard.h" #include "HID.h" #define scanPin\_len 8 int scanPin[] = {4,5,6,7,0,1,2,3}; // 扫描pin,(默认低电平,逐个输出高电平) int scanPos = 0; // 当前扫描位 #define btnPinA\_len 6 #define btnPinD\_len 4 int btnPinA[] = {5,4,3,2,1,0}; // 按钮pin,模拟端口 int btnPinD[] = {8,9,10,11}; // 按钮pin,数字端口 #define btn\_len 10 byte btn[scanPin\_len][btn\_len]; // 按钮状态 byte btnTmp[btn\_len]; // 临时按钮状态 #define KEY\_FN KEY\_RIGHT\_SHIFT // FN键 // 8\*10的按键映射矩阵 uint8\_t keyMap[scanPin\_len][btn\_len] = { {'y','n','7','8',KEY\_F6,'h','m','u','j',' '}, {'o','.','0','9',KEY\_F7,'l',',','i','k',KEY\_FN}, {'p','http://www.likecs.com/','-',KEY\_LEFT\_ARROW,KEY\_F8,';',KEY\_UP\_ARROW,'[','\'',KEY\_DOWN\_ARROW}, {KEY\_F10,KEY\_DELETE,'=',KEY\_BACKSPACE,KEY\_F9,KEY\_F11,KEY\_RETURN,']','\\',KEY\_RIGHT\_ARROW}, {KEY\_ESC,KEY\_LEFT\_GUI,'`',KEY\_LEFT\_CTRL,KEY\_TAB,'a','q','z',KEY\_CAPS\_LOCK,KEY\_LEFT\_SHIFT}, {KEY\_F1,KEY\_LEFT\_ALT,'1',KEY\_F2,'2','s','w','x','d','c'}, {KEY\_F3,' ','4',KEY\_F4,'3','e','r','b','f','v'}, {KEY\_F5,'6','5',0,0,0,'t','g',0,0} }; void setup() { Keyboard.begin(); Keyboard.releaseAll(); // 初始化扫描pin for(int i=0; i<scanPin\_len; i++) { pinMode(scanPin[i], OUTPUT); } // 初始化按钮pin for(int i=0; i<btnPinD\_len; i++) { pinMode(btnPinD[i], INPUT); } // 初始化按钮状态 for(int i=0; i<scanPin\_len; i++) { for(int j=0; j<btn\_len; j++) { btn[i][j] = 0; } } for(int j=0; j<btn\_len; j++) { btnTmp[j] = 0; } } void loop() { // 轮询设置scanPin for(int i=0; i<scanPin\_len; i++) { if(i == scanPos) { digitalWrite(scanPin[i], HIGH); } else { digitalWrite(scanPin[i], LOW); } } delay(5); // 读取按键信息 readBtn(); // 处理状态有改变的btn for(int i=0; i<btn\_len; i++) { if(btn[scanPos][i] != btnTmp[i]) { btn[scanPos][i] = btnTmp[i]; if(btnTmp[i] == 1) { Keyboard.press(keyMap[scanPos][i]); } else { Keyboard.release(keyMap[scanPos][i]); } } } scanPos = (scanPos + 1) % scanPin\_len; // 下一个 } void readBtn() { // 先读模拟口,再读数字口 // 5 -> 0 int index = 0; for(int i = 0; i < btnPinA\_len; i ++) { int val = analogRead(btnPinA[i]); if(val > 600) { btnTmp[index] = 1; } else { btnTmp[index] = 0; } index ++; } for(int i = 0; i < btnPinD\_len; i ++) { btnTmp[index] = digitalRead(btnPinD[i]); index ++; } } 制作图集* 第一版键帽(3D打印机精度还是有点欠缺,特别是处理弧线):
* 打印机底板想换成玻璃的,结果新买的毛玻璃打印时受热不均,碎了。。。还是乖乖用回美纹纸吧
* 在打印中,加热头松动掉落,还好机器有自动保护,没有造成火灾。幸亏代码不是我写的,要不然肯定会火灾的,^_^
* 打印过程中底座脱落,都打成鸟窝了。。。一路坎坷啊
* 轴体安装,再次简单粗暴的没有使用卫星轴
* 飞线,这是第一版没加二极管的连线,没有做pcb,直接飞线连,简单高效,适合屌丝程序员,O(∩_∩)O哈哈~
* ArduinoLeonardo还没到货,拿uno测试按键
* 外壳组装效果
* 第一版键帽(字母是用美纹纸贴上去的,就是这么简单粗暴)
* Leonardo到货,测试驱动
* 右手组装成功(黑色更有感觉啊)
* 新版键帽(白色),美纹纸弱爆了,必须整高端点,然后发现白色材料打印效果很赞,光滑度也高了不少,打印材料还是相当重要的
* 电路板,裸露在键盘外还是挺有极客范的哦
* 最后效果,键盘在手,天下我有
总结