Tutorial: utilizzo moduli radio con PIC - Individuazione degli errori

Una questione cruciale di cui bisogna interessarsi nella progettazione di un sistema di comunicazione, soprattutto via radio ma non esclusivamente, è il controllo degli errori.Parlando specificatamente al riguardo della trasmissione via radio, la natura stessa del canale di trasmissione lo rende inaffidabile poiché:

  • Esso è soggetto ad attenuazione ed a interferenze provenienti da dispositivi che trasmettono sulla stessa frequenza utilizzata od a frequenze prossime;
  • Vi è un importante fattore di casualità nel percorso delle onde radio, il quale non è prevedibile né controllabile al di fuori della polarizzazione delle antenne;
  • I dispositivi trasmittenti e riceventi hanno, a causa delle loro caratteristiche costruttive, un funzionamento che spesso causa una seppur lieve variazione del segnale; ciò è particolarmente vero nel nostro caso poiché i moduli utilizzati per la radiotrasmissione introducono variazione, ad esempio, nella larghezza degli impulsi trasmessi. Inoltre, il modulo ricevitore necessità di un tempo di attivazione in cui ignora i segnali ricevuti per utilizzarli come segnali di sincronizzazione.

Considerati tutti questi fattori, una volta progettato un buon protocollo di comunicazione è spesso necessario implementare un sistema d’individuazione e, se possibile, di correzione degli errori per prevenire l’interpretazione errata dei dati trasmessi.

I protocolli di individuazione degli errori sono molteplici, distinguendosi soprattutto per efficacia, sicurezza e per la conseguente ridondanza e “pesantezza”.
Col termine “ridondanza” del protocollo d’individuazione degli errori s’intende l’aggiunta di dati a tal fine, non contenenti dunque informazione.
Un codice altamente ridondante invierà più dati di uno che non lo è, a parità di informazione trasmessa.
La scelta di un metodo d’individuazione degli errori è quindi una mediazione fra la necessità di sicurezza e quella di velocità di trasmissione, tenendo anche conto della necessità o meno di poter correggere gli errori individuati.

Una volta individuati gli errori nei dati ricevuti, un generico sistema può:

  • Ignorare i dati ricevuti se non in grado di correggerli;
  • Correggere i dati ricevuti se il codice di individuazione d’errore è di tipo FEC (Forward Error Correction), ossia capace di intervenire autonomamente per la correzione. Ciò implica spesso un’alta ridondanza del meccanismo di trasmissione.
  • Se non si utilizza una codifica di canale di tipo FEC o se l’entità dell’errore è troppo alta per permetterne la rigenerazione, il dispositivo in ricezione può chiedere al trasmettitore la ritrasmissione del dato errato. Questo implica la presenza di una codifica di canale di tipo ARQ (Automatic Repeat-reQuest), con conseguente incremento di complessità e costo del sistema.

I più diffusi codici di controllo errori sono i seguenti:

  • Codice a parità
    Consiste nel suddividere l’informazione da trasmettere in gruppi di bit (solitamente sette, otto o nove bit) e aggiungere ad ogni gruppo un bit che porti il numero di ”1” complessivi nel gruppo ad essere pari (parità pari) o dispari (parità dispari).
    Il ricevitore, noto il codice utilizzato, capisce se vi sono errori verificando questa parità.
    Questo codice, largamente utilizzato ad esempio nella comunicazione seriale RS232, nei bus SCSI e PCI e in alcune memorie RAM, presenta alcuni problemi: innanzitutto, non è in grado di correggere eventuali errori rilevati, rendendo necessaria l’installazione di un sistema di ritrasmissione se è necessaria una buona affidabilità. Inoltre, se il numero di bit errati è pari, cioè vi è più di un errore, il protocollo considera giusto il dato, anche se non lo è.
    In definitiva questo codice, dotato tra l’altro di una certa ridondanza, viene utilizzato laddove non sia richiesta una assoluta affidabilità, per esempio in semplici sistemi di trasmissione su canali non pesantemente disturbati.
    Utilizzo nei sistemi di radiotrasmissione: limitato a causa della scarsa efficacia.
  • Codice a parità incrociata
    Si tratta di un’evoluzione del codice a parità, più ridondante di quest’ultimo.
    Il suo funzionamento si basa sul calcolo della parità orizzontale (parità dei singoli gruppi di 7 o 8 bit) e della parità verticale calcolata sui bit della stessa posizione di vari gruppi di bit.
    In ricezione sono ricalcolate entrambe le parità ed eventuali errori sono individuati. Grazie al principio di funzionamento di questo codice, i bit errati possono essere trovati con precisione e corretti.
    Per contro, si tratta di un codice maggiormente ridondante di quello a parità e del codice CRC che vedremo in seguito.
    Utilizzo nei sistemi di radiotrasmissione: molto limitato a causa della eccessiva ridondanza.
  • Codice CRC
    Il codice CRC, acronimo di Cyclic Redundancy Check o Controllo a ridondanza ciclica, opera aggiungendo in coda ai dati da inviare un checksum, ossia una stringa di bit ottenuti mediante elaborazione matematica tra il dato da inviare ed un polinomio di grado variabile secondo il numero di bit da inviare e il grado del polinomio generatore.
    Per polinomio generatore s’intende il polinomio che caratterizza un dato codice CRC. Ad esempio, il codice CRC32 è caratterizzato da un polinomio di trentaduesimo grado.
    Il codice CRC è molto meno ridondante dei codici a parità semplice o incrociata quando è applicato ad un significativo numero di bit. Ad esempio, il CRC32 aggiunge ai dati un numero a 32 bit, variabile fra zero e . Se il numero di bit da inviare fosse, ad esempio, otto (come nella comunicazione RS232), questo codice sarebbe estremamente sconveniente e ridondante. Se il numero di bit da inviare fosse molto maggiore, diventerebbe conveniente utilizzare il codice CRC.
    A causa della sua ottima efficacia, questo codice è molto usato laddove sia richiesta un’individuazione degli errori quasi infallibile. Esiste tuttavia una possibilità che, nonostante la presenza di errori nell’informazione, il codice validi comunque la trasmissione. Si dimostra statisticamente che ciò avviene in casi estremamente rari.
    Fra le principali applicazioni del codice CRC troviamo la compressione dei file e la trasmissione su rete ethernet.
    L’unico punto debole di questo codice è la mancanza della possibilità di correggere gli errori individuati e la complessità del suo calcolo.
    Utilizzo nei sistemi di radiotrasmissione: molto limitato a causa della eccessiva potenza di elaborazione richiesta ad entrambe le MCU.
  • Codice a maggioranza
    Un altro semplice codice di controllo è il codice a maggioranza. Esso prevede l’invio multiplo di ciascun bit o dei byte in cui sono raggruppati.
    SI tratta di un codice estremamente ridondante, il numero di bit inviati subisce un incremento pari, come minimo, al 100%, permettendo però di individuare e correggere gli errori.
    Questo codice è utilizzato in quei casi in cui sia necessario disporre di un meccanismo di correzione degli errori potente ed efficace, anche a scapito della velocità di trasmissione che viene drasticamente ridotta.
    Utilizzo nei sistemi di radiotrasmissione: DIFFUSO per la buona efficacia e la possibilita' di correzione degli errori.

In definitiva, per il nostro caso il codice il meccanismo migliore e' quello del codice a maggioranza, applicato, ad esempio, inviando due o tre volte gli stessi dati. Il ricevitore controlla se i dati sono ricevuti e, in caso di discrepanza tra i vari dati, li scarta o tenta di correggerli (se i dati vengono inviati almeno tre volte). Nei miei precedenti progetti il codice di individuazione degli errori che ho utilizzato si basava sull'invio, in coda al byte dei dati, di un altro byte (la negazione di quello precedente) grazie al quale il ricevitore riusciva a distinguere una buona ricezione da una errata.

Bisogna comunque tenere conto che un codice del genere e' estremamente ridondante e aumenta significativamente il tempo richiesto alla trasmissione dei dati.

Vediamo ora un esempio pratico di trasmissione wireless secondo quanto detto finora.