【 아두이노 기초 】 #27 DC 모터 제어 하기 7
지난 시간에 DC 모터를 버튼 하나를 이용하여 정회전과 역회전을 시켜보았다. 이번에는 버튼 하나를 더 추가 하여 버튼A를 누르면 좌회전, 버튼B를 누르면 우회전, 버튼 A와 B를 동시에 누르면 역회전을 하는 회로를 실습해보도록 하자. 이 실습을 거치게 되면, RC카의 기본적인 구동원리를 이해하게 된다.
※ 모터 구동을 도와 주는 H브릿지 IC(L293D)에 대한 설명은 앞의 게시글을 참조. ( # 24 DC 모터 제어하기 4 바로가기 )
▶ L293D 모터 제어 드라이버 IC 핀배열 및 구성도 :
▶ 실습 목표 :
처음에는 두 개의 모터를 정회전(전진)시키고, 좌버튼(버튼A)을 누르고 있는 동안은 좌회전, 우버튼(버튼B)을 누르고 있는 동안은 우회전, 두 개의 버튼(A&B)을 동시에 누르면 역회전(후진) 시켜서, 버튼 두 개로 마치 RC자동차 처럼 동작 시킬 수 있다.
▶ 실습 회로도면 :
(이미지 클릭하면 확대 가능)
※ 모터에 공급되는 별도의 전원은 본인이 실험하는 모터의 용량에 맞추어(4.5V~35V사이) 입력을 하되, 가급적 낮은 전압을 공급하라. 높은 전압은 L293D IC의 높은 발열과 고장의 원인이 되니 주의 할 것!
▶ 부대품 목록 : 아두이노 보드, 브레드 보드
▶ 부품 목록 : L293D IC , DC 모터 x 2 , 푸쉬버튼 x 2 , 가변저항 10KΩ~500KΩ 사이 아무거나
▶ 실습 절차 :
1. 회로도를 참고하여 모터 와 부품들을 연결한다.
2. 위 선연결 이미지를 참조 하여 회로 연결을 완성한다. 회로 연결에서 VCC1(IC의 16번 핀)에 아두이노의 +5V 단자를 연결하고, 모터 구동을 위한 VCC2(IC의 8번 핀)에는 모터 구동하기에 무리가 없는 4.5V~36V 사이의 별도 전원을 공급한다. ※ 구동 토크가 크거나, 비교적 큰 모터를 연결하게 되면 L293D IC에 발열이 심하게 나고 나가버릴 수 있으니 주의 할 것.
3. 회로의 모든 GND(그라운드, - 단자)는 하나로 연결 한다.
4. 속도 제어를 위해서는 PWM신호 출력이 가능한 아두이노 포트를 사용해야 한다. (디지털 포트중 '~'물결 무늬가 표시된 포트가 PWM 출력이 가능한 포트 이다) 따라서 IC의 1번핀(Enable 단자)에는 반드시 아두이노의 PWM 포트를 연결하도록 한다. (~3,~5,~6,~9,~10,~11 포트 중 아무거나 사용해도 무방)
5. 모터 연결선 +,- 두 가닥은 PWM 기능과는 무관 함으로 디지털 포트 중, 아무 포트에 연결 하도록 한다.
6. 스위치 역활을 할 수 있는 푸쉬 버튼을 아두이노 남는 포트에 연결 한다.
(만약 푸쉬 버튼이 없을 경우 점퍼선으로 대체 가능하다)
▶ 프로그램 (코드& 설명) :
#define btnFront 0 // '버튼정지' 변수를 '0'의 숫자값으로 정의
#define btnLeft 1
#define btnRight 2
#define btnBack 3
int in1=7;
int in2=8;
int in3=12;
int in4=13;
int btnL= 9;
//
모터
방향 변경을 위한 버튼 변수 선언
int btnR=10;
//
모터
방향 변경을 위한 버튼 변수 선언
int Direction; //
모터
방향 변수
int MotorL=6;
//
왼쪽
모터
int MotorR=11; // 오른쪽 모터
int pwm;
//
모터
회전 속도 변수
void setup() {
pinMode(in1, OUTPUT); // L293D의 1번 채널의 입력 1
pinMode(in2, OUTPUT); // L293D의 1번 채널의 입력 2
pinMode(in1, OUTPUT); // L293D의 2번 채널의 입력 1
pinMode(in2, OUTPUT); // L293D의 2번 채널의 입력 2
pinMode(MotorA, OUTPUT);
pinMode(MotorB, OUTPUT);
pinMode(btnL, INPUT_PULLUP); //좌버튼 입력을 내부풀업 입력으로설정
pinMode(btnR,
INPUT_PULLUP); //우버튼 입력을 내부풀업 입력으로설정
}
void loop() {
boolean btnL_HL = digitalRead(btnL); // 좌측
버튼의 논리값 저장
boolean btnR_HL = digitalRead(btnR); // 우측
버튼의
논리값 저장
pwm = analogRead(A0)/4; //
0~256 값을
넣기
위해 '/4'함
// 버튼 누름에 따른 비교문(if)과 , Case 선택문 실행
if ( btnL_HL == HIGH && btnR_HL ==
HIGH)
{
Direction = 0;
}
else if ( btnL_HL ==
LOW && btnR_HL ==
HIGH)
{
Direction = 1;
}
else if ( btnL_HL ==
HIGH && btnR_HL ==
LOW)
{
Direction = 2;
}
else if ( btnL_HL ==
LOW && btnR_HL ==
LOW)
{
Direction = 3;
}
switch
(Direction)
{
case btnFront
: //
전진 [
L, R 모터
정회전
]
{
analogWrite(MotorL, pwm);
digitalWrite(in1,
HIGH);
digitalWrite(in2,
LOW);
analogWrite(MotorR, pwm);
digitalWrite(in3,
HIGH);
digitalWrite(in4,
LOW);
break;
}
case btnLeft : //
좌회전
[ L모터
정지, R모터
전진 ]
{
analogWrite(MotorL, pwm);
digitalWrite(in1,
LOW);
digitalWrite(in2,
LOW);
analogWrite(MotorR, pwm);
digitalWrite(in3,
HIGH);
digitalWrite(in4,
LOW);
break;
}
case btnRight : //
우회전
[ L모터
전진, R모터
정지 ]
{
analogWrite(MotorL, pwm);
digitalWrite(in1,
HIGH);
digitalWrite(in2,
LOW);
analogWrite(MotorR, pwm);
digitalWrite(in3,
LOW);
digitalWrite(in4,
LOW);
break;
}
case btnBack
: //
후진
[ L, R 모터 역회전 ]
{
analogWrite(MotorL, pwm);
digitalWrite(in1,
LOW);
digitalWrite(in2,
HIGH);
analogWrite(MotorR, pwm);
digitalWrite(in3,
LOW);
digitalWrite(in4,
HIGH);
break;
}
}
}
▶ 실행 영상 :
▶ 아두이노 소스 코드 다운로드 :
DCmortorAB_2Button.ino