La scheda Inventor RP2040 W consente di gestire numerosi servocomandi in modo semplice e diretto attraverso MicroPython. Eccovi un esempio.
Articoli precedenti:
- Pimoroni Inventor 2040 W – Hat all-in-one con Pico
- Pimoroni Inventor RP2040 Programmi in MicroPython
La scorsa settimana abbiamo imparato a pilotare i LED indirizzabili presenti sulla scheda Inventor. Oggi ci occuperemo di un task più interessante: la calibrazione di servocomandi.
Sappiamo infatti che un servocomando può essere utilizzato tramite misure angolari, lineari, continue o discrete. Vediamo come agire per fare in modo che tutti i nostri dùservomeccanismi utilizzino la scala di misurazione corretta.
Andiamo!
Programma di calibrazione servocomandi
Il programma riportato di seguito fa parte degli esempi presentati da Pimoroni. Poiché non presenta una sola riga di spiegazione, cercheremo di spiegarne il funzionamento assieme.
Esistono diversi tipi di servi, i più comuni sono ANGOLARE, LINEARE e CONTINUO. Per supportare questi diversi tipi, ciascuna classe Servo contiene un oggetto di calibrazione che memorizza il valore specifico per la mappatura degli impulsi necessaria per il suo tipo. È possibile accedere a una copia della calibrazione di un servo utilizzando .calibration(). È anche possibile fornire a un servo una nuova calibrazione utilizzando .calibration(calibration).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
from inventor import Inventor2040W, SERVO_1, SERVO_2, SERVO_3, SERVO_4 from servo import Calibration, ANGULAR, LINEAR, CONTINUOUS """ Shows how to configure Inventor 2040 W's servos with different common calibrations, as well as a completely custom one. """ # Create a new Inventor2040W and access four of its servos board = Inventor2040W() angular_servo = board.servos[SERVO_1] linear_servo = board.servos[SERVO_2] continuous_servo = board.servos[SERVO_3] custom_servo = board.servos[SERVO_4] # ----------------------------------------------------- # Modify the calibration of an angular servo # ----------------------------------------------------- # Access the calibration of the first servo and print it out cal = angular_servo.calibration() print("Angular Servo:", cal, end="\n\n") WIDE_ANGLE_RANGE = 270 # The range we want the anglular servo to cover # Lets modify the calibration to increase its range cal.apply_default_pairs(ANGULAR) cal.first_value(-WIDE_ANGLE_RANGE / 2) cal.last_value(WIDE_ANGLE_RANGE / 2) # Now apply the modified calibration to the servo and confirm it worked angular_servo.calibration(cal) print("Wide Angle Servo:", angular_servo.calibration(), end="\n\n") # --------------------------------------------------- # Create and modify the calibration of a linear servo # --------------------------------------------------- LINEAR_RANGE = 50 # The range we want the linear servo to cover # Update the linear servo so its max value matches the real distance travelled cal = linear_servo.calibration() cal.apply_default_pairs(LINEAR) cal.last_value(LINEAR_RANGE) # Apply the modified calibration to the servo and confirm it worked linear_servo.calibration(cal) print("Linear Servo:", linear_servo.calibration(), end="\n\n") # ---------------------------------------------------------------- # Create and modify the calibration of a continuous rotation servo # ---------------------------------------------------------------- CONTINUOUS_SPEED = 10 # The speed we want the continuous servo to cover # Update the continuous rotation servo so its value matches its real speed cal = continuous_servo.calibration() cal.apply_default_pairs(CONTINUOUS) cal.first_value(-CONTINUOUS_SPEED) cal.last_value(CONTINUOUS_SPEED) # Apply the modified calibration to the servo and confirm it worked continuous_servo.calibration(cal) print("Continuous Servo:", continuous_servo.calibration(), end="\n\n") # ------------------------------------------------------ # Create a custom calibration and build a servo using it # ------------------------------------------------------ # Create an empty calibration cal = Calibration() # Give it a range of -45 to 45 degrees, corresponding to pulses of 1000 and 2000 microseconds cal.apply_two_pairs(1000, 2000, -45, 45) # Turn off the lower and upper limits, so the servo can go beyond 45 degrees cal.limit_to_calibration(False, False) # Create a servo on pin 3 using the custom calibration and confirmed it worked custom_servo.calibration(cal) print("Custom Servo:", custom_servo.calibration(), end="\n\n") |
Il programma analizza quindi quattro modalità di calibrazione. Importiamo le sezioni necessarie dagli opportuni moduli. Contrariamente alla gestione classica del Pico, queste librerie sono già configurate per inviluppare le funzioni richieste, lasciando all’utente l’unico onere di definire il numero del servo e la caratteristica della calibrazione.
Definiamo l’oggetto board di classe Inventor2040W() e utilizziamo il metodo servos() per associare ciascun servo alla relativa uscita della scheda.
Nella prima sezione si definisce un sistema di misurazione degli angoli. Definiamo la variabile opportuna chiamando il metodo calibration() senza parametri. Quindi definiamo il range angolare ed i valori minimo e massimo da utilizzare , e richiamiamo calibration(cal) con i nuovi valori calcolati attraverso la configurazione di cal.
Per la configurazione LINEAR (su un range di valori definito) e CONTINUOUS (con una velocità di spostamento definita) procediamo allo stesso modo, utilizzando però altri parametri preimpostati (costanti).
L’ultimo caso ci mostra come bypassare i valori preimpostati, e configurare un servo che risponda ai valori scelti dall’utente.
Viene chiamato il metodo Calibration() senza parametri:
1 2 |
# Create an empty calibration cal = Calibration() |
Vengono forniti il range e gli impulsi in microsecondi (la velocità di spostamento)
1 2 |
# Give it a range of -45 to 45 degrees, corresponding to pulses of 1000 and 2000 microseconds cal.apply_two_pairs(1000, 2000, -45, 45) |
Eliminiamo i vincoli imposti dalla creazione dell’oggetto tramite libreria
1 2 |
# Turn off the lower and upper limits, so the servo can go beyond 45 degrees cal.limit_to_calibration(False, False) |
Infine chiamiamo il metodo Calibration() con il parametro cal customizzato dall’utente:
1 2 |
# Create a servo on pin 3 using the custom calibration and confirmed it worked custom_servo.calibration(cal) |
Considerazioni finali
Grazie alla libreria della scheda Inventor, è estremamente semplice creare e customizzare più servomeccanismi utilizzando i parametri preconfezionati. Prossimamente analizzeremo il pilotaggio effettivo dei servomeccanismi, e parleremo dei motori. E magari insegneremo ad Inventor a suonare.
Iscriviti ai nostri gruppi Telegram
Link utili
- Arduino UNO R3
- Elegoo UNO R3
- Arduino Starter Kit per principianti
- Elegoo Advanced Starter Kit
- Arduino Nano