Keyboard の解説と実装リファレンス
【概要】
Keyboard ライブラリは、Arduino ボードを USB HID(Human Interface Device)規格に準拠したキーボードとして動作させるためのライブラリです。このライブラリを使用することで、Arduino は接続されたホストコンピュータに対して、キーの押し下げ(press)や離上(release)のイベントをシミュレートして送信することが可能になります。
主な動作原理として、Arduino ボードが USB デバイスとして認識され、ホスト側(Windows, macOS, Linux 等)から定期的に送出される HID ポーリング要求に対し、現在のキー状態を反映したレポートを返送します。
【仕様】
主要なメソッド
| 関数 | 引数 | 戻り値 | 説明 |
| Keyboard.print(String) | String | なし | 指定した文字列をキーボード入力として送信する。 |
| Keyboard.write(char) | char | なし | 指定した文字をキーボード入力として送信する。 |
| Keyboard.press(char) | char | なし | 指定したキーを押し下げた状態にする。 |
| Keyboard.release(char) | char | なし | 指定したキーを離す。 |
| Keyboard.releaseAll() | なし | なし | 押下されているすべてのキーを同時に離す。 |
データ型と初期状態
- データ型: 主に
char型およびString型を受け取ります。 - 初期状態: ライブラリ初期化時、すべてのキーは「離上(release)」状態にあります。
- キーコード: 標準的な ASCII 文字をサポートしますが、内部的には HID キーコードに変換されて送信されます。
【技術的特徴】
- USB HID プロトコル:
Serial通信が UART プロトコルを介してシリアルポートにデータを流すのに対し、Keyboardは USB スタックを介して HID レポートを構築します。これにより、OS はデバイスを「キーボード」として認識し、特定のドライバを介さず入力を受け取ります。 - ホストポーリング方式:
Arduino が能動的にデータを送り続けるのではなく、ホスト側が定期的に「現在のキー状態」を問い合わせるポーリング方式に基づいています。そのため、非常に短いインターバルでの連続入力を送る場合、OS 側のポーリング周期の影響を受ける可能性があります。 - 状態の維持:
press()関数は、次のrelease()またはreleaseAll()が呼ばれるまで、そのキーが「押し続けられている」という状態を保持します。これは、Ctrl+C などの修飾キーを含むコンビネーション入力の実装において不可欠な挙動です。
【注意点】
- ハードウェアの制約:
すべての Arduino ボードで動作するわけではありません。USB 通信をネイティブに処理できるコントローラ(例: ATmega32U4, SAMD21, RP2040 等)を搭載したボード(Leonardo, Micro, Zero, Due 等)が必要です。Arduino Uno や Mega では、標準の USB ポート経由では動作しません。 - チャタリングの考慮:
物理的なボタンをトリガーにする場合、スイッチのチャタリング(接点の微細な振動)によってpress()が高速に繰り返され、意図しない入力が発生することがあります。ハードウェア的なデバウンス回路、またはソフトウェアによるデバウンス処理の実装が必須です。 - 無限ループと制御:
プログラムのバグによってKeyboard.print()が無限ループに陥った場合、ホストコンピュータは制御不能な入力を受け取ることになります。緊急停止ボタンや、一定時間入力がない場合に停止するガード処理の実装を推奨します。 - リソース制約:
String型の多用はヒープメモリを消費します。大量のテキストを送信する場合は、write()をループで回すか、静的なchar配列を扱う設計を検討してください。
【サンプルコード】
ボタンを押している間だけ、特定の文字(例: ‘A’)を押し続ける動作の例です。
#include <Keyboard.h>
const int buttonPin = 2;
int lastButtonState = HIGH;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Keyboard.begin();
}
void loop() {
int buttonState = digitalRead(buttonPin);
// ボタンが押された瞬間(HIGH -> LOW)
if (buttonState == LOW && lastButtonState == HIGH) {
Keyboard.press('a');
delay(50); // デバウンス用
}
// ボタンが離された瞬間(LOW -> HIGH)
else if (buttonState == HIGH && lastButtonState == LOW) {
Keyboard.release('a');
delay(50); // デバウンス用
}
lastButtonState = buttonState;
}
【活用例】
- マクロパッドの製作: 物理ボタンを押すことで、複雑なショートカットキー(例:
Ctrl + Shift + Alt + S)を一括で送信するデバイス。 - 自動テスト環境: テスト用デバイスが特定のタイミングでキー入力をシミュレートし、ソフトウェアの UI 挙動を自動テストする。
- アクセシビリティ支援: 特定のジェスチャやセンサーの動きを、標準的なキーボード入力に変換して入力補助を行うデバイス。
- プログラマブルキーパッド: 独自のキーレイアウトを持ち、特定のキー入力に対して特定の文字列や操作を割り当てるカスタム入力装置。


コメント