こんにちは、「メカのりまき」です。

この記事では、「Arduino Micro」を使い、PCに対してキー入力をするといったことを行いたいと思います。

本記事で使用するもの

本記事で私が使用した物は以下の通りです。

  • 「Arduino IDE2.2.1」をインストールしたPC(Windows11)
  • Arduino Micro
  • USBケーブル(A-MicroB)
  • タクトスイッチ
  • ブレッドボード
  • ジャンパーワイヤー

今回使用した物は、記事の最後にある広告のところで紹介しています。

記事を見て、気に入ったものがあれば、是非チェックをしてみてください。

Arduino Microについて

本サイトで、「Arduino Micro」を扱うのは、今回が初めてなので、まずは「Arduino Micro」について、最も基本的なArduinoボードである「Arduino Uno R3」と比較しながら、紹介をしたいと思います。

大きさ

「Arduino Micro」の大きさは、長さ48[mm]、幅18[mm]となっており、「Arduino Uno R3」と比べると、非常にコンパクトです。

Arduino Uno R3とArduino Microの写真

形状

「Arduino Uno R3」の入出力ピンはメス型となっているため、オス型のピンを差し込んで、回路を作成します。

オス型のピンを差し込んで回路を作成

それに対して、「Arduino Micro」の入出力ピンの形状はオス型になっており、ブレッドボードやメス型のピンに差し込んで回路を作成します。

ブレッドボードやメス型のピンに差し込んで回路を作成

PCと通信を行うためのUSBコネクタの形状も「Arduino Uno R3」と異なっており、MicroBと呼ばれる形状のものになっています。

MicroBと呼ばれる形状

機能

「Arduino Micro」の基本的な使い方は、「Arduino Uno R3」と同じで、スケッチを書き込むことによって、ピンの入出力を制御し、外部の部品を動かしたり、データを読み取ったりすることができます。

入出力を制御するArduino Microの図

それに加えて、「Arduino Micro」は、デフォルトの状態で、HID(Human Interface Device)として利用することが可能となっており、キーボードやマウスで行っているようなコントロールを簡単に行うことができます。

キー入力やマウス操作をするための情報を送るArduino Microの図

今回の記事では、上記の特性を活かし、キーボードが行っているような入力を、「Arduino Micro」とタクトスイッチを利用することによって行いたいと思います。

スイッチを押して文字を入力する

まずは、スイッチを押したら、指定した文字を入力するといったことを行いたいと思います。

空のスケッチを書き込む

最初に、空のスケッチを書き込むことで、しっかり書き込みができるかどうかの確認をしつつ、回路作成時の安全を確保したいと思います。

まず、「Arduino Micro」とPCを以下の画像のように接続します。

A-MicroBのUSBケーブルで接続

すると、ボードの裏側にあるLEDが点灯します。

LEDが点灯

この時点で、LEDが点灯していない場合は、USBケーブルがしっかりと接続されているか、確認してみてください。

次に、「Arduino IDE」を開き、空のスケッチ(「ファイル」タブの「New Sketch」をクリックしたときに出てくる何の処理も書かれていないスケッチ)を書き込みます。

このとき、ボードの選択欄は「Arduino Micro」を選択します。

Arduino Microを選択

空のスケッチを書き込む

ボードが認識されない場合は、接続がしっかり行われているか、ケーブルが充電専用のものではないかなど確認を行ってみてください。

書き込んだ際、以下のようなオレンジ色の文が、出力画面に表示されますが、エラーではないため問題ありません。

出力画面の表示

回路を作成する

上記の書き込みができましたら、回路の作成をします。

今回は小さめのブレッドボードと背の低いジャンパーワイヤーを使用することで、回路をコンパクトにしてみました。

スイッチを押してキー入力を行う回路

スイッチを押してキー入力を行う回路の図

部品の大まかな種類と繋がり方さえ同じであれば、同じように動作するため、以下のように大きめのブレッドボードを使ったり、ジャンパーワイヤーの種類や経路が異なっていても問題ありません。

スイッチを押してキー入力を行う回路(大きめ)
スイッチを押してキー入力を行う回路の図(大きめ)

スケッチを書き込む

回路の作成が終わりましたら、以下のようなスケッチを書き込んでください。

スケッチを書き込んだ後に、キーボードの入力が勝手に行われる場合は、USBケーブルを抜いてください。

その後、回路とスケッチが間違っていないかの確認を行います。

間違って書き込んだスケッチによる操作により、修正したスケッチの書き込みが困難な場合は対策を次の節である「スケッチの解説」にて説明していますので、先にそちらをご覧ください。

回路とスケッチが正しい場合、押したスイッチに応じて文字の入力が行われます。

左のボタン:aキーの入力 真ん中のボタン:a+shiftキーの入力 右のボタン:Appleとなるようにキーの入力

以下に入力できる欄を作ったので、試しにキー入力を行ってみてください。

入力される文字は、入力モード(半角英数字やひらがな入力など)の影響を受けます。

「a」、「A」、「Apple」と入力したい場合は、入力モードを半角英数字にします。

スイッチを押したのに入力が行われない場合は、回路とスケッチが間違っていないか確認をしてみてください。

スケッチの解説

暴走を止めるための文

今回のスケッチは、単純な文字入力のみなので、スケッチが書き込めない状態になるほど、暴走することはないと思いますが、対策をするための処理を行っているので、それについて説明をしたいと思います。

まず、スケッチの初めにある以下の文で、「pausePin」という定数を用意して暴走を止めるためのピンの番号を格納しています。

次に、「void setup()」の中にある、以下の文で「pausePin」に指定したピンを入力ピンとして設定しています。

ここまでは、よくある入力ピンの初期設定です。

続いて、「void setup()」の中で以下のような文を記述しています。

while()文というのは、( )内がtrueの場合、{ }内の処理を繰り返し行う文です。

while文の説明

今回は、( )内に「digitalRead(pausePin)」と記述しているので、「pausePin」に指定したピンが、「HIGH」のとき、繰り返しの処理が行われます。

そして、今回繰り返しの処理は、空になっており、何も行わないという処理を繰り返すことになります。

これにより、「pausePin」で指定した番号のピンが「HIGH」のとき、ずっと何も行わない処理を繰り返すため、以降の文に暴走させてしまう原因となる文があったとしても、それが実行されなくなるということになります。

digitalRead(pausePin)がHIGHのとき次の処理が実行されることはない

上記の文が正しく書き込めていれば、PCとの接続前に「pausePin」に指定したピン(上記の場合だと13番ピン)と5Vピンを接続することで、暴走を止めることができます。

13番ピンと5Vピンを接続

スケッチが間違っていて、上記の方法が機能しない場合は、リセットボタンを使うことによって、暴走を止めてスケッチを書き込むことができます。

リセットボタン

ただし、結構コツがいるため、何度か挑戦する必要があるかもしれません。

以下に、その方法を書いておきます。

まず、新規スケッチを作成し、空のスケッチを用意します。

その後、リセットボタンを押しっぱなしにした状態でPCと接続し、ボードの選択欄を開きます。

空のスケッチを用意して選択欄を開いておく Arduino Microのリセットボタンは押しっぱなし

ここから先は、スピード勝負になるため、一通り方法を読んでから実行してください。

上記の状態からリセットボタンを離すと、「Arduino Micro」が認識されるため、追加されたボードを選択して、書き込みを実行し、もう一度リセットボタンを押しっぱなしにします。

①リセットボタンを離す ②Arduino Microが追加されたら選択 ③書き込みを実行 ④リセットボタンを押す

ここで、追加されたボードが「Arduino Micro」になっていない場合は、右下にあるアイコンをクリックすると、「Arduino Micro」として認識されるはずです。

追加されたボードがArduino Microでない場合右下のアイコンをクリック

「Arduino Micro」はリセットボタンを離してから、8秒後に処理を開始するため、上記の動作は8秒以内に行う必要があります。

書き込みを実行すると、コンパイルが行われて、その後、書き込みが行われます。

上記の書き込み実行の後、コンパイル完了のポップアップが、右下に表示されたら、リセットボタンを離します。

コンパイル完了のポップアップが表示されたらリセットボタンを離す

上手くいけば、これで空のスケッチが書き込まれるため、暴走を止めることができます。

キー入力を行うための初期設定

Arduinoをキーボードとして、扱うためのライブラリが、標準ライブラリとして存在するため、それを利用します。

まず、スケッチの初めにある以下の文により、「Keyboardライブラリ」を読み込みます。

続いて、「void setup()」の中にある以下の文により、キーボードの初期設定を行います。

「Keyboard.begin()」は( )内に、特定の文を記述することによって、キーボードの種類を指定することができます。

以下に、( )内に記述する文と対応するキーボードの種類の表を示します。

記述する文キーボードの種類
KeyboardLayout_de_DEドイツ用
KeyboardLayout_en_USアメリカ用
KeyboardLayout_es_ESスペイン用
KeyboardLayout_fr_FRフランス用
KeyboardLayout_it_ITイタリア用
KeyboardLayout_sv_SEスウェーデン用
KeyboardLayout_da_DKデンマーク用

今回のように、( )内が空の場合は、アメリカ用のキーボード(USキーボード)として働きます。

表を見ていただくと分かるように、日本用のキーボード(JISキーボード)は、残念ながら用意されていません。

よって、今回は英数字の配列が、日本用のキーボード(JISキーボード)と同じであり、日本でも多く使用されているアメリカ用のキーボード(USキーボード)として設定をおこなっています。

スイッチを扱うための初期設定

今回はスイッチが、押されたら文字を入力するといったことを行うため、スイッチを扱うための設定も行っています。

まず、スケッチの初めにある以下の文により、キー入力を行うスイッチに繋がっているピンの番号を配列としてまとめています。

続いて、「void setup()」の中で以下のような文を記述しています。

ここで出てくる「sizeof()」という関数は、( )内に記述したデータのサイズをバイト単位で返します。

上記の文の場合、「sizeof(keySwitches[0])」は、int型の変数1個分のサイズである「2」という数値を返し、「sizeof(keySwitches)」はint型の変数3個分のサイズである「6」という値を返します。

int型の変数のサイズは2バイトなので、sizeof(keySwitches[0])は「2」 配列はint型の変数3個分のサイズなので、2×3で6バイト、よってsizeof(keySwitches)は「6」

ここで、配列全体のサイズと配列のデータ1個分のサイズが分かれば、配列にいくつの要素が入っているか計算することができます。

6÷2で要素数は3 sizeof()を使って表すとsizeof(keySwitches)/sizeof(keySwitches)

そこで今回のスケッチでは、上記の計算により配列の要素数を確認し、さらに「for文」で要素の数だけ処理を繰り返すことにより、配列にまとめた番号のピンをすべてプルアップ付きの入力ピンとして設定しています。

タクトスイッチやプルアップ付きの入力ピンについて、良く分からないという方は、以下の記事で説明していますので、是非、ご覧になってください。

文字の入力を行う処理

文字を入力するための関数は、いくつかあるので、順番に説明していきたいと思います。

まず、「void loop()」の中で、以下のような文が記述されています。

ここで、「Keyboard.press()」は、( )内で指定した文字のキーが押されているという情報を送ります。

送られるのは、どのキーが押されているかという情報なので、同じ「Keyboard.press(’a’)」という処理でも、入力モードによっては、「a」以外に「あ」や「ち」と入力される場合があります。

ここで指定した文字は、大文字、小文字を区別し「’A’」のように大文字の場合は、「shiftキー」と「aキー」が同時に押されているという情報を送ります。

記号についても入力可能ですが、PCのキーボード設定を、日本語キーボード(106/109)と設定している場合、一部の記号が正しく入力されません。

続いて、「Keyboard.release()」は、指定した文字のキーが押されているという情報を取り消します。

実は、「Keyboard.press()」で指定された文字のキーは、ずっと押されっぱなしの状態であると認識されます。

「Keyboard.release()」は、指定した文字のキーを離したと認識させることができるため、「Keyboard.press()」と合わせて使用されます。

また、「Keyboard.press()」を実行してから、「Keyboard.release()」を実行するまでの時間を空けることによって、長押しをしているような動作をさせることもできます。

aの入力

今回のスケッチでは、「keySwitches[0]」のスイッチが押されたら、「aキー」が押されているという情報を送り、離されたらその情報を取り消しています。

これにより、「keySwitches[0]」のスイッチが、キーボードの「aキー」と同じような働きをするようになります。

次に、「void loop()」の中で、以下のような文が記述されています。

ここで、記述されている「Keyboard.write()」は、指定した文字のキーが押されているという情報を一瞬だけ送ります。

「Keyboard.press()」と「Keyboard.release()」を、ひとまとめにしたような関数で、キーボードのキーを押してすぐ離すのと同じような情報を送ることができます。

今回のスケッチでは、keySwitches[1]のスイッチが押されたら「shiftキー」と「aキー」が押されているという情報を一瞬だけ送り、その後200[ms]待機するということを行っています。

ここで、keySwitches[1]のスイッチを長押しした場合は、先程の「keySwitches[0]」のスイッチと異なり、200[ms]の間隔でキーが連打されているような入力になります。

最後に、「void loop()」の中で、以下のような文が記述されています。

ここで、記述されている「Keyboard.print()」は、指定した文字列になるようにキー入力の情報を送ります。

この関数も送られるのは、どのキーが押されているかという情報なので、同じ「Keyboard.print(“Apple”)」という処理でも、入力モードによっては、「Apple」以外に「ちせせりい」と入力される場合があります。

今回のスケッチでは、「keySwitches[2]」のスイッチが押されたら「Apple」となるようにキー入力の情報を送り、その後200[ms]待機するということを行っています。

文字列をいっぺんに入力できるため便利ですが、入力速度の調整を行うことができず、環境によっては上手く入力の処理が行えないことがあります。

私の環境では、メモ帳で上記の処理を行うと、入力の処理が上手くいかずに、文字が途中で途切れてしまうようなことが起こりました。

入力速度を調整して、文字列を出力するということについては、次回の記事で行いたいと思います。

文字以外の入力を行う

続いて、「backspace」や「ctrl」キーなど文字以外のキー入力を行いたいと思います。

スケッチを書き込む

回路はそのままで以下のようなスケッチを書き込みます。

スケッチを書き込んだ後に、キーボードの入力が勝手に行われる場合は、USBケーブルを抜いてください。

その後、スケッチが間違っていないかの確認を行います。

先程と同様、USBに接続した瞬間暴走し、修正したスケッチの書き込みが困難な場合は、接続前に「pausePin」に指定したピン(上記の場合だと13番ピン)と5Vピンを接続することで、暴走を止めることができます。

回路とスケッチが正しい場合、押したスイッチに応じてキー入力が行われます。

左のボタン:backspaceキーの入力 真ん中のボタン:ctrl+zキーの入力 右のボタン:行の選択を行うための入力

以下に入力できる欄を作ったので、試しにキー入力を行ってみてください。

スケッチの解説

文字以外の入力を行う処理

「Keyboard.press()」、「Keyboard.release()」、「Keyboard.write()」の( )内に特定の文を記述すると、文字以外のキー入力を行うことができます。

以下に、( )内に記述する文と対応するキーの種類(Windows)の表を示します。

修飾キー

記述する文入力されるキー
KEY_LEFT_CTRLctrlキー(左)
KEY_LEFT_SHIFTshiftキー(左)
KEY_LEFT_ALTaltキー(左)
KEY_LEFT_GUIWindowsキー(左)
KEY_RIGHT_CTRLctrlキー(右)
KEY_RIGHT_SHIFTshiftキー(右)
KEY_RIGHT_ALTaltキー(右)
KEY_RIGHT_GUIWindowsキー(右)

特殊キー

記述する文入力されるキー
KEY_UP_ARROW上方向キー(↑)
KEY_DOWN_ARROW下方向キー(↓)
KEY_LEFT_ARROW左方向キー(←)
KEY_RIGHT_ARROW右方向キー(→)
KEY_BACKSPACEbackspaceキー
KEY_TABtabキー
KEY_RETURNenterキー
KEY_MENUmenuキー
KEY_ESCescキー
KEY_INSERTinsertキー
KEY_DELETEdeleteキー
KEY_PAGE_UPpage upキー
KEY_PAGE_DOWNpage downキー
KEY_HOMEhomeキー
KEY_ENDendキー
KEY_CAPS_LOCKcaps lockキー
KEY_PRINT_SCREENprint screenキー
KEY_SCROLL_LOCKscroll lockキー
KEY_PAUSEpauseキー

テンキー

記述する文入力されるキー
KEY_NUM_LOCKnum lockキー
KEY_KP_SLASH/キー
KEY_KP_ASTERISK*キー
KEY_KP_MINUS-キー
KEY_KP_PLUS+キー
KEY_KP_ENTERenterキー
KEY_RETURNenterキー
KEY_KP_11キー
KEY_KP_22キー
KEY_KP_33キー
KEY_KP_44キー
KEY_KP_55キー
KEY_KP_66キー
KEY_KP_77キー
KEY_KP_88キー
KEY_KP_99キー
KEY_KP_00キー
KEY_KP_DOT.キー

ファンクションキー

記述する文入力されるキー
KEY_F1F1キー
KEY_F2F2キー
KEY_F3F3キー
KEY_F4F4キー
KEY_F5F5キー
KEY_F6F6キー
KEY_F7F7キー
KEY_F8F8キー
KEY_F9F9キー
KEY_F10F10キー
KEY_F11F11キー
KEY_F12F12キー
KEY_F13F13キー
KEY_F14F14キー
KEY_F15F15キー
KEY_F16F16キー
KEY_F17F17キー
KEY_F18F18キー
KEY_F19F19キー
KEY_F20F20キー
KEY_F21F21キー
KEY_F22F22キー
KEY_F23F23キー
KEY_F24F24キー

今回のスケッチでは、以下のような文により、「keySwitches[0]」のスイッチが押されたら、「backspaceキー」が押されているという情報を送り、離されたらその情報を取り消すということを行っています。

これにより、「keySwitches[0]」のスイッチが、キーボードの「backspaceキー」と同じような働きをするようになります。

同時押しを行う処理

「Keyboard.press()」は指定したキーを押しっぱなしにしていると認識されるため、複数のキーを同時に入力するときに役立ちます。

今回のスケッチでは、以下のような文により、keySwitches[1]のスイッチが押されたら「ctrl+z」を入力するということを行っています。

ここで、「Keyboard.releaseAll()」は、すべてのキーに対して、押されているという情報を取り消します。

上記の文では、「Keyboard.press()」により、「ctrlキー」と「zキー」が押されているという情報を送った後、処理を待つために100[ms]だけ待機し、その後、すべてのキーに対して、押されているという情報を取り消しています。

ctrl+zの入力

これにより、「ctrlキー」と「zキー」が押されて、離されたと認識させることができます。

その後記述している「while文」では、スイッチが押されている間、空のループ処理を行い、長押しの際にもう一度入力が行われることや同時に他の処理が行われることを防いでいます。

また、最後の「delay(200)」はチャタリングにより、もう一度処理が行われてしまうことを防ぐために記述しています。

長押しとチャタリングの対策

一連の入力を行う処理

単純なショートカットキーの入力だけでなく、一連の操作をするようなスケッチを書きこめば、キーボードでの入力よりも簡単かつ速く入力することができます。

今回のスケッチでは、以下のような文により、keySwitches[2]のスイッチが押されたら行の選択をするためのキー入力を行っています。

上記の文は、keySwitches[2]のスイッチが押されたら、「homeキー」で行の先頭にカーソルを移動させ、次に「shiftキー」と「endキー」により、選択をしながら行の末まで移動させるという処理を行っています。

上記のように、便利だけどキーボードで入力するのが少し面倒な処理もスイッチ1つで実行することができます。

また、もっと長い処理をすることも可能なため、簡単な作業であればスイッチを押すだけで自動化みたいなことも可能です。

終わりに

皆さん、うまくキー入力を行うことができたでしょうか。

Arduinoは、ロボットを動かしたり、センサから情報を受けとって処理をしたりするときに使われるイメージが強いと思いますが、「Arduino Micro」のようにHIDとして利用することができるArduinoボードであれば、今回のようにPCの操作を行うことにも利用できます。

今後はもう少し「Arduino Micro」を使った操作についての記事を書いていこうと思うので、ArduinoでPCなどの操作を行いたいという方は、引き続きサイトをご覧になってくれると嬉しいです。

次回の記事では、キー入力の速度を制御して、文を入力するといったことを行いたいと思います。

本記事はここまでです。ご清覧ありがとうございました。

広告

今回の主役である「Arduino Micro」です。

まだ持っていないという方は、この機会に是非購入を検討してみてください。

「Arduino Micro」とPCと接続するためのケーブルです。

MicroBタイプのUSBケーブルが無い場合は、合わせて購入を検討してみてください。

今回使用したカラフルなスイッチのセットです。

スイッチを色で判別したいときや見た目をカラフルしたいときにおすすめです。

今回使用したコンパクトなブレッドボードとジャンパーワイヤーのセットです。

コンパクトな回路を作成する際に役立ちます。

楽天モーションウィジェットとGoogleアドセンス広告です。

気になる商品がございましたら、チェックをしてみてください。