前言

之前一直想买个机械键盘,听说机械键盘敲代码和玩游戏都特别爽,也是装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 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键
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);// 初始化扫描pinfor(int i=0; i<scanPin_len; i++) {pinMode(scanPin[i], OUTPUT);}// 初始化按钮pinfor(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() {// 轮询设置scanPinfor(int i=0; i<scanPin_len; i++) {if(i == scanPos) {digitalWrite(scanPin[i], HIGH);} else {digitalWrite(scanPin[i], LOW);}}delay(5);// 读取按键信息readBtn();// 处理状态有改变的btnfor(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 -> 0int 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 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!

黑科技:程序猿如何打造属于自己的分体键盘相关推荐

  1. 超级黑科技代码!Python打造电脑人脸屏幕解锁神器附带接头暗号

    前言:让我的电脑认识我 我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现高大上的人脸识别技术! Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特 ...

  2. [贝聊科技] 程序猿如何从产品的角度去提升应用的体验之Android权限优化篇

    前言:大家平时在开发的过程中是否会遇到这种情况:很多产品体验上的细节,特别是涉及到技术相关的细节,产品与设计可能并不会给出详细的解决方案,甚至可能并不太关注这方面的体验细节.例如,应用的缓存清理机制该 ...

  3. 黑科技 | 程序员用Windows记事本写出了光追演示程序:每秒30帧

    光线追踪(Ray tracing)已经是当下游戏领域的热门词汇,NVIDIA从RTX 20系显卡开始支持硬件级实时加速,AMD最近升级了Radeon Rays 4.0套件,终于在CPU之外新增了面向显 ...

  4. 程序猿麒麟臂打造之路(健身二)

    规划 昨天一天做了接近400个.感觉还不错,准备一直坚持. 每个星期一篇帖子,用来记录每天锻炼的次数 第二天 07点 2组 30个 11点 2组 30个 14点 2组 30个 第一周 连续做了三天,可 ...

  5. 欢庆1024之:程序猿不是你想黑,想黑就能黑!

    为什么程序猿们每天能想出这么多段子,却没有人说他们幽默呢?看完这篇文章或许你就明白了. 无论你是首席架构师.代码魔术师.工程师忍者还是软件匠手,都无法改变你是程序猿这个事实.面对即将到来的春节,或许你 ...

  6. 程序猿回到过去:红花会与布隆过滤器

    这是一个台风夜,雨还在下,敲着窗户,叮叮当当.阿智终于写完最后一行代码,合上了笔记本电脑.他看了看时钟,23点56分,他笑着说了一声"今天好早啊".阿智还没有女朋友,自从做了一名程 ...

  7. 程序猿炫起富来你们根本看不懂!

    一直以来我们对程序猿都有误解,认为他们只会写代码.穿格子衬衫.背双肩包.还秃顶,认为他们工作枯燥,生活低调,从不炫富. 不是程序猿不炫富,是炫起富来你们根本看不懂!!! 比如程序猿的三大信仰之一 -- ...

  8. 程序猿专属福利~键盘选的好,下班回家早

    在不想变成加班狗这件事上 程序猿跟普通白领有一致的渴望 或许 一个颜高活好 啪啪啪超爽的机械键盘 能让你代码写的得心应手 甚至能早点下班 更别说 就像女人衣橱里永远缺少一件衣服一样 程序猿的办公桌上 ...

  9. 【程序猿的黑科技】一些有趣且有用的的工具整理

    [前言] 本期将介绍几个PC软件.为大家分享有趣的工具及资源是我创建此专栏的初衷.我也会定期收集一些好玩的"黑科技"供大家研究. 1.一款简约桌面整理插件-dock 密码:6666 ...

最新文章

  1. iis 网页HTTP 错误 404.3 - Not Found解决方案
  2. Real-Time-Voice-Cloning的使用教程
  3. 推荐的 CSS 书写顺序
  4. matlab中(1 )什么意思,matlab中area(1)什么意?mat – 手机爱问
  5. Win10+VS2015+EF6.0+MySQL5.6+MVC环境部署和排错
  6. 5分钟了解Mockito
  7. 1025 反转链表 (25分)(最详细最简便)(套路模板)
  8. Activity service 通信
  9. Javascipt数组去重的几种方式
  10. python将字符串写入csv_用Python将字符串值写入CSV文件
  11. Pyqt 打开外部链接的几种方法
  12. UVA11991 Easy Problem from Rujia Liu?题解
  13. c++ 打印日志信息
  14. SIMATIC HMI操作系统更新
  15. POI合并单元格后边框显示问题
  16. 网络语言c某人,1999—2019,21年的网络流行语,你确定你真的懂?
  17. 数据库增加字段注意事项
  18. win10任务栏太宽而且调不了_win10任务栏变宽了怎么恢复原来的_win10任务栏变宽拉不下去怎么办-爱纯净...
  19. javascript 3/13
  20. 消极和积极的道德--给亲爱的安德烈

热门文章

  1. 【论文阅读】A CNN-Transformer Hybrid Approach for CropClassification Using MultitemporalMultisensor Images
  2. linux 怎么看浏览器,Linux下浏览器比比看
  3. CSS3中惊艳的gradient
  4. Task 2: Word Vectors and Word Senses (附代码)(Stanford CS224N NLP with Deep Learning Winter 2019)
  5. 华为IoT生态品牌扩大朋友圈,方舟实验室首度亮相...
  6. [Unity2D入门教程]简单制作仿植物大战僵尸游戏之①搭建场景
  7. 超详细的harbor私有仓库搭建并使用域名登录
  8. 分解质因数-Pollard‘s Rho
  9. python编辑七段数码管引脚图_少儿Python程序第十二讲:单片机控制数码管
  10. 滨江学院c语言期中考试试题,南信大滨江学院linux期末作业.doc