"""
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.

'''