生成AI、Gemini様に「タイマで割り込みをするプログラムを書いて」とお願いしてます。前回のSAMD21マイコンでのトライアルを「負け」判定とすると、ここまで2勝3敗2分けです。ちょっと星を戻したいところです。今回お願いしてみるのはM5Stack。人気機種に「強い」Gemini様なので期待できます。でもライブラリが。
※Google様の生成AI、Gemini(無料プランだけれども)を使ってソフトをコーディングしてもらっています。
M5Stack
M5Stack Technology Co., Ltd のM5Stackを中心とする製品群は、むき出しのボードであることが多いマイコン開発ボードの中で、シャーシ付き、ディスプレイ付き、そしてバッテリー付であるものが多く、人気の開発ボードじゃないかと思います。搭載マイコン自体はEspressif社製ESP32(コアはXtensa)が主力です。これは第38回と共通です。開発環境としては、MicroPythonまたはArduinoが主流であると思います。ただし、M5にはM5の世界があり、MicroPythonもM5Stack独自の拡張を施してます。ArduinoにおいてもESP32コア機能に加えて独自拡張部分が多く、M5というオブジェクトを使って各種機能を操作するスタイルです。そのせいかボードパッケージはESP32と独立にM5Stack用があります(HALは共通しているので両方に重複して含まれてます。)
また、「世界中の電子工作業界」で人気を博しているせいか、最近の製品ラインの拡張は目覚ましいものがあります。機種の多さに忘却力の年寄はとてもついていけません。
Gemini様のプロンプトへの入力
毎度の茫漠とした問いかけは以下です。
M5Stackで1ms毎にタイマで割り込みをするプログラムを書いて
Gemini様は、上記のような茫漠とした問いかけに対して Web上で人気の(情報量の多そうな)機種について、人気の開発環境を使って回答してくる傾向であるようにみうけられます。M5Stackでも品種がすごく多くなっているので、何について回答をいただけるのか興味深々。また、ソースもMicroPython系になるのか、ArduinoのC++系になるのか?
何時ものように回答は3案、全てArduino環境向けのコードでした。ただ、機種名はビミョー。以下は第1案ですが、黄色のところをご覧くだされや。
M5Stack Core2は、オリジナル系統をCoreとよんで、改訂版のいうような位置づけの製品だと思います。一方 ESP32 DevKitCというのはESP32用の裸のボード製品です。第38回でターゲットになったもの。”M5Stack Core2 for ESP32 DevKitC”という長い名前の製品は見つけることができませぬ。
一方、第2案ではM5Stack Core2だけだとの思し召し。
手元にあるのはM5Stack Grayという結構昔の、でも一番標準的な(ArduinoにおけるUNO R3的)機種です。最近ではM5Stack Coreと「2」抜きで呼ばれている系統です。手元のボードじゃ動かんってこと?
手元のM5Stack用のArduino環境とはミスマッチじゃ
割といい感じなソースが生成されていたので、Arduino IDEにコピペしてビルドを試みました。しかし気づいたのは、M5Stack用のArduino向けライブラリ環境が「かなり更新」されていたことです。手元のバージョンが以下に。
-
- Arduino IDE 2.3.2
- M5Stack(ボードパッケージ)2.1.1
- M5Unified(ライブラリ)0.1.13
Gemini様が生成のソースは以下のインクルードで始まってます。
#include <M5Stack.h>
見慣れたフレーズ。昔はそう書いていた気もするのですが、今や手元の環境にM5Stack.hはありませぬ。手元環境で、オブジェクトM5を使おうと思ったら
#include <M5Unified.h>
です。想像するにM5Stackシリーズの製品が増えすぎたので、M5Unifiedというヘッダで、各種を一元的にサポートするようにしたようです。
そしてGemini様の生成ソースであると、ヘッダファイル名を変更したくらいでは手元環境ではエラー出まくりなことを確認。だめじゃ~。しかしよくよく、手元環境のファイルを見ていて分かったのが、
ESP32用にGemini様が生成したソースの方が、今回M5Stack用に生成してもらったソースより、手元のArduino環境には向いているんじゃね
という点です。M5Stackのボードパッケージに含まれているESP32のHALの方がESP32のパッケージのそれより古いんじゃないかと思います。ESP32編の仇をM5Stack編で討つ、という感じ。ちょっと試行錯誤してたどり着いたソースが以下に。
#include <M5Unified.h> volatile uint32_t counter = 0; void ARDUINO_ISR_ATTR onTimer(){ counter++; } void setup() { M5.begin(); hw_timer_t * tim = timerBegin(0, 80, true); timerAttachInterrupt(tim, &onTimer, true); timerAlarmWrite(tim, 1000, true); timerStart(tim); timerAlarmEnable(tim); Serial.begin(115200); } void loop() { Serial.println(counter); delay(1000); }
上記のソースであれば、手元の環境でビルドOK、実機M5Stack Grayに書き込んだところが以下のように動作もOK。
Gemini様生成のソース2本を混ぜた上で、手修正を重ねた結果っす。今回も勝ちとは判定しずらいな。