DFRobot - Motor Shield for Arduino #1 DC Moter

2018. 9. 14. 15:40

Arduino/Shield

2A Motor Shield for Arduino Twin

DFRobot사에서 나오는 아두이노용 모터 쉴드입니다. 정식 명칭은 2x2A DC Motor Shield for Arduino이고 이름처럼 두 개의 DC 모터에 2A의 전류를 공급할 수 있습니다. 위 쪽 메인 이미지는 같은 회사의 BLE 통합 보드인 Bluno와 결합한 모습입니다.

DFRobot 웹사이트에 보면, 비슷한 구성에 규격까지 동일한 모터 쉴드가 하나 더 있습니다. 모터 드라이버(L298P chip)와의 핀 구성만 다른 듯 하고, 그래서  이 제품에 Twin이라는 이름을 붙인 듯합니다.

관련글

DFRobot - Motor shield for Arduino #2 Stepper Motor

이 글에 이어서, 동일한 모터 쉴드로 스텝 모터를 다루는 글입니다.

DFRobot - Motor shield for Arduino #3 JoyStick

아날로그 조이스틱을 이용하여 스텝 모터를 제어합니다.

DFRobot - Motor shield for Arduino #4 Bluetooth 원격 제어

이전에 사용한 DC모터를, 블루투스를 통하여 스마트폰으로 제어하는 간단한 예제를 소개합니다.

제품 패키지 및 외형 소개

패키지는 간단합니다. 쉴드와 스폰지 하나가 전부입니다. 

Arduino UNO 보드에 삽입한 모습입니다. DFRobot사의 다른 제품들과 마찬가지로, 검은색 보드이고, 핀 소켓은 연두(Digital), 빨강(Power), 파랑(Analog) 색상으로 구별하고 있습니다.

각 핀헤더 소켓 쪽은 직접 납땜하여 사용할 수도 있도록 했고, 아날로그 쪽은 3핀 포트가 따로 준비되어 커넥터를 통해 쉽게 연결할 수 있습니다. 차례대로 +, -, signal 순이며 역시 색깔로 구분하고 있습니다.

전원 입력부입니다. 모터에 전원을 공급하는 방법은 두 가지(PWRIN, VIN)입니다. 위 사진을 보면 검정색 점퍼 소켓이 보이는데, VIN은 아두이노 보드를 통해 전원을 공급받고, PWRIN은 왼쪽 초록색 터미널 단자를 통해 입력받습니다. 디폴트로 VIN이 선택되어 있으므로 외부 입력을 받을 경우, 점퍼 소켓을 왼쪽으로 옮겨 줘야 합니다.

VIN 소스는 아두이노 보드로부터 전원을 공급받습니다. 아두이노가 USB 포트를 통해 전원이 연결된다면 쉴드에는 당연히 5V가 공급되고, DC 잭을 통해 연결되면, 쉴드에도 연결된 전원 그대로 공급됩니다.

쉴드의 허용 전압은 4.8V에서 35V까지입니다. 아두이노 UNO의 허용 전압인 5V(USB), 7V~12V 범위를 벗어난다면 점퍼를 PWRIN으로 옮기고 터미널 단자에 외부 전원을 연결해야 합니다. 어느 쪽이든 모터의 비교적 높은 전류 소비량을 충분히 커버하는지 따져봐야 합니다.

사진 상단에는 이 쉴드에서 사용한 모터 드라이버인 L298P IC가 보이고, 아래쪽 터미널 단자는 모터를 연결하는 출력단입니다. 왼쪽 두 포트에 motor 2, 오른쪽 두 포트에 motor 1을 연결하며, M2+, M2-, M1+, M1- 순으로 연결합니다.

이 쉴드는 모터 연결을 위해 4핀 헤더(사진 가운데)를 별도로 제공하여 편의성을 높였습니다. 또 핀 헤더 양쪽에는 각 두 개씩의 LED가 있어 모터 구동 상태를 표시합니다. M1+, M2+ 단자에 플러스 전원(+, positive)이 할당되면 RED 색상이, 그 반대이면 GREEN 색상이 발광합니다.

쉴드 특징 및 사양
  • Motor Driven Voltage : 4.8V to 35V
  • Output Current : up to 2A/channel
  • Total Power Dissipation : 25W(T=75℃)
  • Driven Power Port : External power terminal, or VIN from Arduino
  • Driven Output Port : 2 channel screw terminals, or male PIN headers
  • Control Port : 4 TTL Compatible digital signals(Digital 10-13)
  • Operation Temperature : -25℃ to 130℃
  • Shield Size : 56x57mm(2.20x2.24")

제품 홈페이지에서 가져온 사양표입니다. 이미 언급한 부분 외에, 각 채널당 최고 2A까지 전류를 출력할 수 있다고 설명하고 있습니다. 단지, 총 전력 소비량이 25W이므로 이를 넘지 않도록 구성해야 합니다.

간단한 DC 모터 구동 테스트

이제, 이 쉴드를 이용한 간단한 테스트 예제를 작성해 보겠습니다. 우선, 테스트에 쓰일 DC모터를 구하기 위해 안 쓰는 DVD-ROM 드라이브를 하나 분해하였습니다.

DVD-ROM 드라이브를 분해하면 디스크 트레이 구동을 위한 DC모터를 하나 찾을 수 있습니다. 트레이의 open/close 모두 동작해야하기 때문에 양방향(bi-directional) 동작이 가능합니다.

트레이를 제거해 보면 위와 같이 기어 구성이 보입니다.

트레이 반대쪽을 통해 모터의 전원 입력 핀을 찾을 수 있습니다. 단순한 DC 모터이기 때문에 화살표 된 부분에 전원만 연결하면 구동시킬 수 있습니다.

모터 쉴드에 연결하기 위해서 위와 같이 전선을 납땜하였습니다. 반대쪽은 핀 헤더용 커넥터를 이용해 장착이 쉽도록 했고요! 또, 기판을 보면 DR+, DR- 표시가 되어있습니다. DR+, 검은색 전선 쪽이 정방향(Forward)인 듯한데, 테스트해보니 DR- 즉, 빨간색 쪽에 +전원(positive)을 연결할 때 트레이가 열립니다. 모터 쉴드와 연결할 때 이 점만 유의하면 되겠습니다.

모터 쉴드와 DC모터 연결

일반적인 DC Moter는 두 개의 전원 입력선만 연결하면 됩니다. +, - 극성에 맞게 연결하면 정해진 방향으로 회전합니다.

DVD-ROM의 트레이용 모터처럼 양방향(bi-directional) 회전이 가능하다면 위와 같이 극성을 반대로 연결하여 회전 방향을 전환할 수 있습니다.

방향 전환을 위해 물리적으로 전선을 바꿔 연결할 수는 없고, 모터 드라이버를 이용하여 처리할 수 있습니다. 여기서 사용하는 L298P 드라이버 칩이 이 기능을 제공하며, 제품 특징 중에 dual full bridge driver라는 말이 바로 이 기능을 의미합니다. 이 모터 쉴드는 두 개의 DC 모터를 장착할 수 있고, 각 모터마다 방향 제어를 위해 M1, M2라는 제어 라인(오렌지 색)을 가지고 있습니다. 아두이노에 쉴드를 장착하면 M1, M2는 각각 디지털 12, 13번 핀과 연결되어 소스 상에서 제어할 수 있습니다.

방향 제어 방법은 간단합니다. M1 제어핀에 'LOW'값을 할당하면 첫 번째 모터(M1)는 정방향(forward)으로 회전하고, 'HIGH'값을 주면 역방향으로 회전합니다. 마찬가지로 M2 제어핀을 이용하여 두 번째 모터도 제어할 수 있습니다.

M1, M2외에 E1, E2라는 제어핀도 제공하고 있습니다. 이는 동작 유무나 속도 조절을 위한 라인으로 각각 아두이노 D10, D11핀에 연결됩니다. E1, E2에 'LOW'를 할당하면 모터의 동작은 'disable' 되고, 반대로 'HIGH'를 할당하면 'enable' 상태가 됩니다. 또, 0~255 사이의 값을 아날로그 출력으로 할당하면 PWM 방식을 이용한 속도 조절이 가능합니다.

보기와 같이 터미널 블록에 모터를 연결합니다. M1+, M2+에 Positive가 할당될 때 정방향 회전에 해당합니다. 왼쪽 화살표가 가리키는 부분이 제어를 위한 핀 배열 설명입니다.

이 쉴드는 터미널 단자와 추가로 핀 헤더용 소켓도 제공합니다. 터미널 단자와 같은 순서로 장착하면 됩니다.

위와 같이 간단히 연결하였습니다. 테스트용이기 때문에, 별도의 외부 전원 없이 진행하였습니다. 좀 느려질 뿐 작동은 잘 합니다.

소스 작성하기

이제, 구동 소스를 작성하겠습니다.

const int E1 = 10;
const int E2 = 11;
const int M1 = 12;
const int M2 = 13;

우선 네 개의 상수를 선언하였습니다. 속도 제어를 위한 E1, E2, 방향 제어를 위한 M1, M2를 각각 핀 10~13번에 연결하기 위해 미리 선언한 것으로, 연결된 모터가 하나이기 때문에, E2와 M2는 생략해도 상관없습니다.(물론, 모터를 첫 번째 라인에 연결했을 경우.)

void setup() {
  pinMode(E1, OUTPUT);
  pinMode(M1, OUTPUT);

setup() 함수를 작성합니다. 모터를 각 방향으로 한 번씩만 구동하기 때문에, 모든 코드를 setup() 함수에 작성하고, loop() 함수는 비워두겠습니다.

위에서 선언한 상수를 이용하여 핀 모드를 설정합니다. 아두이노에서 모터 쉴드 쪽으로 제어 신호를 보내야하기 때문에, 둘 다 출력(OUTPUT) 모드로 설정하였습니다. E2, M2는 앞으로 생략합니다.

void setup() {
  pinMode(E1, OUTPUT);
  pinMode(M1, OUTPUT);
  //
  digitalWrite(M1, LOW);
  analogWrite(E1, 255);

위에서 설명한대로 M1에 'LOW'값을 할당했습니다. 따라서 Forward 방향으로 회전하도록 설정한 것입니다. 원래 DVD-ROM은 트레이가 닫히는 동작이 정방향이지만 저는 반대로 연결하였습니다.

또, 아날로그 출력을 이용하여 모터의 속도를 최대로 설정하였습니다. 물론, 아두이노에서 VIN을 통해 USB 전원을 공급 받기 때문에, 속도는 아주 느립니다.

void setup() {
  pinMode(E1, OUTPUT);
  pinMode(M1, OUTPUT);
  //
  digitalWrite(M1, LOW);
  analogWrite(E1, 255);
  //
  delay(1500);
  analogWrite(E1, 0);

마지막 줄에서 속도 값으로 '0'을 넘겨주었기 때문에 모터는 멈추게 됩니다. 그리고, 그 전까지 1500밀리 초 동안 트레이가 열리는 동작(정방향 구동)을 진행합니다.

const int E1 = 10;
const int M1 = 12;
void setup() {
  pinMode(E1, OUTPUT);
  pinMode(M1, OUTPUT);
  //
  digitalWrite(M1, LOW);
  analogWrite(E1, 255);
  //
  delay(1500);
  analogWrite(E1, 0);
  //
  delay(500);
  //
  digitalWrite(M1, HIGH);
  analogWrite(E1, 255);
  delay(1500);
  analogWrite(E1, 0);
}

전체 소스입니다. 1.5초 동안 open한 다음, 0.5초 쉬고, 반대로 1.5초 동안 close하도록 구성했습니다. M1에 'HIGH' 값을 할당하여 방향을 전환하는 코드를 볼 수 있습니다.

모터가 구동중이라면 사진과 같이 LED가 점등됩니다. 정방향일 경우 빨간 색, 역방향은 초록색입니다.

이 글과 비슷한 내용으로 동영상을 하나 만들었습니다. 실제 실행 결과는 영상을 참고하세요. 다음 시간에는 이 모터 쉴드를 이용하여 스텝 모터를 구동해 보겠습니다.


Comments