
昨日から3連休です。
連休だけど特に予定もありません。
昨日は映画行っただけです・・・外出すると余計な金使うから引篭もってます(ぉ
そんな感じで、今日は自宅にこもってArduinoを使った研究&実験な感じです。
今回はステッピングモーターを動作させる回路に挑戦。
最終目標はホップアップモニターの作成なので、モーター駆動の原理をある程度把握しておけば、実機にするときに参考になるだろうということです。
で、今回使うのが「28BJY-48」ってステッピングモーター。

大体、「ULN2003AN」ってトランジスタアレイってICを使ったドライブ回路基盤がついてます。
Arduinoをつかった28BYJの動作回路をググったら、
こちらのサイトにありました。
ステッピングモーターの動作原理とかは、
こちらを参照しました。2-2相励磁ってパルス駆動をつかってみました。消費電力は上がるけど、トルクが増大するらしい。
Fritzingって基盤イラストを作成できるツールを使ってみました。
ただ、うちの環境だと、最新のバージョン0.9.2bが動作しなかったので、0.8.7bのバージョンを使用してます。なぜだろう?・・・VisualStudioのライブラリがコンフリクトしてんだっぺか?
とりあえず、Fritzingってこういう図をスケッチするのに便利。

回路図で言うとこんな感じ。
スイッチに抵抗を使ってデジタル入力をするのですが、これはプルアップ抵抗って呼ばれる方式で、
スイッチがOFFの場合、入力に5V(HIGH)が入力されています。
スイッチがONの場合、入力に0V(LOW)が入力されます。
抵抗を入れていないで単純にスイッチでON/OFFさせると、ショートする事になるので、デジタル回路には良く使われます。

実際はこんな状態ですけどね(ぉ

動作が判り易いように、ステッピングモーターにチノちゃんを乗せてみました(ぇ
2ボタンで、ボタンを押すと、正転・逆転をする単純な仕組みです。
ステッピングモーターだから、本当は角度指定で回したりが出来るはずだけど、今回は練習って事で、単純に回すだけのプログラム(スケッチ)です。
===サンプルスケッチ=================================================
int motorPin1 = 8; // Blue - 28BYJ48 pin 1
int motorPin2 = 9; // Pink - 28BYJ48 pin 2
int motorPin3 = 10; // Yellow - 28BYJ48 pin 3
int motorPin4 = 11; // Orange - 28BYJ48 pin 4
// Red - 28BYJ48 pin 5 (VCC)
int motorSpeed = 800; //速度。数値が小さいほど速くなる。800以下は脱調して動かない
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
// 2-2相励磁のデジタル出力アドレス。
void setup() {
//declare the motor pins as outputs
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
Serial.begin(9600);
}
void loop(){
if(digitalRead(2)==LOW){ //入力スイッチ(2番ピン)が押される
clockwise(); //時計回り関数へ
}
else if (digitalRead(3)==LOW){ //入力スイッチ(3番ピン)が押される
anticlockwise(); //反時計回り関数へ
}
}
//////////////////////////////////////////////////////////////////////////////
void anticlockwise() //反時計回り関数
{
for(int i = 0; i < 8; i++) //加算ループ
{
setOutput(i); //数値を関数に渡す
delayMicroseconds(motorSpeed);
}
}
void clockwise() //時計回り関数
{
for(int i = 7; i >= 0; i--) //減算ループ
{
setOutput(i); //数値を関数に渡す
delayMicroseconds(motorSpeed);
}
}
void setOutput(int out) //2-2相励磁出力関数
{
digitalWrite(motorPin1, bitRead(lookup[out], 0));
digitalWrite(motorPin2, bitRead(lookup[out], 1));
digitalWrite(motorPin3, bitRead(lookup[out], 2));
digitalWrite(motorPin4, bitRead(lookup[out], 3));
// int lookup[8]で設定したアドレス出力を選択
}
=============================================================
まぁ、こんな感じです。
・・・いまいち参考にならないなぁ・・・
C言語自体、久しぶりだから、関数とかメソッドとか色々悩みつつ、解読しつつソースを書いてみましたが、 まだまだ詰められそうな感じ。
ただ、実際にはステッピングモーターを使うか、普通の単相モーターの、ウォームギヤを使ってトルクを稼ぐかは今のところ未定ですが、サーボモーターはちょっと違う気がする。
ウォームギヤってのはこんなやつです。

田宮さんから工作キットで出てます。
速度とトルクを得るにはこれが最適のような気がします。
そうなると、モータードライバICとか使って勉強する必要があるかなぁ?
TA7291Pとか・・・
これ使うと、正転・逆転・ストップ・ブレーキの制御が3chで出来るようになる。
DCモーターを使うなら、やっぱりこれかなぁ・・・
Arduinoで色々電子工作の幅が広がる感じが楽しいです♪
車いじり+マイコンはDIYの可能性が広がります・・・たぶん(ぇ
エーモン工業で満足できないって人向けですけどねw