아두이노 dc모터 방향 - adu-ino dcmoteo banghyang

[아두이노 강좌] 15. DC 모터 양방향으로 제어하기

본 게시물에서는 아두이노와 L293D 모터 드라이버 칩을 이용하여 DC모터의 속도와 동작방향을 제어하는지에 대해 설명하겠습니다.

아두이노 dc모터 방향 - adu-ino dcmoteo banghyang

본 프로젝트에서는 포텐셔미터로 모터의 속도를 조절하고 푸쉬버튼으로 모터의 방향을 조절합니다.

아두이노 dc모터 방향 - adu-ino dcmoteo banghyang

사용되는 L293D IC 입니다.

실험

아두이노로 모터를 제어하기에 앞서, 먼저 L293D 모터 제어 칩이 어떻게 동작하는 지 알아 보기 위한 간단한 실험을 하겠습니다.

먼저 모터에 5V를 공급하는 것부터 시작합니다..

아두이노 dc모터 방향 - adu-ino dcmoteo banghyang

손가락을 모터 샤프트에 살짝 갖다대면 어느 방향으로 모터가 회전하는지 알 수 있는데, 모터가 어느방향으로 회전하는지 확인하여 보십시오. 모터에 연결된 선을 서로 바꾸면 모터는 아까와는 반대방향으로 회전합니다.

L293D 칩은 위와 같이 극성에 따라 동작방향이 변하는 점을 이용한 칩입니다. 아래와 같이 브레드보드를 셋업하십시오. 먼저 아두이노가 아닌 수동으로 실험을 진행하여 보겠습니다.

아두이노 dc모터 방향 - adu-ino dcmoteo banghyang

우리가 관심있는 것은 L293D의 세개의 핀인데, 그 핀들은 Pin1(Enable), Pin 2 (In1), Pin 7 (In2)입니다. 이 핀들은 5V 혹은 GND에 보라, 노랑, 오렌지 색 점퍼로 연결되어 있습니다.

위의 그림에서 보듯, 모터는 한방향으로 움직입니다. 이 방향을 편의상 A라고 부릅시다.

Pin1(enable)을 GND로 옮기면 모터는 멈추어 서게 되고, pin ln1과 ln2에 무엇을 하던 모터는 동작하지 않습니다. Enable핀은 On/Off 스위치와 같으며, PWM출력을 이용하여 모터의 속도를 조절하는데 유용하게 사용이 됩니다. enable핀을 다시 5V로 연결합니다.

이제 ln1(pin2, 노랑)을 5V에서 GND로 옮깁니다. 그러면 ln1과 ln2는 지금 모두 GND에 연결된 상태로 모터는 다시 멈추게 됩니다.

ln2핀을 GND에서 5V로 옮깁니다. 그러면 모터는 반대방향(방향B)로 욺직이게 됩니다.

마지막으로 ln1을 5V로 다시 옮깁니다. 그러면 ln1, ln2가 모두 5V가 되는데, 이 경우 모터가 멈추게 됩니다.

ln1과 ln2 핀의 조합에 따른 모터의 동작을 아래의 표에 정리하였습니다.

In1

In2

Motor

GND GND
멈춤
5V GND 방향A로 회전
GND 5V 방향B로 회전
5V 5V 멈춤

브레드보드 레이아웃

자, 이제는 모터의 enable, ln1, ln2핀을 아두이노에 연결하여 제어를 하여 보도록 하겠습니다. IC를 브레드보드에 연결할 때 IC의 U형 노치가 브레드보드 상단을 향하도록 설치가 되어야 합니다.

아두이노 dc모터 방향 - adu-ino dcmoteo banghyang

아두이노 코드

아래의 코드를 아두이노에 업로드 하십시오.

  1. int enablePin =11;
  2. int in1Pin =10;
  3. int in2Pin =9;
  4. int switchPin =7;
  5. int potPin =0;
  6. void setup()
  7. {
    1. pinMode(in1Pin, OUTPUT);
  8. pinMode(in2Pin, OUTPUT);
  9. pinMode(enablePin, OUTPUT);
  10. pinMode(switchPin, INPUT_PULLUP);
  11. }
  12. void loop()
  13. {
  14. int speed = analogRead(potPin)/4;
  15. boolean reverse = digitalRead(switchPin);
  16. setMotor(speed, reverse);
  17. }
  18. void setMotor(int speed,boolean reverse)
  19. {
  20. analogWrite(enablePin, speed);
  21. digitalWrite(in1Pin,! reverse);
  22. digitalWrite(in2Pin, reverse);
  23. }

setup함수안에 핀과 핀의 모드가 정의 되어 있습니다. loop함수내에서는 모터속도 값은 포텐셔미터로부터 얻은 아날로그 값을 4로 나눈 값으로 할당되어 있습니다.

4로 나눈 이유는 아날로그 입력값은 0에서 1023이며 실제로 우리가 필요한 값은 0에서 255사이의 값이기 때문입니다.

만약 버튼이 눌리게 되면 모터는 전진하고, 그렇지 않으면 반대로 돌게 됩니다. reverse 변수값은 스위치 핀으로부터 읽어들인 값으로 설정되기 때문에, 버튼이 눌리면 False, 아니면 True입니다.

모터의 속도와 방향의 값은 setMotor()함수의 파라메터로 전달되어 모터 드라이버 칩의 해당 핀을 셋팅함으로써 모터를 제어하게 됩니다.

  1. void setMotor(int speed,boolean reverse)
  2. {
  3. analogWrite(enablePin, speed);
  4. digitalWrite(in1Pin,! reverse);
  5. digitalWrite(in2Pin, reverse);
  6. }

먼저, enable 핀에 analogWrite함수를 이용하여 속도를 설정합니다.L293의 enable핀은 ln1, ln2가 어떻게 셋팅되어 있던지 상관없이 모터를 on/off합니다. 뱡향을 제어하기 위해서는 ln1과 ln2핀은 반드시 반대되는 값으로 설정되어야 합니다.

만약 ln1이 high이고 ln2가 low이면, 모터는 한방향으로 돌게 됩니다. 반대로 ln1이 low이고 ln2가 high라면 모터는 그 반대방향으로 돌게 됩니다.

! 명령은 not을 의미합니다. 그래서 reverse의 값이 무엇이던지 ln1의 값은 reverse의 값과 반대되는 값으로 설정이 됩니다.

두번째 digitalWrite는 ln2에 reverse의 값을 설정합니다. ln1값은 reverse값의 반대값이 설정되기 때문에 ln2의 값은 ln1의 값과 항상 반대값이 됩니다.

L293D

L293D는 매우 유용한 칩으로 실제적으로 두개의 모터를 독립적으로 제어할 수 있습니다. 본 강좌에서는 칩의 반만을 사용한 것이죠. 칩의 왼쪽, 오른쪽으로 모터를 하나씩 연결할 수 있습니다.

아두이노 dc모터 방향 - adu-ino dcmoteo banghyang

만약 두번째 모터를 연결한다면 OUT3, OUT4에 연결되어야 하며 추가적인 세개의 제어 핀이 필요합니다..

  • EN2는 아두이노의 PWM핀에 연결되어야 합니다.

  • IN3과 IN4은 아두이노의 디지털 출력 핀에 연결되어야 합니다.

L293D는 두개의 +V핀(8번, 16번)을 가지고 있습니다. +Vmotor(8)은 모터에 전원을 공급하고 +V(16)은 칩 로직에 전원을 공급합니다. 여기서는 아두이노의 5V핀을 가지고 두개를 다 연결하였습니다만, 만약 높은 출력의 모터를 사용하거나 좀더 높은 전압의 모터를 사용한다면, 모터에게 별도의 전원을 연결하여 주는 것이 좋습니다.