반응형

【 아두이노 기초 】 #26 DC 모터 제어 하기 6

 지난 시간에 DC 모터를 버튼을 이용하여 정회전과 역회전을 시켜보았다. 이번시간에는 모터 하나를 더 추가하여 동시에 두개의 모터의 정·역 제어를 해보도록 하자.  L283D의 나머지 채널 하나만 추가로 연결하면 되니 어렵지 않을 것이다.


※ 모터 구동을 도와 주는 H브릿지 IC(L293D)에 대한 설명은 앞의 게시글을 참조.   ( # 24 DC 모터 제어하기 4 바로가기 )  


▶ L293D 모터 제어 드라이버 IC 핀배열 및 구성도 :





▶ 실습 목표 :  

  두 개의 모터를 L283과 아두이노에 연결하고 같은 방향으로 전진을 시킨다. 푸쉬버튼을 누르고 있는 순간만 두 개의 바퀴가 역회전이 되도록 프로그래밍 하라.  ( 가변저항을 통한 속도제어도 가능하도록 하라)



▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)








▶ 부대품 목록 : 아두이노 보드, 브레드 보드


▶ 부품 목록    : L293D IC, DC 모터 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. 스위치 역활을 할 수 있는 푸쉬 버튼을 아두이노 남는 포트에 연결 한다. 
 (만약 푸쉬 버튼이 없을 경우 점퍼선으로 대체 가능하다)


▶ 프로그램 (코드& 설명) : 


int in1=7;  

int in2=8;

int in3=12; 

int in4=13;

int MotorA=6;      // 좌측 모터

int MotorB=11;     // 우측 모터

int pwmA;

int btn=10;              // 모터 방향 변경을 위한 버튼 변수 선언

void setup() {

  pinMode(in1, OUTPUT);  // L293D의 1번 채널의 입력 1

  pinMode(in2, OUTPUT);  // L293D의 1번 채널의 입력 2

  pinMode(in1, OUTPUT);  // L293D2채널의 입력 1

  pinMode(in2, OUTPUT);  // L293D2채널의 입력 2

  pinMode(MotorA, OUTPUT);

  pinMode(MotorB, OUTPUT);

  pinMode(btn, INPUT_PULLUP); //아두이노 보드 내부 풀업저항 사용 코드

}

void loop() {

  boolean btnHL = digitalRead(btn);  //boolean0(LOW),1(HIGH)논리값

  pwmA = analogRead(A0)/4;           //0~256 값을 넣기위해 '/4'

  MotorSet(pwmA,btnHL);    // 모터의 속도와 방향을 설정하는 함수 실행

} 


void MotorSet(int pwmAboolean btnHL)  //속도값과 버튼상태 값 전달

{

  analogWrite(MotorApwmA);

  digitalWrite(in1, !btnHL); // A 모터 + LinebtnHL 반대 논리 값(!btnHL) 출력

  digitalWrite(in2, btnHL);  // A 모터  - LinebtnHL의 논리 출력

  analogWrite(MotorB, pwm);

  digitalWrite(in3, !btnHL); // B 모터 + LinebtnHL 반대 논리 값(!btnHL) 출력

  digitalWrite(in4, btnHL); //  B 모터  - LinebtnHL의 논리 값 출력

}


▶ 실행 영상 : 




▶ 아두이노 소스 코드 다운로드 : 


DCmortorAB_Button.ino




반응형