​黑科技:程序猿如何打造属于自己的分体键盘
​黑科技:程序猿如何打造属于自己的分体键盘
腾讯Bugly 发表于2年前
​黑科技:程序猿如何打造属于自己的分体键盘
  • 发表于 2年前
  • 阅读 5493
  • 收藏 125
  • 点赞 16
  • 评论 40

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 之前一直想买个机械键盘,听说机械键盘敲代码和玩游戏都特别爽,也是装B神器。同时也觉得普通的键盘打字打久了手腕会有点酸酸的,因为敲键盘时都是要弯着手腕的,一点也不符合人体工程学。于是乎就想买一个分体的机械键盘,结果找了半天都没有比较中意的,找到几个人体工程学键盘,都是薄膜的,而且价格高得离谱,不就多个人体工程学光环嘛。。。

前言

之前一直想买个机械键盘,听说机械键盘敲代码和玩游戏都特别爽,也是装B神器。同时也觉得普通的键盘打字打久了手腕会有点酸酸的,因为敲键盘时都是要弯着手腕的,一点也不符合人体工程学。于是乎就想买一个分体的机械键盘,结果找了半天都没有比较中意的,找到几个人体工程学键盘,都是薄膜的,而且价格高得离谱,不就多个人体工程学光环嘛。。。

普通机械键盘

淘宝人体工程学键盘

淘宝分体键盘

为了不要这么纠结,就自己diy一个咯,正好有台3D打印机,全部外壳自己打印,控制板用Arduino Leonardo,原生支持键盘鼠标驱动,轴体淘宝,考虑成本,先买了80颗国产黑轴做实验,键帽也简单打印一下,说干就干

最终成果

准备

  • 工具
    • 3D打印机
    • 电烙铁
    • 热熔胶
    • 万用表
  • 硬件
    • Arduino Leonardo板
    • 黑轴轴体
    • 二极管+电阻+杜邦线+万能板
    • 小螺丝
  • 软件
    • SolidWorks 3D建模
    • Arduino IDE 写Arduino键盘驱动

是时候上点图了。。。

自己组装的三角洲式3D打印机

淘宝买的工具



步骤

先设计键位排布,使用SolidWorks画出简单的按键布局,先从左手开始,先完整的搞定左手能使用了,再做右手。设计好布局后制作支撑轴体的面板,然后设计电路,用飞线焊接,写代码测试按键是否都正常。电路正常后设计整个外壳,然后整体组装。这就完工啦

  • 键位设计

    • 左手
      左手
    • 右手(之所以外形扭曲,是因为3D打印机打印面积有限)
      右手
  • 电路设计

    由于Arduino板io口有限,必须使用扫描来实现按键,Arduino有6个模拟口,14个数字口。我要做的键盘不超过80个键,所以使用8个数字口进行脉冲扫描,6个模拟口加4个数字口用来接收脉冲来定位按键,这样就实现了8*10的矩阵,支持80个键。还有2个数字键是空闲的,可以用于特殊按键定制。

    • 冲突处理
      使用脉冲扫描方式就会有按键冲突问题,我使用二极管来处理冲突,如图(R是扫描口,C是接收口):
       
    • 电压动荡处理
      二极管解决了冲突问题,但是不能解决电压动荡,电压不稳定有两方面,第一就是当扫描口高电压变为低电压时,接收口电压不会立即变成低电压,所以在接收口都需要加一个下拉电阻,让电压立马降下来。第二就是按键按下时接触片碰撞时导致的电压不稳,这个最好是通过加电容去过滤波动电压,买元件时忘了买电容了,这里就简单粗暴了

    • 最终电路设计

  • 外壳设计

    • 左手
    • 右手
    • 侧面
  • 键帽设计


  • 程序设计

#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<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];//      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测试按键

  • 外壳组装效果

  • 第一版键帽(字母是用美纹纸贴上去的)

  • Leonardo到货,测试驱动

  • 右手组装成功(黑色更有感觉啊)

  • 新版键帽(白色)

  • 电路板

  • 最后效果

总结

做完整个键盘感觉非常有成就感,也非常实用,截止目前已经用了快半年时间了,已经非常习惯机械键盘的按键反馈,手腕也不再弯着,没有酸过了。最后来大致汇总下花费吧

  • 80颗国产黑轴 104元
  • 元器件 24元(邮费贵,还有很多二极管和万能板没用到)
  • Leonardo 30元
    大概材料花费在160元左右,比普通的机械键盘便宜多了,而且还是分体的,所有按键可随意自定义(驱动程序都自己写的,O(∩_∩)O哈哈~)

最后晒一下我在小黑屋的办公桌

如果你觉得内容意犹未尽,如果你想了解更多相关信息,请扫描以下二维码,关注我们的公众账号,可以获取更多技术类干货,还有精彩活动与你分享~

腾讯 Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条 Crash 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!


标签: 机械键盘 Bugly
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 273
博文 134
码字总数 568948
评论 (40)
DarkAngel
真 极客 之DIY键盘,前排留名。。。。。话说3D打印机很贵的啊,这个3D打印机也是自己DIY的吗?
Soi
6币
ItBayMax
牛逼
x007007
膜拜大神
xiaolei123
这得会多少东西
sczyh30
真·牛
啸傲天狼
0之前也有玩过这个板子。现在搞软件了。
左蓝
好厉害的DIY
银月光海
79
寂寞的原子
膜拜大神
LeeNux
给跪了!
IamOkay
好东西啊,有史以来看过的最好的博客。
火文乐武
膜拜
大止刀口
虽然牛,但是3D打印出来的太粗糙,用久了估计手指得出血。
Xiphin
刁爆了
您的好友
还没说那个打印机价格啊喂 那个才是花钱大头吧
Dewdrop
这个3D打印机也就1000块钱,这种是最便宜的
__JM_Joy__
我想定制自己的键盘啊
Morstar
膜拜膜拜大神~~~~~
迷茫的小强
表示膜拜~~~
×
腾讯Bugly
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: