キーボードライブラリを使用して実際にキーボードのプログラムを作成します。
説明内容
前回の記事では「ライブラリ」について説明しました。
今回は、さっそくキーボードの「ライブラリ」を利用して、Arduino MicroをUSBキーボードとして動作させてみます。
ところで今回作成するプログラムでは、当然ながら新しい文法が出てきます。
通常ですと、新しい文法を詳しく説明しながら、プログラムを作成して動作を確認していますが、今回出てくる新しい文法はかなり大きい概念ですので、説明がとても長くなってしまいます。
そこで今回の記事では、ライブラリの使い方を簡単に説明して、Arduino Microをキーボードとして動作させてみることを優先します。
今回の記事では、まずはキーボードライブラリの使い方を通して、どのように利用するのか雰囲気をつかんでいただけるだけで充分です。
新しい概念とその文法の詳細は次回の記事で説明します。
今回製作するキーボード
最初から複雑なことをすると本質的なところがわかりづらくなってしまいますので、今回は1つの機能しかないキーボードを製作します。今回製作するキーボードは
「PCに接続すると5秒後に文字『A』をPCに送るキーボード」
という動作をします。
「A」という文字を1回しか入力できないキーボードです。PCに接続すると、5秒後に強制的に「A」という文字が入力されてしまいます。
人が何かのキーを押し、その押したキーに応じた文字データをPCに送るなどという高機能・高性能キーボードではありません。
ただ、このキーボードを持ち歩けば、「A」を入力したいとき、接続するだけで自動入力できる便利なキーボードです。
Keyboardライブラリのインクルード
それではさっそくこのような動作をするキーボードのプログラムを作成しましょう。
最初に新規ファイルを作成します。Arduino IDEのメニューから「ファイル」→「新規ファイル」を選択すると新規ファイルが作成されます。
一度、この状態で保存します。「ファイル」→「保存」を選択すると、保存ダイアログが表示されます。ファイル名は「keyboard_test」という名前にしましたが、他のファイル名でも構いません。
新規ファイル作成時にデフォルトで書かれているコメントは必要ありませんので削除しておきましょう。また、ご自身がわかるようにこのプログラムのコメントを書いておきます。
このプログラムではキーボードライブラリを使用します。キーボードライブラリを利用するには、プログラムの先頭でヘッダファイルをインクルードします。キーボードライブラリのヘッダファイル名は
Keyboard.h
です。最初の「K」は大文字ですので注意してください。それでは、プログラムの先頭でこのファイルをインクルードしましょう。ヘッダファイルのインクルードは、プリプロセッサ指示子で「#include」でしたよね。
#include <Keyboard.h>
と正しく入力できていないと、「Keyobard」の部分がオレンジ色になりません。オレンジ色になっているか確認しましょう。
これでキーボードライブラリを利用できるようになりました。
キーボードとして認識する命令
次に、PCに接続したときにArduino Microをキーボードとして認識するように命令を書きます。この命令は以下のように書きます。
Keyboard.begin();
「Keyboard」の最初の「K」は大文字です。「Keybaord」の後に「.」(ピリオド)を書いて、その後に「begin()」を書きます。これはArduino Microに対する命令ですので、最後に「;」(セミコロン)を忘れないでください。
ところで、この命令はsetup関数とloop関数のどちらに書けばよいかわかりますか?
前回の記事で、USBキーボードをPCに接続したときに、どのようなデータがやり取りされるか説明しました。接続直後、キーボード認識するためにいろいろなデータのやりとりがされていることがわかりました。データをやり取りして接続が確立すると、あとはPCはキーボードから文字データの受け取りを開始します。
ということは、キーボードとして認識する命令「Keyboard.begin();」は接続時に1度だけ実行すればOKですよね。1度だけ実行する命令はsetup関数に書きますので、プログラムは以下のようになります。
この「Keyboard.begin();」という命令の書き方は不思議ですよね。基礎編パート1で習得した知識で一番近いものは構造体でしょうか。構造体は、構造体を表す名前の後に「.」をつけて、構造体のメンバ変数を指定するんでしたよね。例えば「oto.onkai」という書き方でした。
でもこの命令の場合、メンバ変数ではなく「begin()」というように関数になっています。構造体は変数を組みにする仕組みでしたので、構造体とも違います。
実は「Keyboard.begin()」という書き方は、今までとは全く違う考え方の命令なんです。かなり大きな概念ですので、次回の記事で詳しく説明します。
このあと、このプログラムをArduino Microに送ると、PCに接続すればArduino Microがキーボードとして認識されます。ただし、他に何も命令を書いていないので、何もしないキーボードになりますが…
キーボードとして認識されるか確認する
さて、接続しても何もしない、何もできないキーボードのプログラムを作ったわけですが、一度ここで動作させてみましょう。
動作させても、キーボードとしての機能は何も持っていないから、何も起こらないような気がします。実は、macOSもWindowsも、初めて接続されたキーボードは初回接続時にキーボード認識の処理がされます。
実際に動作確認する前に、各OSでどのような処理になるか、あらかじめ確認しておきます。この後、先程のプログラムをArduino Microに書き込みますが、書き込み直後に各OSで以下のような処理がされます。動作させてみてびっくりしないように、どのようなことが起こるのか先に確認しておきましょう。
macOSの場合
macOSは今まで接続したことがないキーボードが接続されると、キーボードの種類を判定する処理がされます。
初めてキーボードを接続すると、以下のダイアログが表示されます。
「キーボードを識別するために「続ける…」ボタンをクリック」と指示されるので、このダイアログが表示されたら「続ける…」をクリックしてください。クリックすると以下のダイアログが表示されます。
詰んでしまいました…
なんと「左のShiftキーの隣のキーを押してくれ」なんて言ってます。今回確認するプログラムは何もしないキーボードですので、「左のShiftキー」どころか、キーなんてありません!
ということで、macOSをご利用の方は、このダイアログが出てきたら左上の赤ボタンをクリックしてこのダイアログを閉じて見なかったことにしてください。macOS側では、キーボードの種類判定はできない状況ですが、キーボードとしては認識されています。
Windowsの場合
Windowsでは、今まで接続したことがないキーボードが接続されると、OSがキーポードを自動判定します。
初めてのキーボードを接続すると、右下の領域に以下のようなメッセージが表示されます。
特に何かする必要はありませんが、このメッセージが出てきた、ということはArduino Microをキーボードとして認識したことになります。
それでは、先程のプログラムをArduino Microに書き込んでください。上に説明した処理がされていればキーボードとして認識されています。
文字データをPCに送る命令
それでは次に、キーボードライブラリに用意されている、文字データをPCに送る命令を確認します。
文字データをPCに送るには、以下の命令を使用します。
Keyboard.print(文字データ);
基礎編パート1でも説明しましたが、文字データは「 ” 」で囲みます。今回作成するプログラムは、PCに「A」を送りますので、「A」という文字データをPCに送るには以下のように書けばOKです。
Keyboard.print("A");
キーボードライブラリを利用すると、簡単にキーボードが作れますよね。
それでは、最後に「PCに接続すると5秒後に「A」1文字を自動的に入力するキーボード」のプログラムを作成します。
PCに接続すると5秒後に「A」1文字を自動的に入力するキーボードプログラム
PCに文字データ「A」を送る命令はわかりましたので、あとは「接続すると5秒後に「A」1文字をPCに送るようにプログラムを書けばOKです。
PCにキーボード接続してから5秒待ってから、先程の命令を使用して「A」という文字をPCに送ればいいので、Keyboard.begin();でキーボードとして認識された後に、以下の命令を書けばOKですよね。
delay(5000);
Keyboard.print("A");
それでは、プログラムを完成させましょう。
動作確認
これからプログラムを書き込みますが、書き込み直後、すぐにプログラム動作が始まります。5秒後に「A」という文字が、現在のカーソル位置に入力されますのでカーソルの位置に注意してください。
それでは、Arduino MicroをPCに接続して、Arduino IDEから先程のプログラムを書き込んでください。
書き込みが完了すると、以下のようにカーソルの位置に「A」という文字が入力されれば成功です! なお、入力モードを日本語にしている場合は、「A」ではなく「あ」と表示されたかもしれません。「A」「あ」「ち」のいずれか表示されていればOKです。
ところで、OSがUSBキーボードと認識しているか確認してみましょう。
macOSの場合
最初に左上のAppleメニューをクリックして「このMacについて」を選択します。
次に「システムレポート…」ボタンをクリックします。
システムレポートのダイアログが表示されますので、左側のリストから「USB」を選択して、以下のようにUSBデバイスのリストに「Arduino Micoro」と表示されていればOKです。
Windowsの場合
最初に左下のスタートメニューから「Windowsシステムツール」の中にある「コントロールパネル」を選択します。
コントロールパネルから「デバイスとプリンターの表示」をクリックします。
WindowsOSで認識されているデバイスがリストされます。その中に「Arduino Micro」というキーボードがあればOKです。何だか絵がずいぶん違いますが…
さて…
さて、Arduino Microをキーボードにすることができたわけですが、何だか気持ち悪いですよね。
Keyboard.begin();
Keyboard.print();
この2つの変数でもない、構造体でもない、関数でもないなんともよくわからない文法です。
この文法については次回の記事で詳しく説明します。
更新履歴
日付 | 内容 |
---|---|
2021.7.22 | 新規投稿 |
2021.7.25 | キーボードデバイス認識状態確認手順を追加 |
2022.2.20 | 認識手順の説明補足 |
ウルトラ初心者ですが毎日少しずつ進めさせて頂いております
何日か色々試し悩んでも解決しないので質問させてください
今回の記事を進めていた所エラーが発生し
ました
Keyboardが存在しません
と出て先にすすめません
原因がわかれば教えて頂けますでしょうか
何10回と確認しましたがタイプミスはありませんでした
再起動を行なってもダメでした
インクルードまでは読み込みますが
セットアップでエラーが出ます
【開発環境】
Mac OS10.12.3
MacBook Air
ボード
MEGA 2560 R3
お暇なときにでもよろしくお願いします
ご質問どうもありがとうございます。
まず、こちらで以下の環境で確認してみました。
OS: macOS 13.3.1 (MacBook Pro M2)
IED:
Arduino 1.8.19
Arduino IDE 2.1.0
ボードファイル:
Mega2560
この内容で#include <Keyboard.h>を含むスケッチで試してみたのですが、問題ありませんでした。
「Keyboardが存在しません」ということですので、素直に解釈すると、Keyboard.hという名称のファイルが見つからないということになります。
そこでお手数ですが、Keyboard.hがあるか以下の手順でご確認いただけますでしょうか。
Arduino Version1系の場合:
1) Arduinoアプリアイコンを右クリックして表示されるメニューから「パッケージの内容を表示」を選択
2) 表示されるFinderで「Contents」▶︎「Java」▶︎「Libraries」を開く
3) この中に「Keyboard」というフォルダがあるか確認する。あれば、さらに「Keyboard」▶︎「src」フォルダの中にKeyboard.hがあるか確認する
Arduino Version2系の場合:
1) Finderメニューで、Optionキーを押しながら「移動」▶︎「ライブラリ」を選択
2) 表示されたFinderで、「Arduino15」▶︎「libraries」フォルダにKeyboardフォルダがあるか確認する
3) あれば、「Keyboard」▶︎「src」フォルダにKeyboard.hがあるか確認する
いずれの場合もKeyboard.hがなければアプリを再度ダウンロードしてみてください。
Keyboard.hがあるようであれば、何らかの理由で見つけられなくなっていますので、再度対処方法を検討してみます。
お手数ですが、上記内容のご確認をいただければと思います。
素早いご連絡ありがとうございます
試して改めてご連絡いたします
色々試してみましたのでご報告致します
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」のボードを買おうかと思います
詳細にご検証いただいてどうもありがとうございました。
まず最初に謝らなくてはなりません。
私の方で検証してOKでした、という内容ですが、検証の仕方が間違っていました。私の方で検証してOKだったのは「#include <Keyboard.h>」のみを記述したスケッチで確認したためです。このように記述した場合、スケッチでは実際にはKeyboardライブラリが使用されていませんので、特にエラーにはなりません。
setupにKeyboard.begin(); を追加して確認したところ、、、コメントいただいた内容と同じエラーになりました。
そのあと考えてみたのですが、Arduino Megaは非対応なのではないか、と思いました。
Arduino公式サイトのKeyboardライブラリのページを確認すると、
https://www.arduino.cc/reference/en/libraries/keyboard/
ライブラリが対応しているポードの一覧があり、その中に「Arduino Mega」がありますので対応していることになります。私はArduino Megaを持っていないので確認できず、この情報を元に対応している、と判断していました。
ただ私の理解では、Keyboardライブラリがサポートしているボードは、USB-シリアル変換チップが搭載されていないもの、という認識です。Arduino Megaは変換チップとしてATMega16U2が搭載されているので非対応ではないか、と思っています。とは言っても公式ページではサポートとなっていますので、ちょっと??の状態です。
私の環境でボードをArduino Microにしたところエラーがなくなりましたので、私の認識は間違ってはいないのではないか、と思っています。
最近はArduinoボードの価格も高くなってきましたので手軽に購入できる感じではありませんが、この先実機でご確認されたいようでしたらMicroを入手された方が良いかもしれません。
ただ、実機がなくてもスケッチ内容を見ていただければライブラリやクラスの使い方はご理解いただけるかな、と思います。
解決となる回答ができずに申し訳ございません。他に何かご不明点がございましたらお手数ですがご質問いただければと思います。
ご連絡頂きありがとうございます
Microで試したところ問題なく動作きました
引き続き学習させていただきます
こちらこそご連絡いただきどうもありがとうございました。
やはりUSB-シリアル変換チップが載っているボードはダメっぽいですね。公式ページのサポートボードのリストが謎です…
今回は的確なご回答ができず申し訳ございませんでした。
引き続きサイトの方をよろしくお願いいたします。