ArduinoとL293Dを使ってDCモーターをPWM駆動する方法

この記事で学習できること

Arduinoを使ってDCモータの回転方向や速度を制御する方法を学習します。

  • DC モーターの基本原理
  • Arduino で制御するために必要な部品
  • L293D の仕様
  • L293DでPWM駆動を実現する
  • 配線図とサンプルコード
  • よくあるトラブルと対処法
(参考) ArduinoとTB6612FNGを使ってDCモーターをPWM駆動する方法

TB6612FNGの使用方法を[ArduinoとTB6612FNGを使ってDCモーターをPWM駆動する方法]にまとめています。

学習で使う部品は?

Arduino, DCモータ、ドライバなどを準備します。

Arduino UNO R31 個
DC モータ1 個
モータードライバ( L293D)1 個
外部電源(9Vバッテリー)1 個
ブレッドボード、接続用線材1 式

部品の購入先

Arduinoの電子工作をはじめようと思ったらスターターキットを購入するのが便利です。この記事に必要な部品はL293D、電源ボード、モータ、Arduino UNO R3などを含めて全て付属しています。

(広告) Arduino スターターキット
購入先製品備考
AmazonArduino用のUNO R3 最終版スタータキットArduino UNO R3を含み、ブレッドボード、IC、センサなどが含まれています

DCモーターの構成と動作特性は?

  • 模型用のDCモーターは回転中心のシャフト、DC電圧を加える2つのターミナル(端子)と内部の部品を覆っているハウジングのシンプルな外形です。
  • ターミナル間にDC電圧を印加するとシャフトが回転します。印加する電圧の極性を変えるとシャフトの回転方向が変わります。
DCモーターの構成
— 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モーター説明書の例
— DCモーター説明書の例 —
  • このモータをDC 6Vで動作させた場合は、10gcmの負荷で最大250mAの電流が消費されると記載されています。
DCモーター仕様の例
— DCモーター仕様の例 —

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モータを駆動させる部品接続
— DCモータを駆動させる部品接続 —

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モーター用電源回路
— DCモーター用電源回路 —

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

L293D ピン配置と内部ブロック図
— 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モーターを接続します。
DCモータ駆動回路の実際の配線図
— DCモータ駆動回路の実際の配線図 —

PWM駆動方式とは?

  • DCモーターの回転数を変化させるには、ターミナル(端子)に印加するDC電圧の大きさを変化させます。
  • DC電圧を変化させる代わりに、DCモーターを駆動する電圧をパルス状にしてパルス間隔を変化させる方法があり、PWM(Pulse Width Modulation) パルス幅変調と言います。
PWM波形例
— PWM波形例 —
  • 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%の波形を出力した例です。

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)入力
L293Dのピンの機能
— L293Dのピンの機能 —

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

  • 駆動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);
}
  • 今回使用したDCモーターはデューティ-サイクルが150程度から回転を始めました。5Vの電圧ですから、5 x 150 / 255 = 2.94Vで回転を始めることになります。でも回転開始の動きが遅いなど動きは不安定でした。
  • DCモーターの説明書に従って、4.5Vを動作の最低電圧と考えると、最低のデューティ-サイクルは、255 x 4.5 / 5 = 230になります。最大が255なので、それほど変化させる余裕はありません。DCモーター駆動用の電源電圧を5Vから9Vに変えれば変動させる範囲は広がります。

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

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

よくあるトラブルと対処法

モーターが動かない配線の確認、駆動ICの制御ピンの操作を確認
逆回転しない駆動ICの制御ピンの操作を確認
電源が落ちる電源の配線を確認
ドライバが熱くなるDCモータの消費電流仕様の確認

まとめ

  • DCモータを駆動する基本知識を学習できました。またDCモータ駆動には専用の電源回路が必要と解りました。実際の設計にはまず仕様を確認してからの設計が必要と改めて感じました。

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