Arduino のスケッチを AI で生成する方法

この記事で学習できること

Arduino のプログラム(スケッチ)は、初心者にとってハードルが高く感じられることがあります。 しかし近年は、AI を使ってスケッチを自動生成できるようになり、プログラミング経験が少なくても高度なプロジェクトを短時間で作れるようになりました。この記事では、以下を初心者にも分かりやすく解説します。

  • AI を使って Arduino のスケッチを生成する方法
  • 実際のプロンプト例
  • 生成されたコードの確認ポイント
  • 動作確認の手順
  • AI を使う際の注意点
  • 応用例

AIを使ってスケッチを生成するメリット

AI を使うことで、次のようなメリットがあります。特に Arduino 初心者にとって、AI は強力な学習パートナーになります。

  • コードを書く時間を大幅に短縮できる
  • プログラミング初心者でも複雑な処理を実装できる
  • センサーやモジュールの使い方を学びやすい
  • エラーの原因を AI に質問して解決できる
  • 回路図や改善案まで提案してもらえる

使用する AI ツール

この記事では、一般的な AI チャットツールを使用します。 どの AI でも構いませんが、以下のような機能があると便利です。

  • コード生成
  • コードの解説
  • エラー修正
  • 回路図の説明
  • プロンプトに応じた改善提案

スケッチを生成するためのプロンプト例

AI に正確なコードを生成してもらうには、プロンプト(指示文)が重要です。以下は実際に使えるプロンプト例です。

● LED を1秒ごとに点滅させるコード

「Arduino Uno で 13 番ピンの LED を 1 秒ごとに点滅させるスケッチを作ってください。」

● 温度センサーの値を表示するコード

「Arduino と LM35 温度センサーを使って、温度をシリアルモニタに表示するコードを作ってください。」

● MPU6050 の角度を取得するコード

「MPU6050 のピッチとロール角度を取得して、シリアルモニタに表示するスケッチを生成してください。」

RGB LEDを違う周期で光らせる回路

  • AIでスケッチを生成する回路を準備します。 [Arduino用のUNO R3 最終版スタータキット]にRGB LEDが含まれています。RGB LEDは一つのパッケージにRGBのLEDが内蔵されています。ArduinoとRGB LEDの接続は下記のようにします。
白色LEDとArduinoの接続
— 白色LEDとArduinoの接続 —
  •  RGB LEDを下図のように違った周期で点灯します。下図のHiでLEDが点灯し、Loでは消灯します。どのLEDが点灯するかで目で見える色が変わります。例えば、青と赤のLEDが同時に点灯すればMagenta(赤紫)になります。
LEDの点灯周期
— LEDの点灯周期 —

AIに指示する点灯させるプロンプト(指示文)の作成

  •  RGB LEDを点灯する仕様を決めて、プロンプト(指示文)を作成しました。
以下の仕様で、Arduino UNOのスケッチを作って
---
Serialモニタは9600 bpsに設定する

Dgital 5ピンに青 LEDを接続
Dgital 6ピンに緑 LEDを接続
Dgital 7ピンに赤 LEDを接続

初期は、Pin 5,6,7はLoとする。HiでLEDが点灯する。

プログラムを開始すると、それぞれのpinを独立して以下の周期でHi、Loに切り替える。

5ピン 1秒 Hi 1秒 Lo
6ピン 2秒 Hi 2秒 Lo
7ピン 4秒 Hi 4秒 Lo

Serialモニタに、1秒ごとに、5pin、6pin、7PinのHi、Loの状態およびLEDの合成色の目安を表示する。
// ピン番号の定義
const int BLUE_PIN = 5;
const int GREEN_PIN = 6;
const int RED_PIN = 7;

// LED状態管理
bool blueState = LOW;
bool greenState = LOW;
bool redState = LOW;

// タイマー管理
unsigned long prevBlueMillis = 0;
unsigned long prevGreenMillis = 0;
unsigned long prevRedMillis = 0;
unsigned long prevPrintMillis = 0;

// 各LEDのON/OFF周期
const unsigned long BLUE_ON = 1000, BLUE_OFF = 1000;   // 1秒ON、1秒OFF
const unsigned long GREEN_ON = 2000, GREEN_OFF = 2000; // 2秒ON、2秒OFF
const unsigned long RED_ON = 4000, RED_OFF = 4000;     // 4秒ON、4秒OFF

// 現在のON/OFF時間管理
unsigned long blueInterval = BLUE_OFF;
unsigned long greenInterval = GREEN_OFF;
unsigned long redInterval = RED_OFF;

void setup() {
  Serial.begin(9600);
  pinMode(BLUE_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(RED_PIN, OUTPUT);

  // 初期状態をLOW
  digitalWrite(BLUE_PIN, LOW);
  digitalWrite(GREEN_PIN, LOW);
  digitalWrite(RED_PIN, LOW);
}

void loop() {
  unsigned long currentMillis = millis();

  // 青LED制御
  if (currentMillis - prevBlueMillis >= blueInterval) {
    prevBlueMillis = currentMillis;
    blueState = !blueState;
    digitalWrite(BLUE_PIN, blueState);
    blueInterval = blueState ? BLUE_ON : BLUE_OFF;
  }

  // 緑LED制御
  if (currentMillis - prevGreenMillis >= greenInterval) {
    prevGreenMillis = currentMillis;
    greenState = !greenState;
    digitalWrite(GREEN_PIN, greenState);
    greenInterval = greenState ? GREEN_ON : GREEN_OFF;
  }

  // 赤LED制御
  if (currentMillis - prevRedMillis >= redInterval) {
    prevRedMillis = currentMillis;
    redState = !redState;
    digitalWrite(RED_PIN, redState);
    redInterval = redState ? RED_ON : RED_OFF;
  }

  // 1秒ごとに状態を表示
  if (currentMillis - prevPrintMillis >= 1000) {
    prevPrintMillis = currentMillis;

    Serial.print("Pin5(BLUE): ");
    Serial.print(blueState ? "Hi" : "Lo");
    Serial.print(" | Pin6(GREEN): ");
    Serial.print(greenState ? "Hi" : "Lo");
    Serial.print(" | Pin7(RED): ");
    Serial.print(redState ? "Hi" : "Lo");

    // 合成色の目安
    Serial.print(" | Color: ");
    if (blueState || greenState || redState) {
      if (blueState && greenState && redState) Serial.print("White");
      else if (blueState && greenState) Serial.print("Cyan");
      else if (blueState && redState) Serial.print("Magenta");
      else if (greenState && redState) Serial.print("Yellow");
      else if (blueState) Serial.print("Blue");
      else if (greenState) Serial.print("Green");
      else if (redState) Serial.print("Red");
    } else {
      Serial.print("Off");
    }
    Serial.println();
  }
}

生成されたコードの確認ポイント

AI が生成したコードは便利ですが、必ず次の点を確認してください。AI は時々、存在しない関数や古い書き方を使うことがあります。

  • ピン番号が実際の配線と一致しているか
  • 使用しているライブラリが存在するか
  • 初期化処理が正しく書かれているか
  • センサーのアドレスが正しいか
  • delay の値が適切か

AIが生成したスケッチの動作確認の手順

  • Arduino IDE を開く
  • 生成されたコードを貼り付ける
  • ボードとポートを選択
  • コンパイルしてエラーがないか確認
  • Arduino に書き込む
  • 実際に動作するか確認する
  • 動作しない場合は、AI に「エラー内容」をそのまま貼り付けて質問すると、修正案を提案してくれます。

実際のスケッチの動作の確認

  • 青LED、緑LED、赤LEDを独立した周期でて点灯しており、意図した動作になっています。
  • シリアルモニタに青LED、緑LED、赤LEDへのポート出力のHi、Loの状態、また期待されるLEDの色の表示がされています。表示の細かな書式はAIに指示をしていませんが解り易く表示されています。
LEDの点灯状況と合成色のシリアルモニタ表示
— LEDの点灯状況と合成色のシリアルモニタ表示 —

AI を使う際の注意点

AI は便利ですが、万能ではありません。そのため、AI の提案をそのまま使うのではなく、必ず自分で確認することが重要です。

  • 間違った配線を提案することがある
  • 存在しないライブラリを使うことがある
  • センサーの初期化コードが抜けていることがある
  • 実機で動かないコードを生成することがある

応用例

AI を使えば、次のような複雑なプロジェクトも簡単に作れます。プロンプトを工夫するほど、より高度なスケッチを生成できます。

  • 複数センサーを組み合わせたデータロガー
  • LED マトリクスのアニメーション表示
  • サーボモーターを使ったロボット制御
  • Wi-Fi 通信を使った IoT プロジェクト
  • MPU6050 を使った姿勢制御

まとめ

AI を使えば、Arduino のスケッチを短時間で生成でき、初心者でも複雑なプロジェクトに挑戦しやすくなります。AI を活用することで、Arduino の学習効率は大きく向上します

  • プロンプトを工夫する
  • 生成コードを必ず確認する
  • エラーは AI に修正してもらう
  • 応用例を試してスキルを伸ばす

御質問、誤植の指摘、記事の改善点の気づきなどありましたら「問い合わせ 」のページからお願いします。