ArduinoでL293Dを使ってDCモーターをPWM駆動しました

ArduinoでDCモーターを制御する方法を学習します

  • 子どものころDCモータと単3の電池2本を使ったプラモデルの車を作って遊んだ記憶があります。プラモデルの中でDCモータと電池が接続されておりスイッチを入れるとDCモータが回転する簡単な構成でした。Arduinoを使ってDCモータの回転方向や速度を制御する方法を学習します。
学習で使用した部品の購入先は?

DCモーターの外形と動作特性は?

  • 模型用のDCモーターは回転中心のシャフト、DC電圧を加える2つのターミナル(端子)と内部の部品を覆っているハウジングのシンプルな外形です。
  • ターミナル間にDC電圧を印加するとシャフトが回転します。印加する電圧の極性を変えるとシャフトの回転方向が変わります。
  • モーターの特性を示すのにモーター特性図(性能曲線図)が使われます。
  • T-N特性 : トルクが大きいと回転数は下がります。(T-N特性は電圧Eによって変動し、電圧が高いと同じ電流でもトルクが大きくなります。)
  • T-I特性 : トルクが大きくなると電流が増えます。(T-I特性は電圧Eの変化に依存しません。)

DCモーターの駆動の注意点

  • DCモーターは製品によって使用電圧範囲が異なり、指定された電圧で駆動しなければなりません。
  • 購入した[Arduino用のUNO R3 最終版スタータキット]にDCモーターの説明書が付属しています。Adfruit社のモーターのようです。(製造は別の会社だと思いますが..) 使用電圧は、4.5Vから9Vとなっています。(この仕様は、電流を多く使用する3V仕様のモータよりも、5Vまたは9Vは、通常は利用しやすいだろうから、と書かれています。)
  • このモータをDC 6Vで動作させた場合は、10gcmの負荷で最大250mAの電流が消費されると記載されています。

ArduinoでDCモーターを操作する回路構成は?

  • Arduino UNO R3のI/Oピンから取り出せる電流の最大値は20mAですからDCモータの直接駆動はできません。DCモータをArduino UNO R3に直接接続して駆動させようとするとArduino UNO R3は壊れる可能性があります。
  • DCモーターを駆動するには、DCモータの駆動ICをArduino UNO R3とDCモーター間に追加して多くの電流が取り出せるようにします。DCモータの駆動ICとしてL293Dを使用しました。DCモーター駆動用の電源はArduino UNO R3用の電源とは別に準備します。下図であれば、9Vの電池を駆動IC用電源回路に接続し、DCモータの駆動IC用の電流を供給します。
  • Elegoo社の駆動IC用電源回路のFritzing用のデータがWebで見つかりましたので使わさせて頂きました。

DCモーターを操作する駆動IC用電源回は?

  • DCモーター駆動IC用電源回路にElegoo社の電源回路を使用しています。駆動ICによっては9Vの電池をそのまま接続してもモーターは回転しますが、電池の電圧が低下すると回転数が変わってしまいます。
  • On/Off スイッチが装備されている
  • 電源ON時に LEDが点灯する
  • 入力電圧はDC 6.5-9Vであり、入力プラグの形状は5.5mm x 2.1mm
  • 出力電圧は3.3Vまたは5V(ジャンパで設定する)
  • 最大出力電流は 700 mA
  • 外部5V出力用にUSBコネクタを装備
  • ブレッドボードに直接差し込んで使用できる

DCモーター駆動用IC (L293D)の仕様は?

PIN名称PIN番号機能
1,2 EN1ドライバーチャネル1と2を有効にする
<1:4> A2, 7, 10, 15ドライバー入力
<1:4> Y3, 6, 11, 14ドライバー出力
3,4 EN9ドライバーチャネル3と4を有効にする
GROUND4, 5, 12, 13グランド
VCC116内部ロジック用 5V入力
VCC28ドライバー用電圧 (4.5V~36V) 入力

Arduino UNO R3との接続は?

  • 回路図(配線図)に従って、Arduino UNO R3、駆動用IC、駆動IC用電源回路、DCモーターを接続します。

PWM駆動方式とは?

  • DCモーターの回転数を変化させるには、ターミナル(端子)に印加するDC電圧の大きさを変化させます。
  • DC電圧を変化させる代わりに、DCモーターを駆動する電圧をパルス状にしてパルス間隔を変化させる方法があり、PWM(Pulse Width Modulation) パルス幅変調と言います。
  • DCモーターのモーター特性図から、電圧を上げれば回転数が上がり、電圧を下げれば回転数が下がることが解ります。
  • PWM駆動では、デューティ-サイクルを上げれば回転数が上がり、デューティ-サイクルを下げれば回転数が下がります。

ArduinoでPWM駆動する方法は?

  • Arduino UNO R3にはPWMを出力する機能が備わっています。Arduino IDEにはPWM波形を出力する関数が備わっており、スケッチでその関数を呼び出せば設定したポートからPWM波形が出力されます。
  • PWM出力のできるArduino UNO R3の端子とPWM周波数です。ボードにポート番号が印刷されています。PWM波形が出力できるポート番号の前に’~’が加えられています。
PIN 番号PWM 周波数
3, 9, 10, 11490 Hz
5, 6980 Hz
  • PWMを出力する関数は、analogWrite(pin, value) です。
  • pinでPWMを出力するpin番号を設定します。変数を使う場合は、int型です。
  • valueでデューティ-サイクルを設定します。0~255の数値で設定し、0の場合はデューティ-サイクルが0%、255の場合はデューティ-サイクルが100%になります。
analogWrite(5, 128);
  • 5pinにデューティ-サイクルが50%の波形を出力した例です。

ArduinoでL293DをPWM駆動する方法は?

  • L293Dの1ピンはドライバーチャネル1,2を有効にする機能がありました。HighならDCモータに電圧が供給されモータは回転し、LowならDCモータへは電圧は供給されません。1ピンにPWM波形を入力すると、PWM波形がHighの時にDCモータが回転する回路になります。PWM波形のデューティ-サイクルが高いほど速く回転します。
  • 2ピン、7ピンはHigh、Low又はLow、Highの組み合わせで使い、DCモーターのターミナル(端子)への印加電圧の極性を変えることで回転方向を変えることが出来ます。
L293D ピン番号機能・使い方Arduino接続ピン番号
1PWM波形を入力5
2DCモーターの回転方向を決める (HighまたはLow)4
7DCモーターの回転方向を決める (HighまたはLow)3
3, 6DCモータ-への出力
8DCモーター用電圧入力
16L293D内部回路用電圧(5V)入力

DCモーターを駆動するスケッチは?

  • 駆動IC(L293D)をPWM波形で制御し回転速度を変化させるスケッチを作成します。
  • PWM波形のデューティ-サイクルを設定しDCモーターを回転させます。
  • DCモーターの回転方向を変え、DCモーターを回転させます。
  • DCモータの説明書では、使用電圧範囲は、4.5Vから9Vと記載されています。実際はどの程度デューティ-サイクルから動作するか調べてみます。
  • analogWrite(ENABLE,200); //Duty Cycle Settingのラインの数字を変えてデューティ-サイクルを設定します。
//To operate a DC motor with L293D

#define ENABLE 5
#define DIRA 3
#define DIRB 4

int i;
 
void setup() {
  //ピンモードを設定する
  pinMode(ENABLE,OUTPUT);
  pinMode(DIRA,OUTPUT);
  pinMode(DIRB,OUTPUT);
  //シリルモニタ開始
  Serial.begin(9600);
}

void loop() {
  //---回転速度の変更
  Serial.println("Rotation CW");

  //---回転方向の設定
  digitalWrite(DIRA,HIGH);
  digitalWrite(DIRB,LOW);

  //---Duty Cycleの設定
  analogWrite(ENABLE,200); //Duty Cycle Setting
  delay(5000);
  digitalWrite(ENABLE,LOW); //回転停止
  delay(5000);

  //---回転速度の変更
  Serial.println("Rotation CCW");

  //---回転方向の設定
  digitalWrite(DIRA,LOW);
  digitalWrite(DIRB,HIGH);

  //---Duty Cycleの設定
  analogWrite(ENABLE,200); //Duty Cycle Setting
  delay(5000);
  digitalWrite(ENABLE,LOW); //回転停止
  delay(5000);
}
  • 購入した[Arduino用のUNO R3 最終版スタータキット]に付属していたDCモーターはデューティ-サイクルが150程度から回転を始めました。5Vの電圧ですから、5 x 150 / 255 = 2.94Vで回転を始めることになります。でも回転開始の動きが遅いなど動きは不安定でした。
  • DCモーターの説明書に従って、4.5Vを動作の最低電圧と考えると、最低のデューティ-サイクルは、255 x 4.5 / 5 = 230になります。最大が255なので、それほど変化させる余裕はありません。DCモーター駆動用の電源電圧を5Vから9Vに変えれば変動させる範囲は広がります。
  • DCモーターを回転させるスケッチはそれほど難しくはありませんでしたが、DCモーターを回転させるには周辺回路に専用の駆動回路等が必要になることが学習できました。

PWM波形の変化させてDCモーターの回転数を測定しました

  • タコメーターを作成しサーボモータの回転数を測定する方法を[Arduinoの割込み関数を使ってサーボモーターの回転速度を測定しました]にまとめました。作成した治具を使って、DCモーターの回転数を測定しました。
  • DCモーターの駆動電圧は5Vです。測定した回転数は、DCモーターの説明書の回転数と比較しても妥当な値で測定できました。
  • DCモーターの説明書では、4.5V以上の使用電圧となっています。製品のバラツキや温度特性などを考慮しての余裕度だと思います。
  • 電圧値は実測値ではありません。5Vを100%デューティーサイクルとした場合の計算値です。
  • DCモーターの回転数はかなり高いので、用途にもよりますがこのままの回転数で使うのは難しく、例えば車輪の回転に使う場合は減速ギアを含んだギヤードモーターを使用するのが良いのだろうと感じました。

ご質問、誤植の指摘などありましたら。「問い合わせ 」のページからお願いします。