lunedì 25 gennaio 2010

Servo controller con Pic18F su i2c (parte 2)

E' giunto il momento di dettagliare il protocollo di comando del controller che, come indicato nel titolo, è basato su i2c (se non hai letto la precedente parte clicca qui).

Di seguito i comandi inviabili (ovviamente ogni byte comando va preceduto dal byte address i2c per poter essere ricevuto):

SetServoPosition
Posiziona il servo connesso al canale specificato di n gradi a destra o a sinistra rispetto alla posizione centrale. Alla ricezione di questo comando viene automaticamente abilitata la generazione del segnale di pilotaggio sul canale relativo.
Richiede l'invio di 2 byte: il byte comando e il byte parametro che indica la posizione in gradi da 0 a 90.
Il bit DIR rappresenta la direzione di spostamento: 1 a sinistra, 0 a destra.
I bit CH rappresentano il canale selezionato: da 000 (0) a 111 (7).
Cmd byte
Param byte
1
1
0
0
DIR
CH
CH
CH
0
X
X
X
X
X
X
X


AdjustServoCentralPosition
Regola finemente la posizione centrale del servo connesso al canale specificato.
Richiede l'invio di 2 byte: il byte comando e il byte parametro che indica l'offset da 0 a 15.
Il bit OFS indica la direzione vero la quale applicare l'offset: 1 verso sinistra, 0 verso destra.
I bit CH rappresentano il canale selezionato: da 000 (0) a 111 (7).
Cmd byte
Param byte
1
1
0
1
OFS
CH
CH
CH
0
0
0
0
X
X
X
X
Il valore ideale va ricavato sperimentalmente e varia da servo a servo. Per effettuare la regolazione inviate al controller il comando SetServoPosition su 0 gradi in modo da posizionare il servo al centro. Consiglio poi di etichettare il servo con il valore di trimming ricavato in modo da non dover ripetere l'operazione in futuro.
Attenzione: ogni incremento del valore di offset rappresenta 4uSec in +/- di aggiustamento del segnale di pilotaggio e quindi valori troppo elevati potrebbero causare problemi di mancato stop della rotazione agli angoli estremi.


SetServoOutputState
Setta lo stato del canale specificato permettendo di abilitare o disabilitare la generazione del segnale.
Richiede l'invio del solo byte comando.
Il bit STS indica lo stato del canale: 1 abilitato, 0 disabilitato.
I bit CH rappresentano il canale selezionato: da 000 (0) a 111 (7).
Cmd byte
1
0
0
0
STS
CH
CH
CH


ResetAll
Resetta il controller allo stato iniziale disattivando tutti i canali e reimpostando i valori di trimming centrale a 0.
Richiede l'invio del solo byte comando.
Cmd byte
1
0
1
1
0
0
0
0

Questo è quanto andremo ad implementare nella logica del controller. Posso anticiparvi che il firmware che gestirà tale logica sarà facilmente adattabile ad ogni PIC della serie 18F che disponga del modulo i2c hardware (in quanto non lo emulerò via software).

Stay tuned!
ap

NB: l'autore non risponde di eventuali danni causati da omissioni, inesattezze e errori eventualmente presenti nell'articolo pubblicato.

mercoledì 20 gennaio 2010

Servo controller con Pic18F su i2c (parte 1)

Iniziamo il progetto analizzando il funzionamento di un servo RC e come ci dobbiamo interfacciare per poterne controllare il movimento/posizionamento.

Il servo RC analogico standard, e comunque ideale per questo controller, possiede le seguenti caratteristiche: escursione max di rotazione 180°, posizione centrale 1500 uSec.

Dal servo escono 3 fili di diverso colore (solitamente rosso, nero, giallo/bianco):
  • filo nero: GND
  • filo rosso: SUPPLY (generalmente +5 volt)
  • filo giallo/bianco: SIGNAL (segnale di pilotaggio logico 0/1)

Il servo possiede un'elettronica interna che è in grado di azionare il motorino collegato al proprio asse in relazione al segnale logico ricevuto.
Quindi per poterlo controllare dobbiamo generare un segnale, ad onda quadra, abbastanza preciso ed estremamente stabile:
  1. da livello 0 a 1 con durata minima di 600 uSec (posizione 0° cioè tutto a sinistra)
  2. eventuale mantenimento a livello 1 per un massimo di 1800 uSec in relazione all'angolo di posizionamento dell'asse voluto (angolo 0° = asse tutto a sinistra = 0 uSec, angolo 90° = posizione centrale = 900 uSec, angolo 180° = posizione tutto a destra = 1800 uSec)
  3. da livello 1 a 0 e ripezizione segnale dal punto 1 con frequenza di 50 HZ (20 mSec di intervallo)

In pratica abbiamo una variazione dell'impulso di +900 uSec dalla posizione tutto a sinistra (0°) a quella centrale (90°) e di +900 uSec tra quella centrale (90°) e quella tutto a destra (180°).
La durata dell'impulso va quindi da un minimo di 600uSec ad un massimo di 600 + 900 + 900 = 2400 uSec. Per posizionare il servo al centro l'impulso deve durare 600 + 900 = 1500 uSec.





Possiamo affermare che, per questa tipologia di servo, ogni grado angolare corrisponde a circa 10 uSec di variazione della lunghezza del segnale di livello 1.
Per posizionare l'asse a circa 45° (quindi verso sinistra) dobbiamo generare un impulso di 600 + 45*10 = 600 + 450 = 1050 uSec.
Invece per posizionare l'asse a circa 135° (quindi verso desta) dobbiamo generare un impulso di 600 + 135*10 = 600 + 1350 = 1950 uSec.

E' importante non tanto la precisione al uSec quanto la stabilità dell'impulso in quanto dovrà essere ripetuto identico ogni 20 millisecondi e comunque fino al termine della rotazione.

Infatti un impulso non stabile causa l'oscillazione continua della posizione con relativo inutile assorbimento di preziosi mA da parte del motore interno in continuo movimento.
Inoltre impulsi di durata inferiore ai 600 uSec o superiore ai 2.400 uSec sono altrettanto pericolosi in quanto provocano l'arresto a fine corsa della rotazione dell'asse del servo con conseguente continuo sforzo del motore.

Il controller potrà supportare anche servi RC analogici che abbiano escursioni di rotazione inferiori a 180° e voltaggio di alimentazione diverso da 5 volt.
Dobbiamo anche prevedere un sistema di taratura della posizione centrale in quanto anche fornendo lo stesso segnale a due servi identici (stesso modello) non si ottiene lo stesso identico posizionamento (tolleranza o errore).

Nella prossima parte vi parlerò del protocollo di comando del controller basato su i2c.

Stay tuned!
ap

NB: l'autore non risponde di eventuali danni causati da omissioni, inesattezze e errori eventualmente presenti nell'articolo pubblicato.

giovedì 14 gennaio 2010

Let's start

Bene, si inizia! Seguiranno su questo blog vari progetti di elettronica, informatica, robotica... spero interessanti e che possano servire a qualcuno.
Il primo sarà un controller capace di comandare fino a 8 servo RC interfacciabile via i2c basato su microcontrollore PIC serie 18.

Stay tuned!
ap