Funzionamento degli impulsi PPM (RC servo)

Visto che non riesco a fare funzionare la libreria servo e softwareservo sull' ATtiny85 volevo capire come funziona il controllo PPM dei servi visto che in rete non cè nulla in modo da creare una nuova libreria per loro se ci riesco :slight_smile:

il segnale PPM ha una lunghezza fissa di 20ms.
Questo segnale, al suo interno trasporta più segnali(canali) di lunghezza massima intorno ai 2ms e minima intorno ai 0.5ms
La libreria Servo, permette di settare sia la durata minima e massima della lunghezza del segnale Canale.
il segnale Canale deve essere in stato ALTO per lunghezza minima, e poi rimane ALTO per un tempo (solitamente proporzionale) al valore da trasmettere

I Servomotori NON sono in grado di scegliere un canale dal segnale PPM, quindi bisognerà fare attenzione ad inviare un impulso PPM di 20ms che contiene un solo canale.

data la grandezza del tempo (microsecondi), bisogna lavorare di interrupt sui timer.
Good luck

capito ... a dopo le prime prove....
:slight_smile:
Ho qualche problemino.... sto studiando alcune librerie ma non avendone mai scritta una mi trovo in estrema difficoltà....
cme faccio ad usare i timer del micro cè qulche funzione strana o devo usare .asm perchè allora la cosa mi diventa davvero dura.....
non cè un sistema per controllare i micro secondi come delay anche se usa i millisecondi ? :stuck_out_tongue:

Mi spiego meglio:
Il segnale PPM per pilotare un servo é costituito da un impulso di larghezza variabile che viene ripetuto ogni 20mSecondi (50Hz). La lunghezza del imulso é la grandezza di setaggio del Servo. A secondo della fonte un impulso di lunghezza di 1,5mSecondi corrisponde alla posizione centrale del Servo. 1mSecondo e 2mSecondi corripondono con le 2 posizioni estreme del Servo. Alcuni pilotaggi aumentano questo tempo in piú di quello detto prima e alcuni Servo fanno di consequenza anche un escursione maggiore.

non cè un sistema per controllare i micro secondi come delay anche se usa i millisecondi ?

Intendi micros() oppure delayMicroseconds() ?
http://arduino.cc/en/Reference/DelayMicroseconds

Ciao Uwe

Perfetto....
quindi posso creare una funzione invece di una vera e propria libreria.....
grazie UWE :slight_smile:

per quanto riguarda i timer dai un occhio qui, c'è una spiegazione fatta in modo piuttosto chiaro.

L'Application Note 130 della atmel parla solo dei timers di un avr, il documento sarà sicuramente completo ma un po' più ostico!

le spiegazioni sul PPM non è vero che non ci sono...il primo esempio che ho trovato: http://www.servocity.com/html/how_do_servos_work_.html

Per la cronaca un servo puoi pilotarlo anche in PWM con dovuti accorgimenti e restrizioni, ovvero:
la frequenza deve essere di 50Hz e il segnale massimo ammissibile è al 10% del duty-cyle

non li avevo trovati.......
se dovessi pilotrarli in PWM mi resta il problema che è settato ad una freq più alta..... è possibile abbassarla ?
la mia idea era quella di creare una funzione in cui si passano come parametri servo.micro(pin,gradi) e all'interno di quest'ultima si assegna il pin e tramite un switch faccio la selezione dei delay uno per ogni grado cioè 180 switch........

ratto93:
la mia idea era quella di creare una funzione in cui si passano come parametri servo.micro(pin,gradi) e all'interno di quest'ultima si assegna il pin e tramite un switch faccio la selezione dei delay uno per ogni grado cioè 180 switch........

Prima di tutto non ti servono 180 case della switch, basta fare un banale calcolo matematico per trovare i us di durata dell'impulso, vedi sotto, inoltre l'impulso deve essere ripetuto costantemente altrimenti il servo non si muove.
Il PPM per i servo RC, vale per tutti modelli sia analogici che digitali esclusi i modelli speciali ad altissima velocità per i giroscopi, è un impulso positivo compreso tra 1 e 2 ms ripetuto ogni 20 ms.
La durata del delay tra gli impulsi non è per niente critica e non è necessario che sia regolare, tutti i servo accettano come intervallo di ripetizione un range compreso tra 15 ms (66 Hz) e 25 ms (40 Hz), moltissimi modelli di buona qualità arrivano senza problemi fino a 75 Hz e quelli digitali ben oltre i 100 Hz.
Lo standard generico prevede che con 1.5 ms il servo si trovi al centro mentre con 1 ms ruota a Sx di 45° e con 2 ms ruota a Dx di 45°, corsa totale 90°, a seconda del produttore e del modello questi valori possono differire leggermente, p.e. il centro è a 1547 us e la deflessione di 45° richiede +/- 400 us.
Per ottenere il movimento fino a +/- 90° (180° totali), comunque entro i limiti del fermo meccanico ed eventuali limiti, programmabili, imposti dal firmware dei servi digitali, l'impulso deve variare tra 500 us e 2500 us.
Per generare in modo preciso gli impulsi, con la possibilità di sfruttare tutta la dinamica, esiste un solo modo, utilizzare uno, o più, timer e il relativo interrupt, che è esattamente quello che fa la libreria servo che ti garantisco funzionare bene.
La generazione degli impulsi può essere fatta in sequenza, cioè uno per volta, se il numero di servo da controllare è minore di 8 (2.5 ms * 8 = 20 ms), se il numero è maggiore tocca utilizzare più timer in parallelo oppure tecniche di generazione in parallelo degli impulsi, quest'ultima non è una cosa semplice da implementare.

Ehm.....
devo pensarci un pò sopra... a qunto pare la cosa è più difficile del previsto... allora tonerò alle librerie standard e vedò di ricostruirle invece che adattarle e farlo appositamente per il uC ATtiny85

ratto93:
allora tonerò alle librerie standard e vedò di ricostruirle invece che adattarle e farlo appositamente per il uC ATtiny85

Non devi ricostruire nulla, le librerie originali funzionano perfettamente con tutti gli ATmega utilizzabili per Arduino, ovviamente devi adattare il boards.txt in funzione del micro che stai usando.

Io ho provato con la libreria SwServo L'ATtiny85 lavora ad 8Mhz il file boards è apposto(le voci -> attiny45avrisp.build.f_cpu=8000000L)
ma non si muove il servo.... dopo guardo con l'oscilloscopio se esce qualcosa dall' MCU

ratto93:
ma non si muove il servo.... dopo guardo con l'oscilloscopio se esce qualcosa dall' MCU

Sul pin che hai collegato al servo.
Visto che disponi di un oscilloscopio puoi facilmente verificare il corretto funzionamento del tutto.
Carica lo sketch "sweep", è tra gli esempi, e sul pin 9 devi vedere un impulso, ripetuto ogni 20 ms, che varia costantemente tra 0.5 e 2.5 ms, circa 2.5 secondi per completare il ciclo.
Ma il servo come lo colleghi ad Arduino ?
Sopratutto come lo alimenti ?

Lo collego all' ATtiny85 con arduino non ho alcun problema per quello dicevo che forse dovrò fare un apposita libreria.... la solita servo.h non va sul piccolo 8 pin e la SwServo viene caricata apparentemente senza errori ma poi non va nulla....
il servo è alimentato a 6Vdc con una batteria ma anche se lo collego ai 5 che mi fornisce arduino non ha problemi perchè 1° è un micro servo che cosuma pochissimo
2° è a vuoto.....

ratto93:
Lo collego all' ATtiny85 con arduino non ho alcun problema per quello dicevo che forse dovrò fare un apposita libreria.... la solita servo.h non va sul piccolo 8 pin

Ovviamente devi tenere conto del diverso pin out e verificare le corrispondenze dei pin del 328 con quelli del ATtiny.

sul codice pin 0 = piedino 5 ATtiny....

da ignorante di ATtiny:
la libreria appoggia su un timer, siete sicuri al 100% che ATtiny sia compatibile da questo punto di vista?

L'osservazione è corretta, però il compilatore si arrabbierebbe non poco se viene utilizzato dell'hardware che non c'è.
Per ogni processore supportato c'è un file dove vengono definiti tutti i registri e i relativi nomi utilizzati, ora a meno che non ci siano delle ambiguità tra i vari file di definizione, tipo lo stesso nome per delle risorse che sono simili ma non completamente compatibili tra loro, non dovrebbe essere possibile compilare del software che utilizza risorse non disponibili o che non facciano quanto previsto.
Durante la compilazione il preprocessore sceglie percorsi differenti a seconda del micro in modo da utilizzare le corrette risorse e adattare le varie differenze hardware in accordo con le definizioni standard di Arduino, se viene usata una risorsa non presente la compilazione si arresta con vari errori.
Però non escludo che un problema di compatibilità software, parlando di wiring, tra ATtiny e ATmega 328/168 possa esserci.

@Astrobed...
A questo punto non so proprio che dirti... voi ne sapete molto più di me non cè che dire :sweat_smile:

L'Attiny85 supporta 2 timer ed 1 interrupt, se non ricordo male.

Poi il pin 1 (non 0!) dell'Attiny85, corrispondente al pin D5, non puoi usarlo perché è il pin usato per il reset.
Scegline un altro.

leo72:
L'Attiny85 supporta 2 timer ed 1 interrupt, se non ricordo male.

Poi il pin 1 (non 0!) dell'Attiny85, corrispondente al pin D5, non puoi usarlo perché è il pin usato per il reset.
Scegline un altro.

Piedino digitale 0 corrisponde al 5.........
è il PB0....
lo sto facendo funzionare proprio ora correttamente.... con un led blink.....