Nota

Ciao, benvenuto nella community di SunFounder Raspberry Pi & Arduino & ESP32 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 comunità e del nostro team.

  • Impara e Condividi: Scambia suggerimenti 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 Giveaway: Partecipa a concorsi e promozioni festive.

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

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 NEL KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link seguenti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Servo

ACQUISTA

Schema Elettrico

../_images/image337.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/image125.png

Passo 2: Entra nella 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 il codice non funziona o appare un errore come: "wiringPi.h: No such file or directory", fai riferimento a Installa e Controlla wiringPi.

Codice

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

#define ServoPin    1       //definisci 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){ //quando l'inizializzazione di wiring fallisce, stampa messaggio a schermo
        printf("setup wiringPi failed !");
        return 1;
    }
    softPwmCreate(ServoPin, 0, 200);       //inizializza il pin PWM del servo
    while(1){
        for(i=0;i<181;i++){     // Lascia ruotare il servo da 0 a 180 gradi.                setAngle(ServoPin,i);
            delay(2);
        }
        delay(1000);
        for(i=181;i>-1;i--){        // Lascia ruotare il servo da 180 a 0 gradi.                    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 i valori 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 impostare l’angolo del servo.

softPwmWrite(pin,Map(angle,0,180,5,25));

Questa funzione può cambiare il ciclo di lavoro del PWM.

Per far ruotare il servo da 0 a 180°, la larghezza dell’impulso deve variare tra 0,5ms e 2,5ms quando il periodo è di 20ms; 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 del Raspberry Pi può essere impostato come pin PWM.

  • initialValue: La larghezza dell’impulso iniziale è pari a initialValue moltiplicato per 100us.

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

Immagine del Fenomeno

../_images/image126.jpeg