Attiny non possiede la libreria Servo.h per gestire i servo in maniera facile ed intuitiva e quindi un modo per farlo è studiare meglio come funziona un servomotore. Un servomotore è un motore in grado di ruotare con precisione molto elevata e che serve nelle applicazioni industriali per posizionare correttamente e con precisione oggetti in corrispondenza di macchine operatrici. Al suo interno è presente un motore in c.c. calettato su un alberino su cui è disponibile il moto rotatorio, inoltre è inserito un circuito di controllo ed un potenziometro coincidente con l’albero, che verifica  se la rotazione effettuata è corretta e manda il riscontro al circuito di controllo. Questo sistema consente di correggere la posizione e di verificare che sia esatta. Lo schema di controllo è quello classico in automazione:

Il potenziometro H verifica  la posizione y dell’asse del motore e se c’è da correggerla manda un dato all’ingresso in modo che il motore G ruoti ulteriormente (per esempio se la posizione è 91° invece di 90° si può chiedere una correzione).

 

 

 

Come sono inviati i comandi di rotazione  da Arduino al Servo sg90?

Il servo accetta in ingresso un segnale impulsivo, ad onda quadra, di frequenza 50Hz / periodo 20ms e la cui durata dell’impulso determina la rotazione secondo questo schema:

 

Se invio un segnale con l’impulso da 500 us, il circuito di controllo del servo lo interpreta come una richiesta di effettuare la rotazione pari a 0°, se l’impulso dura 2500 us il circuito di controllo lo interpreta come rotazione di 180°.

Riassumendo ecco qui un elenco di alcuni valori utili:

durata (us)    rotazione (gradi)

500             0°

1000           45°

1500           90°

2000           135°

2500           190°

Quindi, per comandare la rotazione al servo di 90° bisogna che Attiny invii ad esso un segnale della durata di 1500 microsecondi e periodo 20 millisecondi.

Esercizio: rotazione del servo di 90°.

Costruite su tinkercad il circuito in figura. L’oscilloscopio va impostato a 0.5 ms per divisione nel tempo e 1 volt per l’ampiezza. Il programma prevede che il chip Attiny invii un segnale alto, poi attenda 1500 ms, poi invii un segnale basso e attenda il resto del tempo fino a 20 ms; poi ricomincia il loop.

Per i collegamenti con Attiny, fate attenzione che il pin 1, che può produrre sia una uscita on/off (digitale) sia una analogica a 256 valori è il secondo a destra dal basso.

Uso dei timer millis e micros.

Quando utilizziamo l’istruzione delay costringiamo Attiny ad attendere il termine del tempo indicato per poi riprendere il ciclo delle istruzioni dell’algoritmo. Questo può essere un ostacolo se si vuole che, mentre il servo si posizioni, Attiny esegua qualche altra operazione. Attiny può eseguire solo questo processo e per non bloccarlo con l’istruzione di attesa possiamo utilizzare i timer interni di Attiny/Arduino che sono millis() e micros(). Millis() restituisce il timer in termini di millisecondi, Micros() in termine di microsecondi. Usando lo stesso circuito di prima possiamo scrivere questo programma:

Durante il loop controlliamo il valore del tempo “d” tra, l’inizio dell’impulso, e il tempo attuale. Se siamo ancora tra l’inizio e la  durata del segnale alto, diamo il digitalwrite(x,HIGH)  corrispondente, altrimenti il segnale basso, altrimenti, infine, resettiamo il cronometro.