naoki86star

インターネットの片隅でなにかしら書いてみる

PICとDAISO販売のWireless Mouseつないでみる

 100均DAISOで無線マウス販売されているのを知った*1。先日PICでUSBをつなげる方法を覚えたところだったので、ちょっとUSB-HOST機能というのをこのDAISOさんの無線マウスで試してみようと一つ購入してみた。これ、とりあえずノートPCでは普通に動いた。うまくいけばPICにリモートで操作を伝えることができるかも。


 今回もPIC24FJ64GB002。色々自分なりの苦労を経て、PICでDAISOさん無線マウスポインタの値・ボタン状態を読み取らせるところまで行った。その要点を書く。

  • MPLABXのMCCでMLA USB HOST Lite(HID mouse)を有効にしてgenerate、周波数はFSOC32MHz/USB Clock48MHz
  • これと別にMLAというライブラリからapp_host_hid_mouse.c(.h)を拝借*2:最も欲しかったのはAPP_HostHIDMouseReportParser()関数。Report HIDの読み取り処理を記述してくれるこれをMCCでは生成してくれない。*3
  • APP_HostHIDMouseReportParser()はUSBスタックがReport HIDを読み取ったタイミングで呼び出すのがいい、というかDAISOさん無線マウスの場合そうである必要あり*4*5
  • MLAのほぼそのままapp_host_hid_mouse.cでbuffalo製オプティカルマウスは動いてくれた!がDAISOさん無線マウスはまだだめでレポートディスクリプタの構造に対応できていない模様。これをもうDAISOさん用に決め打ちで修正*6
  • MCC generate時も、コンパイル時にもHEAP設定してね、の(控えめな)表示があり、HEAP sizeは10242048を設定。

 繰り返し書いてしまうが、MCCでapp_host_hid_mouse.cに相当するサンプルコードを出力してくれず、MLAのおかげで前に進むことができた。*7今回のようにデバイスごとのディスクリプタの確認と実装は必要にせよ、それ以前にapp_host_hid_mouse.cのサンプルがないと全くできなかったと思う。

 理解が進んでから*8振り返ってみると、APP_HostHIDMouseReportParser()は受信データバイト配列の中の各データの位置とサイズをアプリケーションとして再インデックス化しているようなもの。マウスの場合受信データは、(今回見た範囲で)buffaloマウスもDAISOさん無線マウスもデータ構造が似ていて、RL/WHEELボタンがbit、(x,y)ポジション、WHEEL回転方向がそれぞれ符号付き1バイト。特にきっちりデコード処理をしなくとも、コールバックされてくるinterruptデータから簡単な参照演算で所望のマウス状態を取得するでもいいと思った。


 

*1:原価300円でもすむとは思えない。。。

*2:C:\microchip\mla\v2018_11_26\apps\usb\host\hid_mouse\firmware\demo_src

*3:app_host_hid_mouse.cにはもともとのLEDとかprintとかのデモシグナルのためのマクロが埋め込まれている。これらは削除。

*4:このデバイスは複数のReport HIDを通知してきていて、所望の動作のためには1番目のレポートを処理する必要があった。当初非同期にメインループの中でAPP_HostHIDMouseReportParser呼び出ししていたら、2番目のレポートが1番目のを上書きしてうまくいかなかった。

*5:ReportHID受信に連動して呼び出しのためにusb_hid_event.c#USB_ApplicationEventHandler()のEVENT_HID_RPT_DESC_PARSED:から呼び出すようにした。USB_ApplicationEventHandlerを有効にするのにusb_host_config.cを更新。MCCの生成したファイルに手を入れる。

*6:DAISOさん無線マウスのレポート部分は5バイトで送ってきて、ボタン状態・マウス位置の表し方自体はだいたいbuffalo製と同じ。対応はその場しのぎレベルで、細かいこと書いてもアレだけども、DAISOさんデバイスの場合にはAPP_HostHIDMouseReportParser()関数の中でmouse.deflection.parsed.details.count+=2;mouse.size=5;というような追加コードを付け加えてあげた。

*7:拝借したのは前述のとおりdemo_src配下の2ファイル。最初はMLAのUSBframeworkごと利用するのも考えたがざっと見てMCC出力のものと変わらない?MCC出力のほうが年代的にも新しくてよい?のでは思った。

*8:20年近くUSBを使ってきて、今回、USBの転送仕様やら物理結線仕様やらには初めてその端緒に接したように思う。