Arduinoを使ったDCモータ制御

オープンソースマイコン基板Arduino UNOを使ってブラシ付きDCモータを回したいと思います。Arduino UNOのプロセッサはATmega328で非力なのですが、手軽に動かせるため電子回路の動作確認によく使います。

(1) まずは、Arduino UNOのソフトウェア開発環境をインストールします。



Arduino公式サイトArduino - HomeからArduino IDEをダウンロードし、パソコンのフォルダに展開します。

続いてUSBケーブルを使ってArduino UNO基板をパソコンに接続します。


Arduino UNO基板がパソコンからシリアル通信ポートとして見えるため、動かすにはArduino IDEの設定を行い、該当シリアル通信ポートにアクセスする必要があります。Arduino UNO基板をパソコンに接続した状態で、Arduino IDEの展開フォルダからarduino.exeを起動して、メニュー「ツール→シリアルポート」からArduino UNO基板を指定します。







(2) Arduino UNOを使ったLED点灯で動作確認します。



Arduino UNO基板からUSBケーブルを一旦外し、LEDと接続します。LEDの長い脚がプラスで、短い脚がマイナスとなるため、長い脚をArduino UNOの13番デジタルポート、短い脚をGNDに接続します。

Arduino IDE上で以下のコードを記述し、メニュー「スケッチ→検証・コンパイル」でビルドし、メニュー「スケッチ→マイコンボードに書き込む」でマイコンボードにコードを書き込みます。







#define LED 13

void setup() {
  pinMode(LED, OUTPUT);      // 13番ピンが出力として定義
}

void loop() {
  digitalWrite(LED, HIGH);   // 13番ピンに1を出力してLED点灯
  delay(1000);               // 1秒待つ
  digitalWrite(LED, LOW);    // 13番ピンに0を出力してLED消灯
  delay(1000);               // 1秒待つ
}

こうすることによって、Arduino UNOにつながるLEDは1秒周期で点灯することが確認できます。


(3) HブリッジコントローラL298Nを使ってDCモータを制御します。



L298Nは、ST製のダブルHブリッジモータドライブであり、二つのHブリッジ回路を内包するため、二つのDCモータを同時に制御可能なようになっています。In1、In2とEnAは、モータ1に対応するモータドライブの制御入力であり、OUT1、OUT2は、モータ1に印加する電圧となります。また、In3、In4、EnB、OUT3、OUT4はモータ2に対応する信号となります。

L298Nの電気的仕様は以下のようになります。
論理電圧: 5V
駆動電圧: 5V-35V
駆動電流: 2A
最大消費電力: 25W


各制御信号の用途は下記表のようになります。

In1 In2 EnA モータ1
1 0 1 正転
0 1 1 逆転
don't care don't care 0 停止


In3 In4 EnB モータ2
1 0 1 正転
0 1 1 逆転
con't care don't care 0 停止



EnA、EnBポートに0を与えている間、モータには電源が繋がれず、慣性で回ることになります。このことを利用してEnA、EnBポートにPWM信号を流すことによってモータの回転速度を制御することが良く行われます。




制御対象のDCモータは
駆動電圧: 3V-12V (通常6-8V)
最大出力トルク: 800pf cm(3V印加時)
駆動電流: 70mA, MAX: 250mA (3V印加時)
なので、6Vで駆動してみます。








Arduino IDE上で以下のコードを記述し、Arduino UNOにダウンロードして二つのDCモータを動かします。

#define ENA  10
#define IN1 9
#define IN2 8
#define ENB 5
#define IN3 7
#define IN4 6

void setup() {
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}

void spinMotor() {
  digitalWrite(IN1, HIGH);   // 
  digitalWrite(IN2, LOW);    // モータ1を正転
  analogWrite(ENA, 200);     // Duty 78.4%でモータ1を回転させる
  digitalWrite(IN3, HIGH);   // 
  digitalWrite(IN4, LOW);    // モータ2を正転
  analogWrite(ENB, 200);     // Duty 78.4%でモータ2を回転させる
  delay(2000);               // 2秒待つ

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);  // モータ1を逆転
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);   // モータ2を逆転
  delay(2000);               // 2秒待つ

  digitalWrite(IN1, LOW);   
  digitalWrite(IN2, LOW);  // モータ1を停止
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);  // モータ2を停止
  delay(1000);               // 1秒待つ
}

void loop() {
  spinMotor();          // モータを回す
}