.. note:: Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché unirti a noi?** - **Supporto Esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l'aiuto della nostra community e del nostro team. - **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni accesso anticipato ai nuovi annunci di prodotti e alle anteprime. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni festive. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi! .. _ar_servo: 4.3 Servo in Movimento ========================= Un Servo è un tipo di dispositivo basato sulla posizione, noto per la sua capacità di mantenere angoli specifici e offrire una rotazione precisa. Questa caratteristica lo rende estremamente desiderabile per i sistemi di controllo che richiedono regolazioni costanti dell'angolo. Non sorprende quindi che i Servi siano ampiamente utilizzati in giocattoli telecomandati di fascia alta, dai modelli di aerei alle repliche di sottomarini, fino ai robot telecomandati più sofisticati. In questa avvincente avventura, ci sfideremo a manipolare il Servo in un modo unico: facendolo oscillare! Questo progetto offre una brillante opportunità per approfondire le dinamiche dei Servi, affinare le tue competenze nei sistemi di controllo precisi e acquisire una comprensione più profonda del loro funzionamento. Sei pronto a far ballare il Servo al ritmo delle tue note? Iniziamo questo entusiasmante viaggio! **Componenti Necessari** In questo progetto, avremo bisogno dei seguenti componenti. È sicuramente conveniente acquistare un kit completo, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - ELEMENTI IN QUESTO KIT - LINK * - ESP32 Starter Kit - 320+ - |link_esp32_starter_kit| Puoi anche acquistarli separatamente dai link sottostanti. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE AI COMPONENTI - LINK PER L'ACQUISTO * - :ref:`cpn_esp32_wroom_32e` - |link_esp32_wroom_32e_buy| * - :ref:`cpn_esp32_camera_extension` - |link_esp32_extension_board| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_servo` - |link_servo_buy| **Piedinatura Disponibile** Ecco un elenco dei piedini disponibili sulla scheda ESP32 per questo progetto. .. list-table:: :widths: 5 20 * - Piedini Disponibili - IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 **Schema Elettrico** .. image:: ../../img/circuit/circuit_4.3_servo.png **Collegamenti** * Il filo arancione è il segnale e va collegato a IO25. * Il filo rosso è il VCC e va collegato a 5V. * Il filo marrone è il GND e va collegato a GND. .. image:: ../../img/wiring/4.3_swinging_servo_bb.png **Codice** .. note:: * Apri il file ``4.3_servo.ino`` nel percorso ``esp32-starter-kit-main\c\codes\4.3_servo``. Oppure copia questo codice nell'**Arduino IDE**. * Dopo aver selezionato la scheda (ESP32 Dev Module) e la porta appropriata, fai clic sul pulsante **Upload**. * :ref:`unknown_com_port` * Qui viene utilizzata la libreria ``ESP32Servo``, che puoi installare dal **Library Manager**. .. image:: img/servo_lib.png .. raw:: html Una volta caricato il codice, vedrai il braccio del servo ruotare nell'intervallo 0°~180°. **Come funziona?** #. Includi la libreria |link_esp32servo|: Questa riga importa la libreria ESP32Servo, necessaria per controllare il servomotore. .. code-block:: arduino #include #. Definisci il servo e il piedino a cui è collegato: Questa sezione dichiara un oggetto Servo (``myServo``) e un intero costante (``servoPin``) per rappresentare il piedino a cui è collegato il servomotore (piedino 25). .. code-block:: arduino // Definisci il servo e il piedino a cui è collegato Servo myServo; const int servoPin = 25; #. Definisci la larghezza minima e massima degli impulsi per il servo: Questa sezione imposta la larghezza minima e massima degli impulsi per il servomotore (0,5 ms e 2,5 ms, rispettivamente). .. code-block:: arduino // Definisci la larghezza minima e massima degli impulsi per il servo const int minPulseWidth = 500; // 0,5 ms const int maxPulseWidth = 2500; // 2,5 ms #. La funzione ``setup`` inizializza il servomotore collegandolo al piedino specificato e impostando il range della larghezza degli impulsi. Imposta anche la frequenza PWM per il servo a 50Hz, standard per i servomotori. .. code-block:: arduino void setup() { // Collega il servo al piedino specificato e imposta il range della larghezza degli impulsi myServo.attach(servoPin, minPulseWidth, maxPulseWidth); // Imposta la frequenza PWM per il servo myServo.setPeriodHertz(50); // Servo standard a 50Hz } * ``attach (int pin, int min, int max)``: Questa funzione collega il servomotore al piedino GPIO specificato e imposta la larghezza minima e massima degli impulsi per il servo. * ``pin``: Il numero del piedino GPIO a cui è collegato il servo. * ``min`` e ``max``: la larghezza minima e massima degli impulsi, rispettivamente, in microsecondi. Questi valori definiscono il range di movimento del servomotore. * ``setPeriodHertz(int hertz)``: Questa funzione imposta la frequenza PWM per il servomotore in hertz. * ``hertz``: La frequenza PWM desiderata in hertz. La frequenza PWM predefinita per i servi è 50Hz, che è adatta per la maggior parte delle applicazioni. #. La funzione ``loop`` è la parte principale del codice che viene eseguita continuamente. Ruota il servomotore da 0 a 180 gradi, poi torna a 0 gradi. Questo viene fatto mappando l'angolo alla corrispondente larghezza dell'impulso e aggiornando il servomotore con il nuovo valore della larghezza dell'impulso. .. code-block:: arduino void loop() { // Ruota il servo da 0 a 180 gradi for (int angle = 0; angle <= 180; angle++) { int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth); myServo.writeMicroseconds(pulseWidth); delay(15); } // Ruota il servo da 180 a 0 gradi for (int angle = 180; angle >= 0; angle--) { int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth); myServo.writeMicroseconds(pulseWidth); delay(15); } } * ``writeMicroseconds(int value)``: Questa funzione imposta la larghezza dell'impulso del servomotore in microsecondi. * ``value``: La larghezza dell'impulso desiderata in microsecondi. La funzione ``writeMicroseconds(int value)`` prende un valore intero come argomento, che rappresenta la larghezza dell'impulso desiderata in microsecondi. Questo valore dovrebbe normalmente rientrare nel range specificato dalle larghezze degli impulsi minime e massime (``minPulseWidth`` e ``maxPulseWidth``) definite in precedenza nel codice. La funzione imposta quindi la larghezza dell'impulso per il servomotore, facendolo muovere nella posizione corrispondente.