「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



ステッピングモーターに、PWMを使ったアナログ出力
でマイクロステップの制御が出来るかどうかの実験の
続きです。

arduinoを使って、4つのピンから順にアナログ出力を
するようなスケッチをサクッと書いてみました。

内容としてはこんな感じ。

・手元の中古ステッピングモーターに合わせて1周
 あたり96ステップをひとまず前提に置く
・arduinoのタイマー割り込み関数MsTimer2を使って、
 1/10秒毎に時間をカウントする
・割り込み10回につき1ステップ分の角度を進める
 こととし、その中間値はマイクロステップとする
 (96ステップ×10回分=割り込み960回で1周する
  計算…96秒で1周)
・残ったタイマー0、タイマー1の出力ピン4本を
 アナログ出力に割り当てる

ピンアサインとしては、
  X : digital pin 6
 /X : digital pin 9
  Y : digital pin 5
 /Y : digital pin 10
こんな感じ。6と5はタイマー0、9と10は
タイマー1のPWM出力ピンです。

スケッチは以下のとおり。(arduinoのIDEに読み込んで
からtool→auto formatで整形してください。また、
不等号は全角に置き換えてあります。戻して使って
下さい)

#include <MsTimer2.h>


volatile int iCount;


void counting() {
iCount++;

if (iCount==960) {
iCount = 0;
}
}


void setup() {
Serial.begin(9600);

pinMode(6, OUTPUT); //oc0a (PD6) for X
pinMode(5, OUTPUT); //oc0b (PD5) for Y
pinMode(9, OUTPUT); //oc1a (PB1) for /X
pinMode(10, OUTPUT); //oc1b (PB2) for /Y

iCount = 0;

MsTimer2::set(100, counting); // 100ms period
MsTimer2::start();
}


void loop() {

int iReadtimer;
int iStep_rot;
int iStep;
int iVar;
int iOut_a;
int iOut_b;

iReadtimer = iCount; //read timer from counter
iStep_rot = iReadtimer / 10; //step count

iStep = iStep_rot % 4; //step no (0..3)
iVar = iReadtimer % (iStep_rot * 10); //variation in the step (0..9)

iOut_a = 255 * iVar / 9; //output data A
iOut_b = 255 - iOut_a; //output data B


switch (iStep) {

case 0:
analogWrite(6, iOut_b);
analogWrite(5, iOut_a);
analogWrite(9, 0);
analogWrite(10, 0);
break;
case 1:
analogWrite(6, 0);
analogWrite(5, iOut_b);
analogWrite(9, iOut_a);
analogWrite(10, 0);
break;
case 2:
analogWrite(6, 0);
analogWrite(5, 0);
analogWrite(9, iOut_b);
analogWrite(10, iOut_a);
break;
case 3:
analogWrite(6, iOut_a);
analogWrite(5, 0);
analogWrite(9, 0);
analogWrite(10, iOut_b);
default:
break;
}

Serial.print(iStep);
Serial.print(iOut_b);
Serial.println(iOut_a);

}

(シリアルi/f関連の行は削除してもいいです)


各ピンに300オームの抵抗とLEDをつないで、いざ実行!

…接続を間違えていて、ちゃんと光らず…

暫く原因が判らなかったんですが、どうやらLEDと
GNDを繋ぐ経路を繋ぎ間違えていたようです。
再度接続しなおして実行!

うん。完璧。

4つのLEDがジワリジワリと順に光る位置をずらして
いく様が見て取れます。
動画はこの掲示板に貼れないっぽいので、そのうち
ちゃんと纏めておこうと思います。
もう少しタイマー割り込みの頻度を高くして、
ステップの境目をもう少しなだらかにしても
いいかもしれません。

ひとまずソフト面は出来たので、あとはモーター
駆動用のトランジスタと組み合わせて、ステッピング
モーターに繋げばジワリジワリと動いていってくれる
はずかと思うんですが。

まぁ、その点はまた後日挑戦ってことで。(それなりに
回路書いてから実験しないと、arduinoが火を噴いたり
しそうで怖い)

ステッピングモーターに限らず、LED灯すだけでも
結構面白いので、ご興味のある方はLED繋いで
遊んでみてください。


ちなみに、例によってreduino-nanoを使って実験
しました。
(自作のシリアル版arduinoは今mega8が載っている
 んですが、mega8版だとアナログ出力がなんだか
 変な動きをしていたと思ったので避けました。
 mega168に載せかえればシリアル版でも全然
 構わないんですけどね)



(後日訂正)
 デジタル5番とデジタル9番が逆に書かれたまま
 だったので、訂正しました。



コメント ( 0 )




工具箱を漁って、昔買っておいた中古のステッピング
モーターを引っ張り出してきました。

コイルが37Ωと比較的小さなインピーダンスなので、
5Vでもそこそこのトルクが出るはず。で、1周
96ステップで比較的目で見て判る程度の角度なので、
通常のステッピング動作と、マイクロステップの
違いがわかりやすいだろうと…

というわけで、これとarduinoを使って実験をして
みようかなぁと思います。

合間合間でやるので、時間はかかると思います。
気長にお待ちください。

とりあえず、4つのLEDのジワジワと明るさが
ジワジワと移動しているよっていうのをやって
みたいと思います。
それが出来たらモーターに接続…と。



コメント ( 0 )




MWさんからご指摘いただいたマイクロステップ駆動
の実験がしてみたくなりました。

ホントは12月の頭まで忙しいのですが、…いわゆる
現実逃避ってやつでしょうか。簡単にプログラムを
組んで実験がしてみたい…

こういう時に便利なのは何と言ってもarduinoですね。
AVRの内蔵レジスタファイルをあれこれ弄らずとも、
PWMのアナログ出力が超簡単に扱えるので。

arduino公式サイトでは、タイマーを使ったPWM出力
(アナログ出力)は周波数が約490Hzってことなので、
ステッピングモーターを駆動するには必要十分
ではないでしょうか?もうちょっと速い方が
嬉しいんだけど。

問題は、ステッピングモーターも中身はコイル
(インダクタ)なので、インダクタにパルスを
バシバシ入れまくると、電磁誘導で高電圧が発生
しないかなぁってこと。

インダクタの計算、とにかく苦手なんだよなぁ…

PWMの出力をLPF通して、パルスじゃなくて
アナログ値にしちゃえば高電圧の問題は無くなるの
かもしれないけど、この場合、そのアナログ値を
モーターに掛かる電圧に変換する回路が必要に
なるんだろうなぁ。

なんとか簡単にいかないかなぁ…



コメント ( 29 )




しつこいほどに例のコパルのステッピングモーターの続き。
(じつはステッピングモーター大好きっ子なので)


このモーター、ひとたび高速回転するとトルクが
激減しちゃうので、1-2相励磁を使うなんて考えも
しなかったんですが、68Ωタイプの方なら2倍くらい
トルクがあるので、1-1相励磁でも元々それなりの
トルクがあるんだよなぁ…。

なら、減速比がもう少し小さいタイプのモーター
を1-2励磁で動かして振動を減らし、高速回転させる
ときだけ2-2相励磁を使えば高速時のトルク不足を
補うこともできるんではないかなぁ。

やっぱ、68Ωの方のモーター、どこかに売ってない
かなぁ。


そうそう。ステッピングモーターってPWMを上手く
利用すれば1-2相励磁よりももっと微妙な角度に制御
するってことも可能なんじゃないかなぁ?

X→/X→Y→/Yの中間状態を作り出せば良いわけ
なので、Xのコイルに70%、/Xのコイルに30%
のように中間値で振り分けるようにPWM使って
出力を調整したらうまくいかないかなぁ?

などということを何年か前に考えたんですが、当時の
PIC16F873とCCS-Cではそれどころじゃ
なくて実験出来ず仕舞いだったなぁ。

(CCS-Cってセグメントの壁みたいのがあって、
 モジュールサイズがその壁の単位を跨いじゃうと
 コンパイルエラーになっちゃうとか色々な制約が
 あるんですよねぇ… 超面倒くさい)


ユニポーラなら4本の端子があるので、AVRのタイマー
を使って実験するとしたらタイマーの出力端子が4本
…2個のタイマーが必要って事になりますね。
8ビットタイマーで十分だろうから、timer0とtimer2かな。

DCモーターで回転数を制御するよりもこの方がもっと
高精度に調整できると思うんだけどなぁ。
すくなくとも、モーターが「ブーン」って振動することは
無さそうな気がするんだけどなぁ。

まぁ、70%30%にしたからといって、丁度7割の角度
で止まってくれるかは判りませんけど…。




コメント ( 2 )




千石で買ってきたコパル製ステッピングモーターの
トルクのお話。

とりあえず9Vで動かすことを考えると、SPG20-310
(1440ステップ/周)の一番遅いモーター(トルク
が大きいモーター)では、やっぱり速度的にアレかも
しれないので、もう少し速いモーターも欲しいなぁ、
という気持ちに。

ステッピングモーターってちょっと速度上げただけでも
トルクが急速に落ちるので、ステッピングの精度を
劣後させてももう少し速く動かせるモーターも欲しく
なりました。で、再度カタログを眺めてみる…


SPG20-361(360ステップ/周)あたりか、SPG20-290
(720ステップ/周)あたりを今度もう一つ入手
しておきたい。

本当は、あと一回り大きな(トルクの大きな)モーター
が店頭で簡単に買えると良いんだけどなぁ。
このモーター、電流の消費が小さいのはいいんだけど、
トルクが弱いなぁ。

減速ギア内蔵の小型ステッピングモーターって
言う点では凄く便利なんだけどなぁ。
68Ωの方も店頭に並んでいればなぁ…
トルクが一気に2倍近くになるんだけどなぁ。
2相でドライブしても9Vで300mAも流れないはず
だから、乾電池だって動かせるんだけどなぁ。



コメント ( 0 )



« 前ページ 次ページ »