前回は、ハードウェアについて紹介しました。
今回は、ステッピングモータを直接制御するCNCシールドを紹介します。
このCNCシールドは、Arduino UNOに積み重ねて、更にドライブ基板を積み重ねて構成します。
普通に使うには、Arduino用の電源と、CNCシールドにステッピングモータ用の電源を接続し、X軸、Y軸のそれそれのピンヘッダからステッピングモータへつなぐだけで大丈夫です。
これで、ArduinoにGrblコントロールプログラムを書き込めば、USBのシリアルポートからGコードを送るだけでステッピングモータを制御できてしまうという優れものです。
最初、Grbl バージョン0.9を使っていたのですが、バージョン1.1ではプローブピンによるワークの位置決めコマンドをサポートしているので、現在は1.1fを使っています。
CNCシールドの格安版はV3.0の基板ですが、バージョン1.1でも問題なく使えます。プローブは、SCLピンと近くのGNDピンを使います。
手っ取り早く使うには、ステッピングモータのステップ数を設定すると、ちゃんと動くようになります。
使っているモータはステップ角1.8度、台形ねじのピッチが2mmなので、
$100=100
$101=100
と設定してやると正しく位置決めできてしまいます。簡単!
調子よく、モーター単体でテストをしていたのですが、この時コマンドを送っても正しい位置に戻らないことがあることに気が付きました。
いろいろ調べるうちに、ステッピングモータドライバの電流が15秒間ぐらい供給されない状態があることがわかりました。
Gbrlは、複数のGコードを前もってキューしておくのですが、このキューが空になって動作が停止した時に、ドライバのイネーブル端子がディスイネーブル状態になることが原因であるとわかりました。今後の予定としては、キーボード等で位置を動かしてそれを記録して最終的にプレイバックすることを計画していたので、最初の段階の操作ができないことは大問題でした。
そこで、回路上のイネーブル端子を常時イネーブルにすることも考えたのですが、これでは、使っていないときでもステッピングモータに電流が流れ続けるためステッピングモータが高温になってしまいます。
このイネーブル端子を制御している部分を修正することとしました。
— stepper.c —
void st_wake_up()関数内の
if (bit_istrue(settings.flags,BITFLAG_INVERT_ST_ENABLE)) { STEPPERS_DISABLE_PORT |= (1<<STEPPERS_DISABLE_BIT); }
else { STEPPERS_DISABLE_PORT &= ~(1<<STEPPERS_DISABLE_BIT); }
を
if (!bit_istrue(settings.flags,BITFLAG_INVERT_ST_ENABLE)) { STEPPERS_DISABLE_PORT &= ~(1<<STEPPERS_DISABLE_BIT); }
に修正
void st_go_idle()関数内の
if (pin_state) { STEPPERS_DISABLE_PORT |= (1<<STEPPERS_DISABLE_BIT); }
else { STEPPERS_DISABLE_PORT &= ~(1<<STEPPERS_DISABLE_BIT); }
を
if (!pin_state) { STEPPERS_DISABLE_PORT &= ~(1<<STEPPERS_DISABLE_BIT); }
に修正
これら2か所の修正で、コマンドがすべて終了してもドライバを有効のままにしておくことができます。
折角なので、コマンドを送ってドライバを無効にする拡張もしました。
— system.c —
uint8_t system_execute_line(char *line)関数内の
case ‘R’のbreak;の後に次を追加
case ‘P’ : // Power control
STEPPERS_DISABLE_PORT |= (1<<STEPPERS_DISABLE_BIT);
break;
この追加ですべてのコマンド終了時に$Pコマンドを送るとドライバを無効にできます。
で、今回記事投稿のため確認しようとしたところ、現象が再現しませんでした。
まあ、$Pコマンドを送るまでモータをホールドしてくれるので、そのままにしてあります。
次回はコントローラプログラムです。