ラベル サイクルコンピュータ の投稿を表示しています。 すべての投稿を表示
ラベル サイクルコンピュータ の投稿を表示しています。 すべての投稿を表示

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表示問題も解決できればと思います。


2018年9月15日土曜日

続・ANT+サイコンの製作

ANT+対応サイコンをDynastream社のD52無線マイコンを用いて組み立ててみました。

↓標準版のD52モジュール
 https://www.digikey.jp/product-detail/ja/dynastream-innovations-inc/D52QD2M4IA-TRAY/1094-1023-ND/6149451
 ↓加速度センサ内蔵バージョンです。
 https://www.digikey.jp/product-detail/ja/dynastream-innovations-inc/D52QD2M4IA-A-TRAY/1094-1024-ND/6149452


前回(2017年5月公開)は、ANTモジュールにBC-ANT-シリアルを利用しましたが、私のような素人には扱いが難しく、不安定になったり動作不能になったりと悩みました。

シリアル通信でコマンドを発行することによりANT+の信号を受信することができるモジュールは、以下の候補があります。
これらはNordic社の難解なSDK環境を構築することなく、シリアルコマンドでANT通信を実現できるので、私のような素人には、お手軽で、開発時間を短縮できるメリットがあります。
- BC-ANT-シリアル
- nRF24AP2
- D52(nRF528ベース)
今回は、D52を選択しました。
上の写真では、D52で受信したANT信号(パワー値283w)を秋月のArduinoUnoに送信、Nokia5110という200円液晶に表示しています。



便宜上、上記のような2システム構成です。
赤枠のシステムは、D52でANT+信号を受信し、ArduinoProMini8Mhz(3.3v動作)でテキストに変換してシリアル送信します。
オレンジ枠のシステムは、上記ArduinoProMiniからテキストを受信し、Nokia5110液晶に表示します。

D52とArduinoProMiniの接続図
電源Vcc, GNDとTx、Rxを接続するだけです。

D52のPINOUT

ArduinoUnoは5v動作のため、D52のような最大電圧3.7v程度のモジュールを接続するにはいちいち電圧を落とす必要があり面倒です。

私は5vが必要なデバイスをほとんともっていないので、秋月の基板のパターンを以下のようにカットして、5vラインを切断、代わりに3.3vを供給し、システム全体を3.3v動作に改造しています。3.3vで16Mhz動作となるので、オーバークロックとなりますが、短時間であれば、動作します。安定性が必要な場合は、クロックダウンが必要です。






今回のD52でANT受信を行うArduinoソースコード、および
Nokia5110で値を表示するArduinoソースコード(別途Nokia5110用ライブラリが必要)を以下のサイトに置きました(本日の日付をファイル名としています)。

(実際にアクセスする場合、末尾の000を削除して1138で終わるようURLを修正する必要があります。ロボット除けのためで、お手数をお掛けします)

ttps://sites.google.com/site/myfiles1138000

なお、ANT通信を行うには、NETWORK KEYを入手してソースコードに書き込む必要があります。
このあたりは信州Makers管理人様が詳しく公開されております。
いつもありがとうございます。
http://maru-yo.net/shinshu_makers/2017/08/15/%E3%80%90%E3%83%91%E3%83%AF%E3%83%BC%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%80%91antatmega328p%EF%BC%88%E5%86%85%E8%94%B58mhz%E6%8E%A5%E7%B6%9A%EF%BC%9C5v-3-3v%E3%82%82%EF%BD%8F%EF%BD%8B%EF%BC%9E/






























2017年9月3日日曜日

スマホ、サイコン化計画

サイクルコンピュータには、GARMINを利用してきましたが、どうも文字が小さく「老眼の人は使わないで結構です」といわんばかりです。

そこで、Smartphoneをサイクルコンピュータ化してみました。
技術的には、ANT心拍/パワー/速度等の各センサーの情報をスマートフォンにWiFiで転送するデバイスを製作してみました、というものです。

現状品
















スマートフォンのブラウザで各センサーのデータを表示します。
スマホなので、画面の拡大、縮小やスクロールが楽です。
ピンチ操作で拡大してみました。




サイクルコンピュータは、ボタンを押しにくいものが多く、よく不便に感じてましたが、だいぶ改善できたと思います。

また、夏は、信号ストップでサイコンを見て「今、気温43度!熱すぎるー」と空騒ぎするのが自転車の楽しみですが、GARMINは温度表示がかなりいい加減です。

感覚的に誤差が±4度くらいあり、誤差範囲がANTチップ内蔵の温度センサーと重なることから、ANT受信チップ内蔵の温度計をそのまま使ってると推測します。

もう少し温度の精度がほしいです。
丁度、BME280というチップが、温度、湿度、気圧を計測でき、温度誤差は±1度なので、これを採用しました。

今回のハードウェア構成です。
-D52(Dynastream製ANTモジュール)- これでANTセンサーの無線情報を受信します。
-BME280              - これで温度、湿度、気圧を計測します

-Arduino Pro Mini          - 上記2つのモジュールからデータを受信し、文字列として、ESP-WROOMに転送します。

-ESP-WROOM            - WEBサーバとして機能し、各センサーの情報が反映されたWEBサイトをブラウザに送信します。

クライアントは、スマートフォンに限らず、WEBサイトを表示できるデバイスならば、PCでもタブレットでも、腕時計でもOKです。
専用のAppを入れる必要もなく、WiFiのアクセスポイントをESP-WROOMに変更し、ブラウザで、192.168.10.1にアクセスすれば、ブラウザで画面表示され、1秒置きにページが更新される仕組みです。

配線図




ソフトウェアは、Arduino ProMiniはもちろん、ESP-WROOMもArduinoとしてプログラムを書き込んでいます(ESP-WROOMをArduino IDEで書き込む方法はGoogle検索でたくさんでてきます)。

BME280へのアクセスは、GIT HUBのSWITCH SCIENSE製のソースコードをそのまま利用させていただきました。

つづく




2017年5月4日木曜日

ANT+対応サイコンの自作(ソフトウェア編)

昔、ANT+対応のサイクル・コンピュータを自作してました。

パワー、心拍、速度とケイデンスをANTセンサーから受信して表示できました。

本人的に一番の売りは、速度とケイデンスから、何枚目のギアを使ってるか算出して表示できたことでした。
10年くらい前のカンパのサイコンも同様なギア表示をしていたことがヒントでした。

こんな感じで1.8インチTFTにカラー&グラフィカル表示。

しかしこのTFT液晶は太陽光の下では視認性が悪く、
「がんばれ、もっと明るくなーれ、明るくなーれ」
と駆動電圧を上げていったところ、壊れました(汗)。
結果、上の写真のように薄暗くしか映りません。

その後、Stravaにはまってしまい、Garmin以外使わなくなっていました。

最近、お手軽パワーメータには、お手軽サイコンが欲しいな、
という妄想が湧いてきました。

以下は、キャットアイの不朽の名作(と私が勝手に思ってる)RD200。

このサイコンは有線式で、ケイデンス用の線を100回/分のペースでOn・Offすると画面に100と表示され、同様に200回/分ペースなら200と表示される。

ANTの信号を受信して、その数値に合わせて速度/ケイデンス用の線をOn/Offすれば、パワーに限らず、様々な数値を表示できる。
メリットはボタン電池で数年動作すること。
Garminは頻繁に充電が必要で、普段乗りには面倒です。

とりあえず、昔作った、Arduino Uno+nRF24(BC-ANT-Serial)用のANT対応サイコン・ソースコードを動作させてみました。
ArduinoUnoは通常5v動作ですが3.3v動作に改造しており、nRF24と接続するのにレベル・シフタは不要です。

配線は、
Arduinoの2番ピンを入力PINとして、nRF24のTXピンに接続、
Arduinoの3番ピンを出力PINとして、nRF24のRXピンに接続
nRF24の裏面のBR2をショートして、通信速度を9600bpsに設定。




PCのシリアルモニタで見ると、以下のように正常に各ANTセンサーからの情報を受信し、PCへシリアル送信しています。


「パワーが700wで心拍が70は正常でないだろ」
と思われてしまいそうですが、これはANTシミュレータ
を使っています。

このシミュレータを使うと、パワーメータ等のセンサーの出力をシミュレートして電波を送信したり、市販のANT対応センサーの電波を受信して、ログをとったりできます。
(ZWIFTで使うようなUSBのANTドングルが必要です。)

こちらのANTのサイトでフリーで入手しましたが、最新版は、あれこれ変更されてるかもしれません。
ttps://www.thisisant.com/

今回のArduino+nRF24用のANT受信サンプルのソースコードを以下のサイトに置きました(本日の日付をファイル名としています)。
(実際にアクセスする場合、末尾の000を削除して1138で終わるようURLを修正する必要があります。ロボット除けのためで、お手数をお掛けします)
ttps://sites.google.com/site/myfiles1138000

あと、このサンプルのソースコードを動作させるには、
#define NETWORKKEY {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55}
となっている箇所を正しいNETWORKKEYに置き換える必要があります。

www.thisisant.comからANTの仕様とNETWORKKEYを入手する際、NETWORKKEYを公開しないことを約束している(させられている)ためです。
無視して、公開してる方もいるようですが・・・