Bus

Il bus da adottare deve avere ben determinate caratteristiche:

  • Elevata velocità: se i messaggi viaggiano troppo lentamente, il sistema non risulta sufficientemente reattivo agli eventi
  • Affidabilità e tolleranza ai guasti: un sensore guasto non deve bloccare il sistema
  • Espandibilità: non devono esserci restrizioni troppo severe al numero di elementi
  • Multimaster: è desiderabile che possano esserci più master che condividono il bus
  • Capacità: devono poter passare pacchetti anche di 100 byte (vedi alla sezione comunicazioni)
  • Copertura: il bus deve permettere di coprire anche distanze medio-lunghe (fino almeno ad un paio di km con "remotizzatori", almeno 200m in un singolo "ramo")

Le possibilità sono parecchie... In genere il tradeoff è tra velocità e distanza, o tra distanza e costo.

Il top sarebbe Ethernet su fibra, ma i costi sono insostenibili. Anche Ethernet su rame può essere interessante, ma ha costi ancora un po' alti (minimo una decina di euro per nodo).

Inizialmente ho optato per un RS485 che ad una velocità tutto sommato buona (100kbps) permette comunque di coprire distanze di tutto rispetto (1200m). Il contro è che prevede la presenza di soli 32 dispositivi sul bus e non prevede arbitraggio. "Sacrificando" un nodo possiamo inserire un repeater attivo che estenda le possibilità di indirizzamento. Usando il MAX487 si può arrivare a 128 device.

Ora sto valutando ATTENTAMENTE anche il bus CAN che permette comunque 1Km a 50Kbps. Ha il vantaggio di gestire l'accesso concorrente al bus da parte di più device, ma lo svantaggio di prevedere "pacchetti" di soli 64 bit di payload (che ci obbligherebbe ad usare un sistema crittografico con b=64 o ad usare un protocollo di più alto livello, vedi sotto Comunicazioni). Potendo avere più master si potrebbe ridurre il traffico di polling, facendo gestire in "autonomia" a delle "subnet" determinate funzioni (per es. il controllo luci, come succede in CARACA, anche se in questo caso fa lavorare CAN in point-to-point... un tantino overkill!). Però l'idea dei concentratori è molto interessante: si possono più facilmente isolare problemi sul bus, si può gestire una velocità molto elevata (le distanze da coprire sono molto più brevi, e nel caso serva un tratto lungo, si usa un concentratore dedicato),... Insomma tanti vantaggi col "solo" inconveniente del costo leggermente più elevato...

È molto interessante anche FlexRay (evoluzione di CAN), peccato che sia "licenziato" solo per usi automobilistici! Però alcune idee si possono "prendere in prestito"... In particolare i miniframe (frame "opzionali": se chi li detiene non ha nulla da trasmettere, basta che non impegni la linea durante il tempo di minislot ed il protocollo gestisce il passaggio diretto al minislot successivo, quasi senza spreco di banda -- ottimo per segnalazioni tipo interrupt con payload). La durata di un minislot deve essere almeno il doppio (meglio se il triplo) del tempo che impiega un bit per percorrere tutta la rete e venire decodificato dal transceiver, altrimenti un controller potrebbe sbagliare l'assegnazione del minislot. Altra idea interessante di FlexRay è la gestione della sincronizzazione, per permettere ai controller di unirsi alla rete in qualsiasi momento.

Altri bus (tipo Echelon) sono stati adottati in passato da alcuni sistemi antifurto, ma ormai vengono sostituiti per i costi troppo elevati (anche se c'è chi continua imperterrito a farli adottare...).

Come cavo si può generalmente utilizzare del semplice cavo Ethernet UTP, a meno che condizioni di particolare "rumore" portino ad optare per STP. Come connettori conviene usare gli standard RJ45. In questo modo qualunque elettricista dotato di tester per reti Ethernet (oramai sono tanti) è in grado di testare (e certificare!) i cablaggi.

Continuando a documentarmi, ho trovato che Konnex è in avanzato stadio di standardizzazione. Dato che l'antifurto si può considerare una sorta di apparecchiatura per la domotica, vale la pena di analizzare meglio la proposta di standard:

PRO: Standard, molti device già disponibili
CONTRO: Lentezza (9600bps), infrastruttura "pesante", royalty

I contro mi sembrano un po' troppo "pesanti", soprattutto per un sistema che si propone come standard! Può comunque valere la pena di prevedere device di "gateway" tra il bus adottato in OpenAlarm e KNX, così da non limitare l'utente.

È comunque da tenere ben presente la possibilità di trasportare sul bus anche l'alimentazione almeno per i device meno esigenti (sensori ed elementi passivi).


Tavola riassuntiva bus
Bus Velocità Distanza Pro Contro
Ethernet 10BaseT 10Mbps 90m Standard, stabile, fino a 1500byte di payload, cavo economico, sistema facilmente espandibile Costo leggermente elevato dei transceiver, segmenti corti in assenza di ripetitori
CAN 50Kbps 1000m Abbastanza standardizzato, facilmente espandibile, basso costo dei transceiver Cattivo rapporto velocità/distanza, payload nativo di soli 64 byte
RS485 1Mbps 40m Abbastanza standard, molto flessibile Numero di nodi limitato, non multimaster
100Kbps 1200m
10Mbps 12m
Echelon 1.25Mbps 1200m (?) Soluzione stabile, transceiver per lunghe distanze Costo elevato di cavo ed adattatori, soluzione "chiusa"

Lonworks

Sapevi che Cypress produce microprocessori "doppi" di cui uno realizza il protocollo Lonworks e l'altro è libero per l'uso utente? Anche Lonworks è un protocollo un pò pesante e sicuramente generico come KNX, ma in questo modo ti eviti di dover acquistare uno stack da installare su di un micro di tua scelta, utilizzando un (banale?) "neuron chip" da pochi dollari. Avessi avuto i neuron chips in partenza al mio progetto avrei usato quelli, garantito!

Non mi piace...

Sarà sicuramente comodo sotto molti aspetti, ma "fa brutto" avere delle black-box in un sistema open, non ti pare?
Inoltre, costringe ad utilizzare un unico micro. In un sistema open, invece, se voglio usare un PIC lo uso, se voglio usare un 8051 pure, se voglio usare un 386 anche (con un po' più di fatica).
Comunque quei processori doppi possono essere interessanti per realizzare dei gateway per interagire con reti o apparati già esistenti.

Bus di comunicazione

Nella tua quasi esaustiva trattazione del bus hai trascurato un aspetto sul quale io, quando ho progettato e realizzato il mio BUS, ho inciampato vistosamente. La tipologia di connessione. Nel mio sistema ho immaginato fino a 65535 devices, quindi indirizzamento a 16 bit, e rete "a stella". Tecnicamente è facile da fare e sufficiente a qualsiasi esigenza, MA se tornassi indietro farei una tipologia lievemente diversa, ridurrei il numero di devices per trunk a 255 (8 bit) e costruirei uno switch invece di un hub per il collegamento di "sezioni" diverse. Questo non solo per aumentare la flessibilità ma SOPRATUTTO per diminuire il traffico. Vero è che adesso ogni nodo riceve tutto il traffico e quindi è facile costruire un logger che mi conservi la "storia" del traffico, ma questa è proprio uno dei pochissimi vantaggi....

Ed una topologia libera?

L'ultima bozza di protocollo a cui stavo pensando prevede un bus unico, poiché solo la centralina ed il sensore indirizzato sanno a chi è destinato il messaggio (onde evitare che un attaccante possa simulare un guasto ad un sensore). Per includere dei router devo rivedere il sistema. Comunque ci sarà sempre la possibilità di inviare anche segnalazioni broadcast. Molto probabilmente ci sarà anche la possibilità di gestire multipath.

Ho anche trovato lo schema di un "ripetitore attivo bidirezionale", ma senza logica "furba" bisogna sperimentare bene per vedere se su tratte lunghe è sufficiente. E fare attenzione, comunque, che l'RTT non diventi eccessivo ed interferisca con le segnalazioni "interrupt".