#CONCEPTOS PREVIOS
    #freq = 1 / Period
    #freq = 1 / 20ms
    #freq = 50Hz
    #1ms / 20ms = 0.05 = 5% duty cycle
    #2ms / 20ms = 0.10 = 10% duty cycle

    #To get the equivalent pwm duty values:
        #0.05 * 1024 = 51.2
        #0.10 * 1024 = 102.4


# Cargue el módulo de la máquina para GPIO y PWM

import machine
# Cargar el módulo de tiempo para los retrasos
import time

from machine import Pin

# Crear un objeto GPIO p23 regular
p23 = machine.Pin(23, machine.Pin.OUT)

# Crear otro objeto llamado pwm por
# conectar el controlador pwm al pin
pwm = machine.PWM(p23)

# Establecer el pulso cada 20ms
pwm.freq(50)

# Establecer el servicio inicial en 0
# para apagar el pulso
pwm.duty(0)

# Crea una función para mapear los 0 a 180 grados
# a 20 a 120 valores de servicio pwm
def map(x, in_min, in_max, out_min, out_max):
    return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

# Crea otra función para girar
# el servo según el ángulo de entrada
def servo(pin, angle):
    pin.duty(map(angle, 0, 180, 20, 120))


# Para girar el servomotor a 0 grados
servo(pwm, 0)

# Para girar el servomotor a 90 grados
servo(pwm, 90)

# Para girar el servomotor a 180 grados
servo(pwm, 180)

# Para rotar el servo de 0 a 180 grados
# en incrementos de 10 grados
for i in range(0, 181, 10):
    servo(pwm, i)
    time.sleep(0.5)
    
# Para rotar el servo de 180 a 0 grados
# en decremento de 10 grados
for i in range(180, -1, -10):
    servo(pwm, i)
    time.sleep(0.5)