Controller radio per effetti sonori - Protocollo di trasmissione

Come ho anticipato nell'introduzione, molte scelte progettuali sono state condizionate in modo decisivo dal basso budget disponibile. Per questo motivo, la comunicazione fra trasmettitore e ricevitore avviene utilizzando dei moduli radio che non includono alcuna forma di codifica/decodifica del segnale. Occorre progettare tutto manualmente.

Per fortuna ciò non mi ha trovato impreparato (vedere il mio precedente articolo in cui ho avuto lo stesso problema), perciò ho riadattato lo stesso protocollo che avevo già accuratamente sviluppato.

Per una spiegazione molto dettagliata del protocollo, vi rimando a quell'articolo. Se non potete accedervi, inviatemi un'email.
Ad ogni modo, rispiegherò brevemente la questione e le modifiche apportate appositamente per questo progetto.

Innanzitutto, i moduli radio utilizzati lavorano alla frequenza di 433.92 MHz, frequenza in banda libera e quindi molto utilizzata da apparecchi di tutti i generi. Questo rende necessario un protocollo robusto in grado di individuare e scartare gli errori.

A causa della tipologia dello stadio d'ingresso e del metodo di funzionamento di questi moduli, è come se l'ingresso fosse accoppiato in alternata (per intenderci, avesse un condensatore in serie che filtrasse il valor medio/tensione continua del segnale d'ingresso). Per questo motivo non si può trasmettere un livello logico alto per tempi lunghi ed è quindi impossibile l'utilizzo di un protocollo standard tipo RS232. Occorre un protocollo in cui vi sia una componente continua minima ma un buon numero di transizioni di livello.

In genere quando sussiste questa condizione, viene utilizzato il protocollo Manchester, ma nel nostro caso i moduli sono talmente "economici" che durante il processo di trasmissione la larghezza degli impulsi del segnale viene alterata e vengono aggiunti alcuni picchi, rendendo molto difficile una sincronizzazione corretta.

La soluzione da me adottata consiste nell'utilizzare un segnale TTL modulato in OOK (Fh=3kHz): il livello logico alto è così rappresentato dall'invio di un'onda quadra a frequenza 3kHz (massimo consentito, riportato nel datasheet del modulo) per un tempo Tbit, il livello logico basso è rappresentato non inviando nulla per un tempo Tbit.
In questo modo, abbiamo componente continua minima, numerose transizioni, una decodifica semplice ed una facile creazione del segnale codificato (compito svolto direttamente dal PIC trasmittente). Inoltre, un segnale di questo tipo è inviato senza subire un'eccessiva distorsione (fatto osservato sperimentalmente)

Per riuscire ad individuare errori generati da eventuali interferenze, ho incluso un rudimentale ma efficace controllo dell'errore: dopo aver inviato i bit di comando (Es: 1100) si invia anche il loro complemento (Es:0011).Si tratta di un codice d’individuazione degli errori molto ridondante (raddoppia quasi il numero di bit da inviare, aggiungendone di non necessari all’informazione) e non permette la correzione dell'errore, ma è praticamente infallibile ed insensibile alle interferenze anche forti e ripetitive.

Per esempio, in presenza di una interferenza continua che mantenga l'uscita del ricevitore alta per molto tempo, i bit del dato saranno tutti a 1 e, quando il ricevitore vedrà che anche i bit di controllo sono a 1, scarterà il comando classificandolo come disturbo.

La durata di un bit (Tbit) è stata scelta come compromesso: aumentandola si ha più affidabilità nella decodifica, ma aumentano i tempi di trasmissione. Il valore scelto è di 10 ms (inferiore rispetto al mio precedente progetto).
Il numero di bit inviati deve permettere di distinguere fra 10 pulsanti, quindi (è intuitivo, ma...) n = log2(10) = 3.32 -> ci servono 4 bit.
I comandi da inviare sono numerati da 1 a 10.

Il formato di invio dei dati è:

  • 1 bit di start a livello logico alto;
  • 4 bit del codice comando dall'MSB all'LSB;
  • 4 bit del codice controllo dall'MSB all'LSB;

Da cui si ricava che il tempo totale di invio di un comando è (1+4+4)*Tbit = 9*Tbit = 90 ms, sufficientemente veloce da sembrare istantaneo, il che è molto importante per il tipo di applicazione a cui è destinato questo progetto.

Facciamo un esempio: supponiamo di dover inviare il comando numero 5, il cui codice binario è 0101. Il codice di controllo è quindi 1010. Questo significa che in uscita dal pin A2 del PIC trasmettitore troveremo un segnale ottenuto modulando in OOK (F=3kHz, Tbit=10ms) il numero 101011010 (il primo è il bit di start).
Troveremo quindi per 10 ms un'onda quadra di 3 kHz, 10 ms di segnale a livello basso, un'onda quadra a 3 kHz per 10 ms, 10 ms di livello basso, 20 ms di onda quadra, ecc... come nell'immagine seguente:

Questo segnale è lo stesso (idealmente) che avremo all'uscita del modulo ricevitore. Vedremo quindi che all'uscita del modulo ricevitore troveremo una rete circuitale predisposta alla trasformazione di questo segnale in qualcosa di simile al segnale binario TTL di partenza (il nostro 101011010). Parlerò di questo nel capitolo seguente.