Go Down

Topic: arduino che comunicano tra loro (Read 792 times) previous topic - next topic

gingardu

Oct 08, 2012, 08:35 am Last Edit: Oct 08, 2012, 08:37 am by gingardu Reason: 1
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  
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72

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.

uwefed

Non puoi mettere i 2 pin TX in paralello, faresti un corto quando uno resta su H e l' altro va a L.
Usa I2C per collegarli. http://www.smacula.co.uk/2011/12/communicating-between-arduino-boards.html
Ciao Uwe

cyberhs

#3
Oct 08, 2012, 10:05 am Last Edit: Oct 08, 2012, 10:08 am by cyberhs Reason: 1
Scusa Uwe, fermo restando che la soluzione migliore è usare I2C, mettendo un diodo dopo il Tx di ciascuno slave non si risolve il problema?

Ettore Massimo Albani

gingardu

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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

gingardu


Scusa Uwe, fermo restando che la soluzione migliore è usare I2C, mettendo un diodo dopo il Tx di ciascuno slave non si risolve il problema?

Ettore Massimo Albani


sembra una buona idea es e anche facile da provare  secondo me con qualche accorgimento (mettere pulldown il pin rx)  dovrebbe andare alla grande   ]:D
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

uwefed

@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.

Quote
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.

Ciao Uwe

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     :~

Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72


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.

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,

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)
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72


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.

Quote

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.

gingardu

#11
Oct 08, 2012, 02:57 pm Last Edit: Oct 08, 2012, 03:14 pm by gingardu Reason: 1
forse  sono io che non mi spiego  ]:D

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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72


forse  sono io che non mi spiego  ]:D

Probabile  ;)

Quote

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ì:
Code: [Select]
detachInterrupt(...);
if (...) {  ..... }
attachInterrupt(...);



Go Up