AIの片隅で(41) Googleの生成AI、Gemini、SAMD21タイマ割り込みかけて

Joseph Halfmoon

生成AI、Gemini様に「タイマで割り込みをするプログラムを書いて」とお願いしてます。ここまでGemini様は2勝2敗2分け(マイコン1機種で2環境やったものがあるので機種としては5)です。今回お願いしてみるのは、米MicroChip社のArmコアMCU、SAMD21です。使いやすい機種だけれどもGenimi様は?

AIの片隅で 投稿順index

※Google様の生成AI、Gemini(無料プランだけれども)を使ってソフトをコーディングしてもらっています。

SAMD21マイクロコントローラ

Web上でSAMD21とつなげて書かれていることが多いので、それにつられて書いてしまってますが、”SAM D21″とSAMとDの間にスペースを入れた方が良いようです。SAMという名を冠したマイクロコントローラ(マイコン)の大きなシリーズの中でD21ファミリという比較的ローエンドの製品という位置づけのようです。出元はマイコン業界の雄、確実に5本の指に入ってらっしゃる米MicroChip社です。シリーズ源流はMicroChipに買収されたATMEL社製品だと思いますが、買収後もこのファミリ製品は繁栄してます。SAMは大族、MicroChip社のSAMファミリの全貌図が以下に。

SAM Microcontrollers Based on Arm® Cortex®-M Cores

さて今回この中のSAMD21G18という機種指名にて、以下のようにGoogleの生成AI Gemini様に投げかけてます。いつもながら茫漠としてます。

SAMD21G18で1ms毎にタイマで割り込みをするプログラムを書いて

なんでSAMD21G18かと言えば、理由は簡単、手元にSAMD21G18搭載の超小型マイコンボード、Seeed Studio製Seeeduino Xiaoがあるためです。円安で海外製の半導体やボードの価格が上がるなか、今だに「手がとどく」お求めやすい逸品であります。

Gemini様のご回答

例によってまずは3案を並べて拝見させていただきました。全てC言語ソースが生成されてました。特にビルド環境については言及がありませぬ。MicroChip社製品なので、MicroChip社の純正開発環境 MPLAB X IDEかもしれません。でも、ちょっとね。MPLAB X IDEはPIC16Fのビルドでいつもお世話になっておりますが、SAMD21のビルドでは使用したことがありません。知らんけれどもPIC16Fでの経験からすると分厚い自動コンフィギュレーションツール(GUI)のサポートがある筈。それ抜きで「さらっとした」コードだけをご提示いただいても実機上で動くハズもありませぬ。生成していただいたのはあくまでタイマ割り込みを使う「ひな型」的なものと理解しました。強力で自己完結したコンフィギュレーションツールを使うならばその位置づけはビミョ~。

そこでGeminiのプロンプトに追加のお願いをしました。

Arduino環境でのソースにして

なにせターゲット機「Seeeduino Xiao」はSeeeduinoというお名前のとおり、Arduino IDE環境でプログラム作成を行うことを前提としているためです。その辺の解説があるSeeed社の製品ページ(通販ページ)が以下に。

https://jp.seeedstudio.com/Seeeduino-XIAO-Arduino-Microcontroller-SAMD21-Cortex-M0+-p-4426.html

結論からいうと、Arduino環境のソースとしてもマズイ感じのソースが出来上がってました。目立つところを列挙すると

    • setup()、loop()関数と並列にmain()関数がある。
    • tc0という16ビットタイマを使おうとしているようにみえる

Arduino環境のソース、.ino形式にはmain()関数がありません。これはmain()関数が無いというわけではなくて、Ardinoのプリプロセッサで処理される .inoソースに無いというだけで、「裏」のシステム側のソースにはmain()があります。プリプロセッサの処理後、みんなまとめてC++コンパイラが良きに計らってくれるわけです。よって、.ino形式前提のsetup()、loop()関数に並列におかれたmain()関数は何かの勘違いっす。慌て者だな。

また、タイマのインスタンスとして TC0 という16ビットタイマのオブジェクトが最初からある前提でソースがかかれているようです。しかし、SAMD21のタイマはこんな感じです。

    • TCC0~TCC2、24ビットのコンペア・キャプチャ・タイマ
    • TC3~TC7、16ビットタイマ、TCCよりは非力だがコンペア・キャプチャ機能も含む

TC0というのは何か誤解してる?感じっす。なお、SAMD21のタイマについては以下の別件シリーズで調べてます。

AT SAMの部屋(14) XiaoでもGo!machine.TCC1使用、PWM出力

上記はTiny Go言語からSAMD21のTCC1を使ってますが、Go言語だろうとC言語だろうとハードウエアレジスタの制御は似たようなもん(いい加減だな。)

一応、Gemini様のご回答のソースをそのまま、Arduino IDE環境にコピペして、ターゲット機をSeeeduino Xiao(SAMD21マイコン搭載の奴。Seeduino XiaoもSAMD21搭載品だけなく、ESP32とか、RISC-V搭載とかいろいろ派生品種が増えているので要注意っす)にしてみたところが、コンパイルエラー続出でボロボロでした。

実機動作するTCC0タイマを使ったプログラム

実際にTCC0タイマの割り込みを使ってLチカを行うサンプルプログラムが、Arduino環境のSeeeduinoのボードパッケージ傘下に含まれていました。手元の環境での在処は以下でした。

パッケージのインストールパス\packages\Seeeduino\hardware\samd\1.8.5\libraries\TimerTCC0\examples\ISRBlink

上記に格納されていたサンプルプログラムはArduino環境でターゲット機をSeeeduino Xiaoに向ければ問題なくビルド出来、実機でも動作しております。こんな感じ(点滅するのはオレンジのLEDの方。)

SAMD21TimerDUT

機種によってはやっぱりGemini様のお勉強が追い付いてない。。。マイコンのタイマとかマイナーなことを聞くのが悪い?

AIの片隅で(40) Googleの生成AI、Gemini、ラズパイPicoタイマ割り込み2 へ戻る

AIの片隅で(42) Googleの生成AI、Gemini、M5Stackにタイマ割り込み へ進む