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(); // モータを回す }