Ho realizzato questo codice per leggere un array di byte che arriva dal bluetooth e scriverli sulla Eeprom di arduino uno.
Successivamente voglio leggerli per poi comandare dei motori passo-passo.
I byte ricevuti dal bluetooth non coincidono con quelli inviati (soltanto poche manciate di byte iniziali coincidono).
Anche quando vado a leggere la Eeprom non ritrovo gli stessi byte di quelli ricevuti dal bluetooth.
Se qualcuno mi fosse di aiuto ringrazio perchè sto diventando pazzo e sono curioso di sapere dove sbaglio.
Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione ...
... poi, essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
Guglielmo
P.S.: Il tuo post è stato spostato nell'opportuna sezione del forum "Italiano"
Chiedo scusa se pasticcio con il forum. non sono pratico nell'uso. Mi sono presentato nel THREAD come suggerito.
Vengo al mio problema sul quale mi sono impallato.
esempio:
Dalla mia applicazione android invio un array di 750 byte (una bitmap di 3x250) verso un bluetooth HC05 collegato ad arduino uno.
Tutti i byte hanno valore 255 e vengono memorizzati nella EEPROM di 1024 byte di arduino;
Durante la ricezione nel monitor seriale scrivo sia l'ndirizzo di scrittura che il valore:
i primi 2 byte sono le dimensioni della bitmap (in questo caso 3x250).
La stampa della seriale arriva alla posizione 133 e anche impostando la comunicazione a 115200 baud non va molto oltre.
Quando vado a leggere la EEPROM soltanto i primi 157 byte contengono il valore 255, gli altri hanno valori completamente diversi che non trovano corrispondenza con quelli inviati.
La SoftwareSerial ha un buffer di 64 bytes, qualunque byte ricevuto quando il buffer è pieno viene perso.
Ho idea che tu perda troppo tempo tra un carattere e l'altro nel tuo ciclo while e ... ti perdi i caratteri.
Prova a trasmettere a blocchi che nel while ricevi e poggi in SRAM velocemente, prima di far partire il blocco successivo fai tutto quello che serve sul blocco ricevito (salvataggio in EEPROM, stampa, ecc.) e poi passi al blocco seguente.
Guglielmo
P.S.: Aumentare la velocità peggiora solo la cosa, inoltre, nonostante quello che c'è scritto, NON usare la SoftwareSerial oltre i 9600 perché gli errori ed i problemi crescono a dismisura.
Per fare ciò che hai suggerito penso che bisogna istituire una comunicazione bidirezionale e che da Arduino parta il consenso alla trasmissione lato Android di un nuovo blocco quando Arduino ha finito di lavorare il blocco precedente.
Questo procedimento mi complica la vita dal lato Android e se possibile lo vorrei evitare.
Vorrei provare invece a settare il modulo bluetooth HC05 a velocità più basse di 9600 e vedere se riesco ad agganciare tutti i miei byte inviati. E' una cosa sensata? Tieni presente che non mi interessa se il passaggio dei dati impiega più tempo.
Per ora sto memorizzando i dati sulla EEprom di arduino ma la destinazione finale sarà una EEprom da 32kb.
Ci vedi delle altre complicazioni?
Se rallenti la trasmissione e fai meno cose nel while di ricezione, sicuramente diventi più veloce, però considera che ...
... se scrivi direttamente su EEPROM, il codice si blocca per il tempo di scrittura che è più molto lungo che scrivere in SRAM.
A seconda dell'operazione (cancellazione, scrittura, ecc.) il tempo può oscillare, come riportato nel datasheet, dai 3.6msec. ai 10msec. Ora, a 9600bps, i caratteri arrivano 1 ogni millisecondo ... se li scrivi uno alla volta in EEPROM, con blocchi un po' grossi di dati, non ci riuscirai mai senza avere un buffer overflow della seriale :
sacchetto:
Giusto. Per cui l'unica soluzione è istituire una comunicazione bidirezionale a blocchi? e aumentare la capacità del buffer è possibile?
Devi "manomettere" il "core" ...
.. in tal caso ti conviene installarti una versione "sandboxed" dell'IDE, ovvero una versione a se stante indipendente da tutto quello che tu hai sulla tua macchina e che personalizzi per i tuoi gusti.
Ovviamente, ogni volta che esce una nuova versione, dovrai rifare tutto ... :
Per fare una versione "sandboxed", carica l'IDE (NON la versione .exe dell'installer, ma quella nel .zip). Scompatta il .zip in una tua cartella dove hai tutti i permessi di "lettura/scrittura" e dagli un nome univoco, es. "arduino-personalizzato" o come vuoi.
All'interno crea una cartella di nome "portable" ... lancia il .exe che si trova nell'installazione che hai fatto e tutto sarà contenuto in quella cartella senza spargere roba in giro per il disco e senza usare nulla di precedentemente installato.
A questo punto, puoi andare in "arduino-personalizzato\hardware\arduino\avr\cores\arduino" e trovi il file "HardwareSerial.h" dove ci sono le definizioni dei buffer TX ed RX.
Occhio a non esagerare che hai solo 2KB di SRAM per tutto (variabili, stack, ecc.)
Penso che la trasmissione a blocchi rappresenta l'unica soluzione possibile visto che dovrò inviare fino a 32 kb.
Speravo di poter evitare questa complicazione ma dovrò implementare lato android la trasmissione a blocchi.
Ho risolto riducendo il baud rate del bluetooth da 9600 a 2400 e così anche la seriale. ora ricevo correttamente tutti i byte inviati e li memorizzo in EEPROM.
Mi hai dato la giusta dritta. grazie.
Ora il passo successivo sarà collegare una EEPROM da 32kb.
Ho notato che i motori durante l'avanzamento stampa della bitmap si scaldano molto.
Sto usando 2 motorini passo-passo per dvd presi da un pc. vengono pilotati da 2 LN298N
Alla fine della stampa setto a LOW i pin di pilotaggio dei driver cosi' si raffreddano.
E' normale o rischio di bruciarli?
//resetMotori();//non usato per ora
//FINE STAMPA**********
Ho collegato la EEPROM da 32kb e ora ho lo stesso problema nella ricezione!!!
Dovrò implementare la trasmissione a blocchi come dicevi tu. Pazienza. speravo che funzionasse senza mettere mano alla trasmissione......
sacchetto:
Ho collegato la EEPROM da 32kb e ora ho lo stesso problema nella ricezione!!!
Calando il baudrate hai solo dato un po' più di tempo (4 msec. per carattere) ... ma comunque, su migliaia di bytes, non ci stai dentro e ... vai in overflow.
Devi necessariamente implementare un meccanismo che richiede il blocco, lo scrive e dopo richiede il successivo ...