程序员怎么着创设属于自身的分体键盘

前言

作为一名程序员,键盘在手,天下本人有啊,不整把巨大上的键盘怎么升高B格。以前平昔想买个多功能键盘,听他们讲超薄键盘敲代码和玩游戏都尤其爽,也是装B神器。同时也以为普通的键盘打字打久了一手会有点酸酸的,因为敲键盘时都是要弯初步腕的,一点也不符合人体育工作程学。于是乎就想买2个分体的机械键盘,结果找了半天都从不比较满足的,找到几人身工程学键盘,都是薄膜的,而且价钱高得离谱,不就多个肉体育工作程学光环嘛。。。身为程序员中的屌丝,岂能被金钱那种事物降低本身B格呢

一般而言多功能键盘

带 * “人体育工作程学光环” * 键盘

为了不用这么纠结,就融洽diy一个咯,正好有台3D打印机(又三个装B神器,你值得全部,O(∩_∩)O哈哈~),全体外壳本身打字与印刷,控制板用Arduino
伦Nadero,原生帮忙键盘鼠标驱动,轴体考虑到开销,先买了80颗国产黑轴做试验,键帽也简要打字与印刷一下,说干就干

3D打字与印刷的分体黑轴多功能键盘

27111葡京的网址,符合人体育工作程学的分体式设计,全键无冲,可任意自定义飞速键,甚至可任性滴修改键位布局哦(重新规划外壳即可)

准备

  • 工具
    • 3D打字与印刷机 (打字与印刷外壳)
    • 电烙铁
    • 热熔胶 (固定按键用)
    • 万用表
  • 硬件
    • Arduino Leonardo板 (驱动板)
    • 黑轴轴体
    • 二极管+电阻+杜邦线+万能板
    • 小螺丝 (外壳装配)
  • 软件
    • SolidWorks (3D建立模型,设计外壳,可用任何3D建立模型软件代替哦)
    • Arduino IDE (写键盘驱动程序)

是时候上点图了。。。
和谐组装的三角洲式3D打字与印刷机

天猫买的工具


步骤

先规划键位排布,使用 ** SolidWorks **
(任何3D建模软件都ok的,只是小编相比较熟系SolidWorks哦)画出简约的按键布局,先从左侧起初,先全部的解决左手能应用了,再做右手。设计好布局后制作支撑轴体的面板,然后设计电路,用飞线焊接,写代码测试按键是不是都健康。电路符合规律后设计总体外壳,然后全部组装。那就完工啦

  • 键位设计

右侧之所以外形扭曲,是因为3D打字与印刷机打字与印刷面积有限

  • 电路设计

    鉴于Arduino板io口有限,必须运用矩阵扫描来落实按键。扫描格局正是:定义n个io口为扫描口,m个接收口,组成贰个n*m的矩阵。扫描口私下认可全体都是低电压,然后逐一将种种扫描口单独置为高电压(即扫描动作),当以此高电压的扫描口上接二连三的有个别按键有按下时,对应的接收口电压就也是高电压,那时就能够稳定到是哪些按钮按下了,矩阵如图所示:

Arduino有五个模拟口,拾柒个数字口。笔者要做的键盘不超过78个键,所以利用柒个数字口进行脉冲扫描,四个模拟口加六个数字口用来接过脉冲来恒定按键,这样就落成了8*10的矩阵,扶助77个键。还有3个数字键是悠闲的,可以用来特殊按键定制。

  • 按键争辩处理

设若按上海教室不难达成会设有争辩难题,当接收口上有四个按键被按下时,会存在回路,高电压的扫描口和低电压的扫描口发生围堵,就不知晓是哪位按键被按下了。一般键盘都以5键左右不争持,也便是以此键盘有五个接收口,只要有限支撑在同三个接收口上的按键不会同时按下就不会有抵触。

应用矩阵扫描形式就会有按键抵触难题,小编动用二极管来处理争辨,保障不会并发回路难题,如图(Lacrosse是扫描口,C是接收口):

  • 电压动荡处理
    二极管消除了争辨难点,但是不可能消除电压动荡,电压不平静有两方面,第③正是当扫描口高电压变为低电压时,接收口电压不会即刻成为低电压,所以在接收口都亟需加二个下拉电阻,让电压立马降下来。第叁正是按键按下时接触片碰撞时造成的电压不稳,这几个最好是经过加电容(和按键并联)去过滤波动电压,买元件时忘了买电容了,那里就差不离残忍了

  • 末段电路设计

  • 外壳设计(第三期简易点,不把电路板放到外壳内)

    • 左手
-   右手



-   侧面
  • 键帽设计
  • 程序设计

#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','/','-',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 ++;
  }
}

创制图集

  • 第1版键帽(3D打印机精度仍旧有点不足,尤其是拍卖弧线):
  • 打字与印刷机底板想换到玻璃的,结果新买的毛玻璃打字与印刷时受热不均,碎了。。。依然婴孩用回美纹纸吧
  • 在打字与印刷中,加热头松动掉落,幸亏机器有全自动爱护,没有导致火灾。幸好代码不是自己写的,要不然肯定会火灾的,\_

  • 打字与印刷进度中底座脱落,都打成鸟窝了。。。一路坎坷啊

  • 轴体安装,再度简单残忍的远非选择卫星轴
  • 飞线,那是首先版没加二极管的连线,没有做pcb,直接飞线连,简单飞速,适合屌丝程序员,O(∩_∩)O哈哈~
  • ArduinoLeonardo还没到货,拿uno测试按键
  • 外壳组装效果
  • 首先版键帽(字母是用美纹纸贴上去的,就是这么简单冷酷)
  • 伦Nadero到货,测试驱动
  • 出手组装成功(浅灰褐更有感觉啊)
  • 新版键帽(碳灰),美纹纸弱爆了,必须整高端点,然后发现天灰质地打字与印刷效果相当的赞,反射率也高了许多,打字与印刷质感照旧分外重庆大学的
  • 电路板,裸露在键盘外依旧挺有极客范的哦
  • 末段效果,键盘在手,天下本身有

总结

做完全个键盘感觉格外有成就感,也12分实用,甘休最近已经用了快7个月时间了,已经特别喜爱多功能键盘的按键反馈,也不行习惯分体键盘的布局,手腕也不再弯着,没有酸过了。最后来差不多集中下成本吧(屌丝程序员装B有望啊。。。)

  • 80颗国产黑轴 104元
  • 元器件 24元(邮政资费贵,还有很多二极管和万能板没用到)
  • Leonardo 30元
    约莫材料开支在160元左右,比常常的平板键盘便宜多了,而且依旧分体的,全部按键可随心所欲自定义(驱动程序都友好写的,还有吗无法改的,O(∩_∩)O哈哈~)

终极晒一下自小编在小黑屋的办公桌(那键盘是还是不是B格最高的? O(∩_∩)O~~)

发表评论

电子邮件地址不会被公开。 必填项已用*标注