Responsive Advertisement

아두이노 우노 DC 모터 회전속도 컨트롤 ②





모터 회전속도 제어하기


어제 올린 포스트의 연장입니다.

간단하게 DC모터를 순방향, 역방향으로 제어를 했다면. 이번에는 이렇게 회전하는 모터의 속도를 제어해 보도록 하겠습니다.
모터의 속도 제어를 위해서는 다음과 같은 방법으로 몇 가지 부품을 추가해서 사용해야 합니다. 이렇게 한다면 좀 더 세밀한 모터 제어가 가능해지게 됩니다.


필요 부품과 연결방법

필요한 추가 부품

  • 포텐셔미터 (10kΩ)
  • L298N 모터 드라이버 모듈

연결 방법

포텐셔미터왼쪽 핀은 DC 5V VCC에 연결하며, 중앙 핀은 Arduino UNO의 아날로그 입력 핀. 예를 든다면 A0에 연결하면 됩니다. 마지막으로 오른쪽 핀은 GND에 연결하면 포텐셔미터의 연결은 끝낟게 됩니다.

L298N 모터 드라이버 실드ENA는 Arduino의 PWM 핀. 즉, 9번 핀에 IN1은 Arduino UNO의 디지털 핀. 즉, 2번 핀에 IN2는 Arduino UNO의 디지털 핀 3번에 연결하며, OUT1과  OUT2는 DC 모터에 연결하며ㄴ 끝이 납니다.

12V, GND에는 외부 12V전원을 연결하여 전원 공급을 하도록 합니다.



포텐셔미터
포텐셔미터



아두이노 소스

어제 포스팅했던 기존 코드에 속도 제어가 가능하도록 소스를 수정하였습니다.하겠습니다.

const int motorPin1 = 2;
const int motorPin2 = 3;
const int enablePin = 9;
const int togglePin = 4;
const int potPin = A0;  // 포텐셔미터 연결 핀

unsigned long timeA = 5000;
unsigned long timeB = 2000;
unsigned long timeC = 3000;

int mode = 1;
unsigned long previousMillis = 0;
int state = 0;
int motorSpeed = 0;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(togglePin, INPUT_PULLUP);
  pinMode(potPin, INPUT);
  
  Serial.begin(9600);
}

void loop() {
  // 포텐셔미터 값 읽기 및 모터 속도 설정
  motorSpeed = map(analogRead(potPin), 0, 1023, 0, 255);
  
  if (digitalRead(togglePin) == LOW) {
    mode = 1;
  } else {
    mode = 2;
  }

  unsigned long currentMillis = millis();

  if (mode == 1) {
    if (state == 0 && (currentMillis - previousMillis >= timeB)) {
      motorClockwise();
      previousMillis = currentMillis;
      state = 1;
    } else if (state == 1 && (currentMillis - previousMillis >= timeA)) {
      motorStop();
      previousMillis = currentMillis;
      state = 0;
    }
  } else {
    if (state == 0 && (currentMillis - previousMillis >= timeB)) {
      motorClockwise();
      previousMillis = currentMillis;
      state = 1;
    } else if (state == 1 && (currentMillis - previousMillis >= timeA)) {
      motorStop();
      previousMillis = currentMillis;
      state = 2;
    } else if (state == 2 && (currentMillis - previousMillis >= timeB)) {
      motorCounterClockwise();
      previousMillis = currentMillis;
      state = 3;
    } else if (state == 3 && (currentMillis - previousMillis >= timeC)) {
      motorStop();
      previousMillis = currentMillis;
      state = 0;
    }
  }
}

void motorClockwise() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  analogWrite(enablePin, motorSpeed);
  Serial.println("시계 방향 회전, 속도: " + String(motorSpeed));
}

void motorCounterClockwise() {
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  analogWrite(enablePin, motorSpeed);
  Serial.println("반시계 방향 회전, 속도: " + String(motorSpeed));
}

void motorStop() {
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  analogWrite(enablePin, 0);
  Serial.println("모터 정지");
}


모터 속도제어에 대한 상세설명

포텐셔미터 연결방법

아날로그 핀 A0에 포텐셔미터를 연결합니다. 이렇게 함으로써 0-1023 사이의 1024개의 아날로그 값을 포텐셔미터를 통해 아두이노가 읽어 드릴 수 있게 됩니다.

속도 제어 로직

반복적으로 실행되는 loop()함수에서 analogRead(potPin)을 사용하여 포텐셔미터 값을 지속적으로 읽어 들입니다.
map()함수는 analogRead()가 읽어 들인 0-1023 범위의 값을 다시 0-255사이의 정수로 변환합니다. 이 수치가 실질적으로 모터의 속도가 되게 됩니다.

모터 제어함수 수정

실절적인 모터의 속도 제어는 motorClockwise()와 motorCounterClockwise()함수에서 analogWrite(enablePin, motorSpeed)를 사용하여 모터 속도를 제어하게 됩니다.

참고로, Arduino IDE의 Serial모니터를 통해 현재 모터 속도를 확인할 수 있습니다.


주의사항

아두이노와 L298N모터 실드를 사용할 떄는 충분한 전류를 공급할 수 있어야 합니다. 이에 외부 용량이 높은 전원 아답터를 추천드립니다.
DC 모터와 Arduino의 접지(GND)는 공통으로 연결하여 사용하게 합니다.

포텐셔미터 값을 읽어 들일 때 페트라이트 코어 등을 추가로 장착함으로써 노이즈를 줄여 줄 수 있으며, 필요하다면 평균값을 사용하거나 간단한 필터링을 적용하는 방법도 있습니다.


결론

이렇게 어제 포스팅한 소스를 기반으로 한 수정된 코드와 포텐셔미터를 추가로 회로를 구성한다면 실시간으로 모터의 속도를 조절할 수 있게 됩니다. 모드 전환과 타이밍 제어는 이전과 동일하게 작동하면서, 추가로 속도 제어 기능이 추가된 제어 회로가 완성되었습니다.

다음에는 회로 상에서 타이머의 값을 바꿀 수 있는 푸시 스위치를 추가해 보도록 하겠습니다.


댓글 쓰기