AI を活用したプログラミング
--- Z-WINGフライトコントローラーの製作 ---
 新しくマイコンを使ってプログラミングをするとき、どんなマイコンを買ったら良いか、どうやってプログラミングしたら良いか悩みます。
 AIを活用することで、より良い、マイコン選びとプログラミングを行います。
 垂直尾翼が無い鳥型グライダーを操舵するフライトコントローラーの製作をAIを活用したマイコン選びから、プログラミングの様子を見てみよう。
 9割はAIを使うことで進められそうですが、最後の1割はAIで進めることはできず、自分で考えることが必要になりそうです。

1.どんなマイコンを使うか
 AIに、フライトコントローラーを作るのに、どんなマイコンを使えば良いか、
 フライトコントローラーに求める性能をAIに書き入れて質問します。
1.フライトコントローラーは、受信号の信号を読み取り、垂直尾翼を使わず操縦する方式(Z-WING)でサーボを動かして操舵できるようにしたいと思います。空を飛ぶので小型軽量であり、反応速度、操舵の分解能が要求されます。
2.受信機は、国内、海外で安心して使えるFUTABA受信機を使うことにします。
3.フライトコントローラーを作れる性能を持ったマイコンを探します。
4.AIは、候補となるマイコンとセンサーを教えてくれました。しかし、それらを手に入れることができるのでしょうか?
 購入できるかネット検索して調べます。32ビットのマイコンであるSTM32C011F4Pxが80円で買えることが分かりました。STM32C011F4Pxを使うことで、FUTABA受信機のS.BUS信号を使って高い分解能でサーボを動かすことができます。S.BUSなどの用語がわからないときは、AIに質問すれば教えてもらえます。
5.目標とするフライトコントローラーを作るには、STM32C011F4Px と別に ジャイロ、加速度センサーが必要だとわかりました。
6.STM32C011F4Pxを買って、手にしてみたら、小さくて配線できそうもありません。このことは、AIは教えてくれませんでした。
7.あらためて、小さすぎる問題を質問すれば、変換基板を利用すれば良いことがわかります。これもネット検索すると50円で買えることが分かりました。
8.変換基板を購入して STM32C011F4Pxを変換基板にハンダ付けします。
 どうすれば、この小さな部品をハンダできるかは、自分で考えます。アルミのせんたくばさみを加工して、補助具を作ってハンダ付けしました。
      
  小さなチップを利用するには変換基板を使う    加工したアルミせんたくばさみでおさえて、ハンダ付けする
・ まわりに「利用目的に合ったどんなマイコンが使えるか」を教えてくれる人がいなくても、AIが利用目的に合うマイコンがあるのかを簡単に教えてくれます。

・ AIの回答にあるマイコンが実際に購入できるとは限りません。購入先を自分で調べる必要があります。

・ AIの回答にあるマイコンは古く、現在は、もっと良いマイコンが販売されている場合があっても、それらを回答しません。


2.何でプログラミングするか
 AIに、何でプログラミングするか質問します。
1.回答にはSTM32CubeIDEを使ってHALでプログラミングするとありました。
 HALとは何なのでしょう。HALとは何かをAIで質問していくと、C言語を基にしたSTM32C011F4Pxに内蔵されたハードウェアを制御するための命令語のようなものがあるらしいとわかってきました。・・・と言うことは、全体をC言語でプログラミングしていき、内蔵されたハードウェアを使うところで、HALと言う記述をすれば良いと考えれば良さそうです。

2.STM32のホームページを開き、STM32CubeIDEをダウンロードして、インストールしました。
 ・ここで、C言語、HALを記述できます。


3.しかし、何かがおかしい。AIが回答するような方法で、プログラミングを進められません。別のAIで質問してみても、AIによる回答のようなプログラミングができません。

4.STM32C011F4Pxの製造元である STMのホームページを開いて、何でプログラミングをするのか調べます。

5.プログラミングには、 STM32CubeMX と言うソフトもあることがわかり、これをダウンロードしてインストールします。
 AIには、STM32CubeMXと言うソフトがあることを教えます。
 AIに STM32CubeMX の画面のコピーを入れると、AIに質問ができるようになります。

6.STM32C011F4Pxでピンの設定ができました。


7.STMのホームページを見ていて、STM32CubeProgrammer と言うソフトもあったので、ダウンロードしてインストールしました。
 ここでヒント画面を読んで、STM32C011F4Pxのメモリーの初期化、プロテクトができることがわかりました。
・ AIは、「何でプログラミングするか」の相談相手になります。

・ 実際に使うことになった「STM32CubeMX」は、AIの回答にはありませんでした。AIだけでは見つからなかったシステムソフトです。
 AIの回答から、発展的に自分で考えて調べて見つけていくことが必要でした。

3.センサー部品
 AIに、ジャイロ、加速度センサーの部品は、何を買えば良いかを質問します。
1.AIの回答に、フライトコントローラーを作るには、STM32C011F4Px以外に角度の変化を知るジャイロセンサーと加速度を知る加速度センサーを使うとありました。それぞれの向きがXYZの3軸あるので、合計6軸となります。

2.ネットで調べると、AIでの回答にあるセンサーは、すでに製造販売が終わっていたりして、購入できないものばかりでした。

3.センサーが単体ではなく基板に取り付けた状態のモジュールとして2種類が売られていました。
 どのように利用するかの書籍は無く、ネット上にも使用例の情報はありませんでした。性能が分からないので、両方を買いました。
   
  TDK Invensense ICM-42670-P
1980円
 AE-LSM6DSV16X
990円

4.接続方法をAIに質問すると、回答があったので、そのように配線しましたが動作しませんでした。

5.一般的にセンサーとは、どのように接続し、どんな方法で通信するのかAIに質問し、センサーの利用方法を学びます。

6.センサーにどのような方法で接続するかを自分で考えます。

7.「TDK Invensense ICM-42670-P」と「AE-LSM6DSV16X」のホームページから、取扱説明書をPDFとしてダウンロードしました。

8.取扱説明書のPDFをAIに入れて、自分が考えたセンサーの通信方法をAIに質問します。

9.AIから具体的な方法の回答がありました。これで、配線ができます。

10.このようなセンサー部品は、企業で使われる状態で流通しているのでしょう。ホビーとして特別な使い方をするための情報が書かれていません。
 AIの回答は、特別な使い方をするときの正しい設定になっていませんでした。

11.テスターを使って、センサーモジュールの回路をチェックしていくと、取扱説明書にある回路図と違っていることがわかりました。
 当然ですが、AIの回答は間違っていました。

12.テスターで調べた回路を元にAIの回答を修正して、配線することで、信号の一部を読み取れるようになりました。

13.センサーモジュールから、必要な全部の信号を読み取ることができません。
 なぜなのかをAIに質問をしていくと、堂々巡りの回答が繰り返されるだけで、このままでは永久に解決できません。

14.一般的な電子回路の問題として、自分で考えます。
 センサーモジュールとの通信状況をオシロスコープでチェックすることにします。
   
   信号がなまっているように見えます。取扱説明書とAIの回答にある「プルアップ抵抗 4Ωから10Ωを入れる」が間違いです。

15.半固定抵抗を使って「プルアップ抵抗を2.6Ω」に変更して、センサーモジュールから全部の信号を読み取れるようになりました。
   

16.ジャイロの機能は、どちらも同じようでしたが、性能比較は回答されますが、どちらを使ったら良いかの回答はAIから得られません。
 AE-LSM6DSV16Xは、傾けを止めると加速度がゼロに戻るようになっていました。このデータを微分することで滑ったときの変化として利用でき、横滑りしたときの制御として使えそうです。この微分するアイデアは、AIから得ることはできませんでしたが、AIに書き入れると人間が答えるように「素晴らしいアイデア」と回答がありました。
・ 使うことになった部品の使い方は、部品の取扱説明書のPDFをAIに入れて質問することで、知りたい部分を探すのが楽になりました。

・ AIは、使える部品を複数回答します。どの部品を使うかは、自分で考えます。

・ 部品が仕様に書かれているのと違うことがありました。AIは、違ったまま回答します。

・ 部品の取扱説明書に間違いがありました。AIは、違ったまま回答します。

・ AIに違っていることを指摘すると、次から、指摘通りの回答をするようになります。

 しかし、間違った指摘をAIにすると、それ以降間違った回答をするようになるので要注意です。


4.プログラミングの手順を考える
 AIにどこからプログラミングを始めて、プログラミングを進めれば良いかを質問します。
1.AIの回答にあるように、STM32CubeIDEでプログラミングを始めると、ピン設定ができません。

2.AIの回答を無視して、最初にSTM32CubeMXを起動して、ピンの配置と内蔵ハードウェアの設定を行いました。
 AIの回答にある、開発手順は、間違っています。
 そのことをAIに書き入れると「開発手順の違いを理解できず、多くのプログラマーが挫折している」と回答されました。

3.FUTABA受信機のS.BUS信号を読み取る設定をするためにSTM32CubeMXの画面で内蔵ハードウェアの設定を行うのですが、どんな数値にすれば良いかをAIに質問します。FUTABA受信機のS.BUS信号は、世界的に使われているので、設定する数値が回答されて、設定することができました。
    

4.ピン配置と設定が終わったら、STM32CubeMXから、STM32CubeMXを起動して、C言語とHALでプログラミングします。
・ 設定に必要なパラメーターを書いた書籍を見つけることはできませんでしたが、AIの回答から知ることができました。

・ プログラミングの流れはAIの回答通りに進められませんでした。それぞれのシステムツールの特長を理解し自分で考える必要がありました。


5.プログラミング
 AIに、FUTABAの受信機の信号を読み、6軸センサーモジュールのデータを読み、8個のサーボにPWM信号を出力するプログラムを質問します。
1.AIから回答されたFUTABAの受信機の信号を読みとるプログラムをSTM32CubeIDEのmain.cに貼り付けます。
 最初はエラーが出ましたが、エラーの内容をAIに入れて、回答を貼り付け直すことを数回繰り返し、ビルドできました。
 しかし、実行しても、動作はしません。

2.動作しない理由を質問しても、堂々巡りに回答になり、動作しません。

3.オシロスコープで信号を見ると、信号がずれています。
 該当するプログラム、設定の場所を修正することで、正しく動作しました。

4.6軸センサーモジュールとの通信プログラムをAIに質問し、回答されたプログラムをSTM32CubeIDEのmain.cに貼り付けます。

5.まったく動作しません。質問を繰り返すと堂々巡りになり、どんどん症状が悪くなります。

6.別のAIに質問すると「動けば理想的だが、これは絵に描いた餅だ」と回答されました。

7.6軸センサーモジュールと、どのような方法で通信するかを自分で考え、その方法でのプログラムをAIに質問し、
 回答にあったプログラムで、6軸センサーモジュールからデータを得ることができました。

8.サーボにPWM信号を出力するプログラムをAIに質問します。

9.回答されたプログラムで、正しくPWM信号が出力されました。しかし、1と2のサーボに正しく出力されるが、3番目以降のサーボには指定したPWM信号が出力されません。

10.3番目以降のサーボには別の種類の信号を出力したいことを質問すると、それはできないと回答がありました。

11.8個のサーボに別々の種類のPWM信号を出力する方法を自分で考えます。
 2種類のタイマーを使い、チップを2個使うことで可能になりそうです。その方法をAIに書き入れると「素晴らしい、完璧です。」と回答。
 実際にプログラムを書いてみると、正しく実行できました。

12.「FUTABAの受信機の信号を読み、6軸センサーモジュールのデータを読み、8個のサーボにPWM信号を出力する」と言う、システム全体の構成を考えます。

13.FUTABA受信機を読み取るピンの数、6軸センサーモジュールの信号を読み取るピンの数、サーボへのPWM信号を出力するピンの数などを考えると、
STM32C011F4Pxを3個を使うことで可能になるだろうと考えました。このことをAIに書き入れると「素晴らしい、世界最高のシステムが完成する」と回答。

14.それぞれの信号の読み取りは成功しているので、それらをまとめるだけです。AIに質問し、回答されたプログラムを実行してみると、まったく動作しません。

15.プログラムの途中に検査用にLED出力するプログラムを入れて、動作チェックしていきます。

16.動作チェックの状態をAIに入れて、何度も、何度もプログラムの修正を繰り返しますが、まともに動作しません。
 これでは、空を飛ぶ制御には、動作が遅すぎます。

17.プログラムの方法として、DMA(メモリーへの直接アクセス)、割り込みと言った手法があります。
 これらの手法によって、プログラムが簡潔になり、並列処理が行われ、実行速度を上げることができます。
 しかし、AIでは、DMAを使うことでのオーバーヘッド、並列処理をハードウェアのソフトウェアのどちらで行っているのか、ハードウェアとしていくつかの並列処理が行われるときのお互いの干渉が考慮されていないようです。

18.プログラムの手順を自分で考え直して、プログラムの手順を指示して、AIに作らせます。これは、ときどき、AIが指示した手順で無いプログラムを回答してしまうので、「手順の指示、元とするプログラムサンプル」をワープロで保存しておき、変な回答があったときは、保存してあった内容を使って質問します。
 「AIに質問→回答→追加する質問を考え、内容をワープロに保存→AIに質問」を数百回繰り返し、だんだん、望むプログラムに近づきます。

19.AIが回答するプログラムでは、プログラミングの手法として正しいプログラムを回答します。しかし、実際の動作では、関数の作り方や手順で動作に無駄や動作速度の揺れが生じます。説明書には書かれていないのに、実際には、並列処理との間で干渉があります。これらを指摘して、AIに回答を求めることで、実用できるレベルまで高速化できました。

20.Z-WINGとして、どのようにミキシングするかをAIに指定するには、まるでプログラムを書いたような指定文になってしまいます。そこで、Z-WINGの操舵ミキシングは、直接、main.cにプログラムとして書いた方が簡単です。
    
・ 一般的な書籍にあるようなアルゴリズムは、AIの回答にあるリストをそのまま貼り付けて利用できました。このことによってコーディングにかかる時間を大幅に短縮できました。

・ AIの回答にあるプログラムが正常動作しないとき、エラーの指摘をして回答を得ることを繰り返すことで、動作するプログラムになります。
アルゴリズが知られている質問 → 回答では動作しない→エラーを指摘 → アルゴリズムが動作するプログラム

・ しかし、部分的に動作するプログラムを組み合わせて全体システムにすると、目標とする動作になりませんでした。 
 全体システムの質問 → 回答では動作しない → エラーを指摘 → 何度くりかえしても堂々巡りの回答で目標に近づかない

・ エラーの指摘では無く、プログラミングの方向を変える指示をすることで、目的に合ったプログラムを得ることができました。
  回答では動作しない → AIへ考え方を指示 → 目標とする動作

・ 目標とする動作をするプログラムを作るには、自分で考えたプログラムのアイデアをAIに指示することが必要でした。
 


6.書き込み
 AIに、STM32C011F4Pxにプログラムを書き込む方法を質問しました。
1.AIから開発ボードで書き込みができるとあったので、開発ボードを購入しました。
 
 STM32 Nucleo Board STM32C031C6  2200円

2.PDFの取扱説明書をダウンロードしました。開発ボードに内蔵されたチップへの書き込み方は書かれていますが、外部のチップへの書き込み方法を詳しく書いてありません。AIでも具体的な書き込み方法が書かれていないので、自分で考えた配線を行い書き込みします。
     

3.ときどき、書き込みエラーが生じます。AIに質問すると「リセットボタンを連打する方法がネットで紹介されている」と回答。
 実際に試してみると、偶然リセットがかかることがあるようで、再現性が無い対処方法です。
 AIの回答は、現実的でありません。

4.取扱説明書のPDFをAIに入れ、リセットボタンの使い方を質問していくと、開発ボードの配線を変えることが取扱説明書に書かれていると回答。
 該当部分は一行しか無く、取扱説明書を読んでいたら見つからなかったもしれません。すぐに、配線を変えることにします。
       ←SB23の抵抗を取り除いて配線を変える
 これで、開発ボードから、リセットができるようになりました。しかし、書き込みエラーは無くなりませんでした。
・ ボードの取扱説明書のPDFをAIに入れて質問することで、ボードの利用方法を理解する時間を短縮できました。

・ 具体的な配線を写真に撮って、AIに入れて質問することで、回答を得ることはできますが正しいとは限りません。

・ 回答があっても、試してみないと正しいかわかりませんでした。


7.検証
 AIに、完成したZ-WINGコントローラーで、どのように飛行できるか質問すると「素晴らしい飛行になる」といった質問者に同調的な回答が返ってきました。
 しかし、これは、自分で検証する必要があります。
1.STM32C011F4Pxを4個使い、並列処理で受信機と6軸センサーモジュールから信号を受け取り、9個のサーボを動かして鳥の様に滑空します。
     

2.期待した反射的制御が行われるか、実際に飛行テストを行い、調整・改良しながら開発を進めます。 → 開発の様子(YouTube)
 垂直尾翼の無い鳥型ラジコン飛行機が飛んでいる例は、世界でも他の例はありません。
・ AIを活用することで、どこかに資料がありそうなことなら、すぐに知ることができ、開発時間を縮めることができます。

・ どこにも資料として無いプログラムを質問すると、いかにも正しいように人間的な言葉で回答しますが、正しく動作しません。

・ 垂直尾翼の無い鳥型機は、世界的にも実例が無く、その様な航空機の設計理論や操縦理論の文献はありません。 AIに鳥型機の操舵方法について質問すると、航空工学で使われる用語、式を使った回答がありましたが、論理的に間違っていました。そのことを指摘すると、まるで人間のように「申し訳ありませんでした」と訂正された回答がありました。回答があっても正しいとは限らず注意が必要です。

★ AIが回答する「用語、式を使った論理的な説明」の間違いを指摘するには、それなりの専門的な知見が必要です。 
 現状では、AIの利用で開発の時間短縮はできますが、人間が学習していなければAIにほんろうされます。すべてをAIにまかせることはできません。
 
究極の鳥型グライダーの飛行  YouTube @inakakoubouKANAI