본문 바로가기
라즈베리파이_피코_피코 W/마이크로파이썬

12. 라즈베리파이 피코 서보모터

by 땜블리 2023. 3. 6.
728x90
반응형
SMALL

안녕하세요 땜블리 입니다.

라즈베리파이 피코 베이직 트레이닝 보드를 이용한 서보모터 제어를 진행 하겠습니다.

베이직 트레이닝 보드는 아래에서 확인이 가능합니다.

https://ttcw.tistory.com/4

 

라즈베리파이 피코 베이직 트레이닝보드 구성

라즈베리파이 피코 보드의 펌웨어실습을 위한 베이직 트레이닝보드를 소개 합니다. 현재 네이버 스마트스토어에서 판매가 진행되고 있습니다. 라즈베리파이 피코 베이직 트레이닝 보드 라즈베

ttcw.tistory.com

1) 서보모터 구동 원리

(1) 동작설명

서보(Servo)란 서보메커니즘을 적용했다는 의미로, 시스템에서 해당 기기를 시스템이 요구하는 특정 위치로 이동하거나, 특정 수치(속도, 토크 등)만큼 가동시킬때, 정확하게 제어할 수 있는 구조를 갖추고 있다는 의미 입니다.

서보계의 조작부에 사용되는 것을 서보모터라고 부르며 전기식, 유압식, 전기유압식으로 구성되어 있습니다.

VCC GND 에 전원을 인가하고 Signal PWM 신호를 인가하여 모터를 제어합니다.

 

 

서보 모터는 Signal 선에 인가되는 PWM 신호에 따라서 해당 각도로 회전하게 됩니다.

주기가 20ms인 신호에 0.7ms~2.3msH폭을 가지는 PWM 신호에 따라서 모터의 각도가 결정됩니다. 45도 단위로 0.4ms씩 차이가 나므로 좀 더 세밀한 각도 조절을 위해 45도의 신호 폭을 기준으로 시간을 계산하면 됩니다.

: 22.5= 1.5ms(0)+(0.4ms(45)/2)= 1.7ms

pwm = PWM(Pin(19)) PWM 핀설정

pwm.freq(50) PWM 주기 설정

for position in range(1000,9000,50): for문으로 1000에서 9000까지 50씩 증가

for position in range(9000,1000,-50): for문으로 9000에서 1000까지 50씩 감소

 

(2) 코드작성

from time import sleep
from machine import Pin, PWM
pwm = PWM(Pin(19))
pwm.freq(50)
while True:
    for position in range(1000,9000,50):
        pwm.duty_u16(position)
        sleep(0.01)
    for position in range(9000,1000,-50):
        pwm.duty_u16(position)
        sleep(0.01)

(3) 동작결과

 

서보모터가 0도에서 180도를 반복합니다.

 

반응형

2) 가변저항을 이용한 서보모터 각도제어

(1) 동작설명

가변저항 값을 실시간 읽어 서보모터 값으로 전달합니다.

servo1_pwm = Pin(19, Pin.OUT)

servo1 = PWM(servo1_pwm) PWM 핀 설정

servo1.freq(50) 주기 설정

VRData = vr_adc.read_u16() 가변저항 값 읽기

servo2Data = (VRData - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

가변저항 값을 서보모터에 맞는 최소값과 최대값으로 치환 합니다.

servo1 .duty_u16(int(servo2Data)) 치환된 값을 서보모터에 적용 합니다.

 

(2) 코드작성

from time import sleep
from machine import Pin, PWM, ADC
vr_adc = ADC(Pin(26)) #Pin(26,Pin.IN)
servo1_pwm = Pin(19, Pin.OUT)
servo2_pwm = Pin(18, Pin.OUT)
servo1 = PWM(servo1_pwm)
servo2 = PWM(servo2_pwm)
servo1.freq(50)
servo2.freq(50)
in_min =0
in_max =65535
out_min =1000
out_max =9000
while True:
    VRData = vr_adc.read_u16()
    servo2Data = (VRData - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
    servo1 .duty_u16(int(servo2Data))
    servo2 .duty_u16(int(servo2Data))
    sleep(0.01)

 

(3) 동작결과

 

가변저항의 값에 따라 서보모터가 움직입니다.

 

728x90
반응형
LIST

댓글