21:33不安定過ぎるマイクロステップ駆動には失敗したが、走行用モーターに関してはフルステップ駆動でも実用的な低速走行は可能と考えられる。遠距離精密照準のためにマイクロステップ駆動が必須である旋回用モーターとは、根本的に異なる。それに超低速時のマイクロステップ駆動には消費電力が大きいという欠点があるので、必須でなければ回避が正しいとも言える。今度は本番用プログラムだが、ホールセンサーと相の関係を正確に扱わねば回転してくれない。適当な記述で試してみたら、案の定全く回転しない。ホールセンサーの状態が変化したときに割り込みを発生させ、その中で相を切り替えている。停止状態ではホールセンサーの状態が変化せず、割り込みが発生しない。相も変化せず、いつまで経っても回転を開始しない。最初から停止している場合は、ホールセンサーの状態をアクティブに取得し、相を判定し、相を切り替えねばならない。何かのトラブルで回転が開始しなかった場合も、放置すればいつまで経っても回転しない。ブラシレスモーターは、意図していようが意図していなかろうが、回転が停止していることを検出せねばならない。その程度の修正では回転してくれない。土台から、攻略することにした。ホールセンサーの状態を読み、モーターの状態を6通りに分類する。現在のモーターの状態が0〜5までのどこであるかを表示するようにした。一方で、モーターは回転させない。手でモーター軸を回転させ、リアルの角度と液晶表示の0〜5の対応を確認する。これが、すべての始まりだ。60度回転させるごとに、数字は1つずつカウントアップする。逆回転させれば、当然のごとく1つずつカウントダウンし、0の次は5になる。ホールセンサーは、正確にローター角を検出できている。次に、3つのPWMと3つのFETを状態変化させ、6通りの位置にローターを保持するルーチンを用意。いうか、それは既に用意できているので、どのルーチンが何番目の状態を保持するのか、0〜5の具体的な数字と対応を確認する。実際にその状態を発動させたうえで、リアルのモーター軸がどの角度で固定されるのかを見る。確認後、状態0〜5を与えたら、その位置にローターを吸引するようなルーチンを作っておく。次は、オープンループで、状態0〜5をカウントアップしつつローターを吸引するようなプログラムを動かしてみる。すると、低速では期待通りにカクつきつつモーターは回転した。ところが、高速回転してくれない。原因を調べるより、高速回転は「状態変化割り込み」を先に試すことにする。3つのホールセンサーの入力それぞれHになるときとLになるとき。合計6つの割り込みルーチンが用意されている。割り込みルーチン内では状態が0〜5のどれになっているかを確認し、変数に保存する。メインルーチンではその変数を読み出して、LCDに表示する。モーター軸は、手動回転だ。手でモーター軸を1回転させると、6つの変数が別々の値を示す。それぞれの割り込みルーチンに入ったときの状態0〜5が、これで確認できる。逆回転させると、値は別のセットになる。興味深いことに、その値の次の状態が0〜5のどれになるか、という点では回転方向によらず同じ値になる。回転方向によって「次はどの状態0〜5に変化させるか」を切り替えねばならないつもりだったが、その必要はないのであった。1つだけ値が不安定な割り込みがある。逆回転させると2つの値が不安定で、更に1つは値が0のまま変わらない。ホールセンサーの値に基づいて6通りの判別をする、という試行では順回転でも逆回転でも、状態値0〜5は安定して変化した。状態変化割り込みでは不安定。これは、どういうことだろう?まあ何とかなるだろう、と実際に試す。割り込みルーチン内では、次の状態に変化させうように記述。その結果、高速回転を1秒以下だけ行い、すぐ止まってしまう。止まるとタイマーが停止を検出し、強制始動させる。それもまた0.5〜1秒で停止。常に繰り返しではなく、まっとうに回らない方が多い。1秒以下とはいえ高速回転するときはするのに、実用を遥かに下回る不安定さ。状態変化割り込みの不安定さを、そのまま引きずったかのような不安定である。何とかな・・・らなかった。市販ESCでは快調にモーターが動いていた。市販ESCも動力線が3本と、ホールセンサー3つだけしかモーターと情報のやり取りはない。それでちゃんと動いていたのだから、ホールセンサーの読み取りが不安定という問題ではない。少なくとも、ハードの問題である可能性は小さい。ソフトを精査すべきだ。