若者もすなる生成AIといふものを、老人もしてみむとてするなり、ということでGoogleの生成AI、Gemini様に茫漠とした問いかけをしています。今回は「Arduino UNO R3で1ms毎にタイマで割り込みをするプログラムを書いて」です。マイコン機種名を明記しているので「誤解」は無いハズ。後で機種変更もお楽しみ。
※Google様の生成AI、Gemini(無料プランだけれども)を使ってソフトをコーディングしてもらっています。
過去回でのGemini様の挙動を観察するに、パソコン上で動作するようなソフトウエアには強い、特にPythonなどは無類の強さ。一方、ハードウエアに近づいてくるとお答えいただけるけれどもイマイチ自信なさげな感じでした。
今回はソフトウエアです。ただし特定のマイコンを指定、ハードウエアに目を背けてはコーディングできない部分を問いかけてみましたぞ。
Arduino UNO R3で1ms毎にタイマで割り込みをするプログラムを書いて
ミソはArduino UNO R3です。最新機種でArduino UNO R4が出てますが、R3時代の「Web情報の厚み」はすさまじいのできっと良いご回答をいただけるハズ。
例によって3案
Gemini様に問いかけると、最初の回答の右上にもっと回答案表示するためのプルダウンがあり、3案を比べてみることができます。今回、最初にご提示していただいた案(第1案)、ぱっとみカッコよかったのですがよく見ると
ちょっと良くわかんないところがあるんだけれども
ということで3案を比べてみることにいたしました。結論から言うと、
-
- 第1案、そのままではコンパイルでエラーが出る(具体的には、割り込みハンドラの中で定義したstatic変数をメインループ内で参照していた)、変数を大域化して、volatile指定すればコンパイルは通る。しかし実機上で実行すると割り込みハンドラ名がマズイために割り込みを捕捉できない。ハンドラ名まで変更すれば動作はする。
- 第2案、そのままでコンパイル可能、実機上で動作も可能。
- 第3案、そのままでコンパイル可能、実機上で動作も可能。
第1案が「推し」なのかと思っていつも眺めているのですが、意外とダメだったりするのよね。。。今回も第2、第3の方が出来がよかったし。
なお、Gemini様がご提示してくださったソースは、Arduinoの「.ino」形式のソース(C++に一皮<プリプロセッサを>かぶせてある形式)でした。当然か。ただしソースにはさらっとC++と書かれてます。まあArduino知ってる人は迷わないか。コマケー話だ。
案2の動作している様子が以下に。案2は割り込みハンドラが動作した時だけ、ミリ秒単位の時刻をシリアル出力するようになってました。シリアル出力のタイミングはソフトウエアループっす。
案3の方は、割り込みハンドラ内でミリ秒単位のカウンタ(1秒経過すると0に戻る)を作り、それをメインループ側で拾って表示するもの。
こちらも時間経過がみてとれますな。
本当に割り込み間隔が1ミリ秒になっているのかどうかは確認していないです。まあタイマ割り込みのハンドラとして動作はしているみたい。叩き台にするソースとしては十分じゃないかと。知らんけど。