Responsive Advertisement

아두이노 우노 모터제어 시계방향, 반시계방향 회전제어 ①


아두이노를 이용한 모터 회전제어
아두이노를 이용한 모터 회전제어





아두이노를 이용한 모터 회전제어


Arduino UNO 보드를 이용하여 DC모터를 제어하는 코드입니다. 이 코드는 몇 가지 조건에 의해 구동이 되는데, 먼저 가장 중요한 모드 전환 스위치로 인해 모드1, 2로 모드변경이 됩니다.

모드1 에서는 일정 시간동안 회전을 한 후, 일정 시간이 지난 다음 회전을 멈추고 쉬게 됩니다.
모드2 에서는 모드1과 마찬가지로 일정 시간동안 회전을 한 후, 일정 시간이 지나면 쉬었다가 다시 회전을 하게 되지만 이번에는 역방향으로 회전을 하게 되는 기능을 가지고 있습니다.
각각 회전시간과 쉬는 시간은 변수에 의해 제어가 되며, 차후 GUI를 이용한 사용자정의가 가능하게 소스코드를 수정할 예정입니다.

활용방향


이 소스를 기반으로 아래의 DC펌프를 제어할 예정입니다.
펌프를 일정 시간 회전 후 일정시간 쉬는 등의 기능은 프린트 헤드를 세척하는데 있어 효과적이기 때문에 이러한 방법을 생각한 것이고 차차 개발을 하는대로 여기에 관련 글을 포스팅할 예정입니다.



DC펌프
DC펌프


아두이노 프로그램 소스


아래는 해당 기능을 구현 할 프로그램 소스입니다.


아두이노를 이용한 모터 회전제어
아두이노를 이용한 모터 회전제어




// DC 모터 제어 핀
const int motorPin1 = 2;  // 모터 제어 핀 1
const int motorPin2 = 3;  // 모터 제어 핀 2
const int enablePin = 9;  // 모터 속도 제어 핀 (PWM)

// 토글 스위치 핀
const int togglePin = 4;

// 사용자 설정 시간 (밀리초 단위)
unsigned long timeA = 5000;  // 모터 회전 시간
unsigned long timeB = 2000;  // 모터 정지 시간
unsigned long timeC = 3000;  // 모드 2에서의 역방향 회전 시간

// 상태 변수
int mode = 1;
unsigned long previousMillis = 0;
int state = 0;

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

void loop() {
  // 토글 스위치 상태 확인
  if (digitalRead(togglePin) == LOW) {
    mode = 1;
  } else {
    mode = 2;
  }

  unsigned long currentMillis = millis();

  if (mode == 1) {
    // 모드 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 {
    // 모드 2: 시계 방향, 정지, 반시계 방향, 정지 반복
    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, 255);  // 최대 속도
  Serial.println("시계 방향 회전");
}

void motorCounterClockwise() {
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  analogWrite(enablePin, 255);  // 최대 속도
  Serial.println("반시계 방향 회전");
}

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



위 코드를 토대로 아래의 아두이노 용 모터 제어 실드를 이용하면 원하는 결과를 쉽게 얻으리란 생각입니다.




아두이노 모터 제어실드
아두이노 모터 제어실드


소스에 대한 설명


위 코드는 다음과 같은 기능을 수행합니다:
  • 토글 스위치를 이용하여 모드 1과 모드 2를 전환합니다.
  • 모드 1에서는 시계 방향으로 회전하고 정지를 반복합니다.
  • 모드 2에서는 시계 방향 회전, 정지, 반시계 방향 회전, 정지를 반복합니다.
  • timeA, timeB, timeC 변수를 조정하여 각 동작의 시간을 설정할 수 있습니다.
사용자가 시간 간격을 쉽게 조정할 수 있도록 코드 상단에 timeA, timeB, timeC 변수를 배치했습니다. 이 값들을 원하는 밀리초 단위로 변경하여 각 동작의 지속 시간을 조절할 수 있습니다. 차후 이 부분은 LCD액정을 통해 사용자가 직접 확인하며 타이머 설정을 변경할 수 있게 수정할 예정입니다.

이 코드를 Arduino IDE에 복사하여 아두이노 우노에 업로드하면 모터 제어상태를 확인하실 수 있습니다.

회로 연결시 주의사항

DC 모터는 모터 드라이버(위의 L298N 모터 실드 등)를 통해 연결하는게 건편하게 모터를 제어할 수 있는 올바른 방법입니다.
토글 스위치는 디지털 핀 4번에 연결하고, 다른 한 쪽은 GND에 연결합니다.
모터 제어핀은 2번과 3번, PWM 제어핀은 9번에 연결합니다.

필요에 따라 핀 번호나 기타 설정을 조정할 수 있습니다.

부족한 부분은 차후 보강하도록 하겠습니다.



댓글 쓰기