Show Posts
Pages: [1]
1  Forum 2005-2010 (read only) / Italiano / Re: Domotica con Arduino on: September 03, 2010, 05:19:41 am
@astroz78
Quote
Ora ho una domanda per voi "bus-sari"...
Quote
Considerata l'architettura p2p (peer-to-peer)...come si gestisce la comunicazione? Es. Io inserisco l'allarme dal pannello1 (quindi il pannello1 manda un token a chi sà lui), la centrale dell'allarme si inserisce, ma il nuovo stato di "inserimento" deve essere visualizzato su entrambi i pannelli di attivazione (pannello1 e pannello2) nonchè evidentemente dovrà essere visualizzato pure un "alert" sui pannelli "generici".
Considerando la tua architettura con bus lan, direi che il modo + facile per gestire i pannelli è:
1)pannello 1 -->AlarmON@centrale
2)centrale    -->AlarmON@pannello2
3)centrale    -->AlarmON@pannello3
4)ecc.
qualcosa di simile a gestire uno "scenario"
ovviamente devi prevedere che il pannello si allinei alle varie informazioni scrivendo una routine che interroga i vari apparati quando questo viene alimentato la prima volta (altrimenti in caso di blackout il pannello non sà se l'antifurto è attivo o no)

Quote
Tenderei ad evitare meccanismi di polling per non intasare la rete e per garantire la massima affidabilità che l'informazione arrivi in real-time o quasi!
il pooling dei sensori devi farlo in ogni caso ogni 5 minuti per rilevare la loro presenza... se tolgono corrente allo siwtch, l'allarme come fà a scattare?

Nel caso di un bus, gestire i pannelli è più curioso:
utilizzando RS485, ogni messaggio inviato gira sul bus e raggiunge tutti i device collegati..... sono questi che con un filtro scartano i messaggi che non corrispondono al loro indirizzo.
dato che il filtro lo scriviamo noi, possiamo prevedere un indirizzo di broadcast.... una specie di indirizzo jolly che bypassa il filtro

Ti faccio il mio esempio pratico per capire meglio...
ho la necessità si resettare tutti i device domotici della casa...
ogni device ha un indirizzo del tipo 1,2,3 ecc...
ho previsto un indirizzo jolly (255) al quale tutti i device dovrebbero rispondere
il filtro del device 1 che riceve i messaggi sul bus, scarta tutti i messaggi che hanno indirizzo diverso 1 o 255
quelli con destinazione 1 o 255 vengono sempre letti
il comando per resettare tutti i device insieme diventa reset@nodo255 e viene trasmesso una volta sola  smiley-wink

Tornando alla tua architettura, in teoria esiste un indirizzo di broadcast
supponiamo che la tua rete abbia ip del tipo 192.168.0.x e subnet 255.255.255.0, allora l'indirizzo di broadcast dovrebbe essere 192.168.0.255
Tuttavia non credo sia stato implementato nella libreria ethernet :-?

2  Forum 2005-2010 (read only) / Italiano / Re: Domotica con Arduino on: August 27, 2010, 03:06:57 pm
@ignuccio  innanzitutto Benvenuto sul forum,
mi fà piacere che la discussione sulla domotica sia molto viva (lo testimonia il numero di post) e sicuramente qualcuno che ha già realizzato un impianto funzionante è ben accetto smiley-wink
ZigBee o XBee non lo abbiamo considerato perche buona parte degli utenti vorrebbero realizzare un impianto domotico puntando al risparmio....
Perchè non ci racconti un po' la tua esperienza con ZigBee? se non sbaglio si riesce a creare una piccola rete a stella simile ad un Bus ethernet come usa Astroz..... credo che una cosa simile si possa fare anche col Bluetooth e si elimina il problema Master/Slave :o

@Tutti gli altri
Nel mio modello RS485 Multimaster dove tutti i dispositivi parlano quando vogliono, ho trovato un metodo per ridurre le collisioni sul bus... vi posto il codice:
Code:
void CheckBUS() {
  int i=0;
  if (Serial.available() > 0) {    //c'è un messaggio in arrivo o già arrivato
  Serial.println("canale occupato... waiting");
    while (Serial.available()!=i) {  //finchè la trasmissione non finisce
 i=Serial.available();
      delay(random(5,25));            //aspetta un tempo random prima di mandare dati sul canale
    }
  }
}
In pratica, prima mandare dati sul bus, controllo il buffer seriale su Arduino.... se la sua dimensione aumenta, significa che qualche nodo sta trasmettendo quindi aspetto un tempo random per non finire in loop con altri nodi anch'essi in attesa di trasmettere.... semplice a funzionale smiley-grin
3  Forum 2005-2010 (read only) / Italiano / Re: Domotica con Arduino on: August 26, 2010, 02:35:21 pm
@Ambrogio
Quote
a cosa serve il pin D3 ? E' quello che indica la direzione dei dati ? Cioè lo devo settare quando invio un comando e resettare quando sono in ascolto ?
Il pin D3 serve a settare la modalità del chip sul bus: se diamo un Input LOW, si ricevono i dati mentre se il pin ha livello HIGH, si possono trasmettere i dati sul canale....
per maggiori info sul chip --> http://focus.ti.com/lit/ds/symlink/sn75176b.pdf
4  Forum 2005-2010 (read only) / Italiano / Re: Domotica con Arduino on: August 25, 2010, 04:52:40 pm
@Federico Vanzati & @Ambrogio se non erro vi state orientando ad un protocollo di comunicazione su RS485....  perchè avete preferito quel bus invece di un altro?
Io personalmente mi sono buttato sull'RS485 per il costo ridotto, la semplicita di utilizzo e la facilità di costruzione
Per chi fosse interessato posto lo schema elettrico (il chip è l'economico SN75176 0,7€)


La struttura del protocollo da me usata è simile alla vostra con 10 Byte:
Code:
0)Byte di inizio trasmissione (0x01)
1)Indirizzo mittente
2)Indirizzo destinatario
3)Azione SET,QUERY,ACK (0x05,0x0F,0x06)
4)Pin o slot relativo all'azione
5-6)Valore
7-8)Checksum (somma dei Byte 1,2,3,4,5,6)
9)Byte di fine trasmissione (0x04)

L'ostacolo maggiore in questo tipo di bus credo sia la gestione Master-Slaves..... Supponiamo che il Master mandi un MSG sul bus e si aspetti un MSG di ACK (messaggio ricevuto)
nella programmazione dovremmo tenere conto di alcuni aspetti.... cosa succede se:
1) il MSG del Master è corrotto?
2) il MSG del Master non giunge allo slave?
3) lo Slave manda il MSG di ACK ma questo arriva corrotto al Master
4) se lo Slave è fritto.... il Master aspetta il MSG di ACK in eterno?
5) lo slave è lento a rispondere e il Master andato in timeout rinvia il comando... come gestisco questo comando duplicato?
6)ecc....

Supposto di utilizzare il "Reliable Data Transfer 3.0" http://www.cs.umd.edu/~shankar/417-F01/Slides/chapter3a/sld025.htm un po' macchinoso ma efficace, siamo sicuri di avere abbastanza tempo nel'interrogazione di tutti gli slave?
Quote
Non penso che sia necessario stressare così tanto la CPU per guadagnare massimo 5 ms ... secondo me è sufficiente inviare il messaggio e attendere la risposta di avvenuta ricezione dopo max 50 ms. Se dopo 30-50 ms non è arrivata la conferma di ricezione allora riinvio il messaggio una seconda e una terza volta ... se dopo la terza volta non ricevo nessuna risposta posso generare un allarme, tanto saranno passati 90-150 ms, secondo me è un tempo accettabile.
Se abbiamo 10 Slave da interrogare col Master, per accendere una luce potrebbe volerci anche fino a 900-1500ms.... decisamente non accettabile! :-?

Questi sono un po' i motivi per cui ho abbandonato l'architettura Master-Slave  :-/ e sono passato a Multimaster...
Con Multimaster intendo che ogni modulo può parlare quando vuole sul BUS... questo comporta a delle inevitabili collisioni ma si può trovare un modo per gestirle.... ad esempio per ogni Checksum incorretto (2 MSG in contemporanea sul bus) mando una richiesta di riinvio del MSG con un delay random così da impedire (almeno in via teorica la risovrapposizione dei MSG)
Mi rendo conto che non è un sistema affidabile ma oltre a essere molto veloce nella comunicazione, le probabilità che si schiaccino 2 pulsanti nello stesso momento è veramente bassa e nel caso succedesse, posso tollerare il fatto di dover premere il pulsante un'altra volta  smiley-wink

Da notare che il bus Ethernet non soffre di questi problemi ma per il mio impianto, dato che dovrà gestire 8 punti luce, 20 interruttori e 4 sensori, mi accontento di RS485 e dei sui limiti smiley-grin

5  Forum 2005-2010 (read only) / Italiano / Re: Domotica con Arduino on: August 24, 2010, 08:28:32 am
Vorrei segnalare il link al protocollo SCS della domotica BTicino.. potrebbe essere un buono spunto per definire un protocollo di comunicazione
 http://it.wikipedia.org/wiki/OpenWebNet
6  Forum 2005-2010 (read only) / Italiano / Re: Domotica con Arduino on: August 24, 2010, 08:26:38 am
la mia applicazione è molto acerba (infatti per adesso è solo implementato il "inverti stato" nella matrice) ma sufficiente al mio scopo.... quello che forse vuoi ottenere tu è l"attivazione" di uno scenario che potrebbe essere contenuto in una matrice molto più ampia contente tutto il sistema domotico che ovviamente non è possibile salvare tutta in EEPROM....
perchè invece non implementi un nodo specifico per gestire gli scenari?
pulsante9@nodo1==>request scenario1@nodoscenario==>accendere 1 + 2 + 3 + 4 del nodo 1 e 5 + 6 del nodo 2? in caso di modifica devi flashare solo il nodo scenario....
7  Forum 2005-2010 (read only) / Italiano / Re: Domotica con Arduino on: August 24, 2010, 08:03:24 am
@Astroz78 recentemente anche io mi sono posto la problematica della configurazione di ogni nodo volendo mantenere pressochè identico il firmware per ogni modulo (diciamo così slave) che gestisce pulsanti (ingressi digitali), relè (uscite digitali) e sensori (ingressi analogici)

Tralasciando il fatto che utilizzo RS485 e protocollo custom per la comunicazione, ho inpiegato l'utilizzo di una sorta di matrice composta da un certo numero di Array: in pratica ogni colonna corrsponde ad un ingresso digitale, mentre ogni riga ha uno specifico significato.... ora mi spiego meglio:
Prendiamo parte del mio sketch:
Code:
//Digital Inputs Matrix
byte DIn_Ard_Pin_Buffer[11] = { //Buffer DIn(num)=>Arduino Pin (num)
  9,10,0,0,0,0,0,0,0,0};
byte DIn_Addr_Buffer[11] = {    //trigger Input to Address
  1,2,1,1,1,1,1,1,1,1};
byte DIn_Pin_Buffer[11] = {    //trigger Input to dest DOut
  0,1,2,3,4,5,6,7,8,9};  
leggendo in verticale la prima colonna abbiamo questo:
quando ricevo un input dal pulsante 0 sul pin 9 dell'arduino, manda al nodo con indirizzo 1 il comando "inverti stato" alla sua relativa uscita digitale 0 (che nel mio caso non corrisponde ad un pin ma c'è un'altra matrice che relaziona pin e uscita)

Per avere maggiore flessibilità ci vorrebbe ancora una riga nella matrice per definire il tipo di comando da inviare; oltre ad inverti stato, metterei qualcosa come accendi, spegni, duplicazione uscita(nel caso si volessero spegnere 2 punti luce con un comando), timer (utile per la luce in cantina che rimane sempre accesa).
Non utilizzando shift register, la mia matrice ha al massimo 11 colonne... se consideriamo abbondando 10 righe, arriviamo ad utilizzare 110 byte di memoria per l'intera configurazione del nodo...
il consiglio è di tenere la matrice sulla EEPROM e andare ogni volta a leggere il byte necessario liberando la ram
Come velocità di lettura su EEPROM non credo ci siano problemi evidenti e rimangono 1024-110 byte liberi per salvare altri valori

Probabilmente (ma non ne sono sicuro) hai problemi di spazio in ram a causa delle librerie ethernet e shift register ma se intendi pilotare un elevato numero di uscite consiglio il passaggio ad Arduino Mega
Altro vantaggio dell'adozione di queste matrici è l'elevata flessibilità.... se si vuole cambiare funzione di un pulsante, non è necessario smontare la scatola di derivazione per flashare arduino ma un semplice comando sul bus che modifichi la matrice per adattarla alla nuova configurazione  smiley-wink

8  Forum 2005-2010 (read only) / Italiano / Re: Domotica con Arduino on: July 28, 2010, 05:10:40 pm
Eccovi il mio concept:

a) 1 Arduino per stanza con interruttori, pulsanti, sensori di movimento, sensori di temperatura come ingressi (analogici o digitali) e un adeguato numero di relè come uscite

b) Comunicazione tra gli Arduino utilizzando lo standard RS485 (molto economico ) con 1 Master che gestisce il tutto e gli slave come componenti passivi (in configurazione multimaster, gestire le collisioni dei messeggi risulta molto difficile)

c) Protocollo di trasferimento: HDLC personalizzato in questo modo:
[/td][/td]
012345678910
FLAGADDRESSControl field|DATA[td][td]|Checksum|FLAG
ENQ,ACK,NACKActionPinPin number|Value|
0x010x01-0x??0x05,0x06,0x15ASCII(R/W)ASCII(A/D)0x??0x??0x??somma valori0x04

Semplificando arduino slave riceve un comando del tipo
W D 13 1 (scrivi, pin digitale, 13, HIGH)
R D 10 ? ((leggi, pin digitale, 10, valore che restituisce nell'ACK)
R A 3 ? (leggi, pin analogico, 3, valore che restituisce nell'ACK (2 byte essendo compreso fra 0 e 1023))
W A 3 255 (scrivi, pin PWM, 3, 255)

d)Livello di trasporto protocollo: reliable data transfer (RDT) 3.0 (poco efficiente ma efficace e di media difficoltà nell'implementazione)
http://www.cs.st-andrews.ac.uk/~tristan/teaching/cs78_spring05/slides/transport-layer.pdf pagina 28

e)L'Arduino Master si occupa di gestire la logica del sistema quindi potenzialmente può essere collegato con altri dispositivi per il controllo (tramite seriale al pc, o bluetooth al cellulare o ad un modem GSM)

f)Gli Arduini Slave sono composti essenzialmente da una scheda Arduino 2009 e uno shield con relè, pin per i pulsanti, il chip SN75176/MAX 485 (il primo costa meno di 1€) e doppio connettore RJ45 (quello del telefono per intenderci)

g)Il bus di comunicazione è composto da 4 fili:
  • +12V(preferibili ai 5V nel caso i releè fossero a 12)
  • GND
  • RS 485 A
  • RS 485 B
Così abbiamo alimentazione e segnale tutto sul "doppino" telefonico

Molti spunti li ho presi da http://real2electronics.blogspot.com/2009/09/arduino-and-rs485-english-version.html ....

a mio parere la parte più difficile è scrivere il codice per gestire l'RDT e ovviamente il master che essendo il cervello di tutto è decisamente spesso da programmare; lo slave tutto sommato è semplice essendo un componente "passivo"

feedback e suggerimenti sono sempre ben accetti  smiley-wink
9  Forum 2005-2010 (read only) / Italiano / Re: Domotica con Arduino on: July 28, 2010, 05:10:19 pm
Salve, appena iscritto cerco di dare una mano...
scusate il doppio post ma non riuscivo a inserire link
Pages: [1]