아두이노를 이용한 모터 회전제어 |
아두이노를 이용한 모터 회전제어
Arduino UNO 보드를 이용하여 DC모터를 제어하는 코드입니다. 이 코드는 몇 가지 조건에 의해 구동이 되는데, 먼저 가장 중요한 모드 전환 스위치로 인해 모드1, 2로 모드변경이 됩니다.
모드1 에서는 일정 시간동안 회전을 한 후, 일정 시간이 지난 다음 회전을 멈추고 쉬게 됩니다.
모드2 에서는 모드1과 마찬가지로 일정 시간동안 회전을 한 후, 일정 시간이 지나면 쉬었다가 다시 회전을 하게 되지만 이번에는 역방향으로 회전을 하게 되는 기능을 가지고 있습니다.
각각 회전시간과 쉬는 시간은 변수에 의해 제어가 되며, 차후 GUI를 이용한 사용자정의가 가능하게 소스코드를 수정할 예정입니다.
활용방향
이 소스를 기반으로 아래의 DC펌프를 제어할 예정입니다.
펌프를 일정 시간 회전 후 일정시간 쉬는 등의 기능은 프린트 헤드를 세척하는데 있어 효과적이기 때문에 이러한 방법을 생각한 것이고 차차 개발을 하는대로 여기에 관련 글을 포스팅할 예정입니다.
DC펌프 |
아두이노 프로그램 소스
아래는 해당 기능을 구현 할 프로그램 소스입니다.
아두이노를 이용한 모터 회전제어 |
// DC 모터 제어 핀const int motorPin1 = 2; // 모터 제어 핀 1const int motorPin2 = 3; // 모터 제어 핀 2const 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번에 연결합니다.
필요에 따라 핀 번호나 기타 설정을 조정할 수 있습니다.
부족한 부분은 차후 보강하도록 하겠습니다.
댓글 쓰기