Ciao a tutti, sto cercando di inviare segnali da un arduino ad un altro. Il problema è che se voglio inviare un array tipo 011001, sull'altro arduino ciò che vedo è:
primo ciclo--> 011001,
~20esimo ciclo--> 110010,
~40esimo ciclo--> 100101 e così via...ogni tot le cifre traslano di uno a sinistra.
Entrambi i programmi (quello del sender e quello del receiver) hanno lo stesso baud rate e lo stesso numero di Serial.print() (avevo letto che rallentano l'esecuzione del programma).
Sapreste dirmi se c'è un modo di sincronizzarli (senza usare protocolli già "fatti" tipo l'I2C)?
Grazie mille!
P.S. I due arduino (o arduini? ) sono diversi...uno è originale con il chip removibile, l'altro è un compatibile con il chip "saldato"...entrambi modello "UNO". Magari con 2 uguali riesco a sincronizzarli(?).
Se la trasmissione è asincrona il sincronismo è garantito dal bit di start e al/ai bit di stop, naturalmente ci deve essere abbastanza ritardo tra i bytes e i 2 arduini avere il clock stabile proveniente da quarzo o filtro ceramico
Devi trasmettere dati a 6 bit ? ? ? Inizializzi in modo corretto la seriale ? Metti il codice che stai usando (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).
Grazie per le risposte,
In realtà dovrei inviare codice a 10bit.
Ho riscritto i 2 programmi togliendo le parti che non servivano per non creare confusione:
Trasmettitore:
Ah...guardando bene si vede proprio che il led dell'arduino "cinese" lampeggia più velocemente dell'originale...dopo un po' si sfasano e in quel momento si salta un bit. Forse è proprio un problema hardware (spero =D).
Tanto per cominciare tu stai lavorando sulla seriale ad 8 bit trasmettendo normali caratteri ASCII; che poi essi valgano '0' ed '1' (pari ai valori 0x30 e 0x31) poco cambia, inoltre, nel codice che hai messo, NON vedo alcun ciclo di lettura dalla seriale, ma solo delle Serial.print() (... ovvero scritture sulla seriale) quindi ... difficile capire perché trasmetti una cosa e ne ricevi un'altra ... :
dal pin1 (TX) pin 5 della prima al pin A0 della seconda e poi usi il comando digitalRead(A0) per ricevere con un delay di mezzo secondo tra un segnale e l'altro??
Patrick_M:
non ho capito come hai collegato le due schede...
Infatti manco io ... manca la spiegazione sia di come le ha collegate, sia di come esattamente intende trasmettere e ricevere i dati ... visto che pare NON lo faccia via Seriale ... :
gpb01:
Infatti manco io ... manca la spiegazione sia di come le ha collegate, sia di come esattamente intende trasmettere e ricevere i dati ... visto che pare NON lo faccia via Seriale ... :
Guglielmo
Esattamente non lo faccio via seriale...
Ho scelto (a caso) il pin 5 per trasmettere e l'A0 per ricevere.
I 500 ms gli ho messi per vedere bene l'invio...sennò dopo una frazione di secondo il mio numero in binario sarebbe traslato di molte cifre.
se le 2 schede non partono contemporaneamente non sai se sono sincronizzate per ricevere i vari impulsi
Inoltre non essendoci nessun protocollo di scambio dei segnali non potrai mai essere sicuro che vengano spediti e ricevuti correttamente
inoltre siccome il timer interno di arduino non è preciso e in più uno cinese e l'altro no, l'alimentazione che che può avere leggere differenze tra i due e un sacco di altre cose.... fanno si che dopo un po i due vadano per merenda come si dice dalle mie parti
Patrick_M: se le 2 schede non partono contemporaneamente non sai se sono sincronizzate per ricevere i vari impulsi
Inoltre non essendoci nessun protocollo di scambio dei segnali non potrai mai essere sicuro che vengano spediti e ricevuti correttamente
inoltre siccome il timer interno di arduino non è preciso e in più uno cinese e l'altro no, l'alimentazione che che può avere leggere differenze tra i due e un sacco di altre cose.... fanno si che dopo un po i due vadano per merenda come si dice dalle mie parti
Va bene, grazie!
Solo ti faccio notare che in realtà partono contemporaneamente perchè c'è una condizione all'inizio. Se guardi la foto che ho allegato qualche messaggio fa si vede infatti che parte giusto.
tra l'altro.... a scombinarti ancora di più le carte, dentro al tuo ciclo fai stampare sulla seriale il valore che mandi chiamandola 9 volte , usando una velocità molto bassa, gia perde tempo di suo , mettila almeno a 112500 baud
Sasso_Analogico:
Grazie per le risposte,
In realtà dovrei inviare codice a 10bit.
Ho riscritto i 2 programmi togliendo le parti che non servivano per non creare confusione:
Trasmettitore:
Provo un attimo a spiegare i programmi che in effetti non ho commetato:
Allora il programma del Tras parte se un pulsante (collegato al pin 3) viene premuto e prima di entrare nel "while infinito" invia un HIGH al pin 5 (che arriverà al secondo arduino sul pin A0).
Il programma del Ric parte quando sul pin A0 si riceve un HIGH (ovvero appena premo il pulsante sul Tras), per poi entrare sul "while infinito".
Scusate se non sono stato chiaro
anche arduino è un circuito fatto da altri, allora perchè non partire dal chip e fare tutto
tieni presente che se ne hai voglia, la libreria te la studi, dopodichè ti crei il tuo corrispondente che fa quello che vuoi tu e come lo vuoi tu... Però è impegnativo
Sasso_Analogico:
....Il programma del Ric parte quando sul pin A0 si riceve un HIGH (ovvero appena premo il pulsante sul Tras), per poi entrare sul "while infinito".
Ci sono due errori fondamentali.
Il primo è aver fatto coincidere il momento in cui Arduino-A cambia il bit trasmesso, con lo stesso momento in cui Arduino-B campiona l'ingresso (la lettura dell'ingresso sul ricevitore dovrebbe avvenire a metà del tempo tra due variazioni dei bit trasmessi). Il secondo è essersi affidati a delay per un tempo infinito (anche due Arduini identici prima o poi si sfasano).
Serve sempre una sincronizzazione. O realizzata con i tempi e i livelli (come sulla seriale), o con appositi segnali aggiuntivi (come il clock del bus i2c).
Claudio_FF:
Serve sempre una sincronizzazione. O realizzata con i tempi e i livelli (come sulla seriale), o con appositi segnali aggiuntivi (come il clock del bus i2c).
>Sasso_Analogico: Esattamente come dice Claudio_FF ... sia I2C che SPI, che trasferiscono i dati su un pin, comunque ne usano un'altro per dare il clock, altrimenti, senza clock, devi inventarti tu un protocollo asincrono con tanto di bit di start e di stop ... in ciascuno dei due casi, stai reinventando l'acqua calda, quindi tanto vale che usi un tipo di trasferimento standard !
Con la seriale puoi permetterti di distanziare le due schede un po' di più, con I2C o SPI, arrivi al massimo a 10/15 cm ... vedi tu le tue esigenze.