ELEGOO:Lesson 29,30 DC motors,Relay

Lesson 29 DC Motors

モータを制御します。モータは大きな電流が流れるので、直接Arduinoからの信号で制御せずに、制御ICを経由して制御します。制御ICとして、L293D を使います。

モータを動かす電源は Arduino からではなく、別途電源を用意します。

電源ユニットはブレッドボードの横幅にピッタリのサイズで、上下のラインに電源を供給することができます。
ジャンパピン設定で、5V / 3.3V を上下個別で選択可能です。

プラスが赤ライン、マイナスが青ラインなので向きを合わせて。

モータ制御に使う L293D は、1つで2個のモータを制御可能です。今回はモータは1つだけですね。

1~8番ピンがモータ1用、9~16番ピンがモータ2用です。

PWMに入れる数字(0~255)で、モータの強さを設定して、directon 0/1 と direction 1/0 で、モータの回転する向きを制御します。

//---back and forth example
Serial.println("One way, then reverse");
digitalWrite(ENABLE,HIGH); // enable on
for (i=0;i<5;i++) {
  digitalWrite(DIRA,HIGH); //one way
  digitalWrite(DIRB,LOW);
  delay(500);
  digitalWrite(DIRA,LOW); //reverse
  digitalWrite(DIRB,HIGH);
  delay(500);
}
digitalWrite(ENABLE,LOW); // disable
delay(2000);

DIRA と DIRB の HIGH / LOW を入れ替えることで、回転の向きを変更。

Serial.println("PWM full then slow");
//---PWM example, full speed then slow
analogWrite(ENABLE,255); //enable on
digitalWrite(DIRA,HIGH); //one way
digitalWrite(DIRB,LOW);
delay(2000);
analogWrite(ENABLE,180); //half speed
delay(2000);
analogWrite(ENABLE,128); //half speed
delay(2000);
analogWrite(ENABLE,50); //half speed
delay(2000);
analogWrite(ENABLE,128); //half speed
delay(2000);
analogWrite(ENABLE,180); //half speed
delay(2000);
analogWrite(ENABLE,255); //half speed
delay(2000);
digitalWrite(ENABLE,LOW); //all done
delay(10000);

アナログの値を与えることで、回転の速さを調整。

レゴブロックでモーター置き場を作りました!

それっぽくは動作したのですが、プログラム中の「fast Slow example」の内容がイマイチ理解できませんでした。

Serial.println("fast Slow example");
//---fast/slow stop example
digitalWrite(ENABLE,HIGH); //enable on
digitalWrite(DIRA,HIGH); //one way
digitalWrite(DIRB,LOW);
delay(3000);
digitalWrite(ENABLE,LOW); //slow stop
delay(1000);
digitalWrite(ENABLE,HIGH); //enable on
digitalWrite(DIRA,LOW); //one way
digitalWrite(DIRB,HIGH);
delay(3000);
digitalWrite(DIRA,LOW); //fast stop
delay(2000);

3秒回転させて、1秒回転止めて、逆向きに3秒回転させて…の後の

digitalWrite(DIRA,LOW); //fast stop

これで、なんで fast stop になるのか…?ちょっと上の行で、すでに DIRA に LOW 書いてるので、何も変化起きないんじゃないでしょうか。(実際、起きてなさそう。)

fast stop ってコメントなので、一瞬逆回転させることによって fast stop させるのかな?と思ったのですが、このプログラムだとそういうふうには、ならないですよねえ…。

考えても分からなさそうなので、ここはこれでOKにします!


Lesson 30 Relay

リレースイッチです。

内部に電磁石が入ってて、それに電気を流すか流さないかで、物理的に、カチッカチッて感じで接続が切り替わります。

足の幅がブレッドボードと微妙に合わないので、ちょっと曲げて差し込んでください…とのこと。

結構無理やり…。端子まで届いてるかな?

足は5本。

ブレッドボードに差し込むために、曲げてしまった状態です。

下側の左右2本に電流が流れると、リレーがONになります。リレーON時の場合、下の真ん中と左上側が接続され、リレーOFFの場合、下の真ん中と右上側が接続されます。(あっ、上から見たら逆になりますね)

モータードライバーを使ってリレーを制御して、リレーを使ってモータを制御しています。おもしろい。

プログラムを見ると、モータの回転方向を切り替えることができるっぽい記述でした。でもリレーってON/OFFしかできないはずなので、反対向きに回るとか、できそうにないですよね…。

…と思って実行してみると、やはりモーターは同じ方向に回転し続けるだけ。リレーはカチカチ鳴ってて、内部的な電流の方向は変わってるようなのだけど、どっち向きにしろ電流が流れたらリレーはONになりますからね。つまり、ずっとONのままです。Lesson 29 DCモーターのプログラムをコピーして、変更するのを忘れてるっぽい気がします。

これだと面白くないので、ON/OFF繰り返すようにプログラム変更します。

void loop() {
//修正後
  digitalWrite(ENABLE,HIGH); // enable on
  digitalWrite(DIRA,HIGH); //one way
  digitalWrite(DIRB,LOW);
  delay(800);
  digitalWrite(ENABLE,LOW); //disable
  delay(800);

//修正前
/*
  //---back and forth example
  Serial.println("One way, then reverse");
  digitalWrite(ENABLE,HIGH); // enable on
  for (i=0;i<5;i++) 
  {
    digitalWrite(DIRA,HIGH); //one way
    digitalWrite(DIRB,LOW);
    delay(800);
    Serial.println("front");
    digitalWrite(DIRA,LOW); //reverse
    digitalWrite(DIRB,HIGH);
    delay(800);
    Serial.println("back");
  }
*/
}

とはいえ、プログラムが間違ってるのか、自分の理解が間違っているのか、少々自信がないところ…。