회로구성
- 아두이노 + DC모터 + L239D
동작요구사항
- 아두이노에 전원이 인가되면 모터는 멈춰있는 상태이다.
- 시리얼통신을 이용하여 키보드의 ‘+’키를 누르면 속도가 10%씩 증가하고, ‘-’키를 누르면 10%씩 감소하도록 한다.
- 속도만 제어하는 시스템 → 반(half) H-브리지 → 제어핀 하나만 사용
L293D Dual H-Bridge Motor Driver
핀아웃
핀 이름 | 핀 번호 | 기능 |
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,2와 3,4간에 공유
- 칩의 이름에 D가 있다. 이는 각 Ouput 핀에 다이오드가 있음을 의미하며, Output에 연결된 장비로부터 역전류를 방지하기 위함이다.
H-브리지(H-Bridge)
- H-브리지 회로를 이용하면 H-브리지에 연결된 장치에 두 방향으로 전류를 공급할 수 있다.
- 아래 그림과 같이 DC 모터가 연결되어있다고 가정하면,
S1와 S4가 ON → 모터가 CW 방향으로 회전
S2와 S3가 ON → 모터가 CCW 방향으로 회전 - 회로를 작동시킬 때, 단락(short)이 되거나 모터에 같은 극성의 전압을 인가하지 않도록 주의할 것
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를 번갈아 줌으로써 방향을 제어할 수 있다.
- 사용 예
- 8번(모터 구동용 전압공급 핀)과 16번(칩 구동용 전압공급 핀) 핀에 5V를 연결
- 접지(4, 5, 12, 13 중 하나) 연결
- DC 모터를 3번(1Y==Output 1)과 6번(2Y==Output 2) 핀에 연결 : 완전 H-브리지 구성
(모터 회전 방향을 알려주지 않았으므로 아무 일도 일어나지 않음) - 제어핀인 2번(1A==Input 1)과 7번(2A==Input 2)핀에 점퍼선을 연결한 후, 진리표*에 맞게 접지와 5V를 번갈아 공급 → 회전 방향 확인
- 1번(Enable 1,2) 핀 에 점퍼선을 연결한 후 접지와 연결하면 모터는 멈추고, 5V 연결 또는 floating상태는 모터가 동작함
- Enable 핀에 PWM 신호를 사용하여 모터 속도 조절
DC 모터
- DC 전원을 회전운동으로 변환시키는 장치
- 고정자로 영구자석을 사용하고, 회전자(전기자)로 코일을 사용하여 구성한 것으로, 전기자에 흐르는 전류의 방향을 전환함으로써 자력의 반발, 흡인력으로 회전력을 생성
아두이노 제어 함수
- Serial.available(), Serial.read()
Serial.available()
직렬 포트에서 데이터를 수신하기 위해 사용하며, Serial 포트에서 읽을 수 있는 바이트 수를 반환한다. 마이크로 컨트롤러 내부에 구성된 버퍼(FIFO)에 이미 저장된 데이터의 바이트 수를 의미한다. UNO의 경우 63바이트까지 저장할 수 있으며, 읽어가지 않은 데이터는 소실된다.
※ FIFO (First In First Out)
버퍼에 쌓인 데이터는 Serial.read(), Serial.readByte() 등의 함수를 이용하여 읽어갈 수 있다.
Serial.read() 등의 함수로 데이터를 읽어가면 버퍼에 저장된 데이터 수가 감소하고, 그 값을 반환한다.
Serial.read()
직렬 포트에서 수신된 데이터를 읽어오는데 사용하며 호출 시 시리얼 버퍼의 첫 번째 바이트만 읽어온다. 따라서 수신된 유효한 데이터가 있을 때까지 반복적으로 이 함수를 호출하여 데이터를 읽어온다. 만약 유효한 데이터가 없으면 -1을 반환한다.
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 시뮬레이션 결과 영상
'아두이노' 카테고리의 다른 글
아두이노에서 가변저항을 이용한 DC 모터 속도 제어 (0) | 2021.05.31 |
---|---|
아두이노 릴레이 제어 (0) | 2021.05.18 |
아두이노 절전모드 (sleep mode (0) | 2021.05.17 |
아두이노를 이용한 자동차 후방 센서 구현 : 초음파 거리센서+LED+피에조 (0) | 2021.05.16 |
아두이노와 2개의 7세그먼트를 이용한 카운터 구현 (0) | 2021.05.16 |