この記事はアドベントカレンダー2024/12/07の記事です


目次

背景

DDProを使ってラジコンを操作して遊びたいぁ…

ちっちゃいところから始めていこう!

目標

DDProのステアリング操作、アクセル操作、ブレーキ操作に応じてM5BugC2が動作する

やること

構成

DDPro+PC+M5BugC2

image.png

使用ツール

IMG_2252.jpg

IMG_2251.jpg

DDProの出力データを調べる

必要なデータ

手順

  1. WiresharkでUSBPcap1を選択

  2. 文字列ディスクリプタのbString: FANATEC Wheelを探す

    usb.bString == "FANATEC Wheel"
    
  3. sourceのID的なものでフィルターをかける

    usb.src == "source"
    
  4. デバイスディスクリプタの中にVIDとPIDがある

    idVendor: Endor AG(VID)

    idProduct: Unknow(PID)

    となっている

    参考までに他のデバイスの例(G703h)

    idVendor: Logitech, Inc . (VID)

    idProduct: Lightspeed Receiver (PID)

    →文字列ディスクリプタをみないとFANATECのデバイスかどうかわからない….

    Endor AGはFANATECの親会社だった

  5. URB_INTERRUPT inにあるHID Dataを右クリックしCopyでField Nameを選択、クリップボードにフィールド名をコピー

  6. Columnで右クリック→Edit ColumnでTitleにフィールド名をペースト、TypeをCustom、Fieldsにもフィールド名をペースト

    ここまでできるとHID Dataを一覧に並べることができる(不要なものを非表示にしてる)

    ↓のデータはステアリング操作のデータ

    スクリーンショット 2024-12-05 21.59.30.png

  7. ステアリング操作時、アクセル操作時、ブレーキ操作時を比較して見る

予測

がそれっぽい

検証

予測が正しいか検証する

バイトの変化をグラフ化して実際の操作に対応しているか調査

https://youtu.be/jx2fdBg19E4

間違っていなさそう

データを取得しUDPで送信・受信

準備

Pythonで指定のバイトをUDPで送信(PC)

C++でデータの受信(M5BugC2)

検証(CoolTerm)

スクリーンショット 2024-12-06 9.48.56.png

うまく送れていそう

UDPで受信したデータを元にM5BugC2を動かす

準備

M5BugC2用のライブラリの追加

https://github.com/m5stack/M5Hat-BugC

M5BugC2用のコードを追加

検証

※音量注意

https://youtube.com/shorts/tFZkxMHYJfs?feature=share

まとめ

WiresharkとUSBPcapを用いてDDProのHID Dataの一部解析を行った

UDPを用いてDDProとM5BugC2間で通信を行った

DDProの操作でM5BugC2を動かした

モーター制御のコードが不十分なため、動作が期待通りにはいかなかった。(DDProの仕様に合っていない:DDProは同じ動作をしている時データを送信しない?)

また、M5BugC2のバランスや足の問題なのかコードの通りに動かない問題も見られた。

展望

解析していないボタンの解析

予想している原因を改善し期待通りの動作が可能かを検証

フォースフィードバックの実装(M5BugC2に載っているMPU6886を試しに使ってみよう)

https://fanatec.com/ja-jp/faq/details/id/80

ラジコンに換装

感想

やりたいことはある程度できたけど、M5BugC2の問題なのかコード通りの動作をしなくて、直進させようとしても回転してしまうのが残念。

いろいろ勉強できたし、結構楽しくできたから、DirectInputの勉強もしてフォースフィードバックの実装とかラジコンへの換装とか結構楽しみ

それとChatGPT便利すぎる