モータードライバL298Nを使う。

こんにちは、こんばんは
モータードライバをarduinoで使っていきたいと思います。
 

 必要な部品 

・Arduino Uno 
・モータードライバー(L298N) 
・モーター(DC0~12Vの間までで駆動するもの)
・外部電源(DC0~12Vまで) 
・ジャンパ線とミノムシクリップ、ワニ口クリップ 

部品の解説

このブログを書くにあたってL298Nのブログを調べました。
fritzingで分かりやすく解説しているブログがあまりなかった印象だったのでfriztingの図を使っていきたいと思います。
そしてここではL298Nのモジュールの解説をします。 
手っ取り早くスペックを知りたい人はデータシートを読んでください。
 
まず下の図がL298Nのモジュールの図になります。
そして図の下にある表がピンアサイン(ピンの役割と配置)になります。
ピン名 入力/出力 ことがら
OUT1 出力 モーターAの出力
OUT2 出力 モーターAの出力
OUT3 出力 モーターBの出力
OUT4 出力 モーターBの出力
12V 入力 0~12Vの電源入力
GND
0Vの入力
5V 出力 5Vの出力
5V s 出力 5Vの出力
ENA 入力 モーターAのPWMの入力
ENB 入力 モーターBのPWMの入力
IN1 入力 モーターAの正逆回転の信号入力
IN2 入力 モーターAの正逆回転の信号入力
IN3 入力 モーターBの正逆回転の信号入力
IN4 入力 モーターBの正逆回転の信号入力
 
  • 5Vと5Vs(小さいピンのほう)はL298Nから電源を取り出してArduinoで使いたいときに使用します。ですが外部電源を入力する必要があります。
  • モーターA、Bは回路の図に記入してあります。
  • PWMで制御したい場合はENAとENBの結線を外してPWM信号を入力します。 
  • PWMを使わない場合は5VsとENA、ENBを結線します。 
  • 12Vピンは最大12Vと書いてありますがカタログスペック上は50Vが最大です。
  • ピーク100μ秒以下であれば3Aまでそれ以上は2A、電力最大は25W

回路 

モーターを一つ使うか2つ使うかによってケーブルのつなげ方が変わります。

モーター1つの場合↓

モーター2つ場合↓

IN1、IN2はモーターのケーブルと色が同じなので間違えないように注意してください。
 

プログラム

モーター一つ(PWMあり)

#include <Arduino.h>

#define ENA 26
#define IN1 25
#define IN2 33

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

void loop(){
  //Aモーター正転 徐々に加速
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  for(int i = 0; i<255; i++){
    analogWrite(ENA, i);
    delay(10);
  }
  //Aモーター ブレーキ 両極をLOWにすることによって惰性(ニュートラル)になる
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  //ENAをLOWにすることによって回転に対する抵抗する電圧を与えない
  digitalWrite(ENA, LOW);
  delay(2000);
  
  //Aモーター正転 徐々に減速
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  for(int i = 255; i>0; i--){
    analogWrite(ENA, i);
    delay(10);
  }
  
  //Aモーター ブレーキ 両極をHIGHにすることによってブレーキになる
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, HIGH);
  //ENAをHIGHにすることによって回転に対する抵抗する電圧を与える
  digitalWrite(ENA, HIGH);
  delay(2000);
}
 

モーター二つ(PWMあり)

#include <Arduino.h>

#define ENA 26
#define IN1 25
#define IN2 33

#define ENB 32
#define IN3 35
#define IN4 34

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

void loop(){
  //Aモーター正転 徐々に加速
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  for(int i = 0; i<255; i++){
    analogWrite(ENA, i);
    delay(10);
  }
  //Aモーター ブレーキ 両極をLOWにすることによって惰性(ニュートラル)になる
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  //ENAをLOWにすることによって回転に対する抵抗する電圧を与えない
  digitalWrite(ENA, LOW);
  delay(2000);

  //Aモーター正転 徐々に減速
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  for(int i = 255; i>0; i--){
    analogWrite(ENA, i);
    delay(10);
  }
  
  //Aモーター ブレーキ 両極をHIGHにすることによってブレーキになる
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, HIGH);
  //ENAをHIGHにすることによって回転に対する抵抗する電圧を与える
  digitalWrite(ENA, HIGH);
  delay(2000);

  
  //Bモーター正転 徐々に加速
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  for(int i = 0; i<255; i++){
    analogWrite(ENB, i);
    delay(10);
  }
  
  //Bモーター ブレーキ 両極をLOWにすることによって惰性(ニュートラル)になる
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  //ENBをLOWにすることによって回転に対する抵抗する電圧を与えない
  digitalWrite(ENA, LOW);
  delay(2000);

  //Bモーター正転 徐々に減速
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  for(int i = 255; i>0; i--){
    analogWrite(ENB, i);
    delay(10);
  }
  
  //Bモーター ブレーキ 両極をHIGHにすることによってブレーキになる
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, HIGH);
  //ENAをHIGHにすることによって回転に対する抵抗する電圧を与える
  digitalWrite(ENB, HIGH);
  delay(2000);
}
 
このプログラムたちにはわざと関数を使わないで書いています。
関数を使えば快適なプログラムになります。

 

コメント

このブログの人気の投稿

DockerのNextcloudでエラーが出た SQLSTATE[08006] [7]

Arduinoで電流を測定する