• Utilizzare il protocollo RS485 con le schede Droids

    Con la modalità RS485 è possibile fare in modo che due o più dispositivi possano comunicare tra loro sullo stesso Bus. Tale modalità di comunicazione può anche essere sfruttata indipendentemente dall'utilizzo della modalità RS485 "hardware", ovvero tramite il classico doppino AB.

    Questo protocollo Multipeer e' utile anche nel caso si utilizzi una rete wireless tramite XBee oppure una rete mista XBee/485/UART, in quanto e' possibile inviare un comando preciso ad un dispositivo specifico. Gli altri dispositivi presenti sullo stesso Bus, ignoreranno semplicemente il comando, se non indirizzato a loro.

    Una volta inviato il comando, il dispositivo avra' un tempo limite entro il quale dovra' rispondere, trascorso tale tempo si potra' interrogare il dispositivo successivo e cosi' via, in loop, si interrogheranno o sicomanderanno tutti i dispositivi necessari, presenti sullo stesso Bus.
    Se un dispositivo non risponde entro la finestra temporale assegnata, sara' possibile reinviare la richiesta per n volte oppure attendere il prossimo ciclo e prevedere un log nel proprio programma per indicare eventuali dispositivi che non hanno risposto, etc.
    La MuIN LCD all'avvio visualizza una scritta indicante la modalità di comunicazione attiva: normale o RS485.
    Con la modalità RS485 attiva, i dati dovranno essere inviati sotto forma di pacchetti così formattati:

    '@', ADDR_TO, ADDR_FROM, N_BYTES, BYTE1, BYTE2 ... BYTEn, CRC16H, CRC16L, '#'

    @ : carattere fisso (0x40), delimita l'inizio del pacchetto
    ADDR_TO : indirizzo della scheda che deve ricevere il pacchetto
    ADDR_FROM : indirizzo della scheda che trasmette il pacchetto
    N_BYTES : numero di bytes che compongono l'informazione da trasmettere
    BYTE1, BYTE2, BYTEn : gli N bytes di informazione
    CRC16H : byte alto del controllo validità in formato CRC16
    CRC16L : byte basso del controllo validità in formato CRC16
    # : carattere fisso (0x23), delimita la fine del pacchetto

    Tale protocollo, nella sua forma generica, permette l'uso di un sistema point-to-multipoint dove, ad esempio, un microcontrollore o un PC puo' interrogare e/o comandare vari dispositivi (LCD, sensori, attuatori, etc)

    L'indirizzo è definito come valore binario sotto forma di singolo byte e pertanto è possibile disporre di un massimo teorico di 256 indirizzi ma in realtà non tutti i valori sono utilizzabili in quanto l'indirizzo 0 è riservato a comandi di sistema prioritari, il 255 è quello di broadcast (ovvero tutte le schede presenti sul bus ricevono il pacchetto) e gli indirizzi da 251 a 254 sono riservati. I valori validi per un indirizzo vanno quindi da 1 a 250.

    Le schede Droids hanno come indirizzo di default l'ultima cifra della sigla:
    MuIN LCD -> Sigla 990.014 -> Indirizzo RS485 = 14 (0x0E)
    MuIN USB -> Sigla 990.020 -> Indirizzo RS485 = 20 (0x14)

    Il numero di byte è indicativo della quantità di dati trasmessa, è un singolo byte in formato binario. Il range ammesso va da 1 a 255, per cui con un singolo pacchetto è possibile trasmettere da 1 a 255 bytes di informazioni. Il valore 0 è riservato.

    Tutti i dati trasmessi, dal punto di vista del pacchetto, sono solo valori numerici senza alcun significato particolare e sono da inserire sotto forma dei rispettivi valori binari o esadecimali subito dopo il byte che ne indica la quantità.
    Sulla MuIN LCD è possibile inviare massimo 20 bytes di dati per pacchetto, per cui nel caso si abbia la necessità di inviare stringhe più lunghe di 20 caratteri, queste dovranno essere inviate in più pacchetti. Tale limite è imposto dal buffer interno e non riguarda tutti i dispositivi.
    I bytes che rappresentano il controllo di errore sono calcolati secondo l'algoritmo CRC16.
    Sulla MuIN LCD i due bytes del controllo errore non vengono calcolati ma vanno comunque inseriti nel pacchetto e posti entrambi a 0
    Oltre alla formattazione dei dati ci sono anche delle ben precise tempistiche da rispettare:

    Il timeout è di 2mS: tale valore rappresenta il tempo massimo che può intercorrere tra l'invio di due bytes consecutivi facenti parte dello stesso pacchetto. In pratica se tra un byte e il successivo passano più di 2mS, la ricezione viene annullata.

    Tra due pacchetti consecutivi bisogna lasciare un intervallo di almeno 5mS o più se richiesto dai tempi di esecuzione del dispositivo che riceve.

    Il timeout per l'eventuale risposta è di 20mS o più se richiesto dai tempi di esecuzione del dispositivo che trasmette.
    Nal caso della MuIN LCD bisogna attenersi in maniera rigorosa a questi limiti minimi.
    Esempi di comunicazione con protocollo RS485

    Prenderemo ad esempio la comunicazione tra un dispositivo Master qualsiasi che trasmetta i pacchetti dati e una MuIn LCD che li riceve. Tutti i bytes che compongono il pacchetto devono essere inviati in sequenza, senza interruzioni e in formato esadecimale o binario.

    In questo esempio i vari bytes che compongono il pacchetto sono separati da virgola e si ipotizza che l'indirizzo del dispositivo Master sia 0x01 che l'indirizzo della MuIN LCD sia quello di default (0x0E). Si premette che la modalità RS485 sia stata attivata preventivamente sulla MuIN LCD prima di effettuare la comunicazione.

    Esempio 1 - cancellazione del display (comando 0xFE 0x58)

    '@',0x0E,0x01,0x02,0xFE,0x58,0x00,0x00,'#'

    0x0E = indirizzo MuIN LCD (14)
    0x01 = indirizzo dispositivo master (1)
    0x02 = due bytes di informazione
    0xFE = primo byte di informazione (init command per MuIN LCD)
    0x58 = secondo byte di informazione (cancellazione display)
    0x00,0x00 = due bytes controllo errore (per la MuIN LCD devono essere posti a zero)

    Esempio 2 - Scrivo CIAO sul display

    '@',0x0E,0x01,0x04,'C','I','A','O',0x00,0x00,'#'

    Esempio 3 - Richiedo la lettura degli ADC

    '@',0x0E,0x01,0x02,0xFE,0xF1,0x00,0x00,'#'

    Dopo 5mS la MuIN LCD risponde con un pacchetto simile (supponendo che gli ADC leggano tutti un valore pari a 0x03FF):

    '@',0x01,0x0E,0x0A,0x03,0xFF,0x03,0xFF,0x03,0xFF,0 x03,0xFF,0x03,0xFF,0x00,0x00,'#'