energy note

色々と勉強中なので備忘録として。

ESP32でつまづいたこと

M5Stackに始まり、ESP32沼に落ちてしまいそうな感じになってきました。
サイズ、機能、値段、良すぎる。数百円で、しかも開発ボードも2000円しないという・・・
実験で使うロガー兼制御器みたいのをESP32で作っていまして、その過程でつまづいて参考になったサイト等をまとめたいと思います。
低レベルかもしれませんが、もしかしたら同じようになっている人がいるかもしれないのでまとめてみました

<作っていたもの>
ある入力値に対して処理をし、その処理値に応じていくつかの値を返す。
その入力値や処理値、回路の部分的な電圧電流などを定期的に測定し、まとめてSDカードに記録する。

1.void loop() { } の中にLCD(I2C)の表示させる部分書いてたらマルチタスクで定期処理を実行してた別タスクの記録時間が狂う
マルチタスクで500ms毎に入力値や電圧電流値を読んで、LCDに表示しつつデータが溜まったらSDカードに保存する、という処理を入れてたらどうもたまに500msじゃないタイミングで計測している部分があり、原因を色々探りましたが結果わかりませんでした・・・
I2CのLCD表示器を使っていたので、I2C通信タイプのセンサー類とタイミングが重なってしまって計測部が排除されたのではと考えてはいます。
それに計測のタイミングと表示するタイミングは違うので、一緒のタイミングで処理することができませんでした。
そこで妥協してLCDの表示タイミングをいじって、LCDに表示するコードをセンサーの計測と同じループ内に持っていって解決はできました。
モヤモヤしますが勉強が必要だと感じました。
(測定間隔の500msは設定で変更できるようにしたので、表示部はvoid loop() に入れてしました)


2.割り込みで計算やI2Cが使えない
勉強不足でした。割り込みで飛ぶ関数の中にI2Cやその測定してきた値を計算するコードなどを入れていたらパニックになったとのエラーで再起動。
ググりにググってこちらのサイトを参考にさせていただきました。
lang-ship.com
割り込み処理では複雑な処理ができないとのことで、フラグを立てたりして別でその処理をしなければならないと。
割り込み処理で呼び出すタスクも2個(測定用・数値処理用)並べて対応しました・・・

    xTaskCreateUniversal(task1,"task1",8192,NULL,3,&taskHandle,APP_CPU_NUM);
    xTaskCreateUniversal(task2,"task2",8192,NULL,3,&taskHandle2,PRO_CPU_NUM);

変数への代入や簡単?な関数の呼び出しなら割り込みの関数内で動きました。


3.I2Cが使えない(マルチタスク
時がありました。色々追っかけていると、
www.mgo-tec.com
core 1 でないと動かせないようですね。


たなかまさゆき様、mgo-tec様、参考にさせていただきました。感謝申し上げます。
非常に助かりました・・・ありがとうございます・・・

自己啓発か何かで「ドリルを買う人が欲しいのは穴」的なやつ、電子工作勢にはドリルが欲しかったり、はたまたドリルを分解したり作りたかったりする方もいらっしゃると思いますが、自分もESP32でそちらに行ってしまいそうです。
しかし。現状、欲しいのが「穴」の方なので、ドリルの構造やモーターの細部まで勉強しているわけではなく・・・
早くドリルの機能を余すことなく使う、ドリルをカスタマイズできる、くらいまでになりたいものです。