第3回 Keyboardライブラリ

Keyboardライブラリを使用して、実際にArduino Microがキーボードとして動作するスケッチを作成してみます。

目次

説明内容

前回の記事では「ライブラリ」の概要を説明しました。

今回は、さっそく「Keyboardライブラリ」を利用して、Arduino MicroをUSBキーボードとして動作させてみます。

ところで今回作成するプログラムでは、当然ながら新しいC++言語の文法が出てきます。

通常ですと、説明の順番は「新しい知識を詳しく説明」▶︎「スケッチを作成して動作確認」という流れで進めています。

でも、今回出てくる新しい知識はかなり大きい概念ですので、説明がとても長くなってしまい、途中で何をしているのかよくわからなくなってしまう可能性があります。

そこで今回の記事では、ライブラリの使い方を簡単に説明して、Arduino Microをキーボードとして動作させてみます。

最初は詳しい知識を深掘りせず、まずはライブラリを使ったスケッチはどのようなものか、イメージをつかむことを優先したいと思います。

ライブラリをどのように利用するのか雰囲気をつかんでいただければ大成功です!

ライブラの詳細な知識については、次回以降の記事で詳しく説明します。

今回製作するキーボード

今回は、ひとつの機能しか持っていない簡単なキーボードを製作します。

次の動作をするキーボードを製作します。

PCに接続すると、5秒後に文字『A』をPCに送るキーボード

なんとも変なキーボードですよね。動作を図解すると次のようになります。

シンプルキーボード

「A」という文字を1回しか入力できないキーボードです。「キーボード」と言っていますが、キー(スイッチ)は機能しません。

とにかく、PCに接続すると、5秒後に強制的に「A」という文字が入力されてしまうキーボードです。

とても役にたつキーボードではありませんが、このキーボードを持ち歩けば、「A」を入力したいときは、接続するだけで自動入力できるので、もしかしたらどこかで役に立つかもしれません!

説明の進め方

このキーボードを製作するために、次の流れで説明していきます。

  • Arduino Microをキーボードとして認識されるようにする
  • PCに文字「A」を送る

前回の記事で解説しましたが、一般的なUSBキーボードをPCに接続すると、USBキーボードとPCは次のようにデータのやり取りをします。

USB接続時のデータ通信

Arduino Microをキーボードとして動作させる場合、このようなデータのやり取りが必要です。このデータのやり取りにより、PCはArduino Microをキーボードとして認識します。

そこで、最初に「❶ Arduino Microをキーボードとして認識されるようにする」のパートで、この処理をどのようにスケッチに書けばよいか説明します。


これでArduino Microがキーボードとして振る舞うことができるようになりますので、いよいよ「A」をPCに送ります。

次の「❷ PCに文字「A」を送る」のパートでこの処理のスケッチの書き方を説明します。

それではArduino Microを準備して始めましょう!

❶ Arduino Microをキーボードとして認識されるようにする

それではさっそくスケッチを作成しましょう!

新規スケッチ作成

最初に、Arduino IDEのメニューから「ファイル」→「新規ファイル」を選択して新規ファイルを作成します。

作成後、この状態で保存しておきます。ファイル名は「keyboard_test」という名前にしましたが、他の名前でも構いません。

また、ボードの選択メニューから「Arduino Micro」を選択しておきます。

新規ファイル作成時にデフォルトで書かれているコメントは必要ありませんので削除して、このプログラムのコメントを書いておきます。次のようにしてみました。

/*
    キーボードのテストスケッチ
      PCに接続すると一定時間後に「A」を自動的に入力する
*/

void setup() {

}

void loop() {

}

ヘッダファイルのインクルード

これから、Keyboardライブラリを使用するわけですが、ライブラリを利用するには、スケッチの先頭でライブラリのヘッダファイルをインクルードする必要があります

キーボードライブラリのヘッダファイル名を確認しましょう。

Keyboard.h

最初の「K」は大文字ですので注意してください。

それでは、プログラムの先頭でこのファイルをインクルードしましょう。コメントの後の6行目に追加してみました。

/*
    キーボードのテストスケッチ
      PCに接続すると一定時間後に「A」を自動的に入力する
*/

#include <Keyboard.h>

void setup() {

}

void loop() {

}

これでKeyboardライブラリを利用できるようになりました。

キーボードとして認識するスケッチ

次に、PCに接続したときにArduino Microをキーボードとして認識するようにスケッチを書きます。

次のよう1行書くだけでArduino Microがキーボードとして認識されるようになります。

Keyboard.begin();

Keyboardの最初のKは大文字です。

Keybaordの後に.(ピリオド)を入力して、その後にbegin()を書きます。これはArduino Microに対する指示ですので、最後に;(セミコロン)を付けます。


次に、Keyboard.begin();はsetup関数とloop関数のどちらに書けばよいか考えてみましょう。

これは、Arduino MicroをPCに接続したときに、データのやり取りをしてArduino Microをキーボードとして認識してもらうための処理です。一度認識されるとそのあとはキーボードとして動作することができます。

つまり、Keyboard.begin();はPCと接続時に1度だけ実行すれば良いので、setup関数に書けばOKです。

スケッチは次のように作成してみました。(10行目に追加)

/*
    キーボードのテストスケッチ
      PCに接続すると一定時間後に「A」を自動的に入力する
*/

#include <Keyboard.h>

void setup() {
  // Arduino Microがキーボードとして認識れさるようにする
  Keyboard.begin();
}

void loop() {

}

ところで、Keyboard.begin();という書き方はちょっと不思議な書き方ですよね。

.」を使うケースは、基礎編パート1で習得した知識で一番近いものは構造体でしょうかね。

構造体は、構造体を表す名前の後に「.」をつけて、構造体のメンバ変数を指定するんでしたよね。例えばoto.onteiという書き方でした。

でもこの命令の場合、メンバ変数ではなくbegin()というように関数になっています。

実はKeyboard.begin();という書き方は、今までとは違う考え方の仕組みなんです。かなり大きな概念ですので、次回以降の記事で詳しく説明します。


このスケッチをArduino Microボードに送ると、PArduino Microがキーボードとして認識されます。(ただし、他に何の動作も書いてないので、何もしないキーボードですが…)

それでは、実際にスケッチをArduino Microに送って、キーボードとして認識されるか確認してみましょう!

キーボードとして認識されるか確認する

作成したスケッチはキーボードとして動作しませんので、この状態でPCに接続しても何も起こらないような気がしますよね。

実際には、macOSでもWindowsでも、接続時にOS側でキーボード認識の処理がされます。

キーボードの認識処理はOSごとに異なりますので、macOSとWindwosの場合それぞれで、どのような処理になるのか見ておきましょう。

macOSの場合

macOSの場合、OSバージョンにより挙動が異なります。

━━ macOS Sequoia(バージョン15)以降の場合 ━━

スケッチの書き込みが終わると、Arduinoボードがキーボードとして動作を開始します。

動作を開始すると、macOSにとっては新しいUSB機器が接続されたことになりますので、次のようなダイアログが表示されます。

このダイアログで「許可」をクリックすると、Arduino MicroがキーボードとしてmacOSに接続されます。


先程のプログラムをArduino Microに書き込んで確認してみてください。

━━ 以前のmacOSの場合 ━━

申し訳ございません。macOSのどのバージョンから動作仕様が変わったのか追跡できませんでした。

以前のmacOSの場合、今まで接続したことがないキーボードが接続されると、キーボードの種類を判定する処理がされることがあります。そのときは次のように対応してください。

スケッチの書き込みが終わると、初めてのキーボードが接続されたと認識され、次のダイアログが表示されます。

macOSキーボード認識1

「キーボードを識別するために「続ける…」ボタンをクリック」と指示されるので、このダイアログが表示されたら「続ける…」をクリックしてください。クリックすると以下のダイアログが表示されます。

macOSキーボード認識2

詰んでしまいました…

なんと「左のShiftキーの隣のキーを押してくれ」なんて言ってます。今回確認するプログラムは何もしないキーボードですので、「左のShiftキー」どころか、キーなんてありません!

ということで、macOSをご利用で、このダイアログが出てきてしまった方は、このダイアログの左上の赤ボタンをクリックしてこのダイアログを閉じて見なかったことにしてください。

macOS側では、キーボードの種類判定はできない状況ですが、キーボードとしては認識されています。


先程のプログラムをArduino Microに書き込んで確認してみてください。

Windowsの場合

Windowsでは、今まで接続したことがないキーボードが接続されると、キーボードの認識処理がされます。

OSバージョンにより動作が若干異なります。

━━ Windows11の場合 ━━

スケッチの書き込みが終わると、USB機器を接続したときの音(ピコッ)がなります。これでキーボードとして認識されています。

認識状態は次の手順で確認できます。

Windowsの「設定」から「Bluetoothとデバイス」を選択し、次のように「デバイス」をクリックします。

「入力」としてキーボードアイコンのついた「Arduino Micro」と表示されていれば正しく認識されています。


先程のプログラムをArduino Microに書き込んで確認してみてください。

━━ Windows10の場合 ━━

初めてのキーボードを接続すると、右下の領域に以下のようなメッセージが表示されます。

Windowsキーボード認識

特に何かする必要はありませんが、このメッセージが出てきた、ということはArduino Microをキーボードとして認識したことになります。

認識状態は次の手順で確認できます。

Windowsのスタートメニューから「コントロールパネル」を選択します。

コントロールパネルが表示されますので「デバイスとプリンターの表示」をクリックします。

Windowsデバイス確認(2)

Windowsが認識されているデバイスがリストされます。

その中にキーボードアイコンの「Arduino Micro」があればOKです。(何だか絵がずいぶん違いますが…)

Windowsデバイス確認(3)

先程のプログラムをArduino Microに書き込んで確認してみてください。

❷ PCに「A」を送る

PCに文字データを送るスケッチの書き方

それではいよいよ、キーボードライブラリを使用して、文字データをPCに送る方法を確認します。

文字データをPCに送るには、スケッチに次のように書けばOKです。

Keyboard.print(文字データ);

注意点としては、文字データは"で囲みます。

今回作成するスケッチは、PCに「A」を送りますので、次のように書けばOKです。

Keyboard.print("A");

ところで、このように簡単にPCに文字を送ることができますが、今回のスケッチでは必ずsetup関数の中に書く、という点に注意してください

loop関数の中に書いてしまうと、Arduino Microは「A」という文字をPCにずっと送り続けてしまう、たちの悪いキーボードになってしまいます。


ここまでの内容で「❶ Arduino Microをキーボードとして認識されるようにする」ことと「❷ PCに文字データを送る」を実現する方法がわかりました!

それでは、最後に「PCに接続すると5秒後に「A」1文字を自動的に入力するキーボード」のスケッチを作成します。

PCに接続すると5秒後に「A」1文字を自動的に入力するスケッチ

スケッチを完成させるには、接続後5秒待ってから「A」を送るようにすればよいので、delay関数を追加すれば完成です。

スケッチは次のよう作成してみました。

/*
    キーボードのテストスケッチ
      PCに接続すると一定時間後に「A」を自動的に入力する
*/

#include <Keyboard.h>

void setup() {
  // Arduino Microがキーボードとして認識れさるようにする
  Keyboard.begin();

  // 5秒待つ
  delay(5000);

  // 「A」を入力する
  Keyboard.print("A");
}

void loop() {
  // そのあとは何もしない
}

動作確認

これからプログラムを書き込みますが、書き込み直後、すぐにArduino Microはキーボードとして動作を始めます。

Arduino IDEでスケッチの書き込みが完了してから5秒後に、「A」という文字が現在のカーソル位置に入力されます。

そこで、スケッチの書き込みボタンをクリックしたら、スケッチのどこかにカーソルを合わせておくことを忘れないようにしてください。


それではArduino MicroをPCに接続して、スケッチを書き込んでみましょう!

書き込みが完了すると、次のようにカーソルの位置に「A」という文字が入力されれば成功です!

なお、入力モードを日本語にしている場合は、「A」ではなく「あ」または「ち」と表示されたかもしれません。いずれか表示されていればOKです。

Keyboardライブラリ

今回は「Arduino Microをキーボードとして認識しもらう方法」と「PCに文字データを送る方法」を確認しました。

どちらも次のようにKeyboardに続いて、.をつけて関数名のようなものを書く形式でした。

Keyboard.begin();    // キーボードとして認識してもらう処理
Keyboard.print("A"); // PCに文字Aを送る処理 

これらはdigitalWriteなどの普通の関数の呼び出しに似ていますが、かなり異なる考え方のものなんです。

そこで、次回の記事ではこれらがどのようなものなのか、詳しく解説します。

更新履歴

日付内容
2021.7.22新規投稿
2021.7.25キーボードデバイス認識状態確認手順を追加
2022.2.20認識手順の説明補足
2025.2.2Arduino IDE2対応
最新のOS情報に更新
通知の設定
通知タイミング
guest
7 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
柿のたね
柿のたね
1 年 前

ウルトラ初心者ですが毎日少しずつ進めさせて頂いております

何日か色々試し悩んでも解決しないので質問させてください

今回の記事を進めていた所エラーが発生し
ました

Keyboardが存在しません

と出て先にすすめません
原因がわかれば教えて頂けますでしょうか

何10回と確認しましたがタイプミスはありませんでした

再起動を行なってもダメでした

インクルードまでは読み込みますが
セットアップでエラーが出ます

【開発環境】
Mac OS10.12.3
MacBook Air

ボード
MEGA 2560 R3

お暇なときにでもよろしくお願いします

柿のたね
柿のたね
返信  管理者
1 年 前

素早いご連絡ありがとうございます
試して改めてご連絡いたします

柿のたね
柿のたね
返信  管理者
1 年 前

色々試してみましたのでご報告致します

macノートを3台所有しており
全てのmacで同じエラーになり結果ダメでした

【使用PC】
mac book air OS10.12
mac book air M1チップ
mac book air M2チップ

【ソースコード】

#include <Keyboard.h>

void setup() {
Keyboard.begin();

}

void loop() {

}

【コンパイルエラーメッセージ》

/Users/appletealabel/Documents/Arduino/sketch_may04a/sketch_may04a.ino: In function ‘void setup()’:
sketch_may04a:4:1: error: 「Keyboard」が存在しません。スケッチに「#include <Keyboard.h>」という行を含めていますか?
 Keyboard.begin();
 ^~~~~~~~
「Keyboard.h」に対して複数のライブラリが見つかりました
使用済:/Users/xxxxxxxxx/Documents/Arduino/libraries/Keyboard
未使用:/Applications/Arduino.app/Contents/Java/libraries/Keyboard
未使用:/Users/xxxxxxxxx/Documents/Arduino/libraries/Keyboard-1.0.4
exit status 1
「Keyboard」が存在しません。スケッチに「#include <Keyboard.h>」という行を含めていますか?

※「xxxxxxxx」のパス部分はユーザーネームです

ネットの書き込みで他の人も同じ現象が起こっている方がいたので
色々試してみたところ

ツール → ボード → Arduino Microに変更すると
コンパイル完了しました

ただし当然ながら使用ボードがMEGA2560なので書き込みでエラーが出ます

管理者様のボード設定はどうなっておりますでしょうか

コンパイルエラーが出るボード
・Uno
・Nano
・Mega2560

コンパイル完了 可能なボード
・Micro
・Leonardo

※その他ボードは未チェックです

大人しく「micro」か「Leonardo」のボードを買おうかと思います

柿のたね
柿のたね
返信  管理者
1 年 前

ご連絡頂きありがとうございます

Microで試したところ問題なく動作きました

引き続き学習させていただきます

目次