PIC DIY – Costruire una rete domotica con i PIC [PicNET2]

DIY rete domotica

PicNET2 consente di costruire una rete domotica (automazione domestica o building automation o addirittura home automation) con dispositivi di facile reperibilità (i microcontrollori PIC) e basso costo alla portata di qualsiasi hobbista (diy).

Progetto DIY per Hobbisti – come costruire una rete domotica con i PIC [PicNET2]

L’idea nasce dopo lunga ricerca per trovare qualche cosa da cui partire per far comunicare piccoli dispositivi ( possibilmente gli arcinoti PIC) tra loro in modo semplice sicuro e soprattutto economico.
Ottimo esempio di domotica (automazione domestica), in inglese Home Automation o Building Automation.

RETE PIC NET 2 PROGETTO DOMOTICA: 2004 . 2006. 2007

Come pensavo ho trovato moltissimi spunti ma niente di concreto da costruire, cosa ho deciso di mettere assieme delle idee e indicazioni hardware e software trovate, per costruire una piccola rete domotica. L’intento non è dare un progetto finito ma le basi su cui ogni uno può facilmente trovare la propria soluzione per un uso personalizzato o dedicato alla sua specifica esigenza. Pertanto mi rivolgo a chi vuole costruire qualcosa con le sue mani imparando sperimentando e divertendosi con entusiasmo. Ben venga qualsiasi critica proposta e modifica nel progetto con lo scopo di migliorare.
Tutto il materiale software lo metto a disposizione per un uso personale, può essere liberamente copiato e usato a tali fini.

Descrizione picnet2 rete domotica
Il cuore di tutto il sistema è decisamente il PIC. Io ho utilizzato diversi modelli, in base alle mie esigenze. Si possono utilizzare molte tipologie di PIC purché abbiano almeno una USART integrata, ho provato i 16F88, 16F876,16F628 tutti funzionano perfettamente, anche utilizzando l’oscillatore interno (16F88). Nel codice allegato faccio riferimento al 16F628 il quale gestisce tutto il protocollo e si interfaccia con l’esterno tramite le sue porte di ingresso / uscita. Per il trasferimento fisico dei dati viene in aiuto un RTX di uso comune nelle reti CAN quali il MCP2551 o Maxim, MAX3050 e altri della stessa famiglia. L’utilizzo di questo RTX semplifica ancora il SW in quanto la commutazione rx-tx è automaticamente gestita dal chip. Il protocollo è completamente diverso dal Can-Bus e pensato per utilizzare al meglio le risorse dei PIC, semplificandolo al massimo pur mantenendo come priorità irrinunciabile l’affidabilità dei dati ricevuti. Il BUS fisico è composto da 4 fili in cui transitano 2 i dati e 2 alimentazione. L’immunità dai disturbi è data dal tipo di trasmissione differenziale molto usata anche in ambito industriale.
Il tipo di trasmissione è asincrono 38400bps 8N1, la velocità può essere facilmente aumentata o diminuita senza nessun tipo di inconveniente software a parte la distanza massima che varia.
Le specifiche CAN parlano indicativamente 1Mbps max 40 metri, 115200bps 600metri max e via dicendo, per ulteriori informazioni vedi meglio specifiche CAN BUS

Programma della rete domotica con pic
Il programma è scritto in PicBasicPro, tale scelta è stata dettata da praticità nonché da facilità di modifiche e integrazione di codice futuro. Affinché la gestione del bus possa essere facilmente trasportabile ed integrabile ho messo il codice in un file esterno da includere nel programma principale. Il programma si attiva solo nel caso di una richiesta da parte del bus, mentre normalmente il PIC esegue il programma principale.

Il codice scritto gestisce tutta la comunicazione MultiMaster della rete domotica ed è facilmente trasportabile su altro modello PIC ( con USART integrata ) modificando solo le definizioni, in questo modo si possono facilmente aggiungere altre funzionalità . La velocità settando l’opportuna definizione può essere variata bisogna pero verificare se il la USART interna riesce a gestire il baud-rate corretto, altrimenti bisogna cambiare il quarzo, ho notato che comunque esiste una tolleranza molto ampia.

Con un quarzo da 20 Mhz si riesce a raggiungere velocità di quasi 1Mbps ! Per un uso corretto della USART fare riferimento al Data Sheet del PIC. L’uso di velocità elevate può essere utile per macchine automatiche che devono comunicare velocemente a brevi distanze. Per comodità consiglio di utilizzare velocità standard in modo da poter monitorare i dati tramite un PC.
E’ molto comodo all’inizio controllare tutto il traffico tramite PC per testarne il corretto funzionamento, comunque la rete è autonoma nel senso che ogni nodo possiede la capacità di funzionare sia da Master che da Slave interagendo tra loro. La comunicazione è del tipo MULTI-MASTER, le risorse minime per far funzionare la rete sono di almeno due nodi o un nodo e PC con adattatore RS232. Si possono poi in seguito aggiungerne altri semplicemente collegandoli e assegnando loro un ID univoco.
Nella nuova versione il sw è completamente trasparente al programma principale in quanto utilizza l’interrupt della seriale. In questo modo si ottiene una risposta istantanea quando richiesta dalla rete, l’unico inconveniente è che se si sta eseguendo una routines con temporizzazione questa viene totalmente errata causa il tempo richiesto per soddisfare la richiesta di interrupt.

Per questo motivo l’interrupt è stato concepito in un modo particolare, in quanto non ritorna alla successiva istruzione dopo la chiamata, ma effettua un salto alla etichetta loop che deve necessariamente esserci nel programma principale. Questo è molto utile in quanto viene abortita l’istruzione che si stava eseguendo e poteva dare risultati errati.
Una tecnica per risolvere questo problema può essere il cosiddetto bit-banging e il real-time ma di questo parleremo qui sul BLOG in futuro
Altra considerazione è che bisogna fare attenzione quando si richiedono dei dati in modo ripetitivo di non saturare il bus, mettere dei ritardi o un timer che a tempi predefiniti esegue la richiesta.

PROTOCOLLO
I dati viaggiano sempre in pacchetti da 12 byte consecutivi. Non viene controllato lo stato del bus ma la correttezza della trasmissione che, in caso di conflitti sul bus ( trasmissione simultanea di più nodi ) viene rilevata.
Inoltre l’integrità del pacchetto viene fatta dal controllo del cheksum. Il cheksum è composto di 2 byte ( 11 byte lsb, 12 byte msb ) viene fatto sommando i byte da 1 a 10.

I byte del pacchetto sono cosi costituiti:

[ID destinazione]-[ID mandante]-[D1]-[D2]-[D3]-[D4]-[D5]-[D6]-[D7]-[D8]-[cheksumLSB]-[cheksumMSB]

Se invio ID = 50 tutti i nodi della rete riconoscono i dati validi. Serve per dare con un comando valido per tutta la rete in casi particolari, o con un altro byte si può attivare disattivare per gruppi tipo X10.

Dati inviati come MASTER:
Il byte D1 (III° byte del pacchetto) funzione da svolgere, viene utilizzato dal PIC per capire cosa deve fare, deve avere un valore compreso tra 0 e 127.
Il byte D2 (IV° byte del pacchetto) si utilizza per passare l’indirizzo dei dati.
Byte da D3 …. D6 dati.

Dati risposta inviati come SLAVE: (dopo una richiesta del master)
l byte D1 (III° byte del pacchetto) valore uguale o superiore a 128, indica una risposta ad una richiesta
Il byte D2 (IV° byte del pacchetto) funzione eseguita e rimandata.
Byte da D3 …. D6 dati.

Qui di seguito nello specifico come vanno gestiti e interpretati i dati del pacchetto:

REG = registro o ram del PIC in uso, utilizzato normalmente per modificare le porte di inp/out ma può agire anche su tutti i registri STATUS, INTCON, RAM, ecc ( leggersi bene data sheet del PIC ). Si può modificare o leggere, sapendo pero bene quello che si va a fare in quanto non c’è controllo. Si può mandare in crash tutto se si modificano registri o ram riservata all’esecuzione del programma.
Si usa per attivare porte di INP/OUT, timer, leggere valori A/D, ram, ecc.

FILE = si intende la scrittura o lettura di dati nella EEPROM del PIC considerata come memoria. La quantità e indirizzi variano naturalmente a seconda del PIC usato. ATTENZIONE non modificare i primi 8 byte in quanto vengono utilizzati da sistema. Ad esempio il byte 0 contiene l’ ID del nodo.
Quindi si può addirittura cambiare l’ ID del nodo da remoto !

I°   BYTE    =	ID  numero 1 a 255  (escluso 50)  identifica il nodo di destinazione	     
II° BYTE    =	ID       "            "              "             identifica  nodo che manda i dati 	 
III° BYTE    =	funzione svolta	bit 7=1  (> 128 decimale identifica una risposta del nodo ) 
0 =  test verifica funzionamento nodo. Ritorna stringa "Test"
1=   legge 6 byte consecutivi REG. (indirizzo iniziale byte 4) ritorna 6 byte (5..10)
2=   scrive REG. un solo byte (indirizzo byte4) (dato byte5)
3=   scrive REG. un solo byte e ritorna conferma (indirizzo byte4) (dato byte5)
4=   legge 6 byte consecutivi FILE (indirizzo iniziale byte 4) ritorna 6 byte (5..10)
5=   scrive 6 byte consecutivi FILE (indirizzo iniziale byte4) (dati byte 5...10)
6=   scrive 6 byte consecutivi FILE e ritorna conferma (indirizzo iniziale byte4) (dati byte 5...10)
7=   legge bit REG. (indirizzo byte4) (n.bit 00000100 byte5) ritorna byte5 =  zero o uno
8=   setta   bit REG. (indirizzo byte4) (n.bit 00000100 byte5)
9=   resetta bit REG.  (indirizzo byte4) (n.bit 00000100 byte5)
10=  inverti bit REG.  (indirizzo byte4) (n.bit 00000100 byte5)

IV° BYTE   =	Indirizzo della operazione da svolgere
V° BYTE    =	Valore da memorizzare e o inizio dati letti.		 
....fino a ..........
X°   BYTE    =	ultimo dato.
XI°  BYTE  =	Checksum 16 bit.  Dati 1....10  ( byte basso)
XII° BYTE =	Checksum 16 bit.  Dati 1....10  ( byte alto)

I dati sono sempre trasmessi in pacchetti da 12 byte anche quando non tutti i byte hanno un significato utile.

Esempi di comunicazione tra nodi e o tra nodo e PC:

TRASMETTE BYTE: 1, 10, 0, 1, 2, 3, 4, 5, 6, 7, 39, 0
ID, id dest., operazione (0=test), byte fino a 10 in questo caso non significativa, somma byte (basso), somma byte (alto)

RICEVE BYTE: 10, 1, 128, 5, 6, 7, sum 0, sum1
TRASMETTE BYTE: 1, 10, 1, 10, 2, 3, 4, 5, 6, 7, 49, 0
ID, id dest., operazione (1=legge reg.), indirizzo iniziale, 6 byte senza significato, sum0, sum1

RICEVE BYTE: 10, 1, 128, 10, 6 byte con i dati richiesti, csum0, csum1

Per le prime prove consigli di costruirsi un nodo e l’interfaccia seriale RS232 da collegare al PC per fare delle prove per verificarne il funzionamento. Anche senza nessun ulteriore programma nel PIC si può leggere e scrivere i registri interni, le porte di I/O la EEPROM ecc.

COSA SERVE PER INIZIARE
Procurarsi il programma PicBasicPro della Melabs per poter compilare il codice basic del pic, è un programma commerciale che ha anche un certo costo
(ma esiste anche una versione demo di valutazione).
Un utile aiuto nella scrittura del codice è MicroCodeStudioche si integra benissimo con il PicBasic, è gratis, help in linea, controllo del codice ecc. Mi sembra esista anche il modo di utilizzare un compilatore on-line ma non ho il link. Il PIC16F628 si trova senza problemi in commercio e a un prezzo spesso inferiore al + noto 16F84.

Il programmatore è sufficiente il solito X_pippo possibilmente alimentato esternamente da utilizzare con il ben noto
programma IC-Prog 1.05A.

Documentazione

FIRMWARE
‘– Controllo BUS Home Automation PicNet
‘- Luigi 11/2005 Rel. 0.3
‘- Risorse COM1 bus PicNet

SCARICA LA DOCUMENTAZIONE COMPLETA DI SCHEMI ELETTRICI E SORGENTI FIRMWARE —>> DOWNLOAD

Forse non sono stato abbastanza chiaro o completo nella descrizione, ma non sono esperto bravo nel scrivere, ben vengano critiche o altre proposte.
Per informazioni e o chiarimenti scrivete agli indirizzi nel sito.

Luigi

19 Comments

  1. maximassimo 23 giugno 2011
  2. Emanuele 24 giugno 2011
  3. KID1412 20 maggio 2011
  4. fabi 24 ottobre 2008
  5. Emanuele 15 novembre 2011
  6. Fabio_01 7 gennaio 2009
  7. larosa.cristian 5 gennaio 2010
  8. Ionela 5 gennaio 2010
  9. Emanuele 15 gennaio 2009
  10. LuigiPic 21 gennaio 2009
  11. Fabio_01 22 gennaio 2009
  12. kf00115 12 febbraio 2009
  13. LuigiPic 3 marzo 2009
  14. larosa.cristian 9 gennaio 2010
  15. Emanuele 9 gennaio 2010
  16. LuigiPic 9 gennaio 2010
  17. larosa.cristian 22 gennaio 2010
  18. larosa.cristian 22 gennaio 2010
  19. larosa.cristian 22 gennaio 2010

Leave a Reply