Comunicazione seriale tra Arduino Due e Arduino Mega per...

Salve a tutti
allora quello che devo realizzare è un automazione completa per acquari e vorrei inserire un touchscreen da 5 o 7".
Un touch di questa dimensioni ha bisogno di una quarantina di pin quindi una scheda(master) arduino due o mega è gia piena o quasi,l'altra scheda arduino(slave) deve fare il lavoro sporco ovvero deve azionare dei relè,leggerei vari sensori(ultrasuono-distanza,temperatura,pH, eccecc),effettuare il PWM per l'illuminazione a led.
Sulla scheda master ci sarà anche un real time.
Tramite il touch e quindi la scheda master io devo modificare alcune variabili,ad esempio l'orario di accensione dei led,la quantità di fertilizzanti da somministrare ed altre cose,questi dati devono essere inviati alla slave che poi dovrà fare i vari azionamenti.
Ora vi chiedo è possibile fare una cosa del genere?Se si come posso fare questa comunicazione? so che le due schede devono essere collegate con i pin tx-rx e gnd. Se resetto una scheda(con tasto) anche l'altra si resetta?

p.s.non sono espertissimo di arduino ,anzi posso dire che sono un neofita
p.p.s. il real time mi serve per entrambe le schede come devo collegarlo?

vi mette 2 spezzoni di sketch che ho realizzato per l'automazione(la sto gia facendo ma con un touch da 2.8" e un mega)

questo va sul master( oltre a modificare l'orario fa anche il print sullo schermo)
void loop()
{

//CONTROLLO TASTO PIU' ORE OFF MOVIMENTO DX
if(p.x>203 && p.x<228 && p.y>127 && p.y<152 && pc==3 && oreOffMovimentoDx<=22){
int newOreOffMovimentoDx;
mc=1;
ic=0;
dc=0;
tc=0;
ac=0;
fc=0;
pc=3;

cc=0;info=0;
p.x=0;
p.y=0;

newOreOffMovimentoDx=oreOffMovimentoDx+1;
oreOffMovimentoDx=newOreOffMovimentoDx;
tft.fillRect(56, 128, 128, 23, CYAN);
tft.setCursor(85, 133);
tft.setTextColor(BLACK); tft.setTextSize(2);
tft.print("ORE ");
tft.println(oreOffMovimentoDx);
}
//CONTROLLO TASTO MENO MINUTI OFF MOVIMENTO DX
if(p.x>10 && p.x<35 && p.y>155 && p.y<180 && pc==3 && minutiOffMovimentoDx>=1){
int newMinutiOffMovimentoDx;
mc=1;
ic=0;
dc=0;
tc=0;
ac=0;
fc=0;
pc=3;

cc=0;info=0;
p.x=0;
p.y=0;

newMinutiOffMovimentoDx=minutiOffMovimentoDx-1;
minutiOffMovimentoDx=newMinutiOffMovimentoDx;
tft.fillRect(56, 156, 128, 23, CYAN);
tft.setCursor(65, 161);
tft.setTextColor(BLACK); tft.setTextSize(2);
tft.print("MINUTI ");
tft.println(minutiOffMovimentoDx);
}

}

questo un esempio di codice sulla slave

void loop()
{

if(AccendiMovimentoDx==1 && Rete==HIGH)
{
if(hour==oreOnMovimentoDx && minute==minutiOnMovimentoDx)
{
digitalWrite(MOVIMENTODX,HIGH);
}if(hour==oreOffMovimentoDx && minute==minutiOffMovimentoDx)
{
digitalWrite(MOVIMENTODX,LOW);
}
}else
{
digitalWrite(MOVIMENTODX,LOW);
}

}

come potete vedere minutiOffMovimentoDx o oreOffMovimentoDX(ne ho prese solo 2) sono delle variabili che usano entrambe le schede e che devono essere comunicate dal master alla slave

della serie devo creare un collegamento seriale quasi sincrono che porti un ritardo piccolissimo

mi date un aiutino?:slight_smile:

da quello che ho capito devi far comunicare due arduini.
potresti utilizzare il protocollo i2c se essi nno sono troppo lontani tra loro.
l'unico problema è che l'arduino due funziona a 3,3V mentre il mega a 5V quindi non li puoi collegare direttamente (cosa che puoi fare se colleghi due arduino due o due arduino mega o un arduino mega con un qualsiasi altro arduino che vada a 5V)

intanto grazie per la risposta
si esatto devono comunicare tra loro

a occhio e croce tra i due arduino ci saranno circa 1.5-2 metri di cavo(sarà sicuramente schermato)

mi spiegheresti come funzione il protocollo i2c?

temo che come distanza sia troppo elevata e che quindi ci siano dei problemi di letture errate.
se ne parla qui: Lunghezza cavi bus I2C - Hardware - Arduino Forum

questa è una guida che ti spiega il protocollo i2c sicuramente meglio di come potrei fare io: I2C come sistema di comunicazione tra schede Arduino UNO

ma alla fine ti servirebbero solo dei pin in più per poter gestire i relè, sensori ecc.
perchè in questo caso potrebbe andare bene al posto di utilizzare un secondo arduino una cosa di questo tipo che ti permette di avere 48 pin in più: http://www.homotix.it/catalogo/arduino-shield/mux-shield

si diciamo che il problema principale sono i pin ma non devo controllare solo dei relè ma ci saranno deiPWM e anche dei sensori come temperatura,ph, ultrasuoni e in oltre c'è da considerare l'effetto visivo cioè io il touch vorrei posizionarlo nel posto che più mi aggrada eda questo escano meno cavi possibili

se inizio a mettere tutto sulla stessa scheda i fili in gioco iniziano ad essere un pò eccessivi

p.s. ho visto che laconnessione I2C usai pin SDA ed SLC...questi sono gia occupati dal real time cloac quindi non posso usarli
devo usare un altro tipo di comunicazione
ma la seriale non va bene? ovvero quella con ipin tx e rx?

so che sono un pò pignolo ma vorrei che il lavoro venisse bene:)

la comunicazione i2c permette la comunicazione fra molti dispositivi quindi li puoi mettere in parallelo tra loro (ovviamente devi poi utilizzare indirizzi diversi)

si si può utilizzare anche la seriale(non ci avevo pensato perchè utilizzo l'arduino uno e che la seriale è impiegata per la comunicazione con il computer mentre il mega e la due se non sbaglio ne hanno 4 o in caso usi la softwareserial) però con l'aumentare della distanza devi diminuire la velocità

e se facessi una comunicazione bluetooth tra i due arduino?

vinciolo:
p.s. ho visto che laconnessione I2C usai pin SDA ed SLC...questi sono gia occupati dal real time cloac quindi non posso usarli
devo usare un altro tipo di comunicazione

NO, la I2C funziona proprio per poter collegare più dispositivi sulla stessa coppia di fili SDA/SCL.
Quello che permette di selezionare con chi comunicare è l'ID, il codice identificativo che ogni dispositivo ha su quel bus.
Quindi ad una linea I2C tu puoi collegare l'RTC, un sensore digitale, un Arduino ecc... Quando vuoi comunicare con l'RTC, apri la connessione specificando l'indirizzo dell'I2C, quando vuoi comunicare con l'Arduino fai lo stesso con l'ID di quest'ultimo.
Il problema casomai potrebbe essere la distanza. L'I2C è nato per lavorare a distanze di PCB, c'è chi ci ha fatto connessioni anche a decine di metri ma non è la norma, potresti avere problemi.

ma la seriale non va bene? ovvero quella con ipin tx e rx?

Se usi l'Arduino come scheda, i pin RX/TX sono condivisi anche dalla comunicazione verso il PC per cui per caricare un nuovo sketch dovrai scollegare la linea che porta all'altro Arduino altrimenti non potrai programmare la scheda. A parte questo, non ci sono preclusioni. La seriale è seriale. POtrebbe forse aiutarti una coppia di 75176 o MAX485, che sono dei chip che possono estendere la seriale fino a 1000/1200 metri! :wink:
Tra le schede di Pighixxx c'è come connettere questi integrati, che poi comandi con un terzo pin per metterli in ricezione o trasmissione.

aaa capito perfetto

però preferisco usare i TX e RX

gli arduino mega o due hanno 3 tx e 3 rx e solo la 1 è connessa la pc le altre due no quindi potrei usare la due o la 3 e mettere gli integrati che mi hai consigliato per estendere la lunghezza del cavo...e se invece del cavo uso il bluetooth sempre connessi ai pin rx e tx?può funzionare lo stesso?

p.s. i cip che mi hai consigliato che sono degli amplificatori di segnali?

Sono ricetrasmettitori che servono a creare il bus RS485 che permette di comunicare serialmente su lunghe distanze

ok perfetto

allora assodato che farò una comunicazione seriale(se serve utilizzerò i cip che mi hai consigliato)
la comunicazione sarà tra un arduino due (master) e un arduino mega (slave),so che lavorano a tensioni differenti ma mettendo questo:
8-channel Bi-directional Logic Level Converter [TXB0108] : ID 395 : $7.95 : Adafruit Industries, Unique & fun DIY electronics and kits riesco a risolvere il problema.
ora passiamo ai collegamenti:
il TX del master va sul RX dello slave
il RX del master va sul TX del slave
un GND del master va connesso a un GND dello slave per dare lo stesso riferimento
e il pin reset? vanno connessi insieme? o la comunicazione del reset avviene gia con i pin TX-RX?