.. 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.