このところ何とかの一つ覚えで、生成AI、Gemini様に「タイマで割り込みをするプログラムを書いて」とお願いしております。現在までに三機種について試行、勝手ながら結果を判定させていただくとGemini様の1勝2敗という感じ。さて今回はESP32に対してプログラムを書いてくださいとお願い。結果はどうなるのか?
※Google様の生成AI、Gemini(無料プランだけれども)を使ってソフトをコーディングしてもらっています。
プロンプトへの問いかけ
プロンプトへの問いかけはいつもの茫漠とした問いかけです。
ESP32で1ms毎にタイマで割り込みをするプログラムを書いて
上記のような茫漠とした問いかけに対し、Gemini様が
-
- ESP32でもどんな機種向けに回答してくるか
- ESP32向けの開発環境でもどれ向けのソースを作製していただけるか
という点に最初の興味があります。多分、Gemini様がお答えいただけるのは「ポピュラー」な機種で「ポピュラー」な環境であるハズ。
Gemini様からのご回答
Gemini様のご回答、いつものように3案を見比べると以下のようでした。
-
- 案1)ターゲット機種はESP32 DevKitC、開発環境はArduino
- 案2)ターゲット機種は特に規定なし、開発環境はArduino
- 案3)ターゲット機種はESP32 DevKitC、開発環境はArduino
ESP32でも最近は品種が増えているのですが、Gemini様のご回答はスタンダードな品種で、かつ一番お手頃な ESP32 DevKitCを想定しているようです。ここは想定通り。何と言っても手元にもDevKitCがあるので、実機動作確認できるというもの。案3に高らかにDevKitC対応がうたわれているのでその部分を掲げます。
なお、今回も「割り込みハンドラ」の記述が必要になる、ということでESP32のハードウエアを使いきれる
のソースが生成されるか?とも思っていたのです。しかし、生成されてたのはArduino環境向けのコードでした。でもね、
Arduino環境のESP32のボードパッケージ内にIDFのHAL相当のライブラリが含まれる
ことになっているので、骨格はArduino、コマケー話はIDFのHALというスタイルも可能なハズ。そして生成されたソースを拝見してみると実際そのような感じになっていました。
そのまま、あるいはチョイ変程度で実機上で走るんじゃね。
という感じ。しかし、老人の期待は打ち砕かれます。
ボードパッケージのライブラリが勝手に?進化していた
Gemini様のご回答は、以下のページなどみると動きそうな感じなのです。
実際、上記のページでタイマを使うために呼び出している
timer = timerBegin(0, 80, true);
というコード(に似た行)がGemini様のご回答にも登場するだけでなく、Web上の複数ページで発見できました。でも手元の環境ではこれがエラーになるのです。
手元の環境のArduino IDEのバージョンは、2.3.2です。割と新しめ。そしてそこにインストールしてあるESP32のボードパッケージは以下のものです。
3.0.0-alpha3 だと。どうもEspressif社提供のボードパッケージそのものが「進歩」しており、以前とパラメータなど異なっている、というのが真相のようです。以下にタイマ関係のAPIのドキュメントがあります。
https://github.com/espressif/arduino-esp32/blob/master/docs/en/api/timer.rst
そして手元のArduino環境のpackage内の以下のところに上記のAPI使ったソースも準備されてました。
インストールフォルダへのパス\packages\esp32\hardware\esp32\3.0.0-alpha3\libraries\ESP32\examples\Timer\RepeatTimer\RepeatTimer.ino
上のソースはTimerだけではなくてFreeRTOSなども使ってちょっとカッコつけてる?のですが、Gemini様生成のソースと上記Exampleのタイマ設定部分だけ取り出して見比べると以下のようです。
やー、昔のバージョンとの互換性なさすぎ 3.0.0-Alpha。
一応、ExampleのソースをArduino環境でビルドしたら、ESP32 DevKitCの実機上でちゃんと動きましたぞ。こんな感じ。
今回は、Gemini様はそれらしく動きそーなコードを生成できたのだけれども、ライブラリの方がそれを置き去りにして勝手に進化していたという感じ。多分Gemini様はその変化に追いつけてない。。。まあね、ライブラリの変化も互換性抜きにトートツな感じなので、引き分けか。甘いな。