2019年4月19日金曜日

ArduinoとANT無線中継機とZWIFTオーバーテイクボタン

ArduinoマイコンでANT+規格の無線信号を送受信するための備忘録です。

ANT+で無線通信するモジュールとしてAP2と呼ばれるものがありました。

PINOUTも独特です。


これにUART接続(送信用Tx線と受信用Rx線の2線でデバイス間を接続)してコマンドを投げると、ANT+規格の無線信号を送信および受信できます。

nRF24AP2を利用したAP2モジュールはEOLのようで、私の入手した互換モジュールはこちら



◆左はAP2のコピー品
安定して動いてくれましたが、非通電状態でも、一度雨に濡れたら、動作不能となりました。

◆真ん中は、D52モジュール
AP2の後継で、チップは、nRF52832、PINOUTは互換。
でもソフト的には、完全互換ではなかったです。
正常動作のためには
- UART通信速度は9600bps以下で利用すること、
- コマンドを送ったら最低500ms待つこと
が必要なようです。

◆右は、最近みかけるAP2の変形バージョン
よくみるnRF24L01モジュールそっくりですが、これはnRF24AP2です。

PINOUTとschematic


ピンク印がBaudRate設定で、全部GNDに接続すると、
以下のチャートの通り通信速度が4800bpsに設定されます。
BR3 BR2 BR1 Baud Rate
0 0 0 4800
0 1 0 19200
0 0 1 38400
0 1 1 50000
1 0 0 1200
1 1 0 2400
1 0 1 9600
1 1 1 57600


手持ちのAP2互換モジュールは、8ch対応です。
つまり、チャンネル1でANT+のPower(ワット)信号を受信し、
チャンネル2でそのパワー値を送信することが可能です。

自宅のZWIFT用ANTレシーバは感度が低く、よく通信が切れるため、
クランクのパワー計のANT信号を中継してZWIFTに転送するデバイスを作りました。


Arduino ProMini(3.3v動作品)とAP2の接続図
UARTで、
ArduinoのTxをAP2のRxへ
ArduinoのRxをAP2のTXへ

ArduinoUno(3.3v動作に改造済)でも動作


ANTのパワー値を一度受信して、受信した数値を転送してます。
転送する際にパワー値をゴニョゴニョすると、オーバーテイクボタンを作れます。
「ボタンを押すと燃料の混合比が変わってプラス50馬力出力でマンセルをオーバーテイク」することはできませんが、ボタンを押すと、受信した生データに+100wの値を増加してZWIFTに転送、ZWIFT上で絡まれたくない相手を楽に振り切る、ということはできます。
チートとみなされると、まずいことになると思いますが、早速、中継器として動作実験開始・・・

ANTのシミュレータ上では、オーバーテイクボタンを押すと、283wの出力に100wを足して383wを受信できました。

でもなぜか途中で止まったり、ANT信号の受信に失敗したり。

どうもArduino UnoやProMiniで、SoftwareSerialを使ってANTモジュールと通信すると、安定せず、途中停止するようです。
ハードserialが2chあるArduino Microの3.3v対応品を取り寄せて、再度実験予定です。
2019/8/8更新:ArduinoMicroが思うように動かないため、nRF52をArduino化して実験しました(2019/8/8付けで投稿しました)が、やはり途中停止することがあり、ANTの受信は、途中停止を検出して、リセットする必要があると思います。

ANTの受信と送信を同時に行う今回のソースコードをUPLOADしました。
また、このコードでは、ZWIFT上で、ANTシミュレータの結果と異なり、0wの表示しかしませんでした。
ZWIFTは、たまにANT信号の受信に失敗し、0w表示となる問題があります。
今回のANT信号中継器を改良して、ZWIFTの0w表示問題も解決できればと思います。


0 件のコメント:

コメントを投稿