본문 바로가기

아두이노

L293D Dual H-Bridge Motor Driver와 아두이노를 이용한 DC 모터 제어

회로구성

  • 아두이노 + DC모터 + L239D

동작요구사항

  • 아두이노에 전원이 인가되면 모터는 멈춰있는 상태이다.
  • 시리얼통신을 이용하여 키보드의 ‘+’키를 누르면 속도가 10%씩 증가하고, ‘-’키를 누르면 10%씩 감소하도록 한다.
  • 속도만 제어하는 시스템 → 반(half) H-브리지 → 제어핀 하나만 사용

L293D Dual H-Bridge Motor Driver

L293D 모터 드라이버 외형 및 핀아웃

핀아웃

핀 이름 핀 번호 기능
Enable 1, 2 1 Input 1, 2(칩의 좌측 입력)를 활성화
Enable 3, 4 9 Input 3, 4(칩의 우측 입력)를 활성화
Input 1/2/3/4 2/7/10/15 디지털 회로에 연결하여 Output 1/2/3/4를 직접 제어 (HIGH/LOW)
Output 1/2/3/4 3/6/11/14 모터의 한쪽 끝에 연결하여 모터를 구동시킴
Ground 4/5/12/13 접지
Vcc1(Vss) 16 칩 구동용 공급 전압 (4.5V ~ 7V) 
Vcc2(Vs) 8 모터 구동용 공급 전압 (4.5V ~ 36V)

특징

  • 최대 4개의 단방향 DC 모터, 2개의 양방향 DC 모터 또는 1개의 스텝 모터를 구동 할 수 있음 → 모터의 속도와 회전 방향 제어가 가능함
  • H-브리지(Half H-Bridge) 구성으로 모터를 한 방향으로 작동
  • 완전한 H-브리지(Full H-Bridge) 구성으로 전류 흐름의 방향을 제어함으로써 DC 모터를 양방향으로 구동
  • Enable 핀에 PWM 신호를 사용하여 모터를 켜거나 끄거나 속도를 조절할 수 있음. 채널 1,23,4간에 공유
  • 칩의 이름에 D가 있다. 이는 각 Ouput 핀에 다이오드가 있음을 의미하며, Output에 연결된 장비로부터 역전류를 방지하기 위함이다.  

H-브리지(H-Bridge)

  • H-브리지 회로를 이용하면 H-브리지에 연결된 장치에 두 방향으로 전류를 공급할 수 있다. 
  • 아래 그림과 같이 DC 모터가 연결되어있다고 가정하면, 
    S1와 S4가 ON → 모터가 CW 방향으로 회전
    S2와 S3가 ON → 모터가 CCW 방향으로 회전
  • 회로를 작동시킬 때, 단락(short)이 되거나 모터에 같은 극성의 전압을 인가하지 않도록 주의할 것

H-브리지 (H-Bridge) 회로와 동작

L239D Dual H-브리지(H-Bridge)

  • 반 H-브리지(Half H-Bridge) 구성으로 DC 모터 4개를 한 방향으로 작동시킬 수 있다. → DC 모터 4개의 각 한 쪽을 Output 1/2/3/4에 각각 연결하고 모터의 나머지 한 쪽은 접지로 연결한다. 아두이노 디지털핀에 Input 1/2/3/4를 연결하여 Output 1/2/3/4를 제어하면 모터의 동작을 제어할 수 있다.
  • 완전 H-브리지(Full H-Bridge) 구성으로 DC 모터 2개를 양방향으로 작동시킬 수 있다. → DC 모터 2개를 각각 Output 1/2와 Output 3/4에 연결한다. 아두이노 디지털핀에 Input 1/2/3/4를 연결한 후 Input 1/2로 모터 A를, Input3/4로 모터 B를 제어한다. 이 경우 두 개의 Input에 HIGH/LOW를 번갈아 줌으로써 방향을 제어할 수 있다. 
  • 사용 예

 

    1. 8(모터 구동용 전압공급 핀)16(칩 구동용 전압공급 핀) 핀에 5V를 연결
    2. 접지(4, 5, 12, 13 중 하나) 연결
    3. DC 모터를 3(1Y==Output 1)6(2Y==Output 2) 핀에 연결 : 완전 H-브리지 구성
      (
      모터 회전 방향을 알려주지 않았으므로 아무 일도 일어나지 않음)
    4. 제어핀인 2(1A==Input 1)7(2A==Input 2)핀에 점퍼선을 연결한 후, 진리표*에 맞게 접지와 5V를 번갈아 공급 → 회전 방향 확인
    5. 1(Enable 1,2) 핀 에 점퍼선을 연결한 후 접지와 연결하면 모터는 멈추고, 5V 연결 또는 floating상태는 모터가 동작함
    6. Enable 핀에 PWM 신호를 사용하여 모터 속도 조절

* 모터 동작 진리표

DC 모터

  • DC 전원을 회전운동으로 변환시키는 장치
  • 고정자로 영구자석을 사용하고, 회전자(전기자)로 코일을 사용하여 구성한 것으로, 전기자에 흐르는 전류의 방향을 전환함으로써 자력의 반발, 흡인력으로 회전력을 생성

DC 모터 외형과 내부, 동작 원리

아두이노 제어 함수

  • Serial.available(), Serial.read()

Serial.available()

직렬 포트에서 데이터를 수신하기 위해 사용하며, Serial 포트에서 읽을 수 있는 바이트 수를 반환한다마이크로 컨트롤러 내부에 구성된 버퍼(FIFO)에 이미 저장된 데이터의 바이트 수를 의미한다. UNO의 경우 63바이트까지 저장할 수 있으며, 읽어가지 않은 데이터는 소실된다.

Serial.available() 함수 사용 예

 

※ FIFO (First In First Out) 

버퍼에 쌓인 데이터는 Serial.read(), Serial.readByte() 등의 함수를 이용하여 읽어갈 수 있다.

Serial.read() 등의 함수로 데이터를 읽어가면 버퍼에 저장된 데이터 수가 감소하고, 그 값을 반환한다.

 

FIFO 동작
버퍼에 쌓인 데이터를 Serial.read() 함수로 읽어갈 수 있음

Serial.read()

직렬 포트에서 수신된 데이터를 읽어오는데 사용하며 호출 시 시리얼 버퍼의 첫 번째 바이트만 읽어온다. 따라서 수신된 유효한 데이터가 있을 때까지 반복적으로 이 함수를 호출하여 데이터를 읽어온다. 만약 유효한 데이터가 없으면 -1을 반환한다.

Serial.read() 함수 사용 예

Tinkercad 시뮬레이션

전체코드

int enable = 11;   // 1&2 Enable
int in1 = 8;       // 1A
char control;      // control character
int delta = 25;    // 10% speed up/down
int pwm = 0;       // initial speed is zero.
unsigned int count = 0;

int calcPWM(char ch)
{
  if(ch == '+')
  {
    pwm += delta;
    if(pwm > 255)
      pwm = 255;
  }
  else if(ch == '-')
  {
    pwm -= delta;
    if(pwm < 0)
      pwm = 0;
  }
  else
    pwm = 125;
  
  return pwm;
}

void printMessage(char spd)
{
  Serial.print("Count : ");
  Serial.print(count);
  Serial.print(",  Duty Cycle : ");
  Serial.print(pwm/255.0 * 100, 0);
  Serial.print(",  Speed (U/D) : ");
  Serial.println(spd);
}

void setup()
{
  Serial.begin(9600);
  pinMode(enable, OUTPUT);
  pinMode(in1, OUTPUT);
  // initialize motor
  digitalWrite(in1, LOW);
  analogWrite(enable, pwm);
  Serial.println("To speed up, type '+' key, and ");
  Serial.println("to decrease motor speed, type '-' key.");
}

void loop()
{
  if(Serial.available())
  {
    control = Serial.read();
    switch(control)
    {
      case '+' : count++;
      			 calcPWM(control);
      		     printMessage('U');  // speed up
      		     break;
      case '-' : count++;
                 calcPWM(control);
                 printMessage('D');  // speed down
                 break;
      default  : control = ' ';
    }
    analogWrite(enable, pwm);
  }
  delay(10);
}

Tinkercad 시뮬레이션 결과 영상