salve a tutti! sto cercando di usare arduino come scheda di acquisizione per un progetto universitario; mi serve un passo di campionamento di 1 kHz. per la lettura dei dati da porta analogica, uso analogRead(), che serve bene ai miei scopi; i problemi sorgono quando si tratta di inviare i dati: infatti Serial.write() è troppo lento, visto che mi ci mette 1, 2 o anche 3 ms; come faccio? esistono altri modi, più rapidi, per gestire l'invio? per esempio, la libreria Wire andrebbe bene? e come si usa? un'alternativa sarebbe, visto che non è richiesto il processing real-time, di memorizzare prima tutti i dati e dopo inviarli tutti insieme; ma la memoria interna di arduino è troppo piccola; ho pensato quindi di scrivere i dati su di una scheda SD; però non so quanto è la velocità di scrittura su SD, non è che acquisto tutto il necessario e poi mi ritrovo punto a capo? grazie mille.
due cosa:
-accellera la velocità della seriale,esempio usando Serial.begin(115200) al posto di Serial.begin(9600)
-penso che l'analogRead di suo mangi parecchio tempo,ma non sono sicuro di ciò..
AnalogRead di defaul impiega 100 microsecondi ad effettuare la conversione.
Si puo' velocizzare a circa 20 microsecondi settando il prescaler del convertitore analogico.
la porta seriale l'abbiamo settata a 115200... analogRead() è già veloce abbastanza, perchè ad acquisire 10000 dati, senza poi farci nulla, ci mette poco più di un secondo, quindi appunto circa 100 microsecondi ciascuno, che va bene. il problema è solo l'invio/memorizzazione dei dati: per acquisire 1000 dati ed inviarli con Serial.print() ci mette circa 4 secondi, che è troppo
ogni messaggio che mandi dall'arduino al pc cosa contiene?e quanti byte è lungo?
potresti seguire il seguente approcio,se il progetto te lo consente: per 1 sec leggi i dati ogni ms,e memorizzi tutto in un vettore..il secondo dopo,invii a raffica tutto al pc..magari usando altri tempi..
impossibile fare come dici tu: devo acquisire dati presi da 4 celle di carico, che registrano la forza esercitata su di esse da un atleta che salta sulla pedana cui sono connesse... almeno una decina di secondi di dati, ininterrottamente, devo prenderli; i dati sono l'uscita, digitalizzata, delle 4 porte analogiche; ora come ora, li converto in stringa e li concateno con un separatore, al massimo 152 bit, credo, ma per ora uso solo 2 porte, 72; se concatenassi proprio i bit, e potrei farlo, ridurrei il tutto a 40 bit fissi per 4 porte, ma non è la lunghezza del messaggio il problema, quanto proprio il tempo che ci mette a fare un invio.
potresti usare una EEPROM con interfaccia I2C per memorizzare temporaneamente i dati.. dovrebbe essere abbastanza veloce credo...
dai un'occhiata qui:
Non so se usare una eeprom possa servire, generalmente. sono lentine in scrittura. La seriale risulta lenta perché spedisce 1 byte alla volta. 152 bit sino 19 byte da mandare ogni volta. se fai 10.000 letture al secondo sono 190.000 byte. considera poi che l'arduino ha un. buffer di soli 64 byte quindi lo riempi ad una velocità maggiord di quella con cui lo svuoti
Le EEPROM hanno bisogno di ca 5mS per ogni scrittura. Puoi scrivere sempre una pagina intera ma non arrivi mai ai 1kHz voluti.
Ciao Uwe
dado:
devo prenderli; i dati sono l'uscita, digitalizzata, delle 4 porte analogiche; ora come ora, li converto in stringa e li concateno con un separatore, al massimo 152 bit, credo, ma per ora uso solo 2 porte, 72; se concatenassi proprio i bit, e potrei farlo, ridurrei il tutto a 40 bit fissi per 4 porte, ma non è la lunghezza del messaggio il problema, quanto proprio il tempo che ci mette a fare un invio.
Il tuo problema è l'hoverhead sulla seriale, cerchi di trasmettere più dati di quelli possibili nell'unità di tempo.
Basta fare un semplicissimo conto, tu dici di dover trasmettere 152 bit, che sono pari a 19 byte, 1000 volte al secondo, ovvero 19 kByte al secondo, la seriale settata a 115200 bps (n,8,1 = 10 bit per ogni byte trasmesso) raggiunge una velocità di punta pari a 11520 Byte al secondo, ovvero molto meno di quello che ti serve.
Poi tocca fare i conti pure con i tempi di esecuzione delle varie routine, in particolare la serial.print che è decisamente lenta.
La soluzione è compattare maggiormente i dati, 4 letture analogiche a 10 bit sono 40 bit, ovvero 5 byte, aggiungiamo un paio di byte per un preambolo di sincronizzazione e abbiamo solo 7 byte da trasmettere tramite la serial.write sotto forma di dati binari e non certo tramite la serial.print sotto forma di dati ascii, meglio ancora se carichi i dati direttamente sul registro Tx della UART e gestisci tu la trasmissione eliminando tutti i tempi morti.
Ti rammento che la seriale degli ATmega può lavorare a velocità molto maggiori di 115200, p.e. puoi settarla a 921600bps, valore supportato da quasi tutte le Vcom per pc.