とってもシンプルな、9key を作ってみました。
なにやら最近の電子工作界隈では、
自分でキーボードを作ることが流行ってるみたいです。
流行りものが大好きなわたしとしては、そんなブームを素通りすることはできずに、
Arduino ベースの、とってもシンプルな 9key(3×3)を作ってみました。
こんなやつです。
フルキーボードだと1台作るのに1万円以上掛かってしまうので・・・今回は、キー9個だけです。
マイコン
Arduino のようなマイコンを入力デバイスにしてパソコンに接続するには、マイコン自身が HID(ヒューマン・インターフェース・デバイス )として認識できるものでなければなりません。
Arduino では、Mega32U4 というチップが載ってる Leonard や、Pro Micro などの限られたものだけがこれに該当します。
一番なじみ深い Uno は対象外で、これをムリに HID にするにはファームウェアを書き換えたり、特別な作業が必要になるので・・・止めといた方が無難です。
で、今回はこの手の自作キーボードで最も使われているだろう、Pro Micro を選択しました。
Pro Micro には幾つかの種類(red、blue、black)があります。
そして、それぞれが微妙に大きさやピンの配置が違ってたりするので購入に際し注意が必要です。
ちなみに、わたしは上の写真の Black Pro Micro を使いました。
中華で @400 程度で購入できます。
回路図
入出力ピンにキースイッチを9個接続するだけ。
回路図はとってもシンプル。
先月 KiCad がバージョンアップしたので、新たな機能でも試してみようかと思ったのですが、あまりにも回路が簡単すぎて、バージョンアップの恩恵にあずかることはありませんでした。
9個のキー入力を判別するだけ。
Pro Micro の IO ピンは全部で 18 本。
今回の9key では IO ピンとスイッチは1対1で対応できます。
これがフルキーボードだとそう簡単じゃなくて、IO ピンの関係からキーボード・マトリクスで処理する必要があるので、回路は多少複雑になります。
左右分離したフルキーボードでは Pro Micro を2つ使ってキーボード・マトリクスを構成するのが一般的なようです。
まぁ、私がやろうとしているのは、そんな大げさなキーボードじゃないので。
ハードもソフトもとっても簡単。
ホントのところは、大枚はたいてまでフルキーボードまでは必要ないし。。。
むしろ、9キーなら持っててもいいかなぁ~って。
- KiCad のホットキー(ショートカット)を割り当てたり
- 3D モデリングツール Fusion360 のショートカットを割り当てたり
- ハムなら Winkey とかのメモリを割り当てるとか
・・・用途別に、いくつか持っていてもいいかなぁ~って。
基礎チェック
本格的な作業に入る前に、まずやっておくこと!
それは、必要最小限の構成でホントに期待通り動くか・・・チェックすることです。
ミニブレッドボードに Pro Micro とタクトスイッチを1個取り付けた最小構成で HID として振舞ってくれるのか確かめておきます。
スケッチは Arduino IDE のサンプルを少し修正して使います。
基本的には keyboard.h を include して、Keyboard.press() と Keyboard.releaseAll() を使うだけです。
IDE のボード設定は Leonard にして、Pro Micro へスケッチを書き込みます。
#include "Keyboard.h" #define Button1 2 void setup() { Keyboard.begin(); pinMode(Button1, INPUT_PULLUP); } void loop() { if(digitalRead(Button1) == LOW){ Keyboard.press(KEY_LEFT_CTRL); // クリップボードのデータを貼り付け Keyboard.press('v'); delay(100); Keyboard.releaseAll(); while(digitalRead(Button1) == LOW); } delay(100); }
テストスケッチは、タクトスイッチに <ctrl> + V (貼り付け)を割り当てただけ。
メモ帳に書いた文字をコピーしてタクトスイッチを押したら、ちゃんと文字をペーストしてくれました。
基礎チェックは成功です。
PCB
最小構成で HID の確認ができたので、ガーバデータを作って Fusion PCB へ発注しました。
できるだけ小さく・・・作ったつもり。。。
8/8 注文 → 8/22 到着。
製作
パーツさえ揃ってしまえば、キーボード作りは超簡単。
ハンダ付けするだけの単純作業です。
キースイッチは、青軸。(私はこの感触が一番好きなので。)
打鍵時の感触は軸の色で違います。
幾つかの種類の中から、自分が心地よいと感じるものが選択できます。
打鍵時の感触が確かめられる、こういったものも市販されています。(AliExpress で購入)
メカニカルキー Cherry mx の各軸の違いが確かめられるので、本格的にキーボード作りにチャレンジするなら持っていてもいいかもです。
必要なパーツはこれだけ。
表面です。3×3の構成です。
裏面です。
Pro Micro は基板に直付けです。
キートップを取り付けた状態です。
完成です。
一応、足はスペーサを使いましたが・・・これ、専用のケースっているかなぁ~。
まぁ余計なことしないで、このままでいいような気がします。
で、スケッチサンプルとして、KiCad でよく使うホットキーを割り当ててみました。
(KiCad)
X軸で反転 x |
Y軸で反転 y |
配線の開始 w |
---|---|---|
アイテム移動 m |
アイテム回転 r |
アイテム編集 e |
コピー Ctrl + c |
貼り付け Ctrl + v |
元に戻す Ctrl + z |
同じようなコードをスイッチ分の9回、繰り返すだけです。
#include "Keyboard.h" #define Button1 2 #define Button2 3 #define Button3 4 #define Button4 5 #define Button5 6 #define Button6 7 #define Button7 8 #define Button8 9 #define Button9 10 void setup() { Keyboard.begin(); pinMode(Button1, INPUT_PULLUP); pinMode(Button2, INPUT_PULLUP); pinMode(Button3, INPUT_PULLUP); pinMode(Button4, INPUT_PULLUP); pinMode(Button5, INPUT_PULLUP); pinMode(Button6, INPUT_PULLUP); pinMode(Button7, INPUT_PULLUP); pinMode(Button8, INPUT_PULLUP); pinMode(Button9, INPUT_PULLUP); } void loop() { if(digitalRead(Button1) == LOW){ Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('c');
delay(100); Keyboard.releaseAll(); while(digitalRead(Button1) == LOW); } if(digitalRead(Button2) == LOW){ Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('v');
delay(100); Keyboard.releaseAll(); while(digitalRead(Button2) == LOW); } if(digitalRead(Button3) == LOW){ Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('z');
delay(100); Keyboard.releaseAll(); while(digitalRead(Button3) == LOW); } if(digitalRead(Button4) == LOW){ Keyboard.press('m'); delay(100); Keyboard.releaseAll(); while(digitalRead(Button4) == LOW); } if(digitalRead(Button5) == LOW){ Keyboard.press('r'); delay(100); Keyboard.releaseAll(); while(digitalRead(Button5) == LOW); } if(digitalRead(Button6) == LOW){ Keyboard.press('e'); delay(100); Keyboard.releaseAll(); while(digitalRead(Button6) == LOW); } if(digitalRead(Button7) == LOW){ Keyboard.press('x'); delay(100); Keyboard.releaseAll(); while(digitalRead(Button7) == LOW); } if(digitalRead(Button8) == LOW){ Keyboard.press('y'); delay(100); Keyboard.releaseAll(); while(digitalRead(Button8) == LOW); } if(digitalRead(Button9) == LOW){ Keyboard.press('w'); delay(100); Keyboard.releaseAll(); while(digitalRead(Button9) == LOW); } delay(100); }
製作費
- 基板 @200
- Pro Micro ATmega32U4 @400
- キーボードスイッチ Cherry mx 3pin @40 × 9 = 360
- キートップ @50 × 9 = 450
ザックリ、1,500円
キーボードのパーツって案外高いってことに驚きましたが、Cherry スイッチの押し心地ときたら、もう最高です。
・・・フルキーボード、作りたくなっちゃいました。。。
番外編(セキュリティ)
この HID で遊んでいて、ふと、「これって結構危ないかも・・・」って。
USB デバイスが HID として認識できるということは・・・
使い方によっては、他人の PC を勝手に操作することができちゃうということ。
以前、BadUSB のことを書きましたが、これも使い方間違えると同じように危ないなぁ。
例えば、Windows + R の後、CMD で データフォルダを丸ごと削除したり・・・
FTP を使ってファイルを送信したり・・・
USB ケースに QFP パッケージの ATmega32U4 を組み込んだりしたら、もうわからないし。。。
USB マスストレージ(外付け HDD、USB メモリなど)なら、セキュリティツールで全面的に使用禁止にできるけど、HID な入力デバイス(キーボードやマウス)まで禁止にすることはできないからね。
なんか・・・キケン。
これ以上のことは言及しませんが、
少なくとも 第三者がいるところでは絶対に PC から目は離さない、っていう、自衛は必要かも!
それと、得体のしれない USB 接続の送風機や LED ライトなどをパソコンの USB に繋ぐことはやっぱり危険なので、電源を供給するだけなら AC 接続できるアダプタを別途用意するなどした方がセキュリティ的には安全だと・・・思います。
基板頒布