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.

Img

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