Arduino初心者編:DCモータをモータドライバL293Dで制御する

Arduino初心者編:DCモータをモータドライバL293Dで制御する

モータにはいくつか種類がありますが、DCモータは最も単純で基礎的なものです。このDCモータの回転速度や回転方向を手軽に制御するために、DCモータの構造やHブリッジ回路、モータドライバL293Dを使用した回路やプログラム、TINKERCADシミュレーションについて紹介します。

DCモータの構造

ホビー用モーターで最もシンプルでよく使われるのがDCモータです。電池式の扇風機やパソコンの冷却ファンでも使われています。

DCモータは永久磁石の磁界内に配置された回転コイルを介して電流が流れます。電流が流れた事によってコイルに力が発生し、その結果コイルが回転します。力が発生する向きは、電流方向が反対になると反対になります。したがって、モータが回転運動を得るために磁界が発生する向きは、コイルに流れる電流の方向が、摺動(しゅうどう)接点を介して半回転ごとに反転するようにしています。

Hブリッジ回路

DCモータには比較的大きい電流が必要です。工作用モータであれば、100mA~500mA程度が一般的です。そのため、Arduinoの出力端子から直接モーターを動力を動かす事は出来ません。Arduinoの出力電流は20mA程度であり、40mA以上流すと壊れてしまう恐れがあるため注意してください。Arduinoの出力電流不足を補うためにリレーの時に見たような、トランジスタ回路を使用します。リレーの代わりにDCモータを入れればいいのです。パルス幅変調により、電力を調整することでモータ回転速度を調整することもできます。

しかし、この回路では、モータの回転方向を変えることができないので 極性を逆にする必要があります。すなわち、モーターの両極を個別に制御する必要があります。単純にモータ両極を個別のトランジスタ回路の出力ピンに接続して、片方をHIGHに、もう片方をLOWに切り替えれば問題はすぐに解決出来るはずです。

リレー回路のRELAY1をDCモータに置き換えれば良い

モータドライバL293D

次の図はモータドライバL293DというICを使用した回路で、トランジスタ回路を三角形で表しています。入力(1Aまたは2A)がLOWの場合は、出力(3または6)もLOWに切り替わり、入力(1Aまたは2A)がHIGHの場合は、出力(3または6)もHIGHとなります。方向転換するためには、DCモータをL293の端子3と端子6に接続し、入力端子1Aと2AとにHIGHとLOWを交互に印加する事で、モータの回転方向を制御する事が可能です。Hの字に似ていることから、この回路はHブリッジとも呼ばれています。

ドライバー回路図には他にも入力端子があり、そこの部分にはイネーブル(EN)と記されています。モータを動作させる場合は、そこにHIGH信号を印加する必要があります。LOWに設定すると、ドライバの出力が完全にオフになり、ハイインピーダンス(Arduinoの入力ピンのような動作)になります。したがって、イネーブル端子にPWM信号を印加してモータ制御電力を調整できます。

このようなHブリッジ回路は集積回路(IC)として販売されており、Arduinoボードのマイクロコントローラと同じように、外観は黒色のパッケージです。一般的なモデルは先ほど述べたようにL293Dで、4つの独立したドライバを持っており、 2つの独立したモータを制御する事が出来ます。回転方向を変えなければ、4つのモーターを接続しても問題ありません(モーターの片方の線だけをドライバーに接続し、もう片方の線を動作電圧またはGNDに  接続する)。L293Dのもう一つの良い面は、DCモータのインダクタンスの影響を受けて発生するサージ電圧から,ドライバー部分を保護するためにフリーホイールダイオードを内蔵している事です。

DCモータ駆動回路

モータドライバL293Dを使用して、DCモータ駆動回路を作成します。次の例では、ポテンショメータを介してDCモータを制御します。ポテンショメータを一番右まで回したとき、モータは最高速度で回転します。ポテンショメータが中間位置の時はモータ静止します。ポテンショメータを一番左まで回したとき、最高速度で逆方向に回転します。

L293D の 4 つの内蔵ドライバのうち 2 つだけを使用しています。

集積回路(IC)は、ピン番号を正しい位置に合わせるために、片側(ここでは”L293D”の文字の左側)に小さな切り欠きがあります。この切り欠き部にあるピン番号が1で、そこから反時計回りに、2,3,4・・・と数えます。 対応するピン番号は、データシートで確認してみて下さい。

このスケッチでは,ポテンショメータの位置によって正転と逆転を区別し,PWM信号でモータの電力を制御しています。

#define POT  0
#define EN1  3
#define M1A  4
#define M1B  7

int pos = 0;
int MotorPower = 0;
boolean backwards = false;

void setup() {
  pinMode(EN1, OUTPUT);
  pinMode(M1A, OUTPUT);
  pinMode(M1B, OUTPUT);
}

void loop(){
  pos = analogRead(POT);
  
  if(pos >= 512)
  {
    backwards = false;
    MotorPower = (pos-512) / 2;
  }
  else
  {
    backwards = true;
    MotorPower = (511-pos) / 2;
  }   
  
  if(backwards)
  {
    digitalWrite(M1A, HIGH);
    digitalWrite(M1B, LOW);
  }
  else
  {
    digitalWrite(M1A, LOW);
    digitalWrite(M1B, HIGH);    
  }  

  analogWrite(EN1, MotorPower);
}

実際に回路を組んで実験してみると、特に中間のパワーレンジで、わずかにビープ音が聞こえるかもしれません。このビープ音は、Arduinoのパルス幅変調の周波数が人間に聞こえる範囲内にあるためです。パルスが電圧としてしか存在しない限り(調光LEDのように)認識する事は出来ませんが、今回の回路で音が聞こえたのは、モーターを振動させる事で空気に伝わり、可聴化出来るようになったからです。もしかしたら、路面電車や郊外の電車が近づいてきた時に、同じような音を聞いた事があるかもしれません。これらも似たような現象で説明出来ます。

シミュレーション

先ほどの回路をTINKERCADのシミュレーションで動作確認してみてください。ポテンショメータをクリックして、ポテンショメータを回してみると、マルチメータの表示電圧が変わります。それと同時に、オシロスコープでモニタしているPWMの幅も変わります。そのときのDCモータの回転方向や回転数も変わります。

Arduino初心者編カテゴリの最新記事