JH1LHVの雑記帳

和文電信好きなアマチュア無線家の雑記帳

スポンサーリンク

9Key(ナインキー)を作ってみた

とってもシンプルな、9key を作ってみました。

なにやら最近の電子工作界隈では、
自分でキーボードを作ることが流行ってるみたいです。

流行りものが大好きなわたしとしては、そんなブームを素通りすることはできずに、
Arduino ベースの、とってもシンプルな 9key(3×3)を作ってみました。

f:id:JH1LHV:20180829220658j:plain

こんなやつです。
フルキーボードだと1台作るのに1万円以上掛かってしまうので・・・今回は、キー9個だけです。

マイコン

Arduino のようなマイコンを入力デバイスにしてパソコンに接続するには、マイコン自身が HID(ヒューマン・インターフェース・デバイス )として認識できるものでなければなりません。

Arduino では、Mega32U4 というチップが載ってる Leonard や、Pro Micro などの限られたものだけがこれに該当します。

一番なじみ深い Uno は対象外で、これをムリに HID にするにはファームウェアを書き換えたり、特別な作業が必要になるので・・・止めといた方が無難です。

で、今回はこの手の自作キーボードで最も使われているだろう、Pro Micro を選択しました。

f:id:JH1LHV:20180829225941j:plain

Pro Micro には幾つかの種類(red、blue、black)があります。
そして、それぞれが微妙に大きさやピンの配置が違ってたりするので購入に際し注意が必要です。
ちなみに、わたしは上の写真の Black Pro Micro を使いました。
中華で @400 程度で購入できます。

回路図

入出力ピンにキースイッチを9個接続するだけ。
回路図はとってもシンプル。

先月 KiCad がバージョンアップしたので、新たな機能でも試してみようかと思ったのですが、あまりにも回路が簡単すぎて、バージョンアップの恩恵にあずかることはありませんでした。

f:id:JH1LHV:20180829223506j:plain

9個のキー入力を判別するだけ。

Pro Micro の IO ピンは全部で 18 本。
今回の9key では IO ピンとスイッチは1対1で対応できます。

これがフルキーボードだとそう簡単じゃなくて、IO ピンの関係からキーボード・マトリクスで処理する必要があるので、回路は多少複雑になります。


左右分離したフルキーボードでは Pro Micro を2つ使ってキーボード・マトリクスを構成するのが一般的なようです。

まぁ、私がやろうとしているのは、そんな大げさなキーボードじゃないので。
ハードもソフトもとっても簡単。

ホントのところは、大枚はたいてまでフルキーボードまでは必要ないし。。。
むしろ、9キーなら持っててもいいかなぁ~って。

  • KiCad のホットキー(ショートカット)を割り当てたり
  • 3D モデリングツール Fusion360 のショートカットを割り当てたり
  • ハムなら Winkey とかのメモリを割り当てるとか

・・・用途別に、いくつか持っていてもいいかなぁ~って。

基礎チェック

本格的な作業に入る前に、まずやっておくこと!
それは、必要最小限の構成でホントに期待通り動くか・・・チェックすることです。

ミニブレッドボードに Pro Micro とタクトスイッチを1個取り付けた最小構成で HID として振舞ってくれるのか確かめておきます。

f:id:JH1LHV:20180808140324j:plain

スケッチは 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 へ発注しました。
できるだけ小さく・・・作ったつもり。。。

f:id:JH1LHV:20180827214256j:plain 

f:id:JH1LHV:20180826202426j:plain

8/8 注文 → 8/22 到着。

製作

パーツさえ揃ってしまえば、キーボード作りは超簡単。
ハンダ付けするだけの単純作業です。


f:id:JH1LHV:20180826202616j:plain

キースイッチは、青軸。(私はこの感触が一番好きなので。)
打鍵時の感触は軸の色で違います。
幾つかの種類の中から、自分が心地よいと感じるものが選択できます。

f:id:JH1LHV:20180901110149j:plain

打鍵時の感触が確かめられる、こういったものも市販されています。(AliExpress で購入)
メカニカルキー Cherry mx の各軸の違いが確かめられるので、本格的にキーボード作りにチャレンジするなら持っていてもいいかもです。

 

f:id:JH1LHV:20180827151043j:plain

必要なパーツはこれだけ。

 

f:id:JH1LHV:20180827153639j:plain

表面です。3×3の構成です。

 

f:id:JH1LHV:20180827153713j:plain

裏面です。
Pro Micro は基板に直付けです。

 

f:id:JH1LHV:20180827154231j:plain

キートップを取り付けた状態です。

 

f:id:JH1LHV:20180829220658j:plain

完成です。
一応、足はスペーサを使いましたが・・・これ、専用のケースっているかなぁ~。
まぁ余計なことしないで、このままでいいような気がします。

で、スケッチサンプルとして、KiCad でよく使うホットキーを割り当ててみました。

(KiCad)

X軸で反転

Y軸で反転

配線の開始

アイテム移動

アイテム回転

  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 を使ってファイルを送信したり・・・

f:id:JH1LHV:20180827213802j:plain

USB ケースに QFP パッケージの ATmega32U4 を組み込んだりしたら、もうわからないし。。。

USB マスストレージ(外付け HDD、USB メモリなど)なら、セキュリティツールで全面的に使用禁止にできるけど、HID な入力デバイス(キーボードやマウス)まで禁止にすることはできないからね。

なんか・・・キケン。

これ以上のことは言及しませんが、
少なくとも 第三者がいるところでは絶対に PC から目は離さない、っていう、自衛は必要かも!

それと、得体のしれない USB 接続の送風機や LED ライトなどをパソコンの USB に繋ぐことはやっぱり危険なので、電源を供給するだけなら AC 接続できるアダプタを別途用意するなどした方がセキュリティ的には安全だと・・・思います。

 

基板頒布

基板頒布 - JH1LHVの雑記帳