ずらいらと姫の挑戦日記(第58回)~モータを動かそう DCモータ編~
2019-06-24
こんにちは、らずらいと姫です。
前回まではサーボモーターを動かしてきましたが、今回は別の種類のモータであるDCモータを動かしてみたいと思います。サーボモータはパルスの幅で角度を制御するタイプのモータでしたが、DCモータはパルスの幅で回転する速度が変わるタイプのモータになります。ラジコンでいうとサーボモータはハンドルに使われますが、DCモータはモータはタイヤを動かす制御に使用されます。では、早速作ってみましょう。
使用した部品の紹介
今回新たに使用した部品の仕様が載っています。以下のURLからご確認ください。
DCモータ https://www.switch-science.com/catalog/2736/
モータドライバ https://www.switch-science.com/catalog/2422/
回路図
今回もボリュームを使用してモータの回転速度と回転方向を調整できるようにしてみたいと思います。
回路図はこちらのとおりです。
ドライバ | 矢印の色 | 接続先 |
Vcc,Vin | 赤 | 5V端子 |
GND | 黒 | GND |
OUTA,OUTB | 橙 | DCモータ |
INA,INB | 紫 | 8端子、9端子 |
上の表をもとにDCモータ、モータドライバ、ボリュームをLazurit Sub_GHzを下の写真のように繋ぎ合わせてください。
モータ制御ライブラリを使用したプログラムの作成
今回はDCモータを使用するので反転信号の入力も行えるHブリッジ用ライブラリを使用していきたいと思います。
ここで使用したプログラムは下のようになります。
[code language=”c”]
#include dcmoter1_ide.h // Additional Header
void setup() { // put your setup code here, to run once:
hhb.init(0,10230);
hhb.attach(0,8,9);
hhb.start(0);
}
void loop() { // put your main code here, to run repeatedly:
int volt;
volt=analogRead(A0);
hhb.write(0,map(volt,0,1023,-10230,10230));
hhb.update();
delayMicroseconds(10000);
}
[/code]
このプログラムを書きこんでさっそく動かしてみたいと思います。
動きましたが…
あっさりと動いたと思いましたが、ボリュームの値が小さいと、音がしてもモータが動かない領域があります。
ボリュームの値と、PWM出力とモータの動きを図にすると、このような状態になっていることがわかりました。
モータが動けないのに負荷だけかけ続けるのは良くないそうなので、どの値から動くのか調べてみます。
調べるにあたって、ボリュームの値を出力してみました。その結果、実際に動かしてみると値にばらつきがでている気がしましたが、だいたい正回転2500あたり、逆回転は2900あたりで回転し始めることが分かりました。
なお、一度モータが動き出したら、さらに速度を下げても動いてしまいます。その状態でモータを止めると、音だけして動かない状態になってしまいますので、停止している状態から動き出すポイントを探す必要があります。
[code language=”c”]
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
hhb.init(0, 10230);
hhb.attach(0, 8, 9);
hhb.start(0);
}
void loop() {
// put your main code here, to run repeatedly:
int volt;
static unsigned long time = 0;
if ((millis() – time)< 20) {
volt = analogRead(A0);
hhb.write(0, map(volt, 0, 1023, -10230, 10230));
hhb.update();
Serial.println_long(map(volt, 0, 1023, -10000, 10000), DEC);
time = millis();
}
[/code]
このことを考慮してプログラムを-25000から25000の間ではモータを稼働しないように改良します。ここで使用したプログラムは以下になります。
[code language=”c”]
#include dcmoter2_ide.h // Additional Header
void setup()
// put your setup code here, to run once:
hhb.init(0, 10230);
hhb.attach(0, 8, 9);
hhb.start(0);
}
void loop() {
// your main code here, to run rep
volt = analogRead(A0);
motor = map(volt, 0, 1023, -10230, 10230);
if (motor, 2500) {
hhb.write(0, motor);
} else if (motor, -2500) {
hhb.write(0, motor);
} else {
hhb.write(0, 0);
}
delayMicroseconds(10000);
}
[/code]
これでDCモータをボリュームで動かしてみると、動かない領域ではモータを停止させているため安全にDCモータをボリュームで調節できるようになりました。
実際にDCモータを動かした動画がこちらになりますのでご覧ください。
お疲れ様です。今回もお付き合いいただきありがとうございます