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);
アナログの値を与えることで、回転の速さを調整。
レゴブロックでモーター置き場を作りました!
ELEGOO Lesson 29 pic.twitter.com/GdsUhTiQD8
— Nochi (@shikarunochi) 2019年6月23日
それっぽくは動作したのですが、プログラム中の「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"); } */ }
ELEGOO Lesson 30-1 pic.twitter.com/eXf4wVGfGU
— Nochi (@shikarunochi) 2019年6月23日
とはいえ、プログラムが間違ってるのか、自分の理解が間違っているのか、少々自信がないところ…。