Micro(コピー品)に小さなキーパッドを付けて小規模なHIDキーボードを作ってみたが、今度はふつうのUSBキーボードをつないでみた話。ArduinoにUSBキーボードを接続するためにはUSBホスト機能を追加する必要がある。使ってみることにした。MicroにいろいろなUSB周辺装置を接続できるようになるのだが、話の流れとしてキーボードを接続することにした。MicroにつないだキーボードをPCの入力装置として使うこともできるだろう。Hostシールドのこと今回使った製品は中国から取り寄せたもので、USDで$4~$5程度の価格だった。Microとほぼ同サイズのミニ版がある。詳細については開発元のCircuits@Homeのページが詳しい(ちょっと読みづらいけど)。pdf版の回路図はこちら。r1.1′′と、抵抗値が違っていたりするものの中身は同じと考えてよさそうだ。ROMやフラッシュにプログラムが焼かれているわけではないので。ボード中央に、MAXIM社のMAX3421Eが載っていて12MHzの発振器が接続されている。称されていて、SPIホスト(今回はATmega32u4)とSPIで接続する。メーカーのページによれば、SPIホストからのコントロールによりUSB周辺機器用にもUSBホスト用にもなるとのこと。動作電源(VCC)は+3.3Vなので、+5V動作のArduinoと組み合わせる際には電源だけでなく、SPIの各ラインについてもレベルシフトが必要になる。+3.3V動作のものと組み合わせるのが簡単だろう。割込み通知用の(INT)が必要になる(割り込みを使うかどうかはスケッチ次第)。Microと重ねるときには若干の相違があるので注意が必要。多くのスルーホールは、ボード内のどこにも配線されていない。今回入手したコピー品の裏面には、SPI用のシルクが印刷されているが誤りがあるので注意が必要だろう。SCLK)と異なっている。実際にはどうなのかと思ってパターンを追って導通チェックしてみたら以下のようになっていた(左側がシルク印刷、右側がMAX3421Eの端子)。Microの端子並びと同じということ。SSは、ArduinoのD10に接続される)。Microとの接続にあたり、以下のような改造を行った。miniUHSボードの改造についてはDEKOのアヤシいお部屋。該当するページを参考にさせていただいた。AコネクタのVBUSはVCCと直結されている。VCCは+3.3Vだけど大丈夫?と思った。電圧を得ることにした。miniUHSのRAW端子相当の外周スルーホールはどこにも接続されていないから自分で配線する必要がある。RAWとVBUSを接続するならば、VCCとVBUS間のパターンをカットしておく必要がある。カットしておかないと、おそらくMAX3421Eが壊れます。MicroもMAX3421Eもリセットしたい。MicroではなぜかGNDになっている。MINIではRST端子なのだが。)はどこにもつながっていないので、自分で配線してやる必要がある。Microを重ね合わせて接続しない限り、RST-MAX_RST間のパターンカットの必要はない。MicroのRSTとminiUHSのRSTをワイヤで接続すればよいだけ。Micro側もminiUHS側もRSTは入力端子である。MicroのRSTとMAX_RSTをあえて接続する必要もないように思える。注意すべき点は、MAX3421Eの仕様では電源投入後の動作状態では、MAX_RSTをHレベルに維持する必要があること。miniUHSのMAX_RST端子はVCCにプルアップされていないから、何も接続していない状態では状態が不定で正しく動作しなかった。Micro側のRSTはボード内でVCCにプルアップされているので両者を接続してやればよいし、あるいは、miniUHS内でMAX_RSTをVCCにプルアップする必要がある。MINIと(SPIのレベルシフタを介して)接続するならば、MAX_RSTはマイコン側と接続せず、+3.3Vにプルアップしておく必要がある。接続が必要な端子とパッチまとめると、上図の斜線の2箇所でパターンをカットし、(RAW)-VBUSと(RST)-MAX_RSTを配線する。赤丸を付けている端子が、ボード内に接続相手がいるスルーホールを示している。MINIにはRST端子が2つあるので、上のようなパッチをあてて下側のRSTをN.C.にしたminiUHSと組み合わせても動作に影響しないと思う。実際にやったらこんな具合になった。miniUHSにパッチ配線面が薄いので簡単にカットできます。当初は2つのミニボードを重ね合わせようと思っていたのだけど、また何かパッチが必要になると困ると思ってふつうのブレッドボードに並べることにした。MicroとminiUHSヘナヘナなワイヤで接続している両ボードの端子位置は一致している。重ね合わせて使うこともできる。そのときは写真と同じ向きでUSBコネクタが両側にでる形状となる。このボードはしっかりピンをはんだ付けしてしまったので、別途用意することになるが。いちおう、配線図を載せておきます。v2ライセンスで公開しているライブラリを使うことにした。このライブラリを使ったプログラムや製品は、ソースコードを公開すること(入手可能とすること)が義務付けられている。IDEのスケッチ/ライブラリをインクルードで開くメニューの先頭からライブラリを管理を選択し、ライブラリマネージャを開く。“といった項目が表示されるので、最新バージョン(1.3.2)を選択してインストールした。したら、以前にインストールしたことがあってこうなったのかもしれない。ライブラリマネージャに表示されない場合はgithubからzipをダウンロードしてArduinoライブラリとして追加すればよいだろう。ビルドして書き込んだところあっさり動いた。IDEのファイル/スケッチ例の中から選ぶことができる。シリアルモニタに表示される。上記のようにキー操作内容がシリアルモニタに表示されてくる。ShiftやCtrlのような修飾キー単独での押下も表示されるし、修飾キーを押しながら文字キーを押したときもその内容が表示される。ID)が、modにはその時点の修飾キーの情報が入っている。これらのメソッドは修飾キー単独での押下時には呼ばれない。beforeとafterには、ライブラリ側で維持している直前の修飾キー情報と、現在の修飾キー情報が入っている。文字キーの押下を伴わない場合も、この2つの値に相違があれば呼び出しが行われるようだ。miniUHSの下流につないだキーボードのLEDは、ScrLockやNumLockの押下に応じて点いたり消えたりするので、ライブラリがLED用のアウトプットレポートを送っていると思われる。今回はキーボードLEDを利用しないことにした。miniUHSにUSBキーボードをつなぎ、PCのキーボードとして使うスケッチ上記の作例を参考に、miniUHSのUSBポートに接続したキーボードから送られてくるキー操作イベントをHIDインプットレポートとしてPCに送るスケッチを書いてみた。結果として普通のキーボードとして使えればオーケー。Mouse.cppがID==1。全部で8つ(左右4つずつ)。8ビット長のInputフィールド(変数)が1つ。