Offline
God Member
Karma: 6
Posts: 541
|
 |
« on: October 08, 2012, 01:35:47 am » |
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...
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #1 on: October 08, 2012, 01:49:41 am » |
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
|
|
|
|
|
|
|
Selvazzano Dentro - Padova
Offline
God Member
Karma: 17
Posts: 526
"Chi sa fa, chi non sa insegna"
|
 |
« Reply #3 on: October 08, 2012, 03:05:34 am » |
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
God Member
Karma: 6
Posts: 541
|
 |
« Reply #4 on: October 08, 2012, 03:40:48 am » |
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
God Member
Karma: 6
Posts: 541
|
 |
« Reply #5 on: October 08, 2012, 03:54:38 am » |
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 
|
|
|
|
|
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
Brattain Member
Karma: 161
Posts: 15712
+39 349 2158303
|
 |
« Reply #6 on: October 08, 2012, 04:59:46 am » |
@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. Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 541
|
 |
« Reply #7 on: October 08, 2012, 05:37:38 am » |
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 
|
|
|
|
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #8 on: October 08, 2012, 06:01:14 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 541
|
 |
« Reply #9 on: October 08, 2012, 07:17:11 am » |
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 
|
|
|
|
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #10 on: October 08, 2012, 07:29:41 am » |
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  I progetti multichip esistono, ma ssare Arduini interi mi pare uno spreco di soldi quando bastano dei chip in standalone.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 541
|
 |
« Reply #11 on: October 08, 2012, 07:57:00 am » |
forse sono io che non mi spiego  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...
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #12 on: October 08, 2012, 08:13:27 am » |
forse sono io che non mi spiego  Probabile  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(...);
|
|
|
|
|
Logged
|
|
|
|
|
|