############################
# E023_SERVO.PY: Controla un servo con potenciómetro
# ENTRADAS: GPIO potenciómetro y servo
# SALIDAS: Ángulo servo función posición potenciómetro
############################
from machine import Pin, ADC, PWM # Gestión GPIO, ADC y PWM
import time # Control de timing
# Configuración del pin ADC para leer el valor del potenciómetro
pot_pin = ADC(Pin(4)) # Ajustar con un pin que disponga de ADC
pot_pin.atten(ADC.ATTN_11DB) # Rango de voltaje de 0 a +3.3V
# Configuración del pin PWM para controlar el servo
# Ajustar frecuencia según el modelo del servo
servo_pin = PWM(Pin(15), freq=50) # Pin 15 con frecuencia de 50Hz
# Conversión del valor ADC (0,4095) al duty PWM (26,123)
def convierte(valor, in_min, in_max, out_min, out_max):
# Asegurar que el valor esté dentro del rango de entrada
valor = max(min(valor, in_max), in_min)
# Convierte el valor al rango de salida
return int((valor - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
# Bucle principal del programa
print('CONTROL DE SERVO CON POTENCIÓMETRO')
print('Gira potenciómetro...')
try:
while True:
# Lee el valor del potenciómetro
pot_value = pot_pin.read()
# Convierte el valor del potenciómetro al rango de 0º a 180º para el servo
# valor, ADC, PWM
angulo = convierte(pot_value, 0, 4095, 26, 123)
print(f'Ángulo: {angulo}')
# Establece la posición del servo
servo_pin.duty(angulo)
# Espera entre lecturas del potenciómetro
time.sleep(0.5)
except KeyboardInterrupt:
# Detiene el script si se presiona <Ctrl>+<C>
servo_pin.deinit()
print('\nScript detenido...')