ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서보모터(Servo motor) 제어
    라즈베리파이 2024. 1. 10. 13:58

    먼저 모터의 종류를 알아보자.

    모터의원리

    • DC 모터

    - 가장흔한모터, 입력전류방향으로(+, -) 회전방향제어

    - 고회전에유리, RC카, 쿼드콥터등 광범위하게 사용

    - 회전수와 방향제어를 위해서는 드라이버모듈이 필요

    • 서보모터(Servo motor)

    - 보통0~180 사이를 움직이며위치를 정확히제어가능

    -RC카의방향타, 로봇관절등 회전각 제어에적합

    - PWM 신호로 간단히 위치제어가능

    • 스텝모터(Stepper motor)

    - 회전방향 뿐 아니라 회전각을 정밀히제어할수있음

    - DC 모터와 서보모터의 장점을 합친 모터

    - 상대적으로 고회전이 요하지 않고 정밀한 제어가 필요한 경우

    - 3D 프린터의 핵심모터 003- 제어가 복잡하므로 스텝모터드라이버모듈을이용해서 제어

     

    그중에 내가 사용할 서보모터(Servo motor)는 마이크로서보모터를 사용할 거다.

     

     • 마이크로서보모터(SG90)

    -작고, 싸고, 가볍고, 저전력으로 동작

    - 라즈베리파이 전원5V 로도 동작가능

    - PWM 핀하나로 제어가능

    • 고출력이필요한경우- MG-9XX 시리즈와 같은 고출력모델사용 (별도의외부전원필요)- 제어방법은 동일

     

    서보모터제어

    • PWM 신호로회전각제어

    - PWM 신호(펄스폭)에따라-90' ~ +90' 사이의 위치를설정가능

    - 0.5ms 에서-90', 2.5ms 90' (총 20ms 주기)

    - 회전각양끝에는여유를 둔다.

     

    • 회로도 

    GND(검정/갈색) → GND

    PWR(적색) → 5V

    SIG (황색) → PWM 신호

     

    • 서보모터 실행 동작

     

    • 서보모터 각도의 듀티비 방법

    - 주기는 20ms로 동작하며, 주파수는 50Hz로 구성되어 있다.

    - 주기를 조절해가면서 사용하면 각도를 변화시킬 수 있다.

     

     

    우리가 사용할 마이크로서보모터는 softPwm.h 라이브러리를 사용한다.

      관련 함수

    int softPwmCreate(int pin, int initialvalue, int pwmRange)

    - 소프트웨어로 제어하는 PWM 핀을 생성하는 함수

    - 라즈베리파이의 모든 GPIO 핀 이용 가능

     - 매개 변수

      •  pin : PWM 핀으로 사용할 GPIO 핀

      •  initialValue : chrl Pluse width

      •  pwmRange :  한 주기

     

    -  사용 예) softPwmCreate(4, 64, 255);

      •  한 주기가 255ms인 펄스를 25% Duty Cycle로 생성하고 4번 핀을 통해 제어함

      •  Duty Cycle = 64/255 * 100 = 25%

     

    void softPWmWrite(int pin, int value)

    - 생성된 PWM 핀을 통해 1의 지속 시간을 변경하여 Duty Cycle 변경

    -매개 변수

      •  pin : 생성된 PWM 핀

      •  value : 1의 지속 값

     

    -- 서보모터를 1간격 마다 다른 각도로 회전시키는 반복적인 작업을 실행해보았다.

    여기서 서보 모터의 회전을 보면 듀디비로 계산을 해보면  5 = -90도, 15 = 0도, 24 = 90도 돌게 된다.

     

     

    다양한 예시를 해보자.

    --밑에 코딩을 이용해서 터미널 창에 c를 입력하면 0r을 입력하면 90l을 입력하면 -90q를 입력하면 프로그램이 종료되도록 코드를 작성했다.

    먼저 각 함수의 대한 변수명과 서보모터의 GPIO핀을 몇번 사용할건지 선언하자.  

    그리고 다른 부분은 같은데 while문을 조금 바꾸면 된다.

    이렇게 어떤 문자를 통해 자기가 원하는  각도로 조절 할 수 있다.

     

    --위의 코드를 이용해서 c를 입력하면 0도로 이동함과 동시에 첫 번째 led가 켜지고, r을 입력하면 90도로 이동함과 동시에 두 번째 led가 켜지고, l을 입력하면 -90도로 이동함과 동시에 세 번째 led가 켜지도록 코드를 작성했다.

    먼저 led를 사용하므로 led들의 gpio를 선언과 핀모드를 설정한다.

    그리고는 while 문 안에 if문을 사용해 각 문자가 입력될때 어떤 led가 켜지게 설정을 해주었다. ( *여기서 중요한 것은 

    모든 led들의 상황이 바뀌면 그전 상황에서 켜졌던 led는 꺼지게 해야한다. 그래야 부화가 적고 원하는 led만 켜지게 할수 있다.)

     

    --위의 코드를 참조해 사용한 초음파 센서를 이용해서 거리가 10cm미만이면 첫 번째 led가 켜지면서 서보모터가 90도로 이동하고 10cm이상이면 두 번째 led가 켜지면서 0도로 이동되도록 코드를 작성했다.

     

    초음파 센서를 사용해야하므로 초음파센서에 대한 gpio를 선언하고 각각의 트리거와 에코의 핀모드를 설정했다.

    그리고 while문 안에 거리에 대한 함수를 선언하고 일정거리가 되면 해당 led가 켜지고 서보모터는 지정한 각도로 움직이게 설정했다. ( *초음파 센서의 대한 내용은 블로그를 확인해보면 된다.)

    '라즈베리파이' 카테고리의 다른 글

    자동 요리 도구 프로젝트  (1) 2024.04.17
    초음파센서 제어  (0) 2024.01.12
    온습도 센서( DHT11) 제어하기  (0) 2024.01.03
    7-segment, pwm 제어  (0) 2023.12.20
    sw 제어하기  (0) 2023.12.12
Designed by Tistory.