산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

L298N 모터 드라이버 – Arduino 인터페이스, 작동 방식, 코드, 회로도

<메인 클래스="사이트 메인" id="메인">

이 Arduino Tutorial에서는 Arduino를 사용하여 DC 모터를 제어하는 ​​방법을 배웁니다. DC 모터를 제어하는 ​​몇 가지 기본 기술을 잘 살펴보고 L298N 모터 드라이버와 Arduino 보드를 사용하여 DC 모터를 제어하는 ​​방법을 배우는 두 가지 예를 만듭니다.

다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다.

 

모터에 입력되는 전압을 조절하는 것만으로 DC 모터의 속도를 조절할 수 있는데 가장 일반적인 방법은 PWM 신호를 이용하는 것이다.

PWM DC 모터 제어

PWM 또는 펄스 폭 변조는 빠른 속도로 전원을 켜고 끔으로써 전자 장치로 가는 전압의 평균값을 조정할 수 있는 기술입니다. 평균 전압은 듀티 사이클 또는 단일 기간 동안 신호가 켜져 있는 시간과 신호가 꺼져 있는 시간에 따라 다릅니다.

따라서 모터의 크기에 따라 Arduino PWM 출력을 트랜지스터의 베이스나 MOSFET의 게이트에 간단히 연결하고 PWM 출력을 제어하여 모터의 속도를 제어할 수 있습니다. 저전력 Arduino PWM 신호는 고전력 모터가 구동되는 MOSFET에서 게이트를 켜고 끕니다.

H-브리지 DC 모터 제어

반면에 회전 방향을 제어하기 위해서는 모터에 흐르는 전류의 방향을 반대로 하면 되는데 가장 일반적인 방법은 H-Bridge를 사용하는 것입니다. H-Bridge 회로는 4개의 스위칭 소자, 트랜지스터 또는 MOSFET을 포함하며 중앙에 모터가 H형 구성을 형성합니다. 두 개의 특정 스위치를 동시에 활성화하여 전류 흐름의 방향을 변경할 수 있으므로 모터의 회전 방향을 변경할 수 있습니다.

따라서 PWM과 H-Bridge의 두 가지 방법을 결합하면 DC 모터를 완벽하게 제어할 수 있습니다. 이러한 기능을 가진 많은 DC 모터 드라이버가 있으며 L298N이 그 중 하나입니다.

L298N 드라이버

L298N은 2개의 DC 모터의 속도와 방향을 동시에 제어할 수 있는 듀얼 H-Bridge 모터 드라이버입니다. 이 모듈은 최대 2A의 피크 전류로 5~35V 사이의 전압을 갖는 DC 모터를 구동할 수 있습니다.

L298N 모듈의 핀아웃을 자세히 살펴보고 어떻게 작동하는지 설명하겠습니다. 이 모듈에는 모터 A와 B를 위한 2개의 나사 터미널 블록과 접지 핀을 위한 또 다른 나사 터미널 블록, 모터용 VCC 및 입력 또는 출력이 될 수 있는 5V 핀이 있습니다.

이것은 모터 VCC에서 사용되는 전압에 따라 다릅니다. 모듈에는 점퍼를 사용하여 활성화 또는 비활성화되는 온보드 5V 레귤레이터가 있습니다. 모터 공급 전압이 최대 12V인 경우 5V 레귤레이터를 활성화할 수 있으며 5V 핀을 출력으로 사용할 수 있습니다(예:Arduino 보드에 전원을 공급하기 위해). 그러나 모터 전압이 12V보다 크면 해당 전압이 온보드 5V 레귤레이터에 손상을 줄 수 있으므로 점퍼를 분리해야 합니다. 이 경우 IC가 제대로 작동하려면 5V 전원 공급 장치에 연결해야 하므로 5V 핀이 입력으로 사용됩니다.

여기서 이 IC가 약 2V의 전압 강하를 발생시킨다는 것을 알 수 있습니다. 따라서 예를 들어 12V 전원 공급 장치를 사용하는 경우 모터 단자의 전압은 약 10V가 되며, 이는 12V DC 모터에서 최대 속도를 얻을 수 없음을 의미합니다.

다음은 논리 제어 입력입니다. Enable A 및 Enable B 핀은 모터의 속도를 활성화하고 제어하는 ​​데 사용됩니다. 이 핀에 점퍼가 있으면 모터가 활성화되고 최대 속도로 작동하며 점퍼를 제거하면 PWM 입력을 이 핀에 연결하여 모터의 속도를 제어할 수 있습니다. 이 핀을 접지에 연결하면 모터가 비활성화됩니다.

다음으로, 입력 1 및 입력 2 핀은 모터 A의 회전 방향을 제어하는 ​​데 사용되고 입력 3과 4는 모터 B에 사용됩니다. 이 핀을 사용하여 실제로 L298N IC 내부의 H-Bridge 스위치를 제어합니다. 입력 1이 LOW이고 입력 2가 HIGH이면 모터가 앞으로 이동하고 그 반대로 입력 1이 HIGH이고 입력 2가 LOW이면 모터가 뒤로 이동합니다. 두 입력이 동일한 경우 LOW 또는 HIGH 중 하나가 모터를 정지합니다. 입력 3과 4와 모터 B에도 동일하게 적용됩니다.

Arduino 및 L298N 모터 드라이버

이제 몇 가지 실용적인 응용 프로그램을 만들어 보겠습니다. 첫 번째 예에서는 전위차계를 사용하여 모터의 속도를 제어하고 푸시 버튼을 사용하여 회전 방향을 변경합니다. 다음은 회로도입니다.

따라서 L298N 모터 드라이버, DC 모터, 전위차계, 푸시 버튼 및 Arduino 보드가 필요합니다.

아래 링크에서 이 Arduino 튜토리얼에 필요한 구성요소를 얻을 수 있습니다.

Arduino 코드

Arduino 코드는 다음과 같습니다.

/*  Arduino DC Motor Control - PWM | H-Bridge | L298N  -  Example 01

    by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#define enA 9
#define in1 6
#define in2 7
#define button 4

int rotDirection = 0;
int pressed = false;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(button, INPUT);
  // Set initial rotation direction
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
}

void loop() {
  int potValue = analogRead(A0); // Read potentiometer value
  int pwmOutput = map(potValue, 0, 1023, 0 , 255); // Map the potentiometer value from 0 to 255
  analogWrite(enA, pwmOutput); // Send PWM signal to L298N Enable pin

  // Read button - Debounce
  if (digitalRead(button) == true) {
    pressed = !pressed;
  }
  while (digitalRead(button) == true);
  delay(20);

  // If button is pressed - change rotation direction
  if (pressed == true  & rotDirection == 0) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    rotDirection = 1;
    delay(20);
  }
  // If button is pressed - change rotation direction
  if (pressed == false & rotDirection == 1) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    rotDirection = 0;
    delay(20);
  }
}
Code language: Arduino (arduino)

설명: 따라서 먼저 프로그램에 필요한 핀과 일부 변수를 정의해야 합니다. 설정 섹션에서 핀 모드와 모터의 초기 회전 방향을 설정해야 합니다. 루프 섹션에서 우리는 전위차계 값을 읽는 것으로 시작한 다음 0에서 1023 사이의 값을 PWM 신호에 대해 0에서 255까지의 값으로 매핑하거나 0에서 100% 듀티 사이클입니다. PWM 신호. 그런 다음 analogWrite() 함수를 사용하여 PWM 신호를 실제로 모터를 구동하는 L298N 보드의 활성화 핀으로 보냅니다.

다음으로 버튼을 눌렀는지 확인하고 맞으면 입력 1과 입력 2 상태를 반대로 설정하여 모터의 회전 방향을 변경합니다. 푸시 버튼은 토글 버튼으로 작동하며 누를 때마다 모터의 회전 방향이 변경됩니다.

L298N 모터 드라이버를 사용한 Arduino 로봇 자동차 제어

일단 이것을 배웠다면 이제 우리는 우리 자신의 Arduino 로봇 자동차를 만들 수 있습니다. 다음은 회로도입니다.

2개의 DC 모터, L298N 모터 드라이버, Arduino 보드 및 제어용 조이스틱만 있으면 됩니다. 전원 공급 장치의 경우 총 11V를 제공하는 3개의 3.7V 리튬 이온 배터리를 사용하기로 했습니다. 나는 3mm 눈금 합판으로 섀시를 만들고 금속 브래킷을 사용하여 모터를 연결하고 모터에 바퀴를 부착하고 전면에 회전 바퀴를 부착했습니다.

이제 Arduino 코드를 살펴보고 어떻게 작동하는지 봅시다. (아래에서 전체 코드를 찾을 수 있습니다)

int xAxis = analogRead(A0); // Read Joysticks X-axis
int yAxis = analogRead(A1); // Read Joysticks Y-axisCode language: Arduino (arduino)

핀을 정의한 후 루프 섹션에서 조이스틱 X 및 Y 축 값을 읽는 것으로 시작합니다. 조이스틱은 실제로 Arduino의 아날로그 입력에 연결된 두 개의 전위차계로 구성되며 0에서 1023 사이의 값을 갖습니다. 조이스틱이 중앙 위치에 있을 때 두 전위차계 또는 축의 값은 약 512입니다.

<그림 클래스="aligncenter">

약간의 허용 오차를 추가하고 470에서 550 사이의 값을 중심으로 간주합니다. 따라서 조이스틱의 Y축을 뒤로 이동하고 값이 470 아래로 내려가면 4개의 입력 핀을 사용하여 2개의 모터 회전 방향을 뒤로 설정합니다. 그런 다음 470에서 0으로 감소하는 값을 실제로 모터의 속도인 0에서 255로 증가하는 PWM 값으로 변환합니다.

// Y-axis used for forward and backward control
  if (yAxis < 470) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }Code language: Arduino (arduino)

유사하게, 조이스틱의 Y축을 앞으로 움직이고 값이 550을 초과하면 앞으로 이동하도록 모터를 설정하고 판독값을 550에서 1023까지의 PWM 값을 0에서 255로 변환합니다. 조이스틱이 중앙에 머물러 있으면 모터 속도는 0이 됩니다.

다음으로 자동차의 좌우 제어를 위해 X축을 어떻게 사용하는지 봅시다.

// X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }Code language: Arduino (arduino)

따라서 다시 먼저 X축 판독값을 0에서 255 사이의 속도 값으로 변환해야 합니다. 왼쪽으로 이동하려면 이 값을 사용하여 왼쪽 모터 속도를 줄이고 오른쪽 모터 속도를 높입니다. 여기에서 산술 함수 때문에 두 개의 추가 "if" 문을 사용하여 모터 속도 범위를 0에서 255로 제한합니다.

<그림 클래스="aligncenter">

자동차를 오른쪽으로 이동할 때도 같은 방법을 사용합니다.

관련:555 타이머 IC를 사용하여 PWM DC 모터 속도 컨트롤러를 만드는 방법

인가 전압과 모터 자체에 따라 저속에서는 모터가 움직이지 못하고 윙윙거리는 소리가 납니다. 제 경우에는 PWM 신호의 값이 70 미만이면 모터가 움직일 수 없었습니다. 따라서 이 두 if 문을 사용하여 실제로 속도 범위를 70~255로 제한했습니다. 결국에는 최종 모터 속도 또는 L298N 드라이버의 인에이블 핀에 대한 PWM 신호.

// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor BCode language: Arduino (arduino)

다음은 Arduino 로봇 자동차 예제의 전체 코드입니다.

/*  Arduino DC Motor Control - PWM | H-Bridge | L298N
         Example 02 - Arduino Robot Car Control
    by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#define enA 9
#define in1 4
#define in2 5
#define enB 10
#define in3 6
#define in4 7

int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {
  int xAxis = analogRead(A0); // Read Joysticks X-axis
  int yAxis = analogRead(A1); // Read Joysticks Y-axis

  // Y-axis used for forward and backward control
  if (yAxis < 470) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }
  else if (yAxis > 550) {
    // Set Motor A forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }

  // X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }
  if (xAxis > 550) {
    // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    // Move right - decrease right motor speed, increase left motor speed
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA > 255) {
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0) {
      motorSpeedB = 0;
    }
  }
  // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}Code language: Arduino (arduino)

여기까지가 이 튜토리얼의 전부입니다. 다음 동영상에서는 스마트폰과 무선 제어를 가능하게 하는 블루투스 및 라디오 장치를 추가하여 이 Arduino 로봇 자동차를 업그레이드할 것입니다.

아래 댓글 섹션에서 언제든지 질문을 하고 내 Arduino 프로젝트 컬렉션을 확인하는 것을 잊지 마세요.


제조공정

  1. IR 리모콘 해킹 방법
  2. 라인 팔로워 로봇
  3. Arduino Mega를 NEO-6M GPS 모듈과 인터페이스하는 방법
  4. Arduino 교육 플랫폼
  5. 서미스터를 사용하는 것이 얼마나 쉬운가요?!
  6. DIY Arduino 로봇 팔 – 손 제스처로 제어
  7. DC 모터 제어 라이브러리
  8. 스크랩 DVD 드라이브 L293D를 사용하여 미니 CNC 2D 플로터를 만드는 방법
  9. 여기에 아이디어가 있습니다:두뇌-컴퓨터 인터페이스의 작동 방식
  10. 다이렉트 드라이브 모터의 장점 – 정의 및 작동 원리