[Arduino] L293D를 이용한 DC 모터(DC Motor) 양방향 제어
'L293D'는 스테핑모터를 제어할 때 쓰던 칩입니다.
(참고 : [Arduino] L293D칩을 이용한 유니폴라 스테핑 모터(unipolar stepping motor) 제어)
DC모터의 양방향 제어를 할때도 사용이 가능합니다.
(참고 : 디바이스 마트 - L293D )
'L293B'을 이용해도 됩니다.
(참고 : 디바이스 마트 - L293B )
모터는 'KR-300'와 'MDN-4RA3ETA' 사용 했습니다.
(참고 : 디바이스 마트 - 서보형 DC모터 (KR-300), MDN-4RA3ETA )
외부전원을 이용할 때는 'KR-300'를 아두이노 전원을 이용할 때는 'MDN-4RA3ETA'를 사용합니다.
1. 테스트 해보기
일단 아두이노가 아닌 손으로 배선을 수정하여 동작을 확인하기 위한 구성을 합니다.
1-1. 보드 구성
보드 구성은 제가 참고한 사이트와 똑같이 해줍니다.
(참고 : adafruit learning system - Arduino Lesson 15. DC Motor Reversing - An Experiment )
1-2. 테스트 해보기
펌웨어는 올리지 말고 바로 아두이노를 연결하여 모터가 돌아가는지 확인합니다.
소리를 들어보면 모터가 동작함을 알 수 있습니다.
이제 보라색선을 GND로 옮겨 모터를 멈추게 합시다.
각 선은 다음과 같습니다.
보라색선 : Enable
노란색선 : In1
주황색선 : In2
입니다.
'Enable'은 모터의 동작 여부를 결정합니다.
전원이 인가되면 '참(True)'가 되어 모터가 동작할 수 있는 상황이 됩니다.
GND가 인가되면 '거짓(False)'가 되어 모터가 동작하지 않습니다.
그리고 'Enable'을 통해 DC모터의 속도를 조절할 수 있습니다.
'In1', 'In2'는 한쪽은 '참(True)', 한쪽은 '거짓(False)'일 때만 모터가 동작합니다.
단지 둘 다 '참(True)'이거나 '거짓(False)'이라면 동작하지 않습니다.
그리고 'In1'이 '참(True)'이라면 정방향 'In2'가 '참(True)'이라면 역방향으로 모터가 동작합니다.
표로 보자면 다음과 같습니다.
Enable(보라색) | In1(노란색) | In2(주황색) | 결과 |
True | True | True | 멈춤 |
True | True | False | 정방향 |
True | False | True | 역방향 |
True | False | False | 멈춤 |
'Enable'가 'False'일때는 모터가 동작 하지 않습니다.
2. 양방향 제어
위에서 살펴봤다시피 DC모터를 양방향 제어를 하기 위해서는 데이터 선이 2개 필요합니다.
2-1. 보드 구성
이제 'Enable', 'In1', 'In2'를 각각 11번, 10번, 9번에 연결하고 아두이노로 제어해봅시다.
2-2. 펌웨어 작성
이제 'Enable'은 항상 'True'로 두고 'In1'과 'In2'는 시리얼 모니터에서 보낸 데이터에 따라서 동작하도록 작성해 봅시다.
int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int nSwitch = 0;
boolean bReverse = false;
int nSpeed = 70;
String sMeg = "Switch : ";
void setup()
{
Serial.begin(9600);
pinMode(enablePin, OUTPUT);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
}
void loop()
{
if(Serial.available())
{
nSwitch = Serial.read();
}
if( nSwitch == '1')
{
bReverse = true;
}
else
{
bReverse = false;
}
setMotor(nSpeed, bReverse);
Serial.println(sMeg + int(nSwitch) + ", Speed : " + int(nSpeed));
delay(1000);
}
void setMotor(int nSpeed, boolean bReverse)
{
analogWrite(enablePin, nSpeed);
digitalWrite(in1Pin, ! bReverse);
digitalWrite(in2Pin, bReverse);
}
업로드가 끝나면 모터가 돌기 시작합니다.
시리얼 모니터를 열고 '1'나 '0'을 입력하여 모터의 동작 방향을 바꿔봅시다.
동영상 중간중간 모터가 멈칫하는 순간이 있는데 이때가 반향전환을 할 때입니다.
3. 가변저항(potentiometer)을 이용하여 속도 조절 하기
가변저항의 값을 읽어 DC모터의 속도를 조절해 봅시다.
3-1. 보드 구성
이 부분은 이전 포스팅과 같습니다.
(참고 : [Arduino] ULN2004(ULN2003)를 이용한 DC 모터(DC Motor) 제어 )
가변저항의 전원과 접지는 반대로 해도 상관없습니다.
(값이 반대로 나올 뿐이죠 ㅎ)
3-2. 펌웨어 작성
이제 가변저항의 값을 읽어 모터의 속도에 적용해 봅시다.
int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int re = A0;
int nSwitch = 0;
boolean bReverse = false;
int nSpeed = 70;
String sMeg = "Switch : ";
void setup()
{
Serial.begin(9600);
pinMode(enablePin, OUTPUT);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
}
void loop()
{
if(Serial.available())
{
nSwitch = Serial.read();
}
//가변저항 값을 읽는다.
nSpeed = analogRead(re) / 4;
if( nSwitch == '1')
{
bReverse = true;
}
else
{
bReverse = false;
}
setMotor(nSpeed, bReverse);
Serial.println(sMeg + int(nSwitch) + ", Speed : " + int(nSpeed));
delay(1000);
}
void setMotor(int nSpeed, boolean bReverse)
{
analogWrite(enablePin, nSpeed);
digitalWrite(in1Pin, ! bReverse);
digitalWrite(in2Pin, bReverse);
}
이제 가변저항을 돌리면 속도가 조절됩니다.
화면에 보이도록 속도 조절하느냐 고생했습니다 ㅜㅡ
4. 외부 전원 사용하기
이것도 이전 글과 같습니다 ㅎ
코드는 똑같습니다.
마무리
원래는 ULN2004칩을 가지고 양방향 제어를 해보려고 했는데 제가 전자 쪽은 잘 몰라서 모르겠네요 ㅡ.-;;;
하려면 할 수는 있을 것 같은데...
어찌됐건 L293B칩을 이용한다면 많이 비싸진 않기 때문에 상관없을 것 같기도 하고 애매합니다. ㅡ,.ㅜ