黑科技:程序猿如何打造屬於本身的分體鍵盤

前言

以前一直想買個機械鍵盤,據說機械鍵盤敲代碼和玩遊戲都特別爽,也是裝B神器。同時也以爲普通的鍵盤打字打久了手腕會有點酸酸的,由於敲鍵盤時都是要彎着手腕的,一點也不符合人體工程學。因而乎就想買一個分體的機械鍵盤,結果找了半天都沒有比較中意的,找到幾我的體工程學鍵盤,都是薄膜的,並且價格高得離譜,不就多我的體工程學光環嘛。。。git

普通機械鍵盤

淘寶人體工程學鍵盤

淘寶分體鍵盤

爲了避免要這麼糾結,就本身diy一個咯,正好有臺3D打印機,所有外殼本身打印,控制板用Arduino Leonardo,原生支持鍵盤鼠標驅動,軸體淘寶,考慮成本,先買了80顆國產黑軸作實驗,鍵帽也簡單打印一下,說幹就幹工具

最終成果

準備

  • 工具oop

    • 3D打印機佈局

    • 電烙鐵測試

    • 熱熔膠ui

    • 萬用表spa

  • 硬件操作系統

    • Arduino Leonardo板設計

    • 黑軸軸體3d

    • 二極管+電阻+杜邦線+萬能板

    • 小螺絲

  • 軟件

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

  // 初始化掃描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 官方操做系統,鵝廠的工程師都在使用,快來加入咱們吧!

相關文章
相關標籤/搜索