[아두이노] Differential Wheeled RC카 만들기 #2-1 "모터 회전 방향 테스트"

    DC 모터에 대해..

    개념

    DC 모터에 대해 간단하게 짚고 넘어가기 위해 구글링을 하다가 괜찮은 링크가 있어서 띄웁니다.

    www.devicemart.co.kr/goods_process/get_html_to_string?

     

    DC MOTOR

    DC Motor [디바어스마트 바로가기] 작성자: 유은재 (CJ) 작성일: 2018.9.27 1. DC 모터 개요 DC(Direct Current, 직류)모터는 브러시의 유/무에 따라서 일반적으로 Brushed DC모터와 Brushless DC (BLDC)모터로 구분할

    www.devicemart.co.kr

    위는 DC 모터에 대한 '기본' 개념이고, 기어(감속) 모터, BLDC 모터, 스텝 모터, 서보 모터, 액추에이터 등등 다양한 종류의 DC 모터가 있습니다.

    그리고 각 모터마다 제어하는 방법이 다르죠.

     

    지금 제가 사용하는 모터는 DC 기어(감속) 모터입니다.

    사실 "DC 모터 + 감속기"의 개념인데요, 그냥 기어를 추가해서 기어비가 있는 모터를 말합니다.

    노란색 하우징 부분 안에 기어가 들어있기 때문에 '기어 박스'라고 합니다.

    기어 박스 내부는 아마 위와 같이 되어있을 겁니다.

    단, 제가 사용중인 것은 단품으로 1,800원 짜리이니 아마 기어는 메탈이 아닌 플라스틱 소재겠죠.

    제품 선정 방법

    MODEL VOLTAGE NO LOAD AT MAXIMUM EFFICIENCY STALL
    OPERATING RANGE NOMINA SPEED CURRENT SPEED CURRENT TORQUE OUTPUT TORQUE CURRENT
    V r/min A r/min A N.m Kg.cm w N.m Kg.cm A
    NP02D
    -288
    3.0 - 12.0 6 21 0.10 19 0.17 0.05 0.47 0.18 0.18 1.8 0.6

    단품 1,800원짜리 기어 모터의 스펙입니다.

     

    가장 중요한 기어비(gear ratio)는 1:288로, 모터 부하측 허브가 1바퀴 회전하려면 DC 모터가 288바퀴 돌아야 한다는 얘기입니다.

    위 표에서 RPM이 21이니, 기어를 뺀 원래 DC 모터는 약 6,000 RPM 이었을겁니다.

    빠르게 회전하는 높은 RPM의 DC 모터에 기어를 장착하면 기어비에 따라 정밀한 제어가 가능합니다.

     

    모터의 힘을 나타내는 회전력 토크(torque)는...

    뭐 사실 이렇게 작은 모터를 구매하는 분들은 애초에 토크를 보고 구매하진 않았을겁니다.

    대부분 저렴한 가격때문에 구매하셨겠죠.

    힘이 중요하신 분들은 아마 본인이 필요한 힘과 모터 출력(Watt)을 잘 알고 계실겁니다.

    (힘 센 기어 모터는 Aliexpress 쪽이 저렴합니다. 대신 모터 브라켓을 같이 파는 경우가 매우 드물어 제품 선택에 지장이 많습니다.)


    모터 드라이버

    모터 컨트롤러라고도 많이 부릅니다.

    제어하고자 하는 모터 종류에 따라 모터 드라이버도 종류가 다양하고, 모터 스펙(특히 전류)에 따라 용량도 다양합니다.

    저는 쬐깐이 모터 2개를 돌리기 때문에 디바이스 마트에서 2채널짜리들 중 가장 싼 모터 드라이버를 구매했습니다.

    (보통 모터 1개를 구동한다 하면 1채널, 2개를 구동하면 2채널, 4개를 구동하면 4채널이라고 합니다.)

     

    저같이 취미로 만드는 사람들에게 모터 드라이버 같이 저렴하지만 중요(core) 부품인 녀석들이 고장나면, 워크 플로우에 지장이 생길 뿐더러 배송비로 따귀를 맞기 때문에 어느정도 신뢰성이 있는 놈으로 골랐습니다.

    (VAT 포함 2,200원 짜리를 사는데 배송비를 2,500원을 태워?)

     

    L298N

    L298 모터 드라이버

    이렇게 생겼구요, 2,000원입니다.

    자, 2,000원이기 때문에 제품에 대한 평가가 매우 관대해집니다.

    일단 커피보다 쌉니다.

     

    제품 개요

    이쪽 분야에 대해 어린이 수준인 분들을 위해 주목해야 할 부분에 하이라이트를 주었습니다.

    • 본 제품은 ST사의 고전압 고전류 모터 드라이버 칩인 L298N을 탑재한 모터 드라이버입니다.
    • L298N칩은 최대 46V까지의 전압에서 동작하며, 연속적으로 2A(피크시 3A)의 출력을 낼수 있는 25W 등급의 칩입니다.
    • 칩에 내장된 Dual H-Bridge 드라이버DC모터스텝모터를 동작시키는데 사용이 가능합니다.
    • 칩에 대한 자세한 내용은 L298N 데이터시트를 참조하세요.
    • L298N칩에는 방열판이 붙어 있어 출력이 높아짐에 따라 발생하는 열을 효율적으로 식힐 수 있어 훌륭한 성능을 자랑합니다.

    먼저 전원은 최대 46V까지 인가 가능, continuous current가 2A, max(peak) current는 3A로 견딜 수 있는 시간은 자세히 나오지 않았습니다.

    2개의 DC 모터, 혹은 1개의 스텝 모터를 제어 가능합니다.

    자체 방열판이 달려있기 때문에 (2,000원 짜리 주제에)열관리에도 효율적입니다.

     

    제어 방법

    먼저 두 가지 자료를 참고해야 합니다.

    PIN MAP

    첫 번째로 봐야 할 자료는 제품의 핀맵(pin map) 입니다.

    output A 및 B에 DC 모터를 연결합니다.

    전원부에는 3개의 단자가 있는데, 가운데는 GND이고 위는 12V 입력, 아래는 5V 출력입니다.

    TTL 5V 출력을 사용하려면 5V enable 점퍼를 제거해야 합니다.

    파워를 모터 드라이버에 연결하면 5V 출력을 사용할 수 있다는 뜻으로, 아두이노를 사용할 때 편리할 겁니다.

    (단, 입력 전압이 7~35V일 때 가능합니다. 5V 넣고 5V는 못뺀다 이 말입니다.)

    신호 입력 측은 6개의 단자가 있고, 2개는 점퍼로 연결되어 있습니다.

    점퍼를 제거하지 않으면 0~5V 입력으로 속도를 제어할 것이고, 점퍼를 제거한 부분에 PWM 신호를 입력하여 속도를 제어합니다.

    저는 점퍼를 제거하고 PWM 신호를 넣어줄 것입니다.

    왜냐하면 아두이노 우노 제품에는 제대로 된 DAC 컨버터가 없거든요.

     

    아래는 두 번째로 봐야 할 자료로, 입력 신호에 따른 모터의 동작을 적어놓은 일종의 진리표(truth table)입니다.

    TRUTH TABLE

    DC 모터는 다른 모터들에 비해 제어가 매우 단순한 편입니다.

    일반적으로 모터에서 딱 2가닥의 선이 나옵니다.

    보통 (-), (+)라고 하지만 (a), (b) 이런식으로도 표기되어 있습니다.

    뭐 그렇게 중요한 부분은 아닙니다.

    쇼트날 걱정 하지 마시고 먼저 모터에서 나온 선 2가닥을 아무렇게나 모터 드라이버에 연결해보세요.


    결선도

    방금 위에서 말씀드린 것 처럼, 이렇게 작은 DC 모터를 제어하는 것은 매우 쉽습니다.

    용량도 매우 아담하고, 무엇보다 별도의 추가 부품 없이 아두이노와 모터 드라이버로 많은 사항들을 고려하지 않고 사용 가능합니다.

    모터 구동 테스트를 위한 결선도 입니다.

    (와 진짜 그리기 너무 힘들다;)

    위는 테스트중인 환경, 즉 아두이노와 컴퓨터가 USB 케이블로 연결되어 보드에 따로 전원을 공급하지 않는 상태일 때 결선도 입니다.

    USB 케이블을 분리하여 구동시키려면 모터 드라이버 전원부에 있는 점퍼를 제거한 후 위와 같이 아두이노 보드에 전원을 공급합니다.

    회색, 보라색, 흰색 케이블은 좌측 모터를, 주황색 빨간색, 갈색 케이블은 우측 모터를 제어하는 케이블 입니다.

    일부러 모터 드라이버와 모터 사이의 케이블 2 가닥은 모두 검은색으로 표현했습니다.

    이게 이번 구동 테스트의 핵심이거든요.

    결선 하실때 이 케이블들은 그냥 고려하지 말고 납땜, 연결하세요.

    모터 방향은 실제로 구동시켜 봐야 알 수 있습니다.


    모터 방향 테스트

    코드

    #define motorLeft_EN 3    // Left Motor: ENA(PWM) pin
    #define motorLeft_OUT1 2  // Left Motor: IN1 pin
    #define motorLeft_OUT2 4  // Left Motor: IN2 pin
    #define motorRight_EN 5   // Right Motor: ENB(PWM) pin
    #define motorRight_OUT1 7 // Right Motor: IN3 pin
    #define motorRight_OUT2 6 // Right Motor: IN4 pin
    
    void setup() {
      Serial.begin(19200);
      pinMode(motorLeft_EN, OUTPUT);
      pinMode(motorLeft_OUT1, OUTPUT);
      pinMode(motorLeft_OUT2, OUTPUT);
      pinMode(motorRight_EN, OUTPUT);
      pinMode(motorRight_OUT1, OUTPUT);
      pinMode(motorRight_OUT2, OUTPUT);
    }
    
    void loop() {
      // Left motor test #1
      Serial.println("< LEFT >\tIN1: HIGH,\tIN2: LOW");
      digitalWrite(motorLeft_OUT1, HIGH);
      digitalWrite(motorLeft_OUT2, LOW);
      analogWrite(motorLeft_EN, 150);
      delay(2000);
      digitalWrite(motorLeft_OUT1, HIGH);
      digitalWrite(motorLeft_OUT2, HIGH);
      delay(2000);
    
      // Left motor test #2
      Serial.println("< LEFT >\tIN1: LOW,\tIN2: HIGH");
      digitalWrite(motorLeft_OUT1, LOW);
      digitalWrite(motorLeft_OUT2, HIGH);
      analogWrite(motorLeft_EN, 150);
      delay(2000);
      digitalWrite(motorLeft_OUT1, HIGH);
      digitalWrite(motorLeft_OUT2, HIGH);
      delay(2000);
    
      // Right motor test #1
      Serial.println("< RIGHT >\tIN1: HIGH,\tIN2: LOW");
      digitalWrite(motorRight_OUT1, HIGH);
      digitalWrite(motorRight_OUT2, LOW);
      analogWrite(motorRight_EN, 150);
      delay(2000);
      digitalWrite(motorRight_OUT1, HIGH);
      digitalWrite(motorRight_OUT2, HIGH);
      delay(2000);
    
      // Right motor test #2
      Serial.println("< RIGHT >\tIN1: LOW,\tIN2: HIGH");
      digitalWrite(motorRight_OUT1, LOW);
      digitalWrite(motorRight_OUT2, HIGH);
      analogWrite(motorRight_EN, 150);
      delay(2000);
      digitalWrite(motorRight_OUT1, HIGH);
      digitalWrite(motorRight_OUT2, HIGH);
      delay(2000);
    }

    가~장 심플한 모터 구동 테스트 코드입니다.

    제가 위에서 왜 모터 결선 신경쓰지 말라고 했냐면, 제품 주문했을때 오는 상태가 아래와 같기 때문입니다.

    와! 정성!! 와! DIY!!

    모터에 납땜을 직접 해야하는데, 납땜 극성이나 방향에 대한 정보가 없습니다.

    그냥 아무렇게나 납땜하시고, 아무렇게나 연결하세요.

    위의 코드를 구동시켜 모터 회전 방향을 정확하게 알아볼 것입니다.

    그 후 모터 방향이 다르다 싶으면 모터 드라이버쪽 결선만 바꿔주면 됩니다!

     

    코드의 동작 해석은 다음과 같습니다.

    1. 왼쪽 모터, HIGH-LOW (2sec)
    2. 왼쪽 모터 정지 (2sec)
    3. 왼쪽 모터, LOW-HIGH (2sec)
    4. 왼쪽 모터 정지 (2sec)
    5. 오른쪽 모터 HIGH-LOW (2sec)
    6. 오른쪽 모터 정지 (2sec)
    7. 오른쪽 모터 LOW-HIGH (2sec)
    8. 오른쪽 모터 정지 (2sec)
    // Left motor test #1
    Serial.println("< LEFT >\tIN1: HIGH,\tIN2: LOW");
    digitalWrite(motorLeft_OUT1, HIGH);
    digitalWrite(motorLeft_OUT2, LOW);
    analogWrite(motorLeft_EN, 150);
    delay(2000);
    digitalWrite(motorLeft_OUT1, HIGH);
    digitalWrite(motorLeft_OUT2, HIGH);
    delay(2000)

    첫 번째 부분만 살펴 보겠습니다.

    모터 드라이버의 진리표에 따르면, IN1에 HIGH, IN2에 LOW 값을 주었을 때 corotation(정회전), 반대로 IN1에 LOW, IN2에 HIGH 값을 주었을 때 reverse(역회전)이라고 합니다.

    하지만 결선을 맘대로 했기 때문에 이건 돌려봐야 아는 사실이죠.

     

    digitalWrite()로 각 핀에 HIGH 및 LOW값을 설정하고 analogWrite()로 PWM 핀에 150의 값을 줍니다.

    PWM 값의 범위는 0~255(8bit) 입니다.

     

    모터 정지 부분에 있어서 짚고 넘어가야 하는 점이 있습니다.

    LOW-LOW 값을 주면 이는 말 그대로 모터를 '정지'한 개념이고 관성에 따른 미끄러짐 현상이 일어납니다.

    HIGH-HIGH를 주어야 모터 '브레이크'가 잡힙니다.


    실행 결과

    위 동영상과 같이 제꺼는 정 반대로 동작하네요.

    정회전 후 역회전할 줄 알았는데 저는 역회전 후 정회전을 하는군요.

     

    이 작업이 필요한 이유는, 일단 위에서 계속 말씀드린것과 같이 결선 및 납땜의 영향도 있지만, 내가 어떤 값을 주어야 모터가 정회전 혹은 역회전 하는지 정확하게 알아야 하기 때문입니다.

    저는 이 테스트 이후 양쪽 모터 드라이버 결선을 모두 뒤바꿔 주었습니다.

     

    모터 방향과 결선이 모두 정리되었으니 다음 포스팅에서는 PWM 최소/최대값을 알아보겠습니다.

    댓글

    Designed by JB FACTORY