腾讯职工的黑科技

前言

前边一贯想买个多功能键盘,听说超薄键盘敲代码和玩游戏都专门爽,也是装B神器。同时也觉得普通的键盘打字打久了手段会有点酸酸的,因为敲键盘时都是要弯先导腕的,一点也不符合人体工程学。于是乎就想买一个分体的教条键盘,结果找了半天都并未对比乐意的,找到多少人身工程学键盘,都是薄膜的,而且价格高得不可相信,不就三个身子工程学光环嘛。。。

一般而言超薄键盘

27111葡京的网址 1

Tmall人体工程学键盘

27111葡京的网址 2

Tmall分体键盘

27111葡京的网址 3

为了不用这么纠结,就自己diy一个咯,正好有台3D打印机,全体外壳自己打印,控制板用Arduino
伦纳德(Leonard)o,原生协理键盘鼠标驱动,轴体天猫,考虑费用,先买了80颗国产黑轴做试验,键帽也简单打印一下,说干就干

最后成果

27111葡京的网址 4

准备

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

是时候上点图了。。。

团结组装的三角洲式3D打印机

27111葡京的网址 5

天猫商城买的工具

27111葡京的网址 6


步骤

先规划键位排布,使用SolidWorks画出简约的按键布局,先从左侧开首,先全体的搞定左手能选取了,再做右手。设计好布局后制作支撑轴体的面板,然后设计电路,用飞线焊接,写代码测试按键是否都例行。电路正常后安插总体外壳,然后全体组装。那就竣工啦

  • 键位设计

    • 左手
      27111葡京的网址 7
    • 入手(之所以外形扭曲,是因为3D打印机打印面积有限)
      27111葡京的网址 8
  • 电路设计

    鉴于Arduino板io口有限,必须选取扫描来贯彻按键,Arduino有6个模拟口,14个数字口。我要做的键盘不超越80个键,所以拔取8个数字口举行脉冲扫描,6个模拟口加4个数字口用来收取脉冲来定位按键,那样就贯彻了8*10的矩阵,援救80个键。还有2个数字键是悠闲的,可以用于特殊按键定制。

    • 争辩处理
      选择脉冲扫描情势就会有按键争执问题,我动用二极管来拍卖争执,如图(R是扫描口,C是接收口):
      27111葡京的网址 9
    • 电压动荡处理
      二极管解决了争持问题,可是不可以化解电压动荡,电压不稳定有两上边,第一就是当扫描口高电压变为低电压时,接收口电压不会立即变成低电压,所以在接收口都急需加一个下拉电阻,让电压立马降下来。第二就是按键按下时接触片碰撞时造成的电压不稳,那一个最好是经过加电容去过滤波动电压,买元件时忘了买电容了,那里就差不多冷酷了

    • 最后电路设计
      27111葡京的网址 10

  • 外壳设计

    • 左手
      27111葡京的网址 11
    • 右手
      27111葡京的网址 12
    • 侧面
      27111葡京的网址 13
  • 键帽设计
    27111葡京的网址 14
    27111葡京的网址 15
    27111葡京的网址 16

  • 程序设计

#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);

  // 初始化扫描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 ++;
  }
}

打造图集

  • 率先版键帽:
    27111葡京的网址 17

  • 新买的毛玻璃打印时受热不均,碎了。。。
    27111葡京的网址 18

  • 在打印中,加热头松动掉落,还好机器有机动尊崇,没有导致火灾
    27111葡京的网址 19

  • 打印进度中底座脱落,一路周折啊
    27111葡京的网址 20

  • 轴体安装
    27111葡京的网址 21

  • 飞线
    27111葡京的网址 22

  • Arduino雷纳德(Leonard)o还没到货,拿uno测试按键
    27111葡京的网址 23

  • 外壳组装效果
    27111葡京的网址 24

27111葡京的网址 25

  • 率先版键帽(字母是用美纹纸贴上去的)
    27111葡京的网址 26

  • 雷纳德(Leonard)o到货,测试驱动
    27111葡京的网址 27

  • 下手组装成功(粉红色更有痛感啊)
    27111葡京的网址 28

  • 新版键帽(白色)
    27111葡京的网址 29

  • 电路板
    27111葡京的网址 30

 

  • 末段效果
    27111葡京的网址 31

总结

做完全个键盘感觉万分有成就感,也非凡实用,为止近日曾经用了快半年时间了,已经非常习惯数字键盘的按键反馈,手腕也不再弯着,没有酸过了。最终来大概集中下花费吧

  • 80颗国产黑轴 104元
  • 元器件 24元(邮费贵,还有好多二极管和万能板没用到)
  • Leonardo 30元
    粗粗材料开销在160元左右,比常见的教条键盘便宜多了,而且依旧分体的,所有按键可随意自定义(驱动程序都要好写的,O(∩_∩)O哈哈~)

终极晒一下本人在小黑屋的书桌
27111葡京的网址 32

假若你以为内容意犹未尽,假设您想精通更加多相关信息,请扫描以下二维码,关怀大家的斯巴鲁账号,可以获取越多技术类干货,还有杰出活动与您享受~

   27111葡京的网址 33

腾讯
Bugly
是一款专为移动开发者打造的质地监控工具,帮忙开发者疾速,便捷的定位线上动用崩溃的意况以及解决方案。智能合并功用帮忙开发同学把天天上报的数千条Crash按照根因合并分类,每一天早报会列出影响用户数最多的崩溃,精准定位成效协理开发同学定位到出题目的代码行,实时报告可以在发表后高速的询问应用的成色意况,适配最新的
iOS, Android 官方操作系统,鹅厂的工程师都在拔取,快来到场我们吧!

发表评论

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