from machine import Pin,ADC,PWM
import time
# variable = ADC(0) # Analog to Digital Convertor. 2**12 단계로 잘라 2**16=65536에 Matching한다.
variable = ADC(26) # ADC 0번 = GP26번 / 어떤 번호 체계를 써도 무방하다
led = PWM(Pin(1))
led.freq(1000) # LED 사용 시 freq() 값은 그리 민감한 사항은 아닌 듯 하다.
motor = PWM(Pin(16)) # Pin.OUTPUT 선언 생략
motor.freq(50) # 서보 모터 data sheet 참조
while True:
value = variable.read_u16() # u16 : 16비트 단계로 0 ~ 65000 으로 입력
print(value)
led.duty_u16(value)
if value < 10000:
val = 550000 # 400000을 사용하면 동작하지 않는다.
elif value < 40000:
val = 1500000
else:
val = 2400000 # 2500000 을 사용하면 동작하지 않는다.
motor.duty_ns(val) # servo 모터 0도: 0.55ms / 180도: 2.4ms(2400000 ns)
time.sleep(2)
# value = variable.read_u16() # u16 : 16비트 단계로 0 ~ 65535 으로 입력
# print(value)
# led.duty_u16(value)
# if value < 10000:
# val = 1802 # 1000을 사용하면 동작하지 않는다.
# elif value < 40000:
# val = 4800
# else:
# val = 7864 # 9000을 사용하면 동작하지 않는다.
# motor.duty_u16(val)
# time.sleep(2)
# 0도~ 180도 서보 모터의 각을 제어 하기 위해서는 0도와 180도에 해당하는 양 끝단의 값을 정확하게
# 설정 해야 동작한다. 범위을 넘어 가는 값을 취하면 그 방향으로의 움직임조차 없다.
# SG90 data sheet에 따르면, 50HZ period에서 0도 ~ 180도가 1ms ~ 2ms pulse-width으로 나오지만 일부
# 다른 자료나 이 시뮬레이터 기준으로는 0.5ms ~ 2.4ms에서 정확히 작동한다.
# 50HZ frequecy 기준 Pulse-width 0.55ms ~ 2.4ms를 기본 사양으로 택한다면,
# motor.freq(50)으로 정의하고,
# duty_ns() 사용 시 550000 ~ 2400000 ns 범위 사용할 수 있다.
# duty_u16(cycle)을 사용한다면, 이는 2**16=65536 범위를 사용하겠다는 의미인데,
# cycle(%)은 50Hz에 해당하는 20ms period에서 0도 0.55ms은 0.55/20=0.0275 = 2.75%이므로
# 0.0275x65536=1802가 되고, 180도 2.4ms은 (2.4/20)x65536=7864가 된다.
# https://randomnerdtutorials.com/raspberry-pi-pico-servo-motor-micropython/