![見出し画像](https://assets.st-note.com/production/uploads/images/148660644/rectangle_large_type_2_c4e17b87ea8106116674169da3319174.png?width=1200)
【AI x Arduino】AIでLチカしてみた
こんにちはRcatです。
今回は電子工作セクターに向けた感じで、AIと電子工作を組み合わせてAI Lチカをやっていきます。
具体的なやることがこちら
概要
今回は電子工作とAIを連携していきます。
今までAIといえばAIを使って何かを自動化するといったようなソフトウェア的な使い方がほとんどでした。
しかし、最近はあんまりやっていませんでしたが、私は電子工作などもやるので、現実にアクションを起こしたいと考えました。
すでにいくつかのことをやっていますが、既存のものを使用しているので、初めての方には分かりづらいかもしれません。
というわけで、今回は電子工作のHello World LチカをAIでやっていこうと思います。
仕組み
前提条件
まず前提ですが、マイコンはESP32をArduinoで使います。
厳密には32Cです(たまたま手元に転がってたのがこれだった)。
配布するソースコードは無印の32でも32-S3でもコンパイルできるはずです。それ用に作ったテンプレートから派生してるので。
仕組み
まず、電子工作側のベースとなっているのはWebサーバーライブラリです。
スケッチ例の中のWebサーバーの中の一番上のスケッチが一番近いです。
これを参考に色々な機能を組み込んで作り上げてきたものをテンプレートとして使っています。
![](https://assets.st-note.com/img/1722000050480-lEG4ceh6zY.png?width=1200)
IoT電池工作のテンプレートはこちら
事前知識もなく、初めて見る方向けに簡単に説明しますと、このサンプルスケッチはESP32をWEBサーバーにします。
Webサーバーとは、httpリクエストを受け取り必要な応答を返すサーバーです。あなたがこの記事をアプリではなくブラウザで見ている場合、直接noteのWebサーバーにアクセスしています。
で、このWebを電子工作で使う意味なのですが、データを投稿するフォームとかありますよね?つまりデータを受け取るだけではなく、こちらから送信することができます。
この時のパラメーターを電子工作側で受け取ることで、現実にアクションを起こすという仕組みです。
具体的なやり方やできることに関しては昔以下の動画で解説しています。
以下でいうスマホがAI変わる感じですね。
というわけで上記の動画はご視聴いただけましたでしょうか?
動画の中ではスマホの画面で表示される要素を操作して、LEDの色を操作していましたが、この手で操作する部分をAIに指示してAIにやらせるというのが今回の目的です。
AI側の仕組み
さて、次はAI側の方なんですが、まずはこちらの記事をご覧ください。
以下の記事ではDifyというソフトウェアを使ってAIを使ったワークフローの自動化ができることと、それでは少し物足りないなということを紹介しています。
こちらの記事にもあるように、今回は質問分岐専用のチャットボットを作成し、その応答からESP32のURLにアクセスするようなシステムを作成すればいいわけですね。
簡単に言えば以下のようですね。
この中の2番がAIの方で処理する内容となります。
「LEDをN秒間隔で点滅して」とチャットに入力する
チャットの内容がAIに転送される
チャットの内容とは別に何をすればいいのか?といったリストも同時に転送される
AIはチャットの内容を理解し、リストから適切な動作を選択する
どのように出力すればいいかも記述されているので、フォーマットに沿って出力する
プログラムがAIの応答を受け取る
受け取った内容から実行する関数を選択
パラメーターがある場合、それを渡してURLにアクセスする
ESP32が動作する
やり方
ESP32(Arduino)側
今回は私が作成しているIoT工作テンプレートを使う前提で説明します。
なお、ここから先はWeb工作の動画を全てご視聴いただいた前提でお話ししていきます。
内容は非常にシンプルです。
以下がデータを受け取るURLの定義です。
このURLではオンオフの状態を"S"に点滅間隔を"T"に受け取ります。
LEDの点滅をする場合は、Sを1以上、点滅間隔をミリ秒でTに渡します。
つまり、以下のようなURLになります。例えば0.5秒間隔で点滅する例です。
http://192.168.0.XXX/LT?S=1&T=500
![](https://assets.st-note.com/img/1722051180104-NxUiMgF4EH.png)
具体的にLEDを光らせる関数は以下の通りです。こちらをループの中でそのまま実行しています。
具体的には前回の切り替え時間を保存して、この関数が回ってきた時に現在時間から前回の切り替え時間を引いて、点滅間隔よりも大きいと出力を反転させるといった感じですね。
![](https://assets.st-note.com/img/1722051373972-tYSyXSkF2m.png)
省いてますが、事前にセットアップ内でピンモードの設定とURLの紐付けも必要です。
この状態で起動すると、先ほどのURLにアクセスできるようになるので、パソコンやスマホからでも点滅の指示を出すことができるようになります。
AI側
AI側に関してはまず以下の記事を読了の前提です。
また、この記事ではAIはPythonを使って動かすものとし、プラットフォームにDiscordのボットを使用しています。
ボットを使用しない場合は、URLにアクセスする周辺の関数を参考に別のものに置き換えていただければOKです。
環境も全く違う場合はやり方だけ参考にしてください。
上記の記事の引用ですが、AIには以下のようなメッセージを渡しています。
この方法のポイントは出力方法がほぼ確定することです。今のところは100%ですね。
こちらがどんなメッセージを入力しても必ず決まったフォーマットで返すように指示しています。また、一般的なフォーマットを使うように指示することで精度を上げています。
つまりは言葉で指示した内容をAIを使ってJSONに変換しているとも言えます。
![](https://assets.st-note.com/img/1722051687678-8ZTFBgIjgV.png?width=1200)
上の部分では変数になっているコマンド一覧のところですが、以下の定義がAI用のメッセージに変換されて置換されます。
このメッセージによりledblinkというコマンドはLEDを点滅させるためのコマンドであり、スピードとステータスのパラメーターがあるということを理解させます。
ワンポイントとしてパラメーターは何の型なのかというのも書いてあります。こうして書くことで、AIがよくやりがちな文字の数値を出力するといったことを抑制できます。※100%ではないので、数値でも文字でも操作できるような関数にするべき
![](https://assets.st-note.com/img/1722051946127-ZDa3PVVF93.png?width=1200)
そして、このコマンドの関数は以下の通りです。
こちらも非常に単純明快。渡されたパラメーターをURLにくっつけて出来上がったURLにアクセスするだけです。
さて、お気づきですよね。URLにアクセスするということはどういうことですか?そう、この時点でLEDが点滅しているはずです。
![](https://assets.st-note.com/img/1722052050310-xacR1G02aj.png)
ちなみにURLのアクセス部分は以下のようになっています。
これはDiscordのbotを使用しているためです。
![](https://assets.st-note.com/img/1722052119228-0beQoHs0aB.png)
AIを使ったボットのテンプレートについては以下の記事で紹介しているので、気になった方はご確認ください。
まとめ
いかがでしたか?
似たような内容の記事になってしまいましたが、電子工作側の方に見ていただきやすいような構成にしてみました。
AIAIってソフトウェアの話でしょと思っていましたが、意外と電子工作なんかでも組み合わせができそうです。
既製品に対して何かの動作を起こすの難しいかもしれませんが、あなたも工作大好きな人であれば、きっと身の回りのものは自分で作った自分仕様のものであふれているのでしょう。つまり、それらは自分で連携して自動化できるというわけですよね。
是非是非試してみてください。
配布
今回のデモのプログラムは、以下のテンプレートをベースにしています。
そのため、以下の記事をご確認いただき、事前に内容を理解している前提です。
また、配布する内容はESP32のソースコードのみです。
AI側のソースコードが必要な場合は以下の記事から配布しています。
ダウンロードURL
注意事項
事前に利用規約を確認し、同意の上ダウンロードしてください。
また、ダウンロードには別途キーワードが必要です。キーワードについては、本記事の有料期間にて公開しています。
また、本作はIoTテンプレートをベースにしているため、本記事を購入するとその記事の有料区間に貼ってあるキーワードも同時に公開されます。
ここから先は
情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。