volevo chiedere il sistema piu valido per collegare 3 arduino uno tra loro (seriale)
e piu precisamente un arduino chiede (a gentile richiesta es : mettendo un pin HIGH ) a gli altri 2 (uno alla volta) di invialgli un numero a 5-6 cifre contenuto in una variabile,
i 3 arduino sono tutti sulla stessa pcb o vicinissmi
piu che altro a livello elettrico es si possono collegare assieme i pin tx dei due ardiuni trasmittenti senza che si infastidiscono
Perché non usi l'I2C? E' più semplice poi gestire la comunicazione tra master e slave, cioè fra l'Arduino che "chiede" e l'Arduino che "risponde". Inoltre non devi usare pin aggiuntivi, fai tutto tramite A4 e A5: quando un Arduino master deve chiedere qualcosa ad un altro Arduino, non fa altro che spedire la richiesta usando l'ID dello slave con cui vuol comunicare.
ma non si puo usare qualche "barbatrucco" tipo mettere i 2 pin tx su pin differenti
e mettere 2 pin riceventi diversi (anche se funzionano uno alla volta va bene)
@gingardu
Perché Ti ostini a voler usare delle soluzioni fantasiose se il I2C gestisce piú apparecchi sullo stesso bus, e gestise anche in automatico l'indirizzamento.
ma non si puo usare qualche "barbatrucco" tipo mettere i 2 pin tx su pin differenti
e mettere 2 pin riceventi diversi (anche se funzionano uno alla volta va bene)
o mettere i pin come imput quando non servono ecc
La seriale sui pin 0 e1 é gestita via hardware. Puoi sempre usare una seriale emulata, ma é una complicazione rispetto al I2C.
il fatto che di I2C non so ancora nulla =(
invece con la seriale ho gia "pronto quasi tutto"
poi i trasmittenti utilizzano l'interrupt (garantito) ogni 300 millisecondi
bisogna vedere che succede alla trasmissione in corso se l'interrupt si aziona, se semplicemente si ferma e poi riprende o si perde :~
gingardu:
il fatto che di I2C non so ancora nulla =(
invece con la seriale ho gia "pronto quasi tutto"
poi i trasmittenti utilizzano l'interrupt (garantito) ogni 300 millisecondi
bisogna vedere che succede alla trasmissione in corso se l'interrupt si aziona, se semplicemente si ferma e poi riprende o si perde :~
Ancora con l'interrupt
Ricordati che anche la seriale, sul nuovo Arduino 1.x, è gestita da interrupt.
Inoltre gli interrupt potresti perderli sempre, basta che ne arrivino 3 distanziati da un tempo minore rispetto al tempo che serve per gestire l'ISR ed il terzo lo perdi.
Al primo interrupt, viene chiamata l'ISR relativa; durante l'esecuzione arriva il 2° interrupt e viene registrato. Il 3°, se l'ISR del 1° segnale è ancora in esecuzione, sovrascrive il 2° per cui dei 2 segnali successivi tu hai 1 sola registrazione.
allora troviamo il sistema di bloccare l'interrupt sul trasmittente perche quando trasmette il dato
la precedenza deve averla la trasmissione del dato senza corruzioni,
che so non posso dire al ricevente di mettere un pin HIGH sul trasmittente? cosi il trasmittente smette di dar retta all'interrupt (un ciclo WHILE ? ) e appena finito di trasmettere il dato a sua volta fa la stessa cosa col ricevente "avvisa che ha trasmesso il dato" pin che va LOW e riprende con l'interrupt,
insomma voglio fare una cosa pulita e ordinata ogni cosa deve avvenire dietro richiesta ,
anche perche sta faccenda di adoperare 3-4 arduini
in alcuni progetti, ultimamente misembra una cosa da prendere il cosiderazione 8)
gingardu:
allora troviamo il sistema di bloccare l'interrupt sul trasmittente perche quando trasmette il dato
la precedenza deve averla la trasmissione del dato senza corruzioni,
che so non posso dire al ricevente di mettere un pin HIGH sul trasmittente? cosi il trasmittente smette di dar retta all'interrupt (un ciclo WHILE ? ) e appena finito di trasmettere il dato a sua volta fa la stessa cosa col ricevente "avvisa che ha trasmesso il dato" pin che va LOW e riprende con l'interrupt,
Per disabilitare un singolo interrupt, nello specifico quello della seriale, devi andare a modificare le librerie del core e riscriverti le routine come ti servono. Ma non è compito facile. Altrimenti utilizza la vecchia versione 0022 che non usa gli interrupt in trasmissione ma solo in ricezione.
insomma voglio fare una cosa pulita e ordinata ogni cosa deve avvenire dietro richiesta ,
anche perche sta faccenda di adoperare 3-4 arduini
in alcuni progetti, ultimamente misembra una cosa da prendere il cosiderazione 8)
I progetti multichip esistono, ma ssare Arduini interi mi pare uno spreco di soldi quando bastano dei chip in standalone.
se nello scketch metto in if o un while o switch case, che se un pin e alto, trasmette il dato senza dar retta a null'altro e appena il pin va basso ripèrende a dar retta all'interrupt, questo non è fattibile?,
a parte che mentre stavo scrivendo mi e venuto un "flash" che porto direttamente il pin interrupt a LOW,
dall'esterno ed è bello che congelato,
e anche portandolo LOW dall'interno (il pin 3 nel setup e portato HIGH se non non funziona)
if (digitalRead (5)==HIGH) digitalWrite (3, LOW); // 5 è HIGH comandato dal ricevente
if (digitalRead (5)==HIGH) Serial.println (x,DEC);
digitalWrite (3, HIGH);
ovviamente il ricevente appena ricevuto il dato porta 5 LOW
non ho provato ma mi sa che entrambi i metodi hanno alta probabilita di successo
se nello scketch metto in if o un while o switch case, che se un pin e alto, trasmette il dato senza dar retta a null'altro e appena il pin va basso ripèrende a dar retta all'interrupt, questo non è fattibile?,
Ecco, così già è meglio.
Basta disattivare l'interrupt prima dell'if/while/switch, eseguire le tue operazioni e poi riattivarlo.
Tipo così:
detachInterrupt(...);
if (...) { ..... }
attachInterrupt(...);