HID USB

(2015.6.13 作成)

(2020.11.28 更新)

 PCとマイコンの通信を行う方法はいくつかありますが、ここではUSBを用いて通信を行う方法を紹介しようと思います。ただ、ここではUSBの規格などについて詳しく紹介せず、HIDという規格でSTM32マイコンと通信するやり方について解説しています。一部のライブラリについてはこちらでダウンロードすることができます。

USB概要

 USB自体は広く普及していますのでコネクタはよくご存知だとは思います。USB2.0や3.1などの規格がいろいろとあることはご存知だと思うのですが、さらにデータ転送の種類?もいくつかあり以下の4種類が規定されています。

コントロール転送 接続を確立させるなど、USB通信自体をコントロールする。
バルク転送 

HDDなどの大容量データ転送用。

ファイルシステムが必要? 

アイソクロナス転送

音楽の転送など、定期送信を行う用途。

エラー訂正が行われない 。

インタラプト転送  小容量のデータ転送用

 通常、USBでPCへ接続するためにはデバイスドライバを作成して、利用する各PCへインストールする必要があります。しかし個人が趣味のレベルでデバイスドライバを開発するのはとても大変です。しかしインタラプト転送の一種であるHID (Human Interface Device)という規定に従えばドライバ開発無しにPCへの接続が可能になります。

 このHIDについてですが、本来は名前の通りキーボードやマウスなど人が使用するデバイス用の規定です。しかしどのPCにもインターフェースは存在しているためOSが標準でHIDドライバを準備してくれてます。よってこのページで紹介している方法はOS標準のHIDデバイスドライバを使用してマイコンとPC間で任意のデータ送受信を実現するということになります。

 

メリットですが、

  • 規格がしっかり定まっており、デバイスドライバをインストールしなくても任意のPCと接続が可能です。ここではWindows用のサンプルプログラムも紹介してていますがMacやLinuxでも接続できるはずです。
  • STM32の一部のマイコンはペリフェラルとしてUSBドライバが内蔵されており、ソケットと抵抗さえ準備すればPCと接続できます
  • 活線挿抜(ホットプラグ)が出来るので電源を入れたまま抜き差しができ、乱暴に扱っても大丈夫です。
  • こちらのページで紹介している仮想COMポート(CDC)と異なりPCへの挿抜をPC側で知ることができます。またCOMポート番号を毎回調べる煩わしさがありません。

 などなどと、Arduinoで通常行われているRS-232C(UART)+ターミナルソフトに比べても十分なメリットがあります。 

 ここではSTM32F103基板で動作させるコードを紹介していますが、他のSTM32基板でも同様に動作させることができると思います。またArduino用のコードは紹介していません。Arduinoの場合はLeonardoのような一部のボードを使用するかソフト的に作成することが出来るようです。


注意点

 上記の通りメリットも多いUSBのHID通信ですが、いいことばかりではなく以下のような注意点があります。必要に応じてCDC通信と使い分けるのが老いと思います。

  1. USBはホストが制御する通信方式です。デバイス(STM32)側から通信を開始することは出来ません。実際にはホストが一定期間ごとに各デバイスにポーリングを行い、その際デバイス側が手を上げていれば通信が開始されます。このためmsオーダーでの応答を求める場合は使えないと思います。
  2. 通信は1パケットを単位として送受信が行われます。パケットは最大64バイトまで設定することができますがそれより大きいデータを送受信する場合は適切にユーザー側で分割する必要があります。
  3. 上記の通りデータが細切れになる&マスタからのポーリングを待つために最終的なデータ転送速度は遅いです。画像など大きなデータを送る場合はCDCなど別の手段を用いた方が良いです。

 実際に使用するに際してのマイコン側PC側のサンプルプログラムをそれぞれ用意していますので参考にしてみてください。このサンプルプログラムを使用することで写真の様にPCからLEDのOn/Off、ボタンを押すことで任意のデータをPCへ送信できることを確認しています。

 またこのページで紹介している方法は任意のデータを送受信する方法ですが、レポートディスクリプタを書き換えればマウスやキーボードとして本来のHIDデバイスとして動作させることも可能だと思います。

 マイコンでよく使用されるI2CやSPIと異なりUSB通信は仕様が複雑怪奇です。管理人も良くわからずほぼブラックボックスとして使用しています。しかしそれでも一応動いていますので、ご参考になれば幸いです。

コメント: 0 (ディスカッションは終了しました。)
    まだコメントはありません。