Nota

Ciao, benvenuto nella Community 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 Esperti: Risolvi problemi post-vendita e 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: Godi 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 [Qui] e unisciti oggi stesso!

3.7 Servo Oscillante

In questo kit, oltre al LED e al buzzer passivo, c’è anche un dispositivo controllato da segnale PWM: il Servo.

Il Servo è un dispositivo di controllo della posizione (angolo), adatto per quei sistemi di controllo che richiedono cambiamenti angolari costanti e mantenibili. È ampiamente utilizzato nei giocattoli radiocomandati di alta gamma, come aerei, modelli di sottomarini e robot radiocomandati.

Ora, proviamo a far oscillare il servo!

Componenti Necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

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

Nome

ELEMENTI IN QUESTO KIT

LINK

Kepler Kit

450+

Kepler Ultimate Kit

Puoi anche acquistarli separatamente dai link sottostanti.

SN

COMPONENTE

QUANTITÀ

LINK

1

Introduzione al Pico W

1

ACQUISTA

2

Cavo Micro USB

1

3

Breadboard

1

ACQUISTA

4

Cavi Jumper

Diversi

ACQUISTA

5

Servo

1

ACQUISTA

Schema

sch_servo

Collegamenti

wiring_servo

  • Il filo arancione è il segnale ed è collegato a GP15.

  • Il filo rosso è il VCC ed è collegato a VBUS (5V).

  • Il filo marrone è il GND ed è collegato a GND.

Codice

Nota

  • Apri il file 3.7_swinging_servo.py nel percorso kepler-kit-main/micropython o copia questo codice in Thonny, poi clicca su «Esegui Script Corrente» o semplicemente premi F5 per eseguirlo.

  • Non dimenticare di selezionare l’interprete «MicroPython (Raspberry Pi Pico)» nell’angolo in basso a destra.

  • Per tutorial dettagliati, fai riferimento a Aprire ed Eseguire Codice Direttamente.

import machine
import utime

servo = machine.PWM(machine.Pin(15))
servo.freq(50)

def interval_mapping(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

def servo_write(pin,angle):
    pulse_width=interval_mapping(angle, 0, 180, 0.5,2.5)
    duty=int(interval_mapping(pulse_width, 0, 20, 0,65535))
    pin.duty_u16(duty)

while True:
    for angle in range(180):
        servo_write(servo,angle)
        utime.sleep_ms(20)
    for angle in range(180,-1,-1):
        servo_write(servo,angle)
        utime.sleep_ms(20)

Quando il programma è in esecuzione, possiamo vedere il braccio del Servo oscillare avanti e indietro da 0° a 180°.

Il programma continuerà a funzionare a causa del ciclo while True, quindi dovremo premere il pulsante Stop per terminare il programma.

Come funziona?

Abbiamo definito la funzione servo_write() per far funzionare il servo.

Questa funzione ha due parametri:

  • pin, il pin GPIO che controlla il servo.

  • angle, l’angolo dell’albero di uscita.

In questa funzione, viene chiamata interval_mapping() per mappare l’intervallo angolare 0 ~ 180 all’intervallo di larghezza dell’impulso 0,5 ~ 2,5 ms.

pulse_width=interval_mapping(angle, 0, 180, 0.5,2.5)

Perché è 0,5~2,5? Questo è determinato dal modo di funzionamento del Servo.

Servo

Successivamente, la larghezza dell’impulso viene convertita da periodo a duty cycle. Poiché duty_u16() non può avere decimali quando viene utilizzato (il valore non può essere di tipo float), abbiamo usato int() per forzare la conversione del duty in un tipo int.

duty=int(interval_mapping(pulse_width, 0, 20, 0,65535))

Infine, il valore del duty viene scritto in duty_u16().