Battipaglia (SA)
Offline
Jr. Member
Karma: 0
Posts: 52
|
 |
« Reply #30 on: February 04, 2013, 06:03:12 am » |
E ritorno anche al mio dubbio... 50 ms sono una eternità, il tempo medio per la transazione master/slave è 4-5 ms, il timeout mediamente si imposta tra 10-20 ms ed è una condizione di errore certo, con 4-5 ms i conti tornano... ho però qualche dubbio. In questo tempo, il master deve inviare la richiesta e lo slave deve rispondere; pensi che sia fattibile con Arduino? Appena ho un po' di tempo ci provo. E poi non è che il master debba terminare tutto il ciclo di interrogazioni quando deve spedire un comando. questo mi piace  In pratica appena riceve una variazione da uno slave esegue la logica di controllo per verificare se deve comandare qualcosa ed invia i comandi necessari. Il controllo degli slave sarà fatto nei momenti di idle del sistema. questo invece non lo capisco. Mi pare, come dice anche astrobeed, che il sistema interroghi sempre gli slaves, altrimenti come fa a sapere se c'e' stata una variazione o meno. E comunque immagino che la logica di controllo venga eseguita in un tempo brevissimo; credo che il master passi la maggior parte del tempo ad interrogare gli slaves. Ciao.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 2
Posts: 92
|
 |
« Reply #31 on: February 04, 2013, 07:51:07 am » |
Allora dopo tutto questo parlare peché non ci uniamo in u n unico gruppo e iniziamo a mettere le basi per un "simple protocol" da usare per un Arduino Master che collegato con due slave esegue un controllo dello stato pin dei due slave in scansione e in continuazione e appena riceve uno stato High dei pin input 2,3,4 di ogni slave esegue un digitalWrite High dei suoi Pin Output 2,3,4 5,6,7 8,9,10
Slave1 pin2,3,4 ---- segue Master pin2,3,4 Slave2 pin2,3,4 ---- segue Master pin5,6,7 Slave3 pin2,3,4 ---- segue Master pin8,9,10
Da dove iniziamo??
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16499
Don't know what I do
|
 |
« Reply #32 on: February 04, 2013, 10:51:00 am » |
@vittorio68: la mia affermazione sul controllo degli slave nei periodi di idle era fatta relativamente ad un master che dovesse anche interagire con l'utente, lo avevo precisato che appunto in modalità "interattiva" dedicasse la sua attenzione al "padrone" piuttosto che alle sue periferiche. Ovviamente questo dipende da come fai la lettura degli slave, se usi uno scheduler tipo il mio leOS e l'interrogazione la fai in background, puoi sempre ricevere dati senza fermare il loop principale del codice.
|
|
|
|
|
Logged
|
|
|
|
|
Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #33 on: February 04, 2013, 01:10:36 pm » |
Allora dopo tutto questo parlare peché non ci uniamo in u n unico gruppo e iniziamo a mettere le basi per un "simple protocol" da usare per un Arduino Master che collegato con due slave esegue un controllo dello stato pin dei due slave in scansione e in continuazione e appena riceve uno stato High dei pin input 2,3,4 di ogni slave esegue un digitalWrite High dei suoi Pin Output 2,3,4 5,6,7 8,9,10
Slave1 pin2,3,4 ---- segue Master pin2,3,4 Slave2 pin2,3,4 ---- segue Master pin5,6,7 Slave3 pin2,3,4 ---- segue Master pin8,9,10
Da dove iniziamo??
Pietro...l'idea mi piace...scrivere qualcosa noi da mettere a disposizione di tutti (visto che si trova davvero poco) quello da cui partire sarebbe inventarci il protocollo rispondendo a Vittorio... la mia idea di avere un codice in esecuzione all'interno degli slave è solo per i comandi delle luci e per il sensore gas sostanzialmente...ciò per avere un'affidabilità maggiore e un tempo di risposta immediato, la sirena del sensore gas in questo caso è allocata all'interno dello slave in questione...nel caso di una fuga di gas..lo slave dovrebbe rilevare il gas, inviare il comando di accensione della sirena al master e il master dovrebbe restituirlo allo slave dicendo di attivare la sirena...mettiamo caso ci fosse un errore di comunicazione o qualsiasi altro problema per cui il segnale non riesce ad arrivare al master...la sirena non si attiva...è solo una questione di affidabilità, praticamente lo slave mi esegue il codice inviando solo un feedback al master alla prima interrogazione...comunque se vogliamo fare un codice insieme sono a disposizione...cominciamo a buttare giù qualcosa...
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16499
Don't know what I do
|
 |
« Reply #34 on: February 04, 2013, 04:12:29 pm » |
Dovreste creare una serie di livelli di sicurezza. Se l'operazione è banale, come ad esempio accendere un faretto quando inizia a fare buio, potete usare un livello basso, spedendo al master la lettura del sensore ed attendendo che il master spedisca il comando. Ma se il livello di sicurezza è alto, lo slave è abilitato ad invertire la sequenza: operare in proprio attivando una certa cosa ed informando il master del problema.
|
|
|
|
|
Logged
|
|
|
|
|
Battipaglia (SA)
Offline
Jr. Member
Karma: 0
Posts: 52
|
 |
« Reply #35 on: February 05, 2013, 04:48:11 am » |
Allora dopo tutto questo parlare peché non ci uniamo in u n unico gruppo e iniziamo a mettere le basi per un "simple protocol" Qualche tempo fa avevo fatto qualche prova con un paio di Arduino Mega (scelti sopratutto per la maggiore capacità di memoria...) ed un paio di SN75716BP per creare una RS485. Appena ho un po' di tempo rimetto insieme gli sketch di prova che avevo fatto e comincio a postarli. Ciao. Vittorio.
|
|
|
|
|
Logged
|
|
|
|
|
Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #36 on: February 05, 2013, 09:27:49 am » |
Dovreste creare una serie di livelli di sicurezza. Se l'operazione è banale, come ad esempio accendere un faretto quando inizia a fare buio, potete usare un livello basso, spedendo al master la lettura del sensore ed attendendo che il master spedisca il comando. Ma se il livello di sicurezza è alto, lo slave è abilitato ad invertire la sequenza: operare in proprio attivando una certa cosa ed informando il master del problema.
Cosa consigli???
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16499
Don't know what I do
|
 |
« Reply #37 on: February 05, 2013, 10:52:19 am » |
Una semplice tabella con i livelli di sicurezza. Ad ogni operazione che deve eseguire lo slave assegnate un livello. Se il livello è base, fate la solita trafila: spedire al master il dato, attendere la decisione del master. Questo va bene, ad esempio, per la lettura di una fotoresistenza. Se il livello è superiore (allarme fuga gas), potete decidere se: 1) inviare il dato al master e mettere un timeout alla sua risposta, per evitare che una caduta dello stesso o un problema sulla linea impedisca allo slave di prendere una decisione. Oppure 2) attivare una contromisura (es.: sirena) in maniera indipendente ed informare il master dell'accaduto.
Il master potrà avvisare l'utente con un sms/email/led, a seconda di come è stato programmato.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 2
Posts: 92
|
 |
« Reply #38 on: February 06, 2013, 01:38:14 am » |
|
|
|
|
|
Logged
|
|
|
|
|
Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #39 on: February 09, 2013, 06:57:33 pm » |
Ragazzi, vi prego di scusare la mia assenza a causa di svariati impegni lavorativi....dunque creiamo una base di partenza...e partiamo dal master....mettendo per ipotesi che noi vogliamo creare un protocollo semplice utilizziamo 6 byte... e quindi byte data [6] // il primo byte è il classico NULL, inviato per primo come meno significativo 0x00 byte Address; // il secondo byte è quello di indirizzo del dispositivo che invia byte SlaveAddress; // il terzo byte è quello di indirizzo del dispositivo che riceve byte Data; // il quarto byte richiama la funzione da eseguire...nel caso di invio di lettura digitale entrambi i byte di data riportanto il valore di 10 bit byte Data2; // il quinto byte specifica cosa eseguire byte Checksum; // l'ultimo byte invia un feedback al master indicando che l'operazione è stato eseguita
correggetemi se scrivo castronerie...(Leo72 aiutami tu che vedo che sei il più esperto qui...) poi.... #define Address xx; //impostiamo l'indirizzo del dispositivo const int PinRS485Enable = 02; //impostiamo l'abilitazione del trasferimento dati sul pin 2 ( i pin 0 e 1 sono utilizzati per la comunciazione seriale) const int ErrorComLed = 03; //reputo molto utile l'utilizzo di un led che ci segnali eventuali errori di comunicazione
poi sul void setup() scriveremo: pinMode(PinRS485Enable, OUTPUT); // settiamo il pin di controllo della trasmissione come output pinMode(ErrorComLed, OUTPUT); // settiamo il pin del led di errore come output
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 2
Posts: 92
|
 |
« Reply #40 on: February 10, 2013, 08:20:24 am » |
Come inizio non è male...anzi almeno sappiamo da dove partire ma adesso viene il bello... Come costruire i byte da te citati...o meglio come costruire la tabellina di riferimento per le funzioni...aspettiamo... byte data [6] // il primo byte è il classico NULL, inviato per primo come meno significativo 0x00 byte Address; // il secondo byte è quello di indirizzo del dispositivo che invia byte SlaveAddress; // il terzo byte è quello di indirizzo del dispositivo che riceve byte Data; // il quarto byte richiama la funzione da eseguire...nel caso di invio di lettura digitale entrambi i byte di data riportanto il valore di 10 bit byte Data2; // il quinto byte specifica cosa eseguire byte Checksum; // l'ultimo byte invia un feedback al master indicando che l'operazione è stato eseguita
|
|
|
|
|
Logged
|
|
|
|
|
Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #41 on: February 10, 2013, 08:52:56 am » |
Ok dai, quindi siccome vogliamo fare un SimpleProtocol propongo di fare questa tabellina in un file.h da includere nel sorgente, il problema reale che ho riscontrato nei sorgenti che si trovano in giro nel web è appunto il non capire a che serve quella determinata stringa che magari sta solamente dichiarando cosa deve fare quel comando....quindi propongo di semplificare al massimo e lasciare all'utente che va a modificare il codice sorgente soltanto decidere cosa eseguire su quel pin ecc....che ne dici?...un sorta di brutta copia del Wire...
|
|
|
|
|
Logged
|
|
|
|
|
Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #42 on: February 10, 2013, 09:01:50 am » |
dimenticavo....ovviamente nel void setup() Serial.begin(9600); //inizializzo la porta seriale e la imposto a 9600 baud...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 2
Posts: 92
|
 |
« Reply #43 on: February 10, 2013, 10:15:25 am » |
Concordo pienamente nel compilare un file.h per i comandi a livello "open" per lasciare la possibilità a chiunque di personalizzare anche il sorgente... Per la porta seriale pensavo chiaramente di poter usare almeno per il Master la classe SoftwareSerial per il bus485 e quindi usa re una porta virtuale e lasciare chiaramente la Com sui pin 0 e 1 per la comunicazione con PC e monitoraggio delle serialPrint ... che pensi si può fare ??
E intanto andiamo avanti in attesa che si introduca sempre più gente...+ne siamo e meglio è ....
|
|
|
|
|
Logged
|
|
|
|
|
Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #44 on: February 10, 2013, 03:10:36 pm » |
Ottima idea quella della SoftwareSerial... quindi procediamo in questo senso...abbiamo bisogno di altra gente che si aggreghi però...qui di lavoro ce n'è....ma il mio tempo è molto limitato purtroppo...quindi quando posso butto giù qualche idea....fattevi avanti anche voi...con pezzi di codice...a pezzo a pezzo buttiamo giù qualcosa di concreto...
|
|
|
|
|
Logged
|
|
|
|
|
|