USB接続のステッピングモーターコントローラー


ステッピングモーターは光学ステージや分光器の操作などに用いることができるため、 これをパソコンからコントロールできると非常に嬉しい。しかし、ステッピングモーターをスムースに動かそうと 思えば台形駆動のテクニックが必要であり、これを実現している市販のコントローラーは結構高価である。 そこで、手作りで安価に台形駆動ができないものかとネットを検索するとAVR446 というATMELの文書を見つけた。 これはAVRマイコンで台形駆動を実現する方法を記述した物である。
今回はこれにV-USB を加えてUSB接続のステッピングモーターコントローラーを制作した。
回路図は以下の通りである。使用したステッピングモーターはドライバ付きの高級品であり、回転方向を指定して 5μsパルスを送れば1ステップ動作するようになっているから出力ポートは2つしか使わない。自分でドライバを作る場合は モーターに応じた回路を作らなくてはならないが、その場合もAVR446の文書が参考になる。 マイコンには手持ちのATmega168pを使った。ファームウェアのサイズは4KBくらいだからATmega88でも大丈夫だろう。



電源はUSBのバスパワーからとり、ダイオード2つ分電圧を下げて使用している。これはUSBの信号ラインの電圧がおよそ3.6V でなくてはならないためである。発振器はセラロックでは精度が足りないのでちゃんと水晶を使わなくてはならない。

ファームウェアのソースはここに置いておく。AVR446のものを32bitに拡張してある。 これにより65535パルスを超える連続回転が可能である。

ホスト側はLinuxではlibusb、Windowsではlibusb-win32というライブラリを経由してアクセスするのが楽である(64bitOSで 動くかどうかは分からない)。Windowsの場合はINFファイルのインストールが必要になるが、libusb-win32のパッケージの 中にINF-Wizardというものがあり、これを起動して指示に従えばINFファイルを生成してくれる。詳しくはこのあたりを 参照。

ホストからコントローラーへの指令はコントロール転送のbRequestとwValue,wIndexを使って送信する。 bRequestで動作種別を指定し、wValueとwIndexを使ってパルス数などを送るようにしてある。

ホスト側のプログラム例(Linux用)はこちら