ステッピングモーターに、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番が逆に書かれたまま
だったので、訂正しました。
|