.. 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é Unirsi?** - **Supporto Esperto**: Risolvi problematiche post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team. - **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni accesso anticipato a nuovi annunci di prodotti e anticipazioni. - **Sconti Speciali**: Goditi sconti esclusivi sui nostri ultimi prodotti. - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni speciali durante le festività. 👉 Pronto per esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso! 1.3.2 Servo ============== Introduzione ---------------- In questa lezione, impareremo come far ruotare un servomotore. Componenti ------------- .. image:: img/list_1.3.2.png Principio ------------ **Servo** Un servomotore è generalmente composto dai seguenti componenti: custodia, albero, sistema di ingranaggi, potenziometro, motore CC e scheda incorporata. .. image:: img/image121.png Funziona in questo modo: il microcontrollore invia segnali PWM al servo, e la scheda incorporata nel servo riceve i segnali attraverso il pin di segnale e controlla il motore interno per farlo ruotare. Di conseguenza, il motore aziona il sistema di ingranaggi, che a sua volta muove l’albero dopo la riduzione di velocità. L’albero e il potenziometro del servo sono collegati tra loro. Quando l’albero ruota, aziona il potenziometro, che invia quindi un segnale di tensione alla scheda. La scheda determina quindi la direzione e la velocità di rotazione in base alla posizione corrente, così da arrestarsi esattamente nella posizione definita e mantenerla. .. image:: img/image122.png L’angolo è determinato dalla durata di un impulso applicato al filo di controllo. Questo è noto come Modulazione della Larghezza dell’Impulso (PWM). Il servo si aspetta di ricevere un impulso ogni 20 ms. La durata dell’impulso determina la rotazione del motore. Ad esempio, un impulso di 1,5 ms porterà il motore a 90 gradi (posizione neutrale). Quando un impulso inferiore a 1,5 ms viene inviato al servo, quest’ultimo ruota il suo albero in senso antiorario di alcuni gradi rispetto al punto neutro. Quando l’impulso è maggiore di 1,5 ms, avviene il contrario. La larghezza minima e massima dell’impulso che comanda il servo a una posizione valida dipende da ciascun servo. Generalmente, l’impulso minimo è circa 0,5 ms, mentre l’impulso massimo è circa 2,5 ms. .. image:: img/image123.jpeg Schema Elettrico -------------------- .. image:: ../img/image337.png Procedure Sperimentali -------------------------- **Step 1:** Costruisci il circuito. .. image:: ../img/image125.png **Step 2**: Accedi alla cartella del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/1.3.2 **Step 3**: Compila il codice. .. raw:: html .. code-block:: gcc 1.3.2_Servo.c -lwiringPi **Step 4**: Esegui il file eseguibile. .. raw:: html .. code-block:: sudo ./a.out Dopo aver eseguito il programma, il servo ruoterà da 0 gradi a 180 gradi, poi da 180 gradi a 0 gradi, ripetutamente. .. note:: Se non funziona dopo l'esecuzione, o appare un messaggio di errore : \"wiringPi.h: No such file or directory", consulta :ref:`faq_c_nowork`. **Codice** .. code-block:: c #include #include #include #define ServoPin 1 //definisce il servo su GPIO1 long Map(long value,long fromLow,long fromHigh,long toLow,long toHigh){ return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow; } void setAngle(int pin, int angle){ //Crea una funzione per controllare l'angolo del servo. if(angle < 0) angle = 0; if(angle > 180) angle = 180; softPwmWrite(pin,Map(angle, 0, 180, 5, 25)); } int main(void) { int i; if(wiringPiSetup() == -1){ //se l'inizializzazione di wiring fallisce, stampa un messaggio printf("setup wiringPi failed !"); return 1; } softPwmCreate(ServoPin, 0, 200); //inizializza il pin PWM del servo while(1){ for(i=0;i<181;i++){ // Fa ruotare il servo da 0 a 180. setAngle(ServoPin,i); delay(2); } delay(1000); for(i=181;i>-1;i--){ // Fa ruotare il servo da 180 a 0. setAngle(ServoPin,i); delay(2); } delay(1000); } return 0; } **Spiegazione del Codice** .. code-block:: c long Map(long value,long fromLow,long fromHigh,long toLow,long toHigh){ return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow; } Crea una funzione Map() per mappare il valore nel codice seguente. .. code-block:: c void setAngle(int pin, int angle){ //Crea una funzione per controllare l'angolo del servo. if(angle < 0) angle = 0; if(angle > 180) angle = 180; softPwmWrite(pin,Map(angle, 0, 180, 5, 25)); } Crea una funzione setAngle() per impostare l’angolo del servo. .. code-block:: c softPwmWrite(pin,Map(angle,0,180,5,25)); Questa funzione può modificare il ciclo di lavoro del PWM. Per far ruotare il servo da 0 a 180°, la larghezza dell’impulso deve variare tra 0,5 ms e 2,5 ms quando il periodo è di 20 ms; nella funzione softPwmCreate(), abbiamo impostato che il periodo è 200x100us=20ms, quindi dobbiamo mappare 0~180 su 5x100us~25x100us. Di seguito è riportato il prototipo di questa funzione. .. code-block:: int softPwmCreate(int pin,int initialValue,int pwmRange); **Parametro pin:** Qualsiasi pin GPIO del Raspberry Pi può essere impostato come pin PWM. **Parametro initialValue:** La larghezza dell’impulso iniziale è initialValue moltiplicato per 100us. **Parametro pwmRange:** il periodo del PWM è pwmRange moltiplicato per 100us.