Skip to content

Latest commit

 

History

History
351 lines (241 loc) · 8.02 KB

File metadata and controls

351 lines (241 loc) · 8.02 KB

📌 모터

  • DC 모터

    • 전원이 연결되면 연속으로 회전

    • 정확한 위치 제어 어려움

  • 서보 모터

    • 정밀 제어 가능
  • 스텝 모터

    • 분할각 단위로만 회전 가능

    • 하나의 펄스가 주어지면 분할각 만큼 회전하고 멈춤



✔ 서보 모터

  • 0-180도 사이 회전

  • PWM신호로 위치 제어

    • 50Hz : 20ms

    • 1ms : 0도 , 2ms : 180도

  • 3개 연결선

    • VCC : 붉은색

    • GND : 검정색 갈색

    • PWM출력 가능한 핀 : 노란색, 주황색 또는 흰색

  • **"Servo"**라이브러리

  • 사용방법

    1. "Servo"라이브러리

    2. 객체 생성 : Servo myServo;

    3. 제어핀 연결 : myServo.attach(servoPin);

    4. 각도 지정 : myServo.write(angle);

  • 연결방법

    image

  • 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 = "";
          }
      }



✔ DC 모터

  • 연결 순서 -> 정회전, 역회전 가능

  • 연결선2개 : VCC, GND

  • PWM 신호로 속도 조절 가능

  • 단점

    • 결선후 정회전 역회전 선택 불가 -> 별도의 H브리지 회로 필요

      image

    • 많은 전력 필요 -> 데이터 핀 출력으로 제어 어려움

    • 전용 모터 드라이브 칩(L293D모터 드라이버) -> DC모터 제어

  • L293D모터 드라이버

    image

    • 2개 모터 연결 가능

    • 정회전, 역회전 선택 가능

    • 속도제어 : PWM 출력 가능 핀 사용

    • 모터 전용 별도 전원 제어

    • 3개의 제어선

      • enable : 모터 활성화

      • PWMs : 속도 제어

      • DIR : 방향 제어

    • 연결방법

      image

      image

  • 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);
      }

✔ 연결방법





✔ LAB



🔎 정리

  • 서보모터

    • 정밀한 위치제어 가능

    • 0-180도 범위만 회전

    • "Servo"라이브러리

  • DC 모터

    • 간단한 연결, 간단한 제어

    • 모터 드라이버 칩 필요

      • 회전 방향 제어를 위한 별도 회로 필요

      • 전용 전원 공급위한 별도 회로 필요