回路CADの入力支援を目的として、Arduino Microを使用して自作キーボードのプロトタイプを作りました。
荒削りなキーボードですが、動くものができましたので、ご紹介します。
CAD入力を楽にしたい
先日、回路CADを使って回路図を作成する機会がありました。
それがなかなか長い作業だったのですが、 DeleteキーやEscキーを使う機会が多く、だんだんと離れている2つのキーを左手で押すのが煩わしいなぁと思ってきました。
そうしているうちに、手首がだんだんと痛くなってきたり…。
右手でDeleteということも可能ですが、この時はマウスを使うことも多かったので、右手は基本マウスの上でした。
そこで、左手の移動距離を短くできるキーボードが欲しいなぁと考えまして、いっその事自分で作ってみるのも楽しそうだと思い、土日でトライしてみました。
ここで活躍するのがおなじみのArduinoです。
Arduinoもたくさんのシリーズがあるわけですが、キーボードとして使えるものがあります。
それが「Arduino Leonardo」または「Arduino Micro」です。
HiLetgo レオナルド プロ マイクロ ATmega32U4 Arduino 5V/16MHz ブートローダ マイクロ USB Proミニ [並行輸入品]

これらのArduinoは、マウスやキーボードとして使える関数が用意されています。
Arduino UNOでは、残念ながらそのままではキーボードとして使うことはできません。
今回はMicroを使ってみる
LeonardoはUNOと同じ大きさでして、シールド基板を付けるには便利なのですが、キーボードとして置いておくには少し大きいと思いました。
そこで、今回はMicroを使うことにしました。
ハードウェアの製作
CAD入力支援のキーボードということで、なるべく入力動作を減らしながら楽に入力できることを目指して、左手用のキーボードを考えました。
そして作ったのがこちらです。
なにこれ気持ち悪い。
白いところは手を置くところなのですが、自分の左手に合わせて作っています。
材料は石塑粘土です。
石塑粘土って、樹脂粘土のイメージで触ると全然違ってて、扱いに慣れが必要ですね。
そして、この上に手を置いた時の、自然な指の位置にボタンを配置しました。
こんな感じです。
ボタンはよくあるタクトスイッチの上にMDF材を小さく切ったものをキートップとして接着しています。
試作品だけに配線も無造作にむき出しです。
ボタンの配置はこのようになっております。
- 親指:ESC, Del
- 人差し指:Ctrl+v, w
- 中指:Ctrl+c, Ctrl+x
- 薬指:Shift, Ctrl+z
- 小指:Ctrl
(写真のShiftのスペル間違えてる…)
コピー・アンド・ペースト等のショートカットが1ボタンで押せます。
WキーはCADでワイヤを引く時のショートカットです。
その他、よく押すキーを全て左手で押せるようにしています。
各ボタンは全てArduino Microのデジタルピンに直接接続しています。
プログラムの方で内部プルアップさせて論理を安定させるので、外付けの抵抗は付けていません。
ソフトウェアの製作
ソフトはよくわからないので、とりあえず動くものを目指して作りました。
#include <Keyboard.h>
#define Button_Num 9
#define Key_Press 0 //Key押下論理(負論理)
//Keyポート
const int Key0 = 2;
const int Key1 = 3;
const int Key2 = 4;
const int Key3 = 5;
const int Key4 = 6;
const int Key5 = 7;
const int Key6 = 8;
const int Key7 = 9;
const int Key8 = 10;
//Key押下フラグ配列
int Key_flag_now[Button_Num];
int Key_flag_old[Button_Num];
int Key_cnt[Button_Num];
int Key_EN[Button_Num];
int Key_EN_old[Button_Num];
const int Key_scan_num = 5;
void setup() {
//Keyポート初期化
for (int i = Key0; i <= Key8; i++) pinMode(i, INPUT_PULLUP);
//フラグ初期化
for (int i = 0; i < Button_Num; i++) {
Key_flag_now[i] = 1;
Key_flag_old[i] = 1;
Key_cnt[i] = 0;
Key_EN[i] = 0;
Key_EN_old[i] = 0;
}
Keyboard.begin();
}
void loop() {
//Keyの状態を読み取り
for (int i = 0; i < Button_Num; i++) {
//常に入力状態読み取り
Key_flag_now[i] = digitalRead(Key0 + i);
//Scanが確定してなかったら
if ( Key_EN[i] == 0 ) {
//Keyが押されていたら、カウントアップ
if (Key_flag_now[i] == Key_Press) {
Key_cnt[i]++;
}
//押下確定回数に達する前に入力状態が変わったらカウント初期化
else {
Key_cnt[i] = 0;
}
}
//押下確定Scan回数を満たしたら
if (Key_cnt[i] == Key_scan_num) {
Key_EN[i] = 1; //Key押下Flagを立てる
Key_cnt[i] = 0; //cnt初期化
}
//Keyを離したらEN初期化
if ( Key_EN[i] && Key_flag_now[i] ) {
Key_EN[i] = 0;
}
}
//Ctrl処理
if (Key_EN[2] || Key_EN[4] || Key_EN[5] || Key_EN[7] || Key_EN[8]) {
Keyboard.press(0x80); //Ctrl
} else {
Keyboard.release(0x80);
}
if (Key_EN[0] == 1) {
if (Key_EN[0] != Key_EN_old[0]) Keyboard.press(0xB1); //ESC
} else {
Keyboard.release(0xB1);
}
if (Key_EN[1] == 1) {
if (Key_EN[1] != Key_EN_old[1]) Keyboard.press(0xD4); //DEL
} else {
Keyboard.release(0xD4);
}
if (Key_EN[2] == 1) {
if (Key_EN[2] != Key_EN_old[2]) Keyboard.press('v');
} else {
Keyboard.release('v');
}
if (Key_EN[3] == 1) {
if (Key_EN[3] != Key_EN_old[3]) Keyboard.press('w');
} else {
Keyboard.release('w');
}
if (Key_EN[4] == 1) {
if (Key_EN[4] != Key_EN_old[4]) Keyboard.press('c');
} else {
Keyboard.release('c');
}
if (Key_EN[5] == 1) {
if (Key_EN[5] != Key_EN_old[5]) Keyboard.press('x');
} else {
Keyboard.release('x');
}
if (Key_EN[6] == 1) {
Keyboard.press(0x81); //Shift
} else {
Keyboard.release(0x81);
}
if (Key_EN[7] == 1) {
if (Key_EN[7] != Key_EN_old[7]) Keyboard.press('z');
} else {
Keyboard.release('z');
}
for (int i = 0; i < Button_Num; i++) {
Key_EN_old[i] = Key_EN[i];
}
}
各ボタンは全てプログラムで直接決めてしまっています。
全てのボタンを毎ループスキャンして、押されていたらフラグを立てて、それに応じてキーボード関数が実行される作りです。
動作の様子
今回、MacのiMovieの練習も兼ねてナレーションを入れてみました。
今後の課題
まず見た目が荒削りすぎるので、もう少しカッコよくしたいところです…。
あとは、各ボタンの機能が固定なので、いちいちArduinoにプログラムしなくて済むように、シリアル通信でEEPROMに書き込める用に改良したいです。
それでは、改良版ができましたら、また是非よろしくお願いします。







コメント