Progetto 15:Servo

1. Descrizione
Le auto smart fai-da-te di solito includono la funzione di evitamento automatico degli ostacoli. Nel processo di realizzazione, è necessario un servo per controllare il modulo ad ultrasuoni che ruota a sinistra e a destra, e poi misurare la distanza tra l’auto e l’ostacolo, in modo da controllare l’auto per evitare l’ostacolo.
Se si utilizzano altri microcontrollori per controllare la rotazione del servo, bisogna impostare una certa frequenza e larghezza dell’impulso per controllare l’angolo del servo. Ma se si utilizza la scheda principale micro:bit per controllare l’angolo del servo, è sufficiente impostare l’angolo di controllo nell’ambiente di sviluppo: l’impulso corrispondente verrà generato automaticamente per controllare la rotazione del servo. In questo progetto imparerai a controllare il servo per farlo oscillare fra 0° e 90°.
Il servomotore è un attuatore rotativo a controllo di posizione, composto principalmente da chassis, circuito stampato, motore senza nucleo, ingranaggi e sensore di posizione. Il suo principio di funzionamento è che il servo riceve il segnale inviato dal MCU o dal ricevitore, produce un segnale di riferimento con periodo di 20 ms e larghezza di 1,5 ms, poi confronta la tensione continua acquisita con la tensione del potenziometro e ottiene la differenza di tensione in uscita.
Per il servo utilizzato in questo progetto, il filo marrone è la massa, il rosso è il positivo e l’arancione è il filo del segnale.

2. Informazioni sul Servo
L’angolo di rotazione del servomotore è controllato regolando il duty cycle del segnale PWM (Pulse-Width Modulation). Il ciclo standard del segnale PWM è di 20 ms (50 Hz). Teoricamente la larghezza è compresa tra 1 ms e 2 ms, ma in realtà è tra 0,5 ms e 2,5 ms. La larghezza corrisponde all’angolo di rotazione da 0° a 180°. Nota che per motori di marche diverse lo stesso segnale può produrre angoli di rotazione differenti.

Dopo misurazioni, l’intervallo di impulso del servo è 0,65 ms ~ 2,5 ms. Per un servo a 180 gradi, la relazione di controllo corrispondente è la seguente:
Time on High Level |
Angle of the Servo |
Reference Signal Cycle Time(20ms) |
|---|---|---|
0.65ms |
0 degree |
0.65ms high level+19.35ms low level |
1.5ms |
90 degrees |
1.5ms high level+18.5ms low level |
2.5ms |
180degrees |
2.5ms high level+17.5ms low level |
3. Parametri
Tensione di funzionamento: DC 4.8V ~ 6V
Intervallo di angolo operativo: circa 180 ° (a 500 → 2500 μsec)
Dimensioni: 22.9*12.2*30mm
Intervallo di larghezza dell’impulso: 500 → 2500 μsec
Velocità a vuoto: 0.12 ± 0.01 sec / 60 (DC 4.8V), 0.1 ± 0.01 sec / 60 (DC 6V)
Corrente a vuoto: 200 ± 20mA (DC 4.8V), 220 ± 20mA (DC 6V)
Coppia di bloccaggio: 1.3 ± 0.01kg · cm (DC 4.8V), 1.5 ± 0.1kg · cm (DC 6V)
Corrente di stop: ≦ 850mA (DC 4.8V) ≦ 1000mA (DC 6V)
Corrente di standby: 3 ± 1mA (DC 4.8V), 4 ± 1mA (DC 6V)
Peso: 9±1g (senza braccio del servo)
Temperatura di funzionamento: -30℃~60℃
Si noti di non usare l’alimentazione del computer, poiché se la richiesta di corrente è superiore a 500 mA il servo potrebbe bruciarsi. Si consiglia di utilizzare una batteria esterna per l’alimentazione.
4. Preparazione
Inserire la scheda micro:bit nello slot del keyestudio 4WD Mecanum Robot Car V2.0
Inserire le batterie nel portabatterie
Portare l’interruttore di alimentazione su ON
Collegare il micro:bit al computer tramite cavo USB
Aprire la versione offline di Mu.
5. Codice di test
Avviare il software Mu e aprire il file “Servo.py” per importare il codice. È anche possibile inserire il codice manualmente nella finestra di modifica.
(Nota: Tutte le parole e i simboli in inglese devono essere scritti in inglese.)
Fare clic su “Check” per esaminare gli errori nel codice. Il programma è errato se vengono mostrati sottolineature o cursori.
Se il codice è corretto, collegare il micro:bit al computer e fare clic su “Flash” per scaricare il codice sulla scheda micro:bit.

from microbit import *
class Servo:
def __init__(self, pin, freq=50, min_us=600, max_us=2400, angle=180):
self.min_us = min_us
self.max_us = max_us
self.us = 0
self.freq = freq
self.angle = angle
self.analog_period = 0
self.pin = pin
analog_period = round((1/self.freq) * 1000) # hertz to miliseconds
self.pin.set_analog_period(analog_period)
def write_us(self, us):
us = min(self.max_us, max(self.min_us, us))
duty = round(us * 1024 * self.freq // 1000000)
self.pin.write_analog(duty)
sleep(100)
self.pin.write_analog(0)
def write_angle(self, degrees=None):
if degrees is None:
degrees = math.degrees(radians)
degrees = degrees % 360
total_range = self.max_us - self.min_us
us = self.min_us + total_range * degrees // self.angle
self.write_us(us)
Servo(pin14).write_angle(0)
display.show(Image.HAPPY)
while True:
Servo(pin14).write_angle(0)
sleep(1000)
Servo(pin14).write_angle(45)
sleep(1000)
Servo(pin14).write_angle(90)
sleep(1000)
Servo(pin14).write_angle(135)
sleep(1000)
Servo(pin14).write_angle(180)
sleep(1000)
4. Risultato del test
Dopo aver scaricato correttamente il codice sulla scheda, alimentare esternamente (spostare l’interruttore DIP su ON) e premere il pulsante reset sul micro:bit.

La matrice LED mostra un motivo sorridente e il servo ruota seguendo lo schema 0°~45°~90°~135°~180°~0°.