본문 바로가기

Hardware/Arduino and Friends

아두이노 모터 쉴드를 이용해서 DC 모터 구동해보기

필요에 의해서 살짝 아두이노를 다시 살짝 꺼내들었는데요... 이왕 꺼낸김에 살짝 데리고 잠시 놀았답니다. ㅎ. 이번에는 모터 쉴드를 이용해서 DC 모터를 한 번 돌려볼려구요. 시스템은 아두이노 메가 보드와 모터 쉴드, 엔코더가 포함된 모터... 이렇습니다.

DC 모터이기 때문에.. 모터 쉴드측에는 그냥 맘 편히 +-단자에 잘 연결하면 되죠~^^

저렇게만 연결하면 끝이라 뭐 아주~ 쉽습니다...^^

그러나 엔코더도 살짝 보고 싶다는 생각이 들면서.. 또 저렇게 구성이 되었습니다. 화면상 왼쪽은 엔코더의 전원부분과 모터 쉴드를 연결한 부분이구요.. 오른쪽 위는 20번 21번에 엔코더 A.B상을 연결했습니다.

그러면 대충 저런 그림이 되죠~~~^^

항상 그렇듯.. 아두이노로 하는 연결은 참 간편합니다~~^^

#include <Encoder.h>

String inputString = "";
boolean stringComplete = false; 

const int 
  PWM_A   = 3,
  DIR_A   = 12,
  BRAKE_A = 9,
  SNS_A   = A0;

Encoder myEnc(20, 21);

int PWM = 0;

void setup() {
  pinMode(BRAKE_A, OUTPUT);  // Brake pin on channel A
  pinMode(DIR_A, OUTPUT);    // Direction pin on channel A
  
  Serial.begin(115200);
}

void loop() {
  if (stringComplete) {
    PWM = inputString.toInt();

    if (PWM < 0) {
      digitalWrite(DIR_A, LOW);
      analogWrite(PWM_A, -PWM);
    }
    else if (PWM > 0){
      digitalWrite(DIR_A, HIGH);
      analogWrite(PWM_A, PWM);
    }
    else {
      analogWrite(PWM_A, PWM);
    }
    
    inputString = "";
    stringComplete = false;
  }
  
  long newPosition = myEnc.read();

  Serial.print("PWM : ");
  Serial.print(PWM);
  Serial.print(", ");
  Serial.print("C : ");
  Serial.print(analogRead(SNS_A));
  Serial.print(", ");
  Serial.print("E : ");
  Serial.println(newPosition);
}

void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

먼저 PWM 명령은 serialEvent 함수에서 처리랍니다. 거기서 시리얼 통신으로 들어온 문자들을 받는 거구요... 그걸 loop()의 첫번째 부분에서 int로 변환해서 PWM(255MAX) 값으로 인가합니다. 전류는 모터 쉴드가 이미 연결되어 있으니 읽으면 되지요.. 단, 모터 쉴드는 전류의 방향까지는 알려주지 않습니다. 그래서 내가 인가한 전압방향이라고 생각해야합니다. 그리고, 엔코더를 myEnc.read()로 읽습니다. [바로가기]에 가면 엔코더를 읽는 라이브러리를 소개했는데요.. 살짝 업데이트가 되었더군요. 뭐 아무튼.. 그래서 위 코드를 실행하고 시리얼 모니터에서 -255~+255 사이의 값을 인가하면 됩니다. 모터는 돌고^^ 화면에는 내가 인가한 PWM 값과 전류값, 그리고 엔코더 값이 나타날겁니다.^^

네.. 저렇게 나타날겁니다.~~ 내가 입력한 PWM 값과 측정된 전류, 그리고 현재 엔코더의 값이죠.. 다시 이야기하지만, Arduino Motor Shield는 전류의 방향까지 알려주지 않습니다. 그러므로 내가 입력한 PWM 방향을 가지고 전류의 방향을 생각해야하는데요.. 그냥 돌릴때는 상관없겠지만.. 외부의 힘에 의해 모터의 동작이 크게 영향을 받는 다면 정확하다고 할 수는 없을겁니다. 그러나 모터를 보호하기 위한 용도로 제한(limitation)을 걸기 위해서라면 괜찮을 겁니다...

반응형