USB-IOでステッピングモーター駆動実験

インターバルタイマー(その3)でUSB-IOのでポートがたくさん余っているので何かに使えないかと考えた末ステッピングモーターの駆動パルスを発生できるのではないかと思い実験することになりました。

一般にステッピングモーターを駆動するには水晶発振などのパルスを発生する素子とそのパルスを分周するロジックを組み合わせて最終的に下のようなパルスをモーターに与えてやるとモーターが回転することになります。(パルスの与え方はいろいろありますがユニポーラ型ステッピングモーターの2相励磁の一例です)

X1、X2とY1,Y2がユニポーラ型ステッピングモーターの各コイルと考えます。上図で赤枠のパルスパターンが繰り返しているだけなのでこのパルスをUSB-IOで作ってやろうというわけです。さすがにUSB-IOだけではモーターを駆動できないのでドライブ回路を追加します。

 

回路は手持ちの部品を探して右のようなシンプル回路で実験することにしました。
モーターはジャンクのスキャナーについていたもので9Vとしか書いていなくステップ数とかXXppsとかの表示はありませんでした。コイル抵抗は39オーム/Φでした。

(ここからは長文になりますのでキーワードを太字で示しています)
回路はLOWアクティブなのでUSB-IOのポート0(P00〜P03)を使ってP0=6,12,9,3の順番に書き込みを繰り返せば良いことになります。
実験の結果モーターは見事に回転しました。しかし・・・・
このモーターは上記4つのパルス(4ステップ)を1サイクルとすると1回転50サイクル必要でした。したがって360/50=7.2deg./sycle、1.8deg./stepということになります。そして10回転するのに8秒かかりましたから1回転0.8秒ということになります。動力を伝達するのに少なくとも2:1位は減速したいので1回転0.8秒という速度は少し遅すぎます。

スッテッピングモーターの速度はDCモーターのように電圧(電流)を変えれば良いというわけにはいきません。速度は与えるパルスの速さとモーターが持っている1ステップ何度という特性によって決まってしまいます。パルスの速さはPPS(周波数)という単位で表され、PPSを大きくすれば早く回ることになりますがモーターの特性によって最大PPSが決まっています。最大PPSを超えるようなパルスを与えるとついにはモーターはパルスについて行かれなくなります。この現象を脱調といいます。(この他にモーターが起動するときの最大自起動周波数というのもモーターの特性として持っています)

と、いうわけで簡単にモータースピードをあげることはできません。ステップ角の大きいモーターを使うかパルスの周波数(PPS)を上げるしかありません。今回のモーターをそのまま使うことを前提にすればPPSを上げる、すなわちUSB-IOに対して早い書き込みをすれば良いことは明白です。しかし色々な試行錯誤の結論からいうとCPUスピードとかアプリケーションソフトの処理スピードは関係なくUSB-IOのインターフェースの速度に制限されていると思います。USB-IOはUSB 1.X規格なのですが試しにUSB 2.0のポートでテストしたところ10回転2秒と大幅な速度アップとなりました。これはどういうことなのでしょう?USB-IOがUSB 1.X規格なので1.X規格のスピードでしか動作しないと思っていたのですが私の理解を超える結果となりました。まあ結果オーライということでこれ以上追求しない(できない)こととしました。

しかしこの10回転2秒の時は自起動周波数を超えていると思われ時々脱調が起こりました。今度はもう少し遅くする必要が生じたわけですが遅くするのは簡単と考えていましたがまたもや現実に裏切られました。というのは上記P0=6,12,9,3の書き込み時にそれぞれの書き込みごとに適当な待ち時間を挿入すれば速度は自由に変えられる目論見だったのですが自由にという分けには行きませんでした。結果は待ち時間0の時が10回転2秒(これはOKです)、待ち時間各1ミリ秒(4ステップ500回ループで2000ミリ秒=2秒遅くなるはず)で20秒という結果でした。どうして???
更に待ち時間1〜10mSで10回転20秒、11〜20mSで40秒、21〜30mSで60秒、31〜40mSで80秒・・・・・・ 10ミリ秒毎に20秒づつ増加していて4ステップX500回ループX10ms=20秒というのは分かりますが何故1〜9mSで同じ20秒なのでしょうか、また待ち時間を入れるとUSB 1.XもUSB 2.0同じ結果なのです、この現実に私の頭はもう沸騰寸前で失神しそうです。実験ソフトは今回もフリーのHSPを使いこんな単純なのですが根本的に何か間違っているのか?。まあUSB-IOがUSB2.0の動作を保障しているわけではないのでこんな実験すること自体が間違っているのでしょう。(3機種のUSB2.0でテストしましたが内1機種は全くUSB2.0の動作はしませんでした)

それでも気を取り直して待ち時間で調整することは諦め、苦肉の策ですがステップ数で調整することにました。一般の4相モーターではパルスは最低4ステップ必要なので上記パルスパターンで、たとえばP0=6,12,9,9,3とどこかのパルスを一回余計に与えて5ステップにしてやれば5/4倍に時間がかかることになり減速されるはずです。同様に2回(2箇所)で6/4倍、3回(3箇所)で7/4倍、4回(4箇所)で8/4=2倍に減速されるはずです。これは一応目論見通り動きました。但し5〜7ステップの駆動は変則的であり見た目には分かりませんが厳密にはカクカクと言った動きになります。
ここではずとか一応とか曖昧な表現をしているのは、例えば5ステップでP0=6,12,9,9,3はOKですがP0=6,6,12,9,3とかP0=6,12,9,3,3では脱調することがあるのです。どうも3回目の書き込みタイミングがUSB2.0←→USB-IOの間で同期がとれていない様に思います。(USB1.XではOKです)
お勧めできないので参考程度に

その後頭を冷やして整理してみると時間に関するコマンド(HSPではawait、waitとか、gettime)を使うとうまく調整できないことが分りました。そこで待ち時間の代わりとしてrepeat〜loopを繰り返して時間を浪費させるといった非常手段で試したところ一応うまく動作しました。何回loopを繰り返すかはソフトの作り方とCPUの能力に依存しますので試行錯誤で決めるしかありません。



まだ負荷をかけた実験はしていないのですがUSB2.0では8ステップの2相励磁か1−2相励磁くらいが実用スピード(10回転4秒=150RPM以下)のようです。
USB1.Xで4ステップの2相励磁で使用する方が安全ですがモーターを変更しない限りスピードUPは望めません。

モーターの逆転はP0=6,12,9,3を正転とするとP0=3,9,12,6のようにパルスを与える順序を逆転すればよいことになります。また何段階かのスピードのステップを作っておけばモータースピードを徐々に(段階的に)上げる、下げるといったスローアップ、スローダウンもプログラムしだいで可能となります。

ところでこんなことしてどうするの?
ステッピングモーターは時間に対して正確に回転するといわれていますが、これは水晶発振の正確さに起因しています。ソフトでパルスを作る今回の実験では時間に対して正確とはいえません。本来ステッピングモーターが持っている利点は位置再現性です。与えたパルスの数によって正確に回転角が決まりますから何かと応用ができます。プログラムで何回転したかは正確にわかりますから再現性の必要な可動機構を構築するのに最適です。

追試 (2006.06.23追記)
その後の実験の結果少し気になる現象がありました。
モーターを数秒〜数十秒回していると時々”カリッ”という感じのクリック音が入るのです。脱調かと思って心配しましたが、回転軸に付けた目盛りがずれていませんでしたので回転量は変化していません。なので脱調とは違うようです。別のモーターでも同じでしたからモーターが悪いわけでもなく、どうもモーター駆動のパルスが一瞬途切れるのではないかと思われます。
USBの知識をWEBで拾い集めるとUSBのホスト(PC側)とディバイス(USB-IO)間の信号のやりとりはUSB1.1のUSB-IOではホスト側からのインターラプト(問い合わせ)によるらしいので連続的タイミングでコマンドをもらえないのだと推定しています。従ってUSB-IOを使う限りこれはどうにもなりません。気分の良いものではありませんが、まあ回転量が変わるわけではないのでまあいいかと・・・

負荷テスト
負荷をかけるともしかして脱調(回転量のずれ)するかもしれないと思い実験しました。
6Vのモーター(オリエンタルPK224-02A)をVIXEN SP赤道儀の赤経軸に直結し回転させると、やはりという感じで脱調してしまいました。そこで電圧を6Vから7Vに上げるとクリック音は時々入るもののなんとか脱調はしなくなりました。

モータードライバー回路を変更

もう少し安心して使うためにモーター駆動回路を変更しました。

左が最初に実験した12Vを6〜7Vに落とす電源部の回路ですが7Vでモーターを回すとトランジスター(2SB1228)が結構熱くなりました。そこでためしに右のチョッパー方式に変更しました。
これは12Vの電源をON/OFFして平均電圧を得るものでデューティー比(ON時間とOFF時間の比)を変えて電圧(電流)調整するものです。
元電圧が12Vと低いためあまり効果がないかと思いましたが、この回路によって5Vでも脱調(回転ずれ)しなくなりました。また7Vにしてもトランジスタの発熱もほとんどなくチョッパー方式の電流効率の良いことがうかがえます。

まとめ(ステップ角1.8度のモーターを使用した場合)
USB1.1では
1又は2相励磁では75RPMが限度である。これはUSB-IOの応答速度に起因すると思われ、スッテプ数にすると75/60=1.25RPS、1回転200Stepだから1.25X200=250SPSである。
1-2相励磁ではステップ角は半分になるので37.5RPMが限度となる。これらはモーターの能力ではなくてUSBポート−USB-IOの処理速度に制限されている。

USB2.0
では
1又は2相励磁では300RPM(=5RPS=1000SPS)が最高速度だが無負荷でも脱調するときがある。1-2相励磁で150RPMとなり前述負荷で脱調はしないものの1相励磁が入るので負荷が大きくなると不安が残る。従って2相励磁の各ステップを2回づつ繰り返す8ステップの2相励磁(150RPM)で使用するのが安全と考える。

クリック音について
前述の理由でUSBを経由するかぎりこれは避けられない。これはモーターが一瞬止まっていると考えられるが脱調ではなく、自起動領域であれば回転量は保たれる。トルクぎりぎりの負荷やスルー領域で使うと本当の意味での脱調はしやすくなると考える。


モーター駆動試験プログラムUSB-IO P00-P03用)

inserted by FC2 system