1. L298N Dual H-Bridge: 모터 드라이버 모듈?

DC 모터의 방향, 속도를 제어하기 위해 사용하는 모듈입니다. 대용량 모터용으로 최대 2A까지 지원한다고 합니다. 하나의 모듈로 2개의 모터를 제어가 가능하고, 중간에 방열판이 달려있어 공간을 애매하게 많이 차지하는 놈입니다.;;;

제품 사양

– 드라이버 칩 : L298N 듀얼 H-브리지 드라이버 칩
– 드라이브 부분의 공급전압 VMS : +5 V ~ 35 V-
– 드라이브 부분의 최대전류 : 2A / bridge
– 로직 부분의 공급전압 VSS : 4.5-5 0.5 V
– 로직 부분의 작동 전류 범위 :0 ~ 36mA
– 입력제어신호 전압 범위 : H: 4.5~ 5.5V / L: 0V
– 최대 소비 전력 : 20W
– 보관 온도 : -25 ℃까지 130 ℃
– 드라이버 보드 크기 : 55mm * 60mm * 30mm
– 드라이버 보드 무게 : 33g
– 기타 기능 : 방향 제어 표시LED, 전원 표시 LED

2. 연결방법

img_5124a

그림에서 상단에 나사가 달려있는 포트 중 가운데 3개의 포트(파란색)를 아래와 같이 연결합니다. 일반 PC USB 포트가 최대 500mA 정도의 전원을 공급하는데 힘 좀 쓰는 모터들은 500mA 이상이라고 하네요. 별도의 외부전원을 구해야 합니다.

아두이노 모터 드라이버 모듈 배터리
5V 5V
GND GND (-)
VMS (+)

그리고 좌우에 있는 초록색 포트를 각각 모터 A, B에 연결해 줍니다.

이제 모터의 회전 방향과 출력을 제어할 수 있도록 아두이노 보드와 연결해 줄 차례입니다. 위 그림에서 하단 가운데에 있는 ENA, IN1, IN2 (이상 모터 A 제어용), IN3, IN4, ENB (이상 모터 B 제어용) 핀을 아두이노 보드에 연결합니다. ENA, ENB는 아두이노의 PWM 지원되는 핀(D3, 5, 6, 9, 10, 11)에 연결하고 나머지는 임의의 Digital 핀에 연결합니다.

3. 동작방법

ENA와 ENB는 모터 A, B를 Enable 시킬 것이냐를 결정합니다. 아두이노에서 ENA, ENB에 High 전압을 걸어주고 IN1, IN2 입력을 조절해서 모터 방향을 제어할 수 있습니다. 아래 표를 참고하세요. ENA, ENB에 Low 를 걸어주면 IN1, IN2에 관계없이 정지합니다. ENA, ENB에 아두이노 PWM 핀(D3, 5, 6, 9, 10, 11)과 연결하면 모터의 속도를 변경 시킬 수 있습니다.

ENA (or ENB) IN1 (or IN3) IN2 (or IN4) 모터 A (or B)
High High Low 정방향 회전
High Low High 역방향 회전
High High High 정지
High Low Low 정지
Low 상관없음 상관없음 정지

4. 코드 (스케치)

본 예제 코드에서는 IN1, IN2, ENA (D2, D4, D5), IN3, IN4, ENB (D7, D8, D9) 순서로 연결하였습니다. 그리고 전진, 후진, 좌회전, 우회전을 아래와 같이 구현하였습니다. (빠진 부분을 적당히 채우고 수정해서 쓰세요)

void setup() {
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
}

void loop() {
if(direction == 1)  // Forward
{
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
analogWrite(5, speed);

digitalWrite(7, HIGH);
digitalWrite(8, LOW);
analogWrite(9, speed);
}
else if(direction == 4) // Backward
{
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
analogWrite(5, speed);

digitalWrite(7, LOW);
digitalWrite(8, HIGH);
analogWrite(9, speed);
}
else if(direction == 2) // Left
{
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
analogWrite(5, speed);

digitalWrite(7, HIGH);
digitalWrite(8, LOW);
analogWrite(9, speed);
}
else if(direction == 3) // Right
{
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
analogWrite(5, speed);

digitalWrite(7, LOW);
digitalWrite(8, HIGH);
analogWrite(9, speed);
}
else if(direction == 0) // Stop
{
analogWrite(5, 0);

analogWrite(9, 0);
}

}