SPG20-332 + MP4401 その2
2012.06.28 · 778 words · 2 minute read
Arduinoでステッピングモータ SPG20-332を回すやつの続き。
葉山先生の華麗なるアルミ板とPOM板加工によって上の写真(左)のような状態に。
卓球のピンポン球に絵を描くということでピン球botと命名され、あとを任されました。
ボールを回転させる軸とペンの向きを変える軸の2軸なので、少し接続を変更。
pin 4〜7に接続したステッピングモータをボールの軸、pin 8〜11に接続したステッピングモータをペンの軸とする。
ATmega168/328のI/OポートはB、C、Dの3つで、port Bがpin 8〜13、port Cがpin A0〜A5、port Dがpin 0〜7となっている。
ローレベルかつ高速に制御したい時は、これらのポートのコントロールレジスタを直接いじってあげれば良い。→Reference/PortManipulation
(というのも、前回の記事で載せた方式で制御しようとすると励磁する速度の問題で細かい振動が発生するっぽいので)
プログラムはこんな感じで。
#include <Servo.h>
const byte motorPen[]={0x03,0x06,0x0C,0x09}; //PortBの励磁パターン
const byte motorBall[]={0x90,0xC0,0x60,0x30}; //PortDの励磁パターン
Servo servoPen;
void setup(){
DDRB |=B00001111; //PortB 8,9,10,11
DDRD |=B11110000; //PortD 4,5,6,7
servoPen.attach(3);
}
void loop(){
for(int n=0;n<20;n++){
servoPen.write(100);
for(int i=0;i<4;i++){
PORTB &=0xf0;
PORTB |= motorPen[i];
PORTD &=0x0f;
PORTD |= motorBall[i];
delay(8);
}
}
for(int n=0;n<20;n++){
servoPen.write(115);
for(int i=3;i>=0;i--){
PORTB &=0xf0;
PORTB |= motorPen[i];
PORTD &=0x0f;
PORTD |= motorBall[i];
delay(8);
}
}
}
DDRB |= B00001111でポートBの下位4ビット(pin 11,10,9,8)を出力に設定。
DDRD |= B11110000でポートDの上位4ビット(pin 7,6,5,4)を出力に設定。
PORTBとPORTDを初期化し、あらかじめ定義しておいたモータの励磁パターンを投げてあげるという仕組み。
サーボはペンの持ち上げに使用。
これで、以下の動画のように動作する。
行き(右から左)はペン先をボール表面に降ろし、帰り(左から右)はペン先を持ち上げています。
次は起動時のゼロ点補正機構と、座標指定で描いてくれるようなプログラムを作っていきます。