ArduinoとMini L298Nモータードライバーでモーターを制御する

Arduinoでモーターの制御がしたく、Mini L298NというDCモータードライバーを使ってみました。

トランジスタやら使う方法もあるようなのですが、パーツを組み合わせるだけで使えることと、何より速度制御が行えるということでMiniL298Nを使ってみました。

用意するもの

ものはすべてAliexpressで揃えました。
到着が遅かったりしますが、めちゃくちゃ安いです。

Aliexpressの商品は品質トラブルが多いのですが、電子部品はあまり問題ないようです。
買う人が厳しくチェックするので、すぐ淘汰されるんでしょうね。

スターターキット

私は初めから目的が決まっていたので部品をバラで買いましたが、これからArduino始める人はAmazonあたりでスターターキットを買うのがいいと思います。

Arduino スターターキット」で検索すればいくつか出てきます。
その中でモーターが含まれているやつを買えばいいはずです。

スターターキットもAliexpressのほうが安いのですが、届くの長いとやる気が失せてしまいますから。

Arduino Uno

s.click.aliexpress.com

Arduinoにもいろいろ種類があるようなのですが、一番標準的なのがこのUnoです。
スターターキットとかについてくるのもこれですね。

Unoを買っておけば間違いないと思います。

Arduino公式サイトのUnoのページ

Windowsで互換品のArduinoを認識できないときは

Aliexpressで買うと安いのですが、私が買ったやつは互換品だったせいか、Windowsで使うにはUSBドライバをインストールする必要がありました。

もしWindowsArduinoが動かなくて、デバイスマネージャーでUSB2.0のエラーがあったら、下記サイトよりUSBドライバーをダウンロードしてインストールしてください。
一応VirusTotalで調べてみましたが、何年も前からあるドライバーで問題もなさそうでした。

公式のUSBドライバーダウンロードページ(中国語)

バージョンはCH341serというので大丈夫でした。
ほかのバージョンでも大丈夫かもしれません。

Mini L298N

https://s.click.aliexpress.com/e/_9ASWzMs.click.aliexpress.com

DCモータードライバー(DCモーターコントローラー)です。
モーターをコントロールしてくれるやつです。

これ1つで2つのモーターを別々に制御できます。
回転方向と速度の調整が可能です。

2相4線のステッピングモーター1つの制御もできると書かれています。

L298N(こちらでも可能)

ja.aliexpress.com

L298NというMiniがついていないドライバーです。
Mini L298Nはこの製品の低価格版という位置づけのようです。

許容できる電圧や電流が大きく、なによりはんだ付けが不要です。
ICチップに放熱板がついていて、見た目にも高そうです。

つなぎ方が少し違うのですが、L298Nの記事はたくさんあるのでそちらを参照してください。
↓例えばこちら

DCモータコントローラを使って複数のモータを制御する | 物を作る者

MB102 または電池

https://s.click.aliexpress.com/e/_AWXTtCs.click.aliexpress.com

ブレッドボード用電源モジュール(MB102)も用意します。

ArduinoのI/O pinの出力は5V 20mAなのでモーターの電力をI/O pinから取ると過電流でArduinoが壊れてしまいます。
そこで電源モジュールから電力を取ります。

電池数本でも代替可能です。

この電源モジュールは700mAの出力を持つので、モーターも動かせます。

といっても無理は禁物で、私はこれで一度にたくさんモーターを動かそうとして壊してしまいました。

煙を吐いてお亡くなりに… 燃えなくてよかった。

正しいかわかりませんがモーターが5Vの電圧に対応していたので、そのあと電源は5V 2.4AのUSB電源アダプターから直接取ってしまいました。

モーター

電源モジュールを使うなら、3Vか5Vに対応するDCモーターならなんでもいいです。

適当な何かで。

Aliexpressでも探せますし、ミニ四駆のモーターは3Vなのでそれでもいけます。

ケーブルとブレッドボード

s.click.aliexpress.com

https://s.click.aliexpress.com/e/_AWibf8s.click.aliexpress.com

パーツをつなぐのに必要です。

ブレッドボード図

下図のような感じで接続していきます。

Mini L298Nをブレッドボードに乗せるには、ピンをはんだ付けする必要があります。

モーターの適正電圧に合わせて、電源モジュールの3Vと5Vのジャンパーピンを差し換えてください。

モーター1個の配線例

モーター2個の配線例

私は電源モジュール壊したり、Mini L298Nを直接ケーブルとはんだ付けしたりしたのでブレッドボード使っていません。
下のモーター2個のが電池式なのは、電源モジュールだと壊れるかもしれないからです。

プログラム

ArduinoC++言語でプログラムできます。

クラスとかも普通に使えるみたいです。

公式リファレンス

最大出力で使う

単にモーターをON/OFFできればよいのであればdigitalWrite()を使います。

回転、停止、逆回転、停止を1秒ずつ行い繰り返すサンプルです。

const int out1 = 11;  // 11番のI/O pin
const int out2 = 10;  // 10番のI/O pin


void setup() {
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
}

void loop() {
  // モーターを回転させます
  digitalWrite(out1, HIGH);
  delay(1000);  // 1秒そのまま
  
  // モーターを停止させます
  digitalWrite(out1, LOW);
  delay(1000);
  
  // モーターを先ほどとは逆方向に回転させます
  digitalWrite(out2, HIGH);
  delay(1000);  

  // モーターを停止させます
  digitalWrite(out2, LOW);
  delay(1000);
}

速度調整して使う

速度を調整したいのであればanalogWrite()を使います。
出力電圧を256段階で調整できます。
例えばUnoなら0~5Vを0~255の範囲で調整できます。
モーターの電源の電圧が違えば、その範囲での調整となります。 (例えば9Vの電池を使うなら0~9Vの範囲で調整されます)

アナログ出力(PWM)に対応したPIN(3,5,6,9,10,11番)を使う必要があります。
analogWrite()の解説ページには「PIN5,6はちょっと電圧高く出るかもよ」みたいなことが書かれています。

出力半分、最大、停止を1秒ずつ行い繰り返すサンプルです。

const int out1 = 11;  // 11番のI/O pin
const int out2 = 10;  // 10番のI/O pin


void setup() {
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
}

void loop() {
  // モーターを半分で回転させます
  analogWrite(out1, 127);
  delay(1000);  // 1秒そのまま
  
  // モーターを最大で回転させます
  analogWrite(out1, 255);
  delay(1000);
  
  // モーターを停止させます
  analogWrite(out1, 0);
  delay(1000);
}

2個同時に使う

モーター2個をバラバラに制御できます。

const int out1 = 11;  // 11番のI/O pin。モーターA
const int out2 = 10;  // 10番のI/O pin。モーターA
const int out3 = 9;   // 9番のI/O pin。モーターB
const int out4 = 8;   // 8番のI/O pin。モーターB


void setup() {
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(out3, OUTPUT);
  pinMode(out4, OUTPUT);
}

void loop() {
  // モーターAとモーターBをどちらもフル回転させます。
  digitalWrite(out1, HIGH);
  digitalWrite(out2, LOW);
  digitalWrite(out3, HIGH);
  digitalWrite(out4, LOW);
  delay(1000);

  // モーターBはそのままで、モーターAのみ逆回転させます。
  digitalWrite(out1, LOW);
  digitalWrite(out2, HIGH);
  delay(1000);

  // モーターAの出力を約3分の2にします。モーターBは約3分の1にします。
  analogWrite(out2, 170);
  analogWrite(out3, 85);
  delay(1000);
}

終わりに

電子工作はさっぱりなのですが、なんとかできてしまいました。
Arduinoすごい

Mini L298Nの使い方を書いた記事が検索してもなかったので書きましたが、知識が浅いので間違っている箇所があるかもしれません。
その場合はご指摘いただけると幸いです。