为什么80%的码农都做不了架构师?>>>
前言
之前一直想买个机械键盘,听说机械键盘敲代码和玩游戏都特别爽,也是装B神器。同时也觉得普通的键盘打字打久了手腕会有点酸酸的,因为敲键盘时都是要弯着手腕的,一点也不符合人体工程学。于是乎就想买一个分体的机械键盘,结果找了半天都没有比较中意的,找到几个人体工程学键盘,都是薄膜的,而且价格高得离谱,不就多个人体工程学光环嘛。。。
普通机械键盘
淘宝人体工程学键盘
淘宝分体键盘
为了不要这么纠结,就自己diy一个咯,正好有台3D打印机,全部外壳自己打印,控制板用Arduino Leonardo,原生支持键盘鼠标驱动,轴体淘宝,考虑成本,先买了80颗国产黑轴做实验,键帽也简单打印一下,说干就干
最终成果
准备
- 工具
- 3D打印机
- 电烙铁
- 热熔胶
- 万用表
- 硬件
- Arduino Leonardo板
- 黑轴轴体
- 二极管+电阻+杜邦线+万能板
- 小螺丝
- 软件
- SolidWorks 3D建模
- Arduino IDE 写Arduino键盘驱动
是时候上点图了。。。
自己组装的三角洲式3D打印机
淘宝买的工具
步骤
先设计键位排布,使用SolidWorks画出简单的按键布局,先从左手开始,先完整的搞定左手能使用了,再做右手。设计好布局后制作支撑轴体的面板,然后设计电路,用飞线焊接,写代码测试按键是否都正常。电路正常后设计整个外壳,然后整体组装。这就完工啦
键位设计
电路设计
由于Arduino板io口有限,必须使用扫描来实现按键,Arduino有6个模拟口,14个数字口。我要做的键盘不超过80个键,所以使用8个数字口进行脉冲扫描,6个模拟口加4个数字口用来接收脉冲来定位按键,这样就实现了8*10的矩阵,支持80个键。还有2个数字键是空闲的,可以用于特殊按键定制。
外壳设计
程序设计
#include "Keyboard.h"#include "HID.h"#define scanPin_len 8int scanPin[] = {4,5,6,7,0,1,2,3}; // 扫描pin,(默认高电平,逐个输出低电平)int scanPos = 0; // 当前扫描位#define btnPinA_len 6#define btnPinD_len 4int btnPinA[] = {5,4,3,2,1,0}; // 按钮pin,模拟端口int btnPinD[] = {8,9,10,11}; // 按钮pin,数字端口#define btn_len 10byte btn[scanPin_len][btn_len]; // 按钮状态byte btnTmp[btn_len]; // 临时按钮状态#define KEY_FN KEY_RIGHT_SHIFT // FN键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','/','-',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();
Serial.begin(9600); // 初始化扫描pin
for(int i=0; i// 初始化按钮pin
for(int i=0; i// 初始化按钮状态
for(int i=0; ifor(int j=0; j0;
}
} for(int j=0; j0;
}
}void loop() { // 轮询设置scanPin
for(int i=0; iif(i == scanPos) {
digitalWrite(scanPin[i], HIGH);
} else {
digitalWrite(scanPin[i], LOW);
}
}
delay(5); // 读取按键信息
readBtn(); // 处理状态有改变的btn
for(int i=0; iif(btn[scanPos][i] != btnTmp[i]) {
btn[scanPos][i] = btnTmp[i];// Serial.print("["); // Serial.print(scanPos);// Serial.print(" : ");// Serial.print(i);
if(btnTmp[i] == 1) {
Keyboard.press(keyMap[scanPos][i]);// Serial.print("] pressed");
} else {
Keyboard.release(keyMap[scanPos][i]);// Serial.print("] released");
}// Serial.println("");
}
}
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;
} // Serial.print(btnTmp[index]);
index ++;
} for(int i = 0; i < btnPinD_len; i ++) {
btnTmp[index] = digitalRead(btnPinD[i]); // Serial.print(btnTmp[index]);
index ++;
}
}
制作图集
新买的毛玻璃打印时受热不均,碎了。。。
打印过程中底座脱落,一路坎坷啊
ArduinoLeonardo还没到货,拿uno测试按键
外壳组装效果
- 最后效果
总结
做完整个键盘感觉非常有成就感,也非常实用,截止目前已经用了快半年时间了,已经非常习惯机械键盘的按键反馈,手腕也不再弯着,没有酸过了。最后来大致汇总下花费吧
- 80颗国产黑轴 104元
- 元器件 24元(邮费贵,还有很多二极管和万能板没用到)
- Leonardo 30元
大概材料花费在160元左右,比普通的机械键盘便宜多了,而且还是分体的,所有按键可随意自定义(驱动程序都自己写的,O(∩_∩)O哈哈~)
如果你觉得内容意犹未尽,如果你想了解更多相关信息,请扫描以下二维码,关注我们的公众账号,可以获取更多技术类干货,还有精彩活动与你分享~
腾讯 Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条 Crash 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!