Pages: [1] 2   Go Down
Author Topic: Aumentare velocità di comunicazione Arduino PC  (Read 1479 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Castelletto Sopra Ticino, IT
Offline Offline
Full Member
***
Karma: 0
Posts: 169
Yes we can!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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? smiley-razz
Se magari qualcuno riuscisse a fare la prova con qualche sistema operativo real time gliene sarei grato.
Saluti
Marco
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 313
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ....
Logged

Imperia
Offline Offline
Newbie
*
Karma: 0
Posts: 45
geofisica & datalogger
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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?
« Last Edit: May 03, 2010, 01:46:42 pm by evildeejay » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Serial.begin(115200);
...
while(millis()-prevMillis<time)
  {
    val++;
  }
dura 59 µsecondi
se aggiungi
Code:
Serial.print(val,DEC);
il tempo si allunga di 364 µsec a 424 µsec.
se cambi Serial.print con Serial.println
Code:
Serial.println(val,DEC);
il tempo si allunga di altri 142 µsec a 566 µsec.

Ciao Uwe
« Last Edit: May 03, 2010, 04:51:36 pm by uwefed » Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
int x;
char most, less;
most=(char)x/256;
less=(char)x div 256;
Serial.write(most);
Serial.write(less);
Qualche idea migliore?
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: August 09, 2010, 01:53:31 am by uwefed » Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Pages: [1] 2   Go Up
Jump to: