【 아두이노 기초 】 #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Ω 사이 아무거나
▶ 프로그램 (코드& 설명) :
#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;
}
}
}
▶ 실행 영상 :
▶ 아두이노 소스 코드 다운로드 :
'아두이노 > 1. 아두이노기초' 카테고리의 다른 글
【 아두이노 기초 】 #29 서보(Servo) 모터 제어 하기 2 (0) | 2018.11.07 |
---|---|
【 아두이노 기초 】 #28 서보(Servo) 모터 제어 하기 1 (0) | 2018.10.30 |
【 아두이노 기초 】 #26 DC 모터 제어 하기 6 (2개의 DC모터) (0) | 2018.10.15 |
【 아두이노 기초 】 #25 DC 모터 제어 하기 5 (0) | 2018.10.10 |
【 아두이노 기초 】 #24 DC 모터 제어 하기 4 (0) | 2018.10.02 |