
ごちゃごちゃと入り組んだプログラムのことをスパゲッティーなコードと言います。今、ロボット作ってるの。今回は、精密だけどあまり力は必要ないタイプ。ステッパーモーターをマイクロステップ動作でこまかくこまかく動かします。1周を200,000分解、0.0018度づつの制御です。

SUNXのセンサー。向かい合わせて、光が遮断されると”なんか来たよ!”と教えてくれます。発光部が変調してたりして高級品なんだけど、掘り出し物だったのさ。2コ買っちゃったよ。

入力12V。結果はネガティブハイなので5VからLEDを通して接続すると、検出時に光ります。物が端っこにきたときとか、なにかにぶつかりそうなときに検知します。

今回のモーターはPlexMotor製。CSA-UCっていう、200,000分解能のマイクロステップドライバ搭載。Arduinoに直接つなげることができます。端子がまだ無いのでピンにハンダ付けしました。トルクは十分。分解能が運転中に変更できないので、用途によってプログラムのパラメータ初期値と連動しなければなりません。

positiveをArduinoの5Vにそのまま接続。negativeを信号線に。LEDでインジケータ付けたけど、速度を上げるうちに見えなくなります。実験に荒いモードで使用していると、特定の周波数でぶりぶりするけど、加減速するうちはあまり気にならない。っていうか、今回200,000分解で使用するから、たぶん振動は気にならないほどスムースなはず。

タイミングチャート。0.4マイクロ秒以上の信号ということなので、思ったような速度で動かせます。1からステッパーモーターを動かすと、あまり無茶できないから、安心安心。

で、あとはMacでプログラミングさ。Arduinoって、メインのループをひたすら繰り返すんだけど、そこにモーターコントロールを入れるとかかりっきりになるので、Timer1を使用して定期的(といっても500マイクロ秒ごとにとかだけど)にカウンタをチェック、モーターを動かすタイミングのときに動かす、という方法にすれば、メインループが解放できます。
急加速/急減速するとガクガクしそうなので、台形加速を組みました。ゆっくり動き出して、なめらかに止まる。Interruptを使用するプログラミングでこんなに速い処理の場合、下手に込み入ったコマンドを実行すると次のinterruptに間に合わなくなるので、やわらかアクセル/ブレーキの加減をどのように組み込むか、考え中です。