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

RTK22は、システム全体の高速化、多センサ化をはかるので、今までのESP32系のM5シリーズで苦しくなる場合が想定されます。そこでArduinoIDEで使える超高速マイコンを探してます。
SDカード付でサイズが薄くて小さいのがありました。
USBホストもためしてみました その2レポート。WiFI化も検討します。
●サイズ比較写真 上がTeensy4.1  下がM5Atom TFカードキットの基板だけのサイズ
●Teensy4.1の入手
米国がメイン市場なので、日本のサプライヤーでも米国系のロボショップ(徳島市)が安くて在庫があるので翌日配達してくれます。お値段は、3424円+送料500円で4000円以下とちょっと高めですが、SDカードの高速ログとかUSBホストを高速に使いたいとかPCの代わりにデータ処理をしたい目的に使えるので安いと思います。MIDIを制御したり高音質録音などオーディオ用途に強みを発揮してますが、計測用にも魅力的な性能があると思います。
https://www.robotshop.com/jp/ja/teensy-41-usb-microcontroller-development-board-no-pins.html
※Teensy備忘録
★Teensyいじるシリーズ
その1(導入とSD速度) その2(USBHOST初め) その3(USBHOST3ポート)
その4(USBHOST事例) その5(ハードウェアシリアル便利)

●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年6月18日追記 6か月経過して、Teensy4.1命になってきました。

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

理由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に記録するだけですので、ベンチマークで測定する方法との違いがあるかもしれません。


■本当なのか?
SPIでは、5MBPS程度が限界なので、不思議なので調べてみたのですが、
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年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%不良率がゼロ%になりました。
夏の間は、私は、ヒートシンクをつけてます。

 

※その後
初めての動作だったのですが、その後プログラム学習をして、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でハマった>

 

コメントを残す

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