"""
A continuación se presenta el código para hacer girar un servomotor 180°de manera intermitente.
Se tomó como fuentes de apoyo las páginas: https://peppe8o.com/sg90-servo-motor-with-raspberry-pi-pico-and-micropython/
https://controlautomaticoeducacion.com/micropython/servomotor-raspberry-pi-pico-esp/
"""
from machine import Pin, PWM # Desde el módulo de máquina, se importan las clases para usar los pines y lo de PWM
# (modulación por ancho de pulso) para simular señal analógica.
from time import sleep # Del módulo time, se importa la clase sleep.
""" Configuración de entrada y frecuencia del PWM """
servo_pin = PWM(Pin(2)) #configuración del pin 2 para conectar la señal del servomotor.
servo_pin.freq(50) # El PWM trabajará con frecuencia de 50Hz para emular señal análoga y garantizar recorrido de 0°-180°.
# A partir del ángulo de trabajo requerido, se calcula el output o salida necesaria, para que el servomotor se mueva
# correctamente.
def servo(degrees): # Se crea la función servo que requiere como entrada, el ángulo de posición a alcanzar
# y permite verificar que la entrada esté entre 0° y 180° que es el rango de trabajo.Esta función permite pasar el ángulo de giro deseado
#al servomotor, como PWM equivalente.
# Se Chequea si el ángulo buscado está dentro del rango de trabajo:
if degrees > 180: degrees=180
if degrees < 0: degrees=0
# Se establece límites (Valores min y max) de su ciclo de trabajo.
#El servomotor realiza todos los ángulos disponibles entre 1 y 9 ms considerando el período típico del servo que es de 20 ms
maxDuty=9000
minDuty=1000
#Fórmula para pasar de grados a PWM/duty cycle
#El valor de grados (0-180) se proporciona al rango de 1000-9000 con la siguiente fórmula
#Duty Cycle = minimo + rango * proporción de ángulo
newDuty=minDuty+(maxDuty-minDuty)*(degrees/180)
# Comando que pasa el valor de duty al servo
servo_pin.duty_u16(int(newDuty)) # Esta instrucción se encarga de configurar el ciclo de trabajo de la señal PWM.
# La función duty_u16 establece el nuevo valor en el pin PWM. La función int() convierte el valor flotante a entero.
# Ciclo infinito while que hace girar el servo en todo su rango hasta que se detenga manualmente.
t=2
servo(1)
print("Angulo: 0")
sleep(t)
servo(45)
print("Angulo: 45")
sleep(t)
servo(90)
print("Angulo: 90")
sleep(t)
servo(135)
print("Angulo: 135")
sleep(t)
servo(180)
print("Angulo: 180")
sleep(t)
'''
while True:
for degree in range(0,180,1): #Este bucle "para" prueba el servomotor con un valor creciente de grados.
servo(degree)
sleep(0.05) #Tiempo de espera de 0.05 s
print("increasing -- "+str(degree))
for degree in range(180, 0, -1): #Este 2do bucle "para" hace la misma prueba anterior pero en dirección inversa.
servo(degree) # El valor que guarde, lo coloca en la función servo.
sleep(0.05) #Tiempo de espera de 0.05 s
print("decreasing -- "+str(degree)) # muestra por consola lo que se está ejecutando.
# Fin del programa.
'''