Libreria di Arduino per leggere segnali PPM
Ho realizzato una semplice libreria che permette di semplificare la lettura con Arduino di segnali PPM provenienti da una Ricevente per esempio utilizzata nei radiomodelli.
Il progetto è totalmente opensource, rilasciato sotto licenza GNUv2 disponibile a chiunque su GitHub:
https://github.com/kiuz/PPM-Signal-Reader-ARDUINO, sono graditi contributi e consigli.
Tutorial: primi passi
Vediamo subito come utilizzare questa libreria, nell'immagine seguente troviamo due configurazioni dei collegamenti con Arduino. Nella configurazione di sinistra si utilizza l'alimentazione con USB per alimentare Arduino, altrimenti si può utilizzare l'alimentazione proveniente dalla ricevente senza utilizzare il collegamento USB come mostrato nella configurazione di destra.
Colleghiamo quindi il pin di colore "nero" della ricevente al pin GND (ground/terra) di Arduino, mentre il pin di colore "bianco" della ricevente ad un qualsiasi pin di input digitale, in questo esempio faccio uso del pin 13.
Prendiamo quindi ora in considerazione il seguente codice, anche disponibile nel pacchetto della libreria gli esempi (Examples).
#include < Ppmrc.h>
Channel channel1;
void setup() {
Serial.begin(9600);
Serial.println("Ready");
pinMode (13, INPUT);
channel1.init(1,1,13);
}
void loop() {
delay(500);
channel1.readSignal();
channel1.detectVersus();
Serial.println(channel1.getSignal());
Serial.println(channel1.getPosition());
Serial.println(channel1. getVersus());
Serial.println(" ");
}
Importiamo e istanziamo la classe Channel
Quindi per prima cosa dobbiamo importare correttamente la libreria e istanziare la classe Channel per ogni "canale" della ricevente che intendiamo leggere, in questo caso leggeremo solo il primo canale.
#include < Ppmrc.h> Channel channel1;
Configuriamo la classe Channel
A questo punto possiamo congigurare la nostra classe channel inserendo le seguenti righe all'interno della classe "setup()" di Arduino. In particolare configuriamo il Pin 13 per la lettura ed inizializziamo la classe con le seguenti righe:
pinMode (13, INPUT); channel1.init(1,1,13);
Sintassi Channel::init()
Osserviamo un'attimo la sintassi della funzione void Channel::init()
void Channel::init(int stat, int inv, int pin) {
... }
- stat: Intero 1 o 0, se impostato ad 1 istanzia inizializza le statistiche per il canale istanziato, questa funzionalità non è ancora completamente sviluppata, ad ogni modo nell'init è disponibile l'opzione.
- inv: Intero 1 o -1, se impostato a -1 inverte la l'output di lettura del segnale.
- pin:Intero, deve corrispondere al numero del Ping di Digital Input di arduino che intendiamo utilizzare la lettura del segnale della ricevene.
Utilizziamo la libreria
Ora possiamo passare ad utilizzare la libreria attraverso la funzione loop() di Arduino. L'unica funzione davvero necessaria a far funzionare la nostra libreria è "Channel::readSignal()" che legge e memorizza il segnale per poi farne l'uso che preferiamo, inseriamo quindi in loop() il metodo readSignal():
channel1.readSignal();
Se siamo anche interessati al "processamento" del "verso" possiamo richiamare anche la funzione detectVerus():
channel1.detectVersus();
A questo punto durante ogni loop di arduino verrà letto il segnale e memorizzato nella classe attraverso l'uso di readSignal() ed identificato il verso del segnale con detectVersus().
Fatto questo siamo in grado di leggere i valori della ppm attraverso 3 semplici metodi che ci facilitano la il lavoro:
Serial.println(channel1.getSignal());
Serial.println(channel1.getPosition());
Serial.println(channel1. getVersus());
Serial.println(" ");
- getSignal(): Con questo metodo otteniamo il valore del segnale PPM letto da arduino, solitamente un numerto compreso tra 800 e 1600... ma potrebbe variare in base al modello di ricevente.
- getPosition(): Otteniamo essenzialmente lo stessa informazione del metodo precedente ma tradotto in un nunmero compreso tra 0 e 100 così da poter capire velocemente ed in modo simmetrico il segnale della ricevente. Sarà 0 sulla posizione centrale e avrà un particolare valore in base alla "quantità" che si sta selezionando con il radiocomando.
- getVersus(): Se invece siamo solo interessati a conosce il verso del segnale senza conosce quanto questo segnale è in un verso o nell'altro possiamo usare questo metodo con il quale otterremo 0 se in posizione centrale, 1 o -1 in se sta andando in un verso o nell'altro.
Esempio pratico
Video Tutorial
Le foto soprastanti mostrano il collegamenti che ho utilizzato, sfruttando il codice di esempio offerto insieme alla libreria si ottiene il seguente risultato del video sottostante:







