【RTK22】超高速マイコンCortex-M7搭載Teensy4.1いじる その1<SDcardWrite5MB/sec以上でる>

RTK22は、システム全体の高速化、多センサ化をはかるので、今までのESP32系のM5シリーズで苦しくなる場合が想定されます。そこでArduinoIDEで使える超高速マイコンを探してます。
SDカード付でサイズが薄くて小さいのがありました。
Raspiを使わない理由ーマイコン(Arm cortex-M7)とPC(C#,Python)で処理してますー
 信州MAKERSでは組み込み系IOT開発をしてます。
 小型化と省電力とセンサ計測精度が必要ですが、raspiの場合 OSで管理されているので、数μsecのタイミングを
 制御できませんので、ADCは、外部基板に任せないとできないので、サイズとシステムが大きくなってしまいます。
  信州MAKERSのシステムは多種類のセンサ入力がバラバラのタイミングで入ってきますので、数μsecの遅延タイミングでデータが
 落ちてしまうエラーがよくあります、マイコンでさえ厳しい用途なので、OSで遅延が発生するRaspiでは、信州MAKERSの 
  システムは、実現できないからです。マイコンからセンシングしたデータは、UDPとかUSBで数十MBPSでPCへ直接
  送信して、C#とPythonで大規模高速処理できますので、raspiの機能は中途半端だとみてます。
   raspiをご検討の方は、raspiを学習する時間があったら、PCでC#とPythonを学習したほうが、将来にわたって、お得だと思います。
WEBでraspiユーザーの記事をみると、コト作りができてない感じがします。するコトが決まってそれを実現するには、何がベストで、だからraspiを
使うという必然性が見えないプロジェクトが多いです、pythonが好きだからpythonでIOTやりたいとか、raspiしか知らないからraspiをやっているとか
コト作り観点で、デバイスを選ぶという基本的な活動無しで、やっていても、将来的にテクノロジーとデバイスの変化に置き去りにされるリスクがあります。
おいてかれないためには、PCベースのプログラミングで、将来のAI化を見ながら開発をしていくことが重要なので、時間をかけるのはPCでのプログラミングで
raspiの使い方、マイコンの使い方は、できるだけ時間をかけないほうが効率がよいと思います。

※2024年7月 Teensy4.1の高速SDと高速USBを活用して、SDカードファイルのUSB経由アップロードシステム
SDがSDIOなの最大20Mbps、PCとのUSB接続ではUSB2.0通信なので条件で、数十Mbpsから480Mbpsまででます。
36MByteのバイナリファイルたった17秒でPCへ取り込めます。実効17Mbpsの高速アプロードできます。マイコンでここまで出来る機種無いと思います。Teensy4.1を使うことで、マイコン開発の効率が劇的に向上します。作り方記事は、こちら C#コンソールとTeensyPgmです。【STA24】SDカードからログファイル超高速アップロードその1<シングルTaskで簡単>

※2024年1月使い初めて2年経過で、大活躍してます。Teensy4.1のおかげで幸せになれました。
Teensy4.1スキー計測システムで大活躍してくれてます。多センサでサンプリング周期がバラバラな計測では、
ESP32系を使っていたらスキー計測ログが信頼性高く、精度良くできなかったです。
しかもSDIO対応でSPIの倍速いです。Teensy4.1ではデフォルトのSDライブラリで、SDIOを使いますので20Mbpsくらいはでます。設計者のPaulStoffregenのコメントをご覧ください。SD.begin(BUILTIN_SDCARD)と宣言するだけで超高速SDカード読み書きが実現できます。
https://forum.pjrc.com/index.php?threads/teensy-4-1-sd-card-cs-pin.74142/#post-335849

USBホストもためしてみました その2レポート。WiFI化も検討します。
●サイズ比較写真 上がTeensy4.1  下がM5Atom TFカードキットの基板だけのサイズ
●Teensy4.1の入手
米国がメイン市場なので、日本のサプライヤーでも米国系のロボショップ(徳島市)が安くて在庫があるので翌日配達してくれます。お値段は、3424円+送料500円で4000円以下(2021年冬)とちょっと高めですが、SDカードの高速ログとかUSBホストを高速に使いたいとかPCの代わりにデータ処理をしたい目的に使えるので安いと思います。MIDIを制御したり高音質録音などオーディオ用途に強みを発揮してますが、計測用にも魅力的な性能があると思います。

https://www.robotshop.com/jp/ja/teensy-41-usb-microcontroller-development-board-no-pins.html

 

※Teensy備忘録 categoryu teeensy
2023/1/29
【Teens4.1】外部電源とUSB給電の切り替えジャンパピン付けた<以外と忘れる>

★Teensyいじるシリーズ
その1(導入とSD速度) その2(USBHOST初め) その3(USBHOST3ポート)
その4(USBHOST事例) その5(ハードウェアシリアル便利)
その6 
Teensy4.1多数シリアルからのSDログTIPS<OPEN/CLOSEで泣く>

その7ハードウェアシリアルバッファ設定と受信方法違いでSD OPENエラーではまった件

その8 【STA22】Teensy4.1SDカードOPENエラー<HardwareSerialバッファが原因だった>

★Teensy4.1のinternal sdカードが超速いのは、SPIしているからです。
sd.begin(INTERNAL_SD)と定義すればSDIOになるので、データラインが4本

 

●ARMのフラグシップ
Cortex-M7CPUを採用しているDIY専用マイコンTeensy4.1
日本では、あまり普及してませんが、欧米では、高機能マイコンの代表的な存在です。
スマホのCPUで有名なARMのフラグシップCPUなので、めちゃ速かったです。
本家ARMのCortex-M7のページ https://www.arm.com/ja/products/silicon-ip-cpu/cortex-m/cortex-m7

Teensy4.1の正規ページ https://www.pjrc.com/store/teensy40.html
■ベンチマーク速いです
ベンチマークESP32(240MHz)が351なのにTeensy4.0(600MHz)は、2314と何と6.5倍速いです。
この速度についての記事感謝 https://ehbtj.com/electronics/try-using-teensy-40/

詳しいレポ記事書いてる方感謝 https://a-tomi.hatenablog.com/entry/2021/03/19/225327

■ESP32が240MHzで600DMIPSとされているが、cortex-M7は、600MHzで1284MIPSなので倍あるので
このグラフ値はESP32がシングルコアしか使ってない場合ではないかと思います。
ESP32は、2コアなのでマルチタスクのプログラムなら処理速度があがりますが、ESP32の
マルチタスクプログラム難しくて一般ユーザーはなかなか手がでませんので、シングルコアで使う場合
が一般ユーザーのESP32の処理速度と見たほうがいいと思います。
※Teensyでは、リアルタイムOSは搭載してませんが、ハードウェアシリアルが8個もあるので、シリアル受信はリアルタイムマルチタスクになってます。しかも、CPUとは独立して動くので、リアルタイムOSより速くて、簡単プログラムなので、私のような素人プログラマがプロが苦労して作ったマルチタスクを上回るパフォーマンスを出すことができるのではと考えてます。

●Teensy4.1のArduinoIDEへの登録
専用アプリTeensyduinoでワンタッチでArduinoIDEでTeensyシリーズが使えるようになります。
M5Stackより簡単で、サンプルプログラムが何倍もあってESp32より技術レベルが高い感じがします。
Teensyduinoのダウンロードと解説ページ https://www.pjrc.com/teensy/td_download.html
あとは、ArdiuinoIDEの設定を下記のように設定してコンパイル書き込みします。
Cの文法は、Arduinoそのものでいいです。Teensyのライブラリが面倒みてくれてます。

 

 

サンプルプログラムがめちゃくちゃあります。ファイルースケッチ例で一番下までいくと数百個サンプルありました。

※2022年11月8日追記 10か月間悪戦苦闘して悟ったTIPSを備忘録しました。
OPENCLOSEは、飛行機の離着陸と同じで慎重を期さないといけないことが身に沁みました。

【RTK22】Teensy4.1シリアル受信データのSDログPgmのTIPS<OPEN/CLOSEの扱い重要>

※2022年6月18日追記 6か月経過して、Teensy4.1命になってきました。

Teensy4.1使い初めて半年経過して、速さと高機能IOとArduinoライブラリー、サンプルPgmの多さで、
もうESP32,M5Stack系を触りたくなくなりました。欧米のマイコンマニアのレベルの高さが判ります。
★Teensyいじるシリーズ
その1(導入とSD速度) その2(USBHOST初め) その3(USBHOST3ポート)
その4(USBHOST事例) その5(ハードウェアシリアル便利)

その6 シリアルデータをSDログする場合のTIPS

その7 ハードウェアシリアルのバッファ設定と受信方法でハマった備忘録

理由1:コンパイル速度が桁違いに速い(M5系は数分かかるが、teensy4.1は、数十秒以内)
理由2:多センサ、ばらばらな周期データを複数ファイルでSD記録が高速で可能
理由3:USB HOSTが使えるので、USB出力の複数デバイスのデータを受信ログできる。
理由4:ハードウェアシリアルが超便利です。CPUとは独立に動作しているので、バッファサイズを大きめに32の倍数に設定しておけば、所望量までため込んでくれるので、その間他の仕事ができるので、ハードウェアシリアルを使うことでリアルタイム処理プログラムが作り易くなります。しかもハードウエアシリアルが8ポートもあるので鬼に金棒です。
(バッファサイズは指定しなければ64バイトですが、1周期で受信するサイズが多い場合は大き目に指定したほうが読み込み処理が一瞬で済むようになります、遅いデバイスを複数接続する場合など非常に便利です)
※私の場合、RTK GPSチップを2-3個接続で1周期でそれぞれ数百から1Kバイトくらいのデータを受信して変換処理して複数FILEをSD記録して、モニターに無線送信しなければいけないので、衛星電波の受信状態で出力タイミングがばらつくGPSチップのお相手をハードウェアシリアルにお任せして他の仕事ができるので、超便利です、Teensyのハードウェアシリアルがなければ、システムが作れなかったです。昨年まで使っていたESP32,M5Stack系では逆立ちしてもできないシステムです。

◎2022年4月20日メモ 「コンパイル時間滅茶短いです。」
Teensy初めて4か月経過してRTKロガー制作中ですが、ログシステムでTeensy以外にM5Core2とM5Atomliteも使ってますが、同じArduinoIDE対応のCPUですが、コンパイル時間が桁違いです。内容にもよりますが、M5シリーズは数分待たないとコンパイル完了しませんが、Teensy の場合30秒以内、速ければ数秒でコンパイル完了します。
試行錯誤のプログラム開発をしているのでコンパイル時間の差は、開発時間短縮に凄く効いてきます。クロックの差だけでは説明できないくらい大差があります。欧米系のライブラリー設計が中国系より優秀な感じがします。

 

※2022/5/25追記  「夏場高温 環境で重いプログラム走らせると熱暴走します。」
USB HOST 2ポートでF9P基板2枚とESP8266をドライブM5StickCをWiFiモジュールとしてドライブLSM9DS1をI2Cでドライブ、それらのデータをSDに高速ログさせる重いプログラムをデバッグ中に急にCPUのRESETが頻繁にかかるようになりました。扇風機で風をあてると数十分回しても暴走しなくなりました。Teensy Forumでも話題になっていて60℃超えると暴走するようです。600MHzでΔTが23℃あるので37℃以上のCPU環境だと暴走するみたいです。私の場合スキー用のデータログシステムで使うので、本番では問題ありませんが、夏場屋外での直射日光下の実験ではヒートシンクをつけたほうがよさそうです。USBHOSに2Aくらい流しているのがリスキーなので、UARTに変更する手も検討してみます。
https://forum.pjrc.com/threads/69048-Teensy-crashes-at-arround-60%C2%B0C?highlight=heat+sink

※teensy4.1購入後3か月経過してMTP機能が超便利なことを発見しました。
Teensy4のUSB高速処理能力を生かして、スマホでよく使われているMediaTranslatePtotocolを切り替えながら
使う方法を発見しました。これで、SDカードを抜いて、リーダーにさして、PCに挿してマウントする手間が省けて、データ処理の生産性が向上しました。普段のデバッグ作業でも使えるので、超便利です。
teensyForumには、お宝情報が満載です。

 

【Teensy4.1】MTPモードでSDカード抜かずにWin10へマウント<TyToolでPgm切替便利>

●SDカード書き込み速度実験
上記スケッチ例のSDを探して、dataloggingというサンプルコードがあったのでそれを改造して、SD書き込み速度測定しました。
コードは、GISTにアップしてあります。ご自分でログしたいデータ数をnum=40とかに
変更してコンパイルして走らせると数秒で1000行ログして終わります。そしたら、SDカードにdata_log.txtファイルができるので、開くとデータの末尾にmillis()が記録されているので、保存時刻がわかります。
https://gist.github.com/dj1711572002/1a56926e58ec3caa8f7c03672cd50ffa

Terapadでdata_logファイルの中身をチェック。

■速度測定結果
今までのArudinoCPUでは体験したことが無い超高速です。メガバイト/秒の世界です。
①1行の記録時間
 1行24バイトデータで4μsec, 1行3.9kByteデータで205μsec

サンプリング周波数なら、
 1行24バイトデータで25kKHz、1行3.9kByteデータで4.8kHzでます。
※異常に速いので、不思議なのですが、データと計算結果を検証してもおかしくないので、
このままにしておきます。この測定は、OPEN,CLOSEは、最初と最後しかしてなくてLOOPを回っている
時間をSDに記録するだけですので、ベンチマークで測定する方法との違いがあるかもしれません。


■本当なのか?=>実はSDIOの速度を図っていたようです。
SPIでは、5MBPS程度が限界なので、不思議なので調べてみたのですが、
★デフォルトで内蔵SDカードスロットを使う場合は、SPIでなくSDIOを使うので、SPIの倍以上速いです。
TeensyユーザフォーラムでSD速度調べた人の事例さがしたらありました。
SDIOを使ったexFATなら20MBPS程度でるみたいですので、私は、旧ライブラリーSD.hを使ってSPIを
使っているので、18MBPSは出すぎる計算になります。
 https://forum.pjrc.com/threads/62158-SD-card-interface-Teensy-4-1-vs-Teensy-4-0-Audio-adapter

私の測定値とほぼ同程度の結果がでているので、Teensy4,1は、超高速SD書き込みができることは間違いないです。

※2022年10月27日追記  「SDFat SPIモードとUSBHostt36 ライブラリー相性悪い」
しばらくぶりにSDカード書き込みしようとしたら、6か月前のプログラムでSD OPENができなくなってしまいました。USB HOSTライブラリーと同時に動作する場合SDFATが動作しない現象です。SDライブラリーでも、発生して、SDFatライブラリで一時動作していたのですが、TeensyduinoのバージョンとSDFatライブラリーのバージョンアップがあったせいか、動作しなくなりました。
6か月もいじらないと、あちこちでバージョンアップがはいっていてどれが原因かわからなくなります。いかんせん、SSDを交換して、
6か月前の環境を消してしまったので、当時の完全動作環境にもどれないので、sdFATとUSBHOSTt36の組み合わせは動作不可状態です。
現象としては、OPENが通ってないので、基本的にSPIのCSがUSBHOSTとぶつかっているイメージがあります。
※SDFatライブラリの作者 greiman氏の解説HPがあったので、学習しながら、原因をさぐります。

USBbhttps://www.if.ufrj.br/~pef/producao_academica/artigos/audiotermometro/audiotermometro-I/bibliotecas/SdFat/Doc/html/index.html

■対策としてSDIOに乗り換える=>間違ってました。、元々TeensyのらSDFATライブラリーでInternalSDを指定するとSDIOになってました
SDカードをSPIで使うのは、遅いし、SD規格上は、簡易的な使い方なので、製品並みの信頼性は

ないので、本来ならSDIOをつかうべきなので、この際、思い切って、SDIOにチェンジしてしまおうかと検討します。書き込み線がSPIが1本ですが、SDIOは2本と4本使えるので、2倍、4倍速度になるので、音声録音などができるようになります。現在は、GNSS系のデータなので、SPIでも間に合ってますが、SD書き込み処理を超高速にできる点で
他の機能を増やせるメリットもあるので、検討してみます。
とりあえずは、SDIOのデモプログラムを学習します。
https://github.com/greiman/SdFat/blob/master/examples/TeensySdioDemo/TeensySdioDemo.ino

※2022年6月10日 追記  4か月ほど、各種SD  Teensy4.1でコーディングでのTIPS
EPS32などの従来のArduino系のCPUでは、問題ないコードでも、超高速のTeensyだと問題になる事例があります。
「シリアルとか、I2C、SPIなどIFを同時に使用しているときに特に、注意が必要です。バックで、タスクが動いている場合注意です」

1:SDカード書き込みでは,Openした後、書き込みコードをいれるのですが、
myFile=sd.open(myPath,FILE_WRITE);
if(myFile){  //if(myFIle)とmyFile.writeは、密着させたコードにすること
myFile.write(data)//<密着させなくてもそこそこは動作しますが、エラー率が増えます。1%程度不良率がでたことがある
       }
2:重要な変数は、グローバルでstatic宣言にしておくこと
SD,シリアル等ライブラリーを使っている場合、変数が化けることがあります。最上部でstatic宣言したほうがいいです。

3: 夏の暑い部屋だと、SDの不良率が上がります。扇風機をあてると1%不良率がゼロ%になりました。
夏の間は、私は、ヒートシンクをつけてます。

※2022年7月追記  「SDFat不思議な現象に遭遇」多分teensyduinoのバグ
SDFatで2種類のファイルを違った周期で、書き込むプログラムを作って、初期動作から、バージョンアップを
10回ほど繰り返して、機能を増やしていったのですが、突然あるバージョン以降SDがOPENエラーに見舞われるというバグが発生しました。正常なバージョンとの違いをいろいろ試してみたのですが、そっくりコピーしてもまだ、SD OPENエラーがでてギブアップ状態になりました。思い立って、
ダメなバージョンのコードをコピーして
新規プログラムとしてペーストしてコンパイルすると何と、正常にSD OPENしてログができました。
何度も、切った貼ったしてバージョンアップしていくと、コンパイラの設定にゴミがたまっていてゴミが引き継がれて、おかしくなったと想像してます。teensyduinoのコンパイル速度異常に速いので、何かコンパイル条件を引き継ぎながら省略している部分が悪さをしてしまったのではないかと推理してます。これからは、バージョンアップで動かなくなったら、ソースをコピーして新規のプログラムとしてコンパイルしなおすことにします。

※その後
初めての動作だったのですが、その後プログラム学習をして、SD.hライブラリーでは、全然ダメ判りました。
SD.hだと、USBHOSTライブラリと同時使用すると異常動作が発生して、オープンできなくなったりします10年前の古いライブラリーなので、Teensyユーザーは、sdFAT.hライブラリを使うようです。
SPIだけでなく、SDIOを使ってオーディオの録音に使っているみたいです。
sdFATライブラリは、GITのここにあります。
https://github.com/greiman/SdFat
これをダウンロードして、解凍して、Arduino-librariesフォルダーに投げ込んで、
更に、Arduinoのライブラリー登録をしてください。
サンプルプログラムが膨大にあるので、参考になります。

【RTK22】Teensy4.1でMovingBase受信Pgm作ったrev.042<SDでハマった>

【STA22】Teensy4.1SDカードOPENエラー<HardwareSerialバッファが原因だった>

コメントを残す

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