Nota

Ciao, benvenuto nella Community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci 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 comunità e del nostro team.

  • Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e omaggi: Partecipa a omaggi e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

1.3.2 Servo

Introduzione

In questo progetto impareremo come far ruotare un servo.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_1.3.2.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

COMPONENTI IN QUESTO KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Servo

ACQUISTA

Schema di Collegamento

../_images/image337.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/image125.png

Passo 2: Accedi alla cartella del codice.

cd ~/raphael-kit/c/1.3.2

Passo 3: Compila il codice.

gcc 1.3.2_Servo.c -lwiringPi

Passo 4: Esegui il file eseguibile.

sudo ./a.out

Dopo l’esecuzione del programma, il servo ruoterà da 0 gradi a 180 gradi, e poi da 180 gradi a 0 gradi, ciclicamente.

Nota

Se non funziona dopo l’esecuzione o compare un messaggio di errore: "wiringPi.h: No such file or directory", consulta Installazione e verifica di WiringPi.

Codice

#include <wiringPi.h>
#include <softPwm.h>
#include <stdio.h>

#define ServoPin    1       //definisci il servo al 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 a schermo
        printf("setup wiringPi failed !");
        return 1;
    }
    softPwmCreate(ServoPin, 0, 200);       //inizializza il pin PMW del servo
    while(1){
        for(i=0;i<181;i++){     // Fai ruotare il servo da 0 a 180.                 setAngle(ServoPin,i);
            delay(2);
        }
        delay(1000);
        for(i=181;i>-1;i--){        // Fai ruotare il servo da 180 a 0.             setAngle(ServoPin,i);
            delay(2);
        }
        delay(1000);
    }
    return 0;
}

Spiegazione del Codice

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.

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 scrivere l’angolo sul servo.

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 dovrebbe variare entro l’intervallo di 0,5 ms ~ 2,5 ms quando il periodo è di 20 ms; nella funzione softPwmCreate() abbiamo impostato che il periodo è 200x100us = 20ms, quindi dobbiamo mappare 0 ~ 180 a 5x100us ~ 25x100us.

Il prototipo di questa funzione è mostrato di seguito.

int softPwmCreate(int pin,int initialValue,int pwmRange);
  • pin: Qualsiasi pin GPIO di Raspberry Pi può essere impostato come pin PWM.

  • initialValue: La larghezza dell’impulso iniziale è il valore iniziale moltiplicato per 100us.

  • pwmRange: il periodo del PWM è pwmRange moltiplicato per 100us.

Immagine del Fenomeno

../_images/image126.jpeg