USBHIDデバイスを作成する

最終更新日:2020年1月20日


HIDデバイスは (Human Interface Device, HID) の略で、コンピュータの周辺機器・構成要素のうち、マンマシンインタフェースを担当するものの総称とされています。例えば、

一寸発展して、

ようなデバイスが対象となります。
I/F(API)が規格化されているので、OSの違いがあってもそのまま使えるはず、、と云うメリットがありますし、基本ドライバは接続した時点で自動インストールされるはずです。

STM32duinoにはHID用ライブラリが提供されています。どの程度のデバイスが構築できるのかはライブラリ次第のようです。少なくともカスタマイズされたキーボード・マウスは作れるようですし、ハッキング用の入力デバイスなんかも紹介されていたりします。

よく見かけるExampleだと、

があります。
さて、ここではどのようなテーマにしようかと思っています。
テーマを決定する前にHIDライブラリについて調査します。


まず使用するライブラリですが、Arduino_STM32-master.zipを解凍して、\Users\[user]\Documents\Arduino\hardwareにインストールしたライブラリとなります。このライブラリですが、最新としてください。2018年頃のバージョンだとまともに動かないことを確認しました。

Exampleをとりあえず選んでビルドします。
多分普通にビルド出来、BluePillに書き込まれます。自動的にリセットが掛かるとUSBドライバは自動的にインストールされるかと思います。

デバイスマネージャで見るとヒューマンインターフェースデバイスに追加されていることが判るかと思います。

そして残念なことにArduino BootLoader が壊れてしまうようです。
ところが、ArduinoIDEのツール>>UploadMethodに『HIDbootLoader』と云うのが追加されます。

『HIDbootLoader』を選択してBluePillに書き込んでみました。すると、以下のように、このデバイスにはHID Bootloaderが見当たらない!と云われてしまいました。

+------------------------------------------------------------------------+
|         HID-Flash v2.1 - STM32 HID Bootloader Flash Tool               |
|     (c)      2018 - Bruno Freitas      - http://www.brunofreitas.com/  |
|     (c) 2018-2019 - Vassilis Serasidis - https://www.serasidis.gr/     |
|   Customized for STM32duino ecosystem  - https://www.stm32duino.com/   |
+------------------------------------------------------------------------+
> Trying to open the comport...
> unable to open comport
> Searching for 1209:BEBA HID device...
##########
Error - No HID Bootloader device is found

ただこのことで判りました。多分先人が『HID Bootloader』を提供しているはずで、これを利用すれば、HIDデバイスの開発もスムーズになりそうです。
今回書き込んだスケッチは検証が難しいと感じましたので、検証できるExampleでもう一度トライします。


まずは『HID Bootloader』を入手したいと思いました。https://github.com/Serasidis/STM32_HID_Bootloaderに掲載されていたのですが、https://github.com/Serasidis/STM32_HID_Bootloader/releasesにバイナリファイルが有ります。説明を読む限り、stm32flashで書込は出来るようです。

stm32flash.exe -g 0x8000000 -b 115200 -w hid_generic_pc13.bin COM2

と云うような記述をするようです。BOOT0ショートピンは1にする必要があります。

やってみました。

『HID Bootloader』は、すんなり書き込めました。
ショートピンBOOT0を0に戻し、USB接続し直します。ArduinoIDEからプログラムコードを書き込んでみました。

最大131072バイトのフラッシュメモリのうち、スケッチが20348バイト(15%)を使っています。
最大20480バイトのRAMのうち、グローバル変数が4416バイト(21%)を使っていて、ローカル変数で16064バイト使うことができます。
C:\Users\[user]\Documents\Arduino\hardware\Arduino_STM32-master/tools/win/hid-flash.exe C:\Users\

+------------------------------------------------------------------------+
|         HID-Flash v2.1 - STM32 HID Bootloader Flash Tool               |
|     (c)      2018 - Bruno Freitas      - http://www.brunofreitas.com/  |
|     (c) 2018-2019 - Vassilis Serasidis - https://www.serasidis.gr/     |
|   Customized for STM32duino ecosystem  - https://www.stm32duino.com/   |
+------------------------------------------------------------------------+
> Trying to open the comport...
> unable to open comport
> Searching for 1209:BEBA HID device...
#
> 1209:BEBA device is found !
> Sending <reset pages> command...
> Flashing firmware...
. 1024 Bytes
. 2048 Bytes
. 3072 Bytes
. 4096 Bytes
. 5120 Bytes
. 6144 Bytes
. 7168 Bytes
. 8192 Bytes
. 9216 Bytes
. 10240 Bytes
. 11264 Bytes
. 12288 Bytes
. 13312 Bytes
. 14336 Bytes
. 15360 Bytes
. 16384 Bytes
. 17408 Bytes
. 18432 Bytes
. 19456 Bytes
. 20480 Bytes
> Done!
> Sending <reboot mcu> command...

今度はきちんと書き込めました。ただ、、、その後USBデバイスとして認識に失敗します。そして、書き込んだプログラムは動きません。原因不明です。バイナリファイルの選択が良くなかったのかもしれません。『low_and_medium_density』 と『high_density』があります。この違いについて資料が見つかりません。とりあえず入れ替えてやってみるしかないです。

やっぱり動かないです。Lチカを書き込んだのですがダメです。

今一度説明書きを読みました。どうもプログラムをArduinoIDEから書き込む際はBOOT1のショートピンを1にしておかないといけないのかと思います。BOOT1のショートピンを1にしてPCに接続すると、

BluePillが認識されています。この後です。Lチカのコードを書き込みます。成功します。しかし、実行しません。

判りません。今一度先人の記事調査が必要です。


ということで、ブートローダを従来のモノに変えて、今一度トライします。
テストプログラムは『keyboardMouse』にしてみました。
\Arduino_STM32-master\STM32F1\libraries\USBComposite\examples\keyboardMouse

プログラムコードの書き込みに成功し、USB再接続すると、テキストエディタにUP/DOWN・・・と勝手に入力されます。

/*
 * 20200127 T.Wanibe
 * このプログラムはBluePillをHIDデバイスとして使うテストプログラムです。
 * 書込はSTM32duinoとして書込、USBケーブルを一旦外して再度接続すると、
 * mapleというキーボードデバイスとして認識されます。
 * テキストエディタにカーソルを当てると勝手に文字列を入力してゆきます。
 * ちゃんとHIDデバイスとして動いていることが確認出来ますが、ちょっとこのプログラムは
 * 乗っ取られに近いので推奨できないです
 * 最大131072バイトのフラッシュメモリのうち、スケッチが17964バイト(13%)を使っています。
 * 最大20480バイトのRAMのうち、グローバル変数が4408バイト(21%)を使っていて、ローカル変数で16072バイト使うことができます。
 */
#include <USBComposite.h>
USBHID HID;
HIDKeyboard Keyboard(HID);
HIDMouse Mouse(HID); 
 
void setup() {
        HID.begin(HID_KEYBOARD_MOUSE);
}
void loop() {
        Keyboard.println("UP");
        Mouse.move(0,-127);
        delay(1500);
        Keyboard.println("DOWN");
        Mouse.move(0,127);
        Mouse.move(0,127);  //Movement cannot be greater than a byte
        delay(1500);
        Keyboard.println("LEFT");
        Mouse.move(-127,-127);
        delay(1500);
        Keyboard.println("RIGHT");
        Mouse.move(127,0);
        Mouse.move(127,0);  //Movement cannot be greater than a byte
        delay(1500);
        Keyboard.println("CENTER");
        Mouse.move(-127,0);
        delay(500);
        delay(5000);
}

デバイスとしては『Maple』と云う名でキーボード複合デバイスとして認識されました。

ただ、この方法は、1回書き込んでしまうとArduinoIDEがUSBシリアルとして認識しないため、ブートローダの再書き込みが必要です。
HIDデバイスとして構築するならHIDブートローダを利用して、BOOT1ピンの切替で対応した方がリーズナブルかと思います。

バーコードリーダのようなデバイスであればこの仕組みで作れそうです。
HIDデバイスとしてBluePillで構築出来るアイデアがほしいです。


オブジェクト自体はベクター殿のストレージをお借りしています。

https://www.vector.co.jp/vpack/browse/person/an051501.html



免責事項

本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。

本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。

商標・登録商標

Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。