年末で、プログラムは完成したと思っていたのですが、いざ、歩行実験をはじめたら、
机上で動作していた機能が動かない現象が多発したので、正月は、原因解析三昧となりました。
結果:なんと、シリアル受信方法が悪いとSPIのエラーが発生するという珍現象でした。
経緯:
11月16日にM9Nのシリアル受信方式を300Byte一括バッファにしたのが
悪かったみたいです。11月7日に完成させたプログラムでは、100Byteずつバッファにいれて3回読んでいたのを、バッファを大きくして3回分読んでから、変数に渡す方式に変更したことが悪かったみたいです。
=>変更したときは、机上で普通に動作していたのですが、いろいろプログラム負荷を重くしていくと、SD OPENエラーの頻度が増えてきました。
原因:ハードウェアシリアルは、バッファサイズを32の倍数で指定して、自動的にハードでシリアル受信させる機能ですが、1回の送信量でバッファを定義しないで、今回のように3回分をバッファに保持させるような使い方をするとTeensyDuinoの内部処理でSPIの制御とバッティングする現象が発生するのではないかと素人ながら、考えてます。ということで、普通の使い方をすれば普通に動作するものを下手にいじったもので珍現象に見舞われたという顛末でした。
※余分に輸入してストックしてあるTeensyをメルカリで販売してます。Teensy4.1 イーサネット無 5000円 (2024年8月29日~)
本記事の読者様には、500円値引きしてご購入いただけます。メルカリのコメントにブログ記事みて購入したいと言っていただければ
値引き価格4500円でお売りいたします。https://jp.mercari.com/item/m99133661345
●やったことの備忘録
現象1:頻繁にSDカードOPENエラーが発生してログできなくなる。
現象2:USBシリアルとかBlueToothSPPからのキーイン送信でプログラムを制御することが
頻繁にハングする。
解析1:SD書き込みが動作しない
1-1 SDカードの接触部を無水アルコールで拭いてみた。=>効果なし
1-2 SDカードをフォーマットしなおした=>効果なし
1-3 別のSDカードに替えてみた=>効果なし
解析2:昨年のプログラム制作時の環境と現在のシステムの違いのチェック
2-1 Base(F9P)とRover(F9H)だけでデバッグしていたが
現在は、フル装備で、M9Nと無線モジュールとしてM5Atomをシリアル接続してある
①電流の食いすぎではないか?
確かに、常時650mA程度ながれていて、計算上は、瞬間的に1A以上になる可能性がある
1)M5ATOMの電源は、最低500mAは必要と仕様書に書いてある
クリックしてesp32-pico-d4_datasheet_en.pdfにアクセス
2)M9Nは、GPSなので、常時50mA ピーク100mA流れるそうです。
クリックしてNEO-M9N-00B_DataSheet_UBX-19014285.pdfにアクセス
3)F9Pは、最大130mA常時50mAくらい食っているみたいです。
クリックしてZED-F9P-04B_DataSheet_UBX-21044850.pdfにアクセス
4)Teensy4.1は、100mAは必要らしいです。
合計で、900mAくらいは流れる可能性があるので、電源ケーブル類は1Aで余裕のある太いものが必要です。
■外部電源用にパターンカットしてなかった。現象2のように時々調子おかしくなったのはこれが原因かも
電源供給で落とし穴があって、
USBシリアルから5Vをいれて、外部デバイスに供給するのは、電流供給量が不足するので
外部電源をVinにいれて、パッドパターンをカットしないと外部電源供給ができません。]
pdf https://www.pjrc.com/teensy/card11b_rev4_web.pdf
このパターjンをカットするとUSBコネクタを刺しても、電源つながってないので、Vinピンに
5Vを外部からいれないとCPUへの書き込みができなくなりますので、外部電源線を常につないでおかないとデバッグできませんので、USBの外部電源ケーブルを作っておく必要があります。
2:上記解析をしてもなんとも原因がわからないのですが、たまたまM9Nの電源オフして、動作させたときだけ、SDエラーが皆無だったのがヒントになりました。
2:M9N受信がされてなければ、SD書き込みが正常動作する現象を追いました。
2-1:バッファのサイズ128バイトにして、100バイトずつ読むと正常だったので
3回読みにしました。
●教訓
①イレギュラーなプログラムをつくらないこと。指定された使い方を忠実に守ること。
②解析、4M変動を忠実にチェックすること