【正月実験】SPI->UDP無線送信速度実験<SPI+UDPで1.4Mbpsまで落ちた>

2024年のスキー計測システムSTA24は、完全防水ケースに全システムを封入してしまうため、
ログデータのあるSDカードを取り出すのに30分かかってしまうので、高速無線転送が必須となりました。
正月で学んだこと1:UDPは、簡単なことが分った。敷居が低くなったので、これからいろいろ使います。
正月で学んだこと2:速度がMbpsの世界だとデータがいつ何時化けるかもしれないので、チェックサムで
しっかりと管理しないといけない
正月で学んだこと3:ESP32は、UDPとSPIを同時使用すると処理速度を1/3に落とさないとデータが転送できない。
=>もっと、信頼性の高いWiFiチップを使いたい。

●何故、マイコンをTeensyとESP32の2個CPUを使うのかの理由は絶対でない
今までのシステムがこうなっていたからですが、ESP32単体で、GPSとIMUのデータのSDログと無線送信ができないだろうと踏んでいるからです。
しかし、やってなんぼ主義なので、ダメならダメだしをしてみることは重要だと思いまGPSとIMUをESP32 シリアル1,2につないでUDPしてみます。
2024年1月8日追記 ESP32でセンサデータをUDP送信する近距離の実験してみました。パケットサイズとばらつきで1~3Mbps程度はでます。
【STA24】ESP32ベースでBNO085とRTKF9PデータUDP無線ログ<シンプルにした>
5mも離れるとパケット落ちが増えるので、私の使い方は1m以内の通信です。

※ESP32でない選択もUARTで2MBPSまででるWIFIチップがあります。
   WizFi360というチップです。https://www.wiznet.io/product-item/wizfi360/
    国内ROBOSHOPさんの在庫が切れてきて、1月末入荷なので今回はESP32を使います。
https://jp.robotshop.com/products/seeedstudio-grove-uart-wizfi360-wifi-module

 

●正月ここ3年タブーだったUDPに手を染めてみる(失敗しても正月の手習いで良し)
①ログデータ

Teensy4.1がGNSS RTKボード2枚からのcm級位置情報とGPS信号類の信頼性データと
9軸FUSION IMU BNO085からの姿勢データと加速データ各種をログしてます。
120msec周期で512Byteにおさめる程度の容量があります。

②UDPのMbps単位の速度で上記データを転送するには、Teensy-ESP32間をSPIで通信しないとならない。
マイコン間SPI通信を年末3日かけて配線、プログラム調整しました結果3-4Mbpsの速度を得ました。

【STA24】SPIマイコン間通信その1<4.6Mbpsまで出たがばらつく>

 

③SPI受信プログラムにUDP送信をいれると途端に遅くしないといけないです。
ESP32のSPi受信はDMAを使ったライブラリーなのですが、プログラムのちょっとした速度変化で
エラー率がころころ変わります。ESP32の本来の処理速度に余裕がないのに、仕事をつっこみすぎるから
だと思います。本来なら、ESP32だけですべての複数センサとSDカードログとUDP送信を処理したいのですがSPIとUDPを同居させただけで、処理速度を1/3に落とさないといけないということは、ESP32は、本来一つの仕事しかできる能力がないということだと理解してます。
もう少しコスト高くなってもいいからArm  cortex7レベルでWifi付きのCPU欲しいです。
もっと、手頃な専用無線モジュールとしてこちらのほうも試したかったのですが在庫切れでした
チェックサムエラーがでてしまうので、泣く泣く1.5Mbpsまで遅くしました。下記は測定ログです。MasterのTeensyのログです。

ちなみに、SPIだけのマイコン間通信なら6MHzクロックで4.55Mbps実効速度でてました。

MASTER errn 1  size 512 dly 150 ts 9378 Speed 568889 byte/sec 4.55111 Mbps

 

④UDPをPCで受信する
 マイコン間UDP通信の場合は、WiFIルーターでなくお相手のマイコンのIP指定でUDP通信できるのですが
実は、マイコンが収集したログデータを手中に収めるには、PCにとりこまないといけません。マイコンのSDカードにおさめて、抜き差ししてPCで読み込む手間が大変ですので、結局UDPは、PCで受信したほうが
能率が良いです。今回は、VisualStudioC#のサンプルプログラムをちょい変更して受信しました。
UDP C#サンプルプログラム感謝:https://dobon.net/vb/dotnet/internet/udpclient.html
=>IP設定:ご自分のWifiルーターにESP32とPCを接続させます。PCのIPをcmdプロンプトのipconfigで探しておきます。PCのIP番号をESP32のUDPプログラムに送信先IP書き込んでおけばUDPはつながります。
SPI MASTERのTeensyPgm: https://gist.github.com/dj1711572002/b6f701010c29508bba063236b7ceac97
SPI SLAVEのESP32Pgm: https://gist.github.com/dj1711572002/7417f9b0b89a8430d050641cdead46d7
UDP受信 C#Form Pgm: https://gist.github.com/dj1711572002/7ad1588f44521920fe436f978c96f36c
=>C#が判る方用ですので、C#知らない方は、UDPのモニタアプリでデータがきてるか見られます。末尾解説

結果:PC受信したUDPデータの実効速度は、 1.42Mbpsとなりました。SPIより10%ほど低下しました。

⑤4Mbps欲しいのに、遅すぎる
何故3Mbps欲しいのかというと
=>SDカードにスキー滑走1本15分のデータログファイルが30MBくらいになる
=>30MBのファイルを1分程度で無線アップロードさせたいから30*8/60=4Mbps
●以後
1月4日まで少し粘って速度アップできないかやってみます。WIZ360も試すことはしたいです。
HTTPでサーバーアップロードも試してみたいです。

●今回の実験のやり方備忘録
A:家のWiFiルーターは使わないほうがよい。ポケットWiFiでUDP実験したほうが、リスク少ない
=>生活インフラの家のWiFiルーターを訳に分からないUDP実験につかってIP設定など変更するのは危険です。
格安SIMのWiFIルーターが良いです。私はRAKUTENから無料でもらったルーターつかってます。

B:C#のプログラムが面倒だったので、UDPのモニタさがしたら有名なWiresharkでできることがわかった
こちらのブログでUDPのモニタのしかた教えていただきました感謝です。
https://blog.mmaakkyyii.com/posts/post12/?utm_source=pocket_saves
WireSherk使用例:ESP32 192.168.0.113からPC 192.168.0.9へ転送しているかモニタしたら
554バイト送られていた。512バイトが実データですが、UDPヘッダなどついているんだと思います。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です