Pages: [1]   Go Down
Author Topic: arduino che comunicano tra loro  (Read 605 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  
« Last Edit: October 08, 2012, 01:37:18 am by gingardu » Logged


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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 252
Posts: 21283
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 37
Posts: 1318
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 08, 2012, 03:08:09 am by cyberhs » Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


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

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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   smiley-twist
Logged


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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 252
Posts: 21283
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il fatto che di I2C   non so ancora nulla    smiley-cry
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     smiley-confuse

Logged


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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

il fatto che di I2C   non so ancora nulla    smiley-cry
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     smiley-confuse


Ancora con l'interrupt  smiley-wink
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.
Logged


Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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   smiley-cool
Logged


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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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   smiley-cool
I progetti multichip esistono, ma ssare Arduini interi mi pare uno spreco di soldi quando bastano dei chip in standalone.
Logged


Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

forse  sono io che non mi spiego  smiley-twist

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
« Last Edit: October 08, 2012, 08:14:57 am by gingardu » Logged


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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

forse  sono io che non mi spiego  smiley-twist
Probabile  smiley-wink

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:
detachInterrupt(...);
if (...) {  ..... }
attachInterrupt(...);

Logged


Pages: [1]   Go Up
Jump to: