Go Down

Topic: Aumentare velocità di comunicazione Arduino PC (Read 1 time) previous topic - next topic

evildeejay

Salve a tutti,
sto lavorando ad un progetto dove necessito di inviare circa 1500 interi al secondo al pc.
Dalle prove effettuate credo che tramite usb sia possibile inviare circa 120 interi al secondo (5ms a Serial.write) confermate?
Pensavo ad aumentare la frequenza della seriale ma non so quanto potrei guadagnarne.
Siete a conoscenza di un modo per aumentare la banda di dati tra arduino e pc? magari sfruttando altri protocolli...
Grazie a tutti.

Marco

uwefed

ciao evildeejay
La velocitá massima della seriale é 115200 Baud che dovrebbero essere ca 10kByte al secondo. Dovrebbe bastare per 1500 interi.
Ciao Uwe

evildeejay

Ciao Uwe grazie mille per la risposta!
Effettivamente con 10Kbyte ci dovrei stare sui 1500interi al secondo, la mia perplessità è che leggo di persone che non riescono a spingersi sopra un certo baud causa crash del sistema.
Penso che sia, ovviamente, un problema dal lato PC.
Proverò a installare la distribuzione RT Linux per un controllo ottimo delle applicazioni realtime sperando di poter sfruttare tutti i 10kbyte.
Grazie ancora per la risposta!

Marco

uwefed

ciao evildeejay
So solo dirti che a me con Win XP non hanno dato problemi velocitá cosí alte.
Ciao Uwe

t30

io ho usato in piu' di uno sketch la velocità 115200 su linux e non ho mai avuto problemi (per essere completi uso slack 12.2/13.0 e eeebuntu)

evildeejay

Gazie a tutti per le rispsoste,
ho provato anche io con baud 115200 ed effettivamente funziona senza problemi.
Però riesco a trasmettere circa 1700 interi di media contro i 2500 previsti.
Anche se il progetto ne richiede 1500 se riuscissi ad arrivare a 3000 sarebbe ancora meglio.
Questo è il programma di TEST che ho eseguito:
Code: [Select]

int val=0;
long prevMillis=0;
int time=1000;

void setup()
{
 Serial.begin(115200);
 delay(1000);
 Serial.println("NUMERO DI INTERI IN UN SECONDO");
 delay(1000);
 prevMillis=millis();
}

void loop()
{
 while(millis()-prevMillis<time)
 {
   Serial.println(val,DEC);
   val++;
 }
}

Voi quanto fate? :P
Se magari qualcuno riuscisse a fare la prova con qualche sistema operativo real time gliene sarei grato.
Saluti
Marco

evildeejay

Stavo pensando che gli interi potrebbero essere codificati a 64bit e quindi sarebbe abbastanza logico il risultato 1700.
Qualcuno me lo sa confermare?
Marco

uwefed

Anche il ciclo While mangia tempo.
Per determinare quello fai un while senza il serial e vedi a quanto é arrivato val. cosí ti calcoli il tempo per ogni giro del while.
Ciao Uwe

dadebo1

in un post.. messo nel we .. mi pare quello del quadri .... tero ....
hanno scritto che se si alimenta arduino da alimentazione esrterna la communicazione col pc migliora.. io nn ho provato .. mah ....

dolfrang

ok per verificato che si possono trasmettere > 1500 dumeri interi
il problema perà è l'acquisizione di dati

se si fa un for  next per acquisire 1000 campioni si ottiene una frequenza di campionamento da un canale pari a 9500 campioni al secondo

se aggiungiamo  println... tale frequenza dimezza
se poi aggiungiamp altri if la frequenza scende ulteriorment anche sotto a 300 hz per canale multiplex attivando 6 canali

esiste  qualche sistema per aumentare la frequenza di campionamento ?

evildeejay

#10
May 03, 2010, 08:46 pm Last Edit: May 03, 2010, 08:46 pm by evildeejay Reason: 1
Aggiungo nuove informazioni:
in realtà la comunicazione seriale non trasmette interi come sequenze di 32 bit ma se deve trasmette un numero es. 234 trasmette prima il 2 poi il 3 e poi il 4 e non 234 codificato in binario.
Detto ciò incide nella trasmissione sia la lunghezza dei numeri e sia se è presente "ln" alla fine del serialprint che trasmette se non erro due caratteri (credo "\n")
Infatti utilizzando questo programma riesco ad ottenere in un secondo una sequenza di circa 12000 valori "0"
Code: [Select]

int val=0;
long prevMillis=0;
int time=1000;

void setup()
{
 Serial.begin(115200);
 delay(1000);
 Serial.println("NUMERO DI BYTE IN UN SECONDO");
 delay(1000);
 prevMillis=millis();
}

void loop()
{
 while(millis()-prevMillis<time)
 {
   Serial.print(val,DEC);
 }
}


@dolfrang
tu hai bisogno di comunicare il dati acquisiti in realtime o puoi registrarli sulla ram e trasmetterli dopo averli letti?

uwefed

#11
May 03, 2010, 11:16 pm Last Edit: May 03, 2010, 11:51 pm by uwefed Reason: 1
Puntualizzazioni
I numeri "integer" occupano 2 byte percio 16 bit.
Puoi spedire il numero anche come 2 byte di numeri da 0 a 255. Il programma che prende i dati sul PC puó trasformarli.

un po di numeri il ciclo
Code: [Select]

Serial.begin(115200);
...
while(millis()-prevMillis<time)
 {
   val++;
 }

dura 59 µsecondi
se aggiungi
Code: [Select]
Serial.print(val,DEC); il tempo si allunga di 364 µsec a 424 µsec.
se cambi Serial.print con Serial.println
Code: [Select]
Serial.println(val,DEC); il tempo si allunga di altri 142 µsec a 566 µsec.

Ciao Uwe

AndreaV

Peccato che il discorso si sia fermato, devo inviare un int con la seriale, come faccio? Dove trovo il codice della funzione write()? Da http://www.arduino.cc/en/Serial/Write
deduco che accetta solo char infatti il protocollo RS232 invia 8bit al colpo. Se volessi inviare degli int che ricordo essere a 16bit devo dividerlo in due numeri da 8bit, gli  bit più significativi e gli 8 meno significativi.
Code: [Select]
int x;
char most, less;
most=(char)x/256;
less=(char)x div 256;
Serial.write(most);
Serial.write(less);

Qualche idea migliore?

uwefed

#13
Aug 08, 2010, 08:53 pm Last Edit: Aug 09, 2010, 08:53 am by uwefed Reason: 1
2 cose
Ho trovato un errore nel mio Reply #11.
Con un byte si possono visualizzare numeri da 0 a 255 e con 2 Byte da 0 a 65535 se la variabile é senza segno ( unsigned)
Scusate il mio errore.
@AndreaV
non funziona Serial.print(numero); ?
dove numero é una variabile int?
Ciao Uwe

AndreaV

Giusta risposta, colpa mia che non ho precisato che l'atmega mi deve ancora arrivare e intato scrivo il codice. Se sapessi dove sono le libtrerie potrei cercare la dichiarazione della funzione Serial.write(). IL C però non suporta l'overload delle funzioni, il linguaggio di Arduino si?

Go Up