第4回:Arduino・ラズパイPICOでマクロキーボード自作(複数キー接続編)

自作マクロキーボード Arduino
ラズパイPICO搭載自作マクロキーボード
記事内には広告が含まれています。

Arduino IDEを使用して、4つのボタンがあり、各ボタンを押すと指定のテキストやキーが表示されるスケッチを作成します。
4個のボタンを「単一文字」「複数文字」「コンビネーションキー」に割り当ててみます。
ここまで出来るようになると、一般に販売されているマクロキーボードなどにかなり近くなりますのでぜひ頑張って試してみてください!

必要なもの

  • Arduino Pro Micro・Raspberry Pi PiconなどArduinoIDEに対応しておりHID準拠の物
  • ブレッドボード(あると便利です)
  • 4つのボタン(スイッチ)・CherryMX互換のメカニカルキースイッチなど
  • 接続用のジャンパーワイヤ

今回は4個のボタン(スイッチ)を利用しますので、ブレットボードとジャンパーワイヤなどを利用して動作確認用の回路を利用することをお勧めします。
CherryMX互換などのメカニカルキースイッチのピンはジャンパーワイヤーが刺さらない場合が多いのでご注意ください。

配線図

  • ボタン1: デジタルピン 2
  • ボタン2: デジタルピン 3
  • ボタン3: デジタルピン 4
  • ボタン4: デジタルピン 5
  • 各ボタンの片方の端子はGNDに接続し、もう片方の端子は対応するデジタルピンに接続します。

ボタン(スイッチ)はモーメンタリスイッチを利用することを前提にしています。
モーメンタリスイッチとはボタンを押している間回路が通電するスイッチです。
※CherryMXなどのメカニカルキーボードのスイッチはモーメンタリスイッチです。

スケッチ

以下のスケッチをArduino IDEにコピーして、Pro MicroやRaspberry Pi Picoなどにアップロードしてください。

#include <Keyboard.h>

// ボタンのピン番号
const int button1Pin = 2;
const int button2Pin = 3;
const int button3Pin = 4;
const int button4Pin = 5;

// ボタンの状態
int button1State = 0;
int button2State = 0;
int button3State = 0;
int button4State = 0;

void setup() {
  // ボタンピンを入力に設定
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);
  pinMode(button4Pin, INPUT_PULLUP);

  // キーボードの初期化
  Keyboard.begin();
}

void loop() {
  // ボタンの状態を読み取る
  button1State = digitalRead(button1Pin);
  button2State = digitalRead(button2Pin);
  button3State = digitalRead(button3Pin);
  button4State = digitalRead(button4Pin);

  // ボタン1が押されたら "Hello Arduino" を表示
  if (button1State == LOW) {
    Keyboard.print("Hello Arduino");
    delay(500); // デバウンス対策
  }

  // ボタン2が押されたら 'A' を表示
  if (button2State == LOW) {
    Keyboard.write('A');
    delay(500); // デバウンス対策
  }

  // ボタン3が押されたら Ctrl+C を送信
  if (button3State == LOW) {
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('c');
    delay(100);
    Keyboard.releaseAll();
    delay(500); // デバウンス対策
  }

  // ボタン4が押されたら "See you" を表示
  if (button4State == LOW) {
    Keyboard.print("See you");
    delay(500); // デバウンス対策
  }
}

スケッチの行ごとの説明

  1. ヘッダファイルのインクルード
   #include <Keyboard.h>
  • Keyboard.hライブラリをインクルードして、キーボードのエミュレーション機能を使用します。
  1. ボタンのピン番号の定義
   const int button1Pin = 2;
   const int button2Pin = 3;
   const int button3Pin = 4;
   const int button4Pin = 5;
  • 各ボタンに対応するデジタルピン番号を定義します。

ピン番号は順番の方が分かりやすいのですが、配線の取り回しなどの関係で変更した場合は、ピン番号の定義を変更して下さい。
ボタンを増やす場合はconst int button5Pin = 6;などを追加
減らす場合は下から行を削れば問題ありません。

  1. ボタンの状態を保存する変数の定義
   int button1State = 0;
   int button2State = 0;
   int button3State = 0;
   int button4State = 0;
  • 各ボタンの状態を保存するための変数を定義します。
  • ボタン数を変更している場合は、追加削除してください。
  1. setup関数
   void setup() {
     pinMode(button1Pin, INPUT_PULLUP);
     pinMode(button2Pin, INPUT_PULLUP);
     pinMode(button3Pin, INPUT_PULLUP);
     pinMode(button4Pin, INPUT_PULLUP);
     Keyboard.begin();
   }
  • 各ボタンのピンを入力モード(内部プルアップ抵抗)に設定し、Keyboardライブラリを初期化します。
  • ボタン数を変更している場合は、追加削除してください。
  1. loop関数
   void loop() {
     button1State = digitalRead(button1Pin);
     button2State = digitalRead(button2Pin);
     button3State = digitalRead(button3Pin);
     button4State = digitalRead(button4Pin);
  • 各ボタンの状態を読み取ります。
  • ボタン数を変更している場合は、追加削除してください。
  1. ボタン1の処理
   if (button1State == LOW) {
     Keyboard.print("Hello Arduino");
     delay(500);
   }
  • ボタン1が押されたら(LOW)、”Hello Arduino” を送信し、500ms待機してデバウンス対策をします。
  1. ボタン2の処理
   if (button2State == LOW) {
     Keyboard.write('A');
     delay(500);
   }
  • ボタン2が押されたら(LOW)、’A’ を送信し、500ms待機してデバウンス対策をします。
  1. ボタン3の処理
   if (button3State == LOW) {
     Keyboard.press(KEY_LEFT_CTRL);
     Keyboard.press('c');
     delay(100);
     Keyboard.releaseAll();
     delay(500);
   }
  • ボタン3が押されたら(LOW)、Ctrl+Cを送信し、500ms待機してデバウンス対策をします。
  1. ボタン4の処理
   if (button4State == LOW) {
     Keyboard.print("See you");
     delay(500);
   }
  • ボタン4が押されたら(LOW)、”See you” を送信し、500ms待機してデバウンス対策をします。

このスケッチを使うことで、各ボタンを押すと指定のテキストやキーを送信するマクロキーボードが作成できます。

まとめ

今回の複数キーにアクションを振り分けることが出来た時点で、一般的なマクロキーボードとほぼ同様の操作が可能になります。
また、前回の1キーでキーカウントによる動作制御も各キーに取り入れることも可能です。
各ボタンの処理の中身を書き変えればOKです。
例:1つ目のボタンであれば
if (button1State == LOW) {
以降に前回のキーの操作部分のソースを張り付ければOKです。

ちなみに、今回アップした写真のキーはKailhのCopper軸です。CherryMX互換で軸の種類もかなり豊富でCherryMXより価格も安く、最近のNISSYのお気に入りのキーです。
※今回の物には付けていませんがLEDも追加できるようになっています。

コメント

タイトルとURLをコピーしました