-
DC 모터
-
전원이 연결되면 연속으로 회전
-
정확한 위치 제어 어려움
-
-
서보 모터
- 정밀 제어 가능
-
스텝 모터
-
분할각 단위로만 회전 가능
-
하나의 펄스가 주어지면 분할각 만큼 회전하고 멈춤
-
-
0-180도 사이 회전
-
PWM신호로 위치 제어
-
50Hz : 20ms
-
1ms : 0도 , 2ms : 180도
-
-
3개 연결선
-
VCC : 붉은색
-
GND : 검정색 갈색
-
PWM출력 가능한 핀 : 노란색, 주황색 또는 흰색
-
-
**"Servo"**라이브러리
-
사용방법
-
"Servo"라이브러리
-
객체 생성 : Servo myServo;
-
제어핀 연결 : myServo.attach(servoPin);
-
각도 지정 : myServo.write(angle);
-
-
연결방법
-
LAB
-
서보모터 제어
#include <Servo.h> Servo myServo; int servoPin = 11; void setup(){ myServo.attach(servoPin); } void loop(){ int angle; for(angle=0; angle<180; angle++>){ myServo.write(angle); delay(5); } for (angle=100; angle>0; angle--){ myServo.write(angle); delay(5); } }
-
가변저항으로 서보 제어
#include <Servo.h> Servo myServo; int servoPin = 11; void setup(){ myServo.attach(servoPin); } void loop(){ int value = analogRead(A0); int angle = map(value, 0, 1023, 0, 180); myServo.write(angle); }
-
가변저항값 -> 서보모터 회전 시간 제어
#include <Servo.h> Servo myServo; int servoPin = 11; void setup(){ myServo.attach(servoPin); } void loop(){ time_current = millis(); if (time_current - time_previous >= interval){ time_previous = time_current; angle += angle_step; if (angle > 180){ angle = 180; angle_stemp += -1 } else if (angle < 0>){ angle =0; angle_step *= -1; } myServo.write(angle); } int reading = analogRead(A0); int new_interval = map(reading, 0, 1023, 5, 20); if (new_interval != interval){ interval = new_interval; Serial.print("Current Interval : "); Serial.println(interval); } }
-
시리얼 모니터로 서보 제어
#include <Servo.h> Servo myServo; void setup(){ myServo.attach(servoPin) } void loop(){ while (Serial.available()){ char data = Serial.read(); if (data == '\n'){ process_it = true; break; } buffer += data; } if (process_it) { process_it = false; int angle = buffer.toInt(); Serial.print(String(">> ") + buffer); if (angle<0 || angle>180) { Serial.println("...invalid angle."); }else { Serial.println(); myServo.write(angle); delay(3); } buffer = ""; } }
-
-
연결 순서 -> 정회전, 역회전 가능
-
연결선2개 : VCC, GND
-
PWM 신호로 속도 조절 가능
-
단점
-
L293D모터 드라이버
-
LAB
-
DC모터 정화전 & 역회전
void loop(){ // 모터 1 제어 digitalWrite(enable1, HIGH); digitalWrite(DIR1, HIGH); //정방향 digitalWrite(PWM1, LOW); delay(4000); digitalWrite(PWM1, HIGH); delay(200); digitalWrite(DIR1, LOW); digitalWrite(PWM1, HIGH); delay(4000); digitalWrite(PWM1, LOW); delay(200); digitalWrite(Enable1, LOW); }
-
DC모터 회전속도 조절
void loop() { digitalWrite(Enable1, HIGH); // 모터 제어 가능 상태 digitalWrite(DIR1, HIGH); // 정방향 회전 for (int i = 255; i >= 0; i--) { // 모터 회전 속도 서서히 증가 analogWrite(PWM1, i); delay(30); } digitalWrite(PWM1, HIGH); // 모터 정지 delay(200); digitalWrite(DIR1, LOW); // 역방향 회전 for (int i = 0; i < 256; i++) { // 모터 회전 속도 서서히 증가 analogWrite(PWM1, i); delay(30); } digitalWrite(PWM1, LOW); // 모터 정지 delay(200); digitalWrite(Enable1, LOW); // 모터 제어 불가능 상태 }
-
버튼으로 DC모터 회전 방향 제어
void loop() { if (digitalRead(button_pin)) { direction = !direction; if (direction) // clockwise Serial.println("Clockwise..."); else Serial.println("Anti-clockwise..."); digitalWrite(DIR1, direction); digitalWrite(PWM1, !direction); delay(2000); } }
-
가변저항 -> DC모터 속도 제어핀
void loop() { int reading = analogRead(A0); int speed = map(reading, 0, 1023, -255, 255); if (speed > 0) { digitalWrite(DIR1, HIGH); // 방 int pwm_value = 255 - speed; analogWrite(PWM1, pwm_value); Serial.print(String("Reading : ") + reading); Serial.println(String(", Clockwise : ") + speed); } else { digitalWrite(DIR1, LOW); // 역방 int pwm_value = abs(speed); analogWrite(PWM1, pwm_value); Serial.print(String("Reading : ") + reading); Serial.println(String(", Anti-clockwise : ") + pwm_value); } delay(1000); }
-
-
서보모터
-
정밀한 위치제어 가능
-
0-180도 범위만 회전
-
"Servo"라이브러리
-
-
DC 모터
-
간단한 연결, 간단한 제어
-
모터 드라이버 칩 필요
-
회전 방향 제어를 위한 별도 회로 필요
-
전용 전원 공급위한 별도 회로 필요
-
-