「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 )