from machine import Pin, ADC, PWM
from time import sleep
# --- CONFIGURAZIONE ---
POT_PIN = 26 # pin ADC usato dal potenziometro (come nel tuo esempio)
SERVO_PIN = 15 # pin PWM collegato al servo (modifica se necessario)
FREQ = 50 # frequenza PWM per servo (50 Hz -> periodo 20 ms)
# Pulse width in ms typical servo (aggiusta se il tuo servo richiede valori diversi)
MIN_PULSE_MS = 0.5 # posizione minima (es. 0.5 ms)
MAX_PULSE_MS = 2.5 # posizione massima (es. 2.5 ms)
# soglia per considerare il potenziometro "al massimo"
THRESHOLD_RATIO = 0.98 # 98% del valore massimo ADC
# --- INIZIALIZZAZIONE HW ---
pot = ADC(POT_PIN)
servo = PWM(Pin(SERVO_PIN))
servo.freq(FREQ)
# Calcolo dinamico dei duty per duty_u16 (range 0..65535)
PERIOD_MS = 1000 / FREQ # periodo in ms (es. 20 ms per 50 Hz)
duty_min = int((MIN_PULSE_MS / PERIOD_MS) * 65535)
duty_max = int((MAX_PULSE_MS / PERIOD_MS) * 65535)
threshold = int(THRESHOLD_RATIO * 65535)
print("Duty min:", duty_min, "Duty max:", duty_max, "Soglia ADC:", threshold)
# flag per evitare ripetizioni continue finché il pot resta al top
ready_to_trigger = True
try:
while True:
valore = pot.read_u16() # 0..65535
tensione = (valore * 3.3) / 65535 # opzionale: conversione in V
# stampa utile per debug
print("ADC:", valore, "Tensione:", "{:.2f}V".format(tensione))
if valore >= threshold and ready_to_trigger:
# porta il servo alla posizione massima
servo.duty_u16(duty_max)
print("-> Servo: POSIZIONE MASSIMA")
sleep(2) # mantiene la posizione per 2 secondi
# torna alla posizione minima
servo.duty_u16(duty_min)
print("-> Servo: POSIZIONE MINIMA (ritorno)")
# disabilita trigger finché il pot non scende sotto la soglia
ready_to_trigger = False
# opzionale: lascia il servo nella posizione minima per un momento
sleep(0.5)
if valore < threshold:
# il pot è stato abbassato: riabilitiamo il trigger
if not ready_to_trigger:
print("Pot abbassato: pronto per nuovo trigger")
ready_to_trigger = True
sleep(0.1) # piccolo ritardo di loop
finally:
# pulizia: spegni PWM prima di terminare (se il tuo REPL/board lo richiede)
servo.deinit()