problema connessione Arduino Mega 2560 < Firmata > VisualBasic 2010

@GiacomoSam
l'errore "Una periferica collegata al sistema non è in funzione." sembrerebbe indicare che l'Arduino si sia bloccato che che quindi la COM corrispondente non funzioni più. Puoi controllare da gestione dispositivi se sparisce. Può anche essere colpa dell'USB sul PC, magari non fa bene contatto e si scollega. A me capita con un portatile.
Il secondo messaggio di errore che hai postato riguarda invece l'IDE e non il VB. Forse indica la stessa cosa.

Io avrei scritto lo sketch diversamente. Avrei raccolto tutti i dati analogici e digitali, li avrei stampati tutti in una volta (o in due se supero o mi avvicino ai 64 caratteri del buffer), avrei atteso un po', poi avrei controllato l'arrivo di comandi da seriale ed eventualmente li avrei eseguiti. Infine avrei riiniziato il ciclo.

@Guglielmo gpb01
La storia della seriale che lavora un carattere alla volta non l'ho capita.
Nelle comunicazioni Arduino->PC mando un stringa alla volta e su PC la ricevo senza problemi.
La differenza è nelle comunicazioni PC->Arduino dove, se supero il carattere, devo inventarmi qualcosa.
Potrebbe anche bastare di aspettare che nel buffer ci sia il numero di caratteri attesi ma invece mi son implementato una routine che aspetta un carattere terminatore. Intendevi questo caso?

Ok. quindi dici di accumulare dati in una stringa con tutti i dati (analogici e digitali) e poi mandarli tutti per volta e poi mandarli via seriale al PC?
devo fare un array o va bene anche una semplice print.ln per ogni dato?
e per mandarle dal PC?

Quello che mi ha mandato Guglielmo sembra molto efficace e mettendo chat al posto di INT risparmio molto nella velocità mi sembra di capire. Ora appena metto VB (non so cosa ho combinato con internet) vedo se va tutto bene.

Anche io avevo notato che c'è un qualche problema di connessione tra i due sistemi e mi chiedevo se ci fosse qualche problema di Hardware (tipo contatto USB). Ora controllo un po'. Ho visto che collegando Arduino con un Mac tutto va bene (ma li non ho VB :0).

Grazie,

Giacomo.

zoomx:
La storia della seriale che lavora un carattere alla volta non l'ho capita.
Nelle comunicazioni Arduino->PC mando un stringa alla volta e su PC la ricevo senza problemi.

Perché hai la "pappa fatta" da parte della Serial.print() che trasforma lei, i tipi che conosce, in una serie di caratteri ...
... prova a dover trasmettere una "struttura dati" ... poi mi dici come fai :wink:

zoomx:
La differenza è nelle comunicazioni PC->Arduino dove, se supero il carattere, devo inventarmi qualcosa. ....

La trasmissione dei dati asincroni lungo una seriale funziona sempre allo stesso modo ...
... l'IDE di Arduino può venirti incontro in tante cose e nascondertene tante altre, ma se non sai ESATTAMENTE come funziona, appena ti allontanerai da Arduino ... avrai i tuoi problemi ]:smiley: ]:smiley: ]:smiley:

Guglielmo

@GiacomoSan
io suggerivo un approccio ma se già ti va bene quello proposto non c'è bisogno di cambiare, non è che il mio sia meglio.
In caso puoi usare un Array oppure anche una serie di print che alla fine termini con un carattere speciale. Se usi solo Ascii puoi terminare con /n e dal lato VB usare Stringa= SerialPort1.ReadLine() che, se non c'è una stringa che termina con il carattere /n restituisce Nothing altrimenti restituisce la stringa contenente tutte le letture. Devi poi interpretare la stringa.

@Gugliemo
mi è chiaro, adesso.
So quasi esattamente come funziona, con Arduino mi son riavvicinato ai microcontrollori ma mi è capitato di usare ST6 e ST9 qualche annetto fa, in assembler. Ma potevo non saperlo.

Rieccomi. Riassumo quello che ho fatto in questi giorni:

ho cambiato PC, vecchio lo stesso e sempre con Windows XP e ho scaricato il software per arduino e caricato lo sketch.

Ma come al solito non funziona. Ovvero quando Arduino deve solo mandare dati tutto va bene, il problema è che quando devo mandare i comandi (lo faccio direttamente digitando i chart dalla serial) si vede che i numeri che manda in seriale rallentano, come se il PC facesse fatica e poi si blocca tutto il PC. Facendo la Task manager di Windows con citrl+alt+canc mi dice che Java non risponde. Non saprei più cosa fare.

@Icio Non riesco a scaricare il file e non ho capito bene quello che intendi.

Domani proverò a comprare un Arduino UNO (questa volta poi al massimo riprendo un Mega nuovo se vedo che funziona) e vedere se con lui funziona.

Un altra cosa

poi quando riapro lo sketch e provo a lanciarlo di nuovo mi dice che la COM3 (a cui è collegato Arduino) è già in uso. Così devo rinstallare i driver di Arduino per poi riprovare.

Ricordo che con Win XP c'erano dei problemi ... hai già letto QUI ???

Guglielmo

Si, scelgo anche io il driver manualmente. Ora però su questo computer non mi viene la schermata del driver che non ha passato il logo testing.

Giacomo.

@Giacomo, uso Windows XP è ho già mandato dati da serial monitor ad Arduino Uno (IDE 1.0.5), non in maniera intensiva, ma non mi ha mai dato questi problemi. Con la Mega mi sembra non ho provato.

ho provato anche con un Arduino UNO nuovo ma niente da fare =(

@nid69ita

io sto usando l'IDE 1.0.5-r2 e mando i comandi direttamente dalla seriale, ma anche andando piano (distanza di qualche secondo) mi si impalla tutto.

ho provato anche a copiare lo sketch di Guglielmo così com'è ma nulla.

P.s. Non è che c'è qualche problema con Java? :relaxed:

Giacomo.

Se voi, pubblica lo sketch, e provo anche io con la mia Arduino Uno e Windows XP.
Quali valori bisogna mandare da monitor seriale?

Grazie mille, così mi tolgo il dubbio e capisco se il problema è nel mio PC

ecco lo sketch:

int pH1;
int pH2;
int DO;
int Co2 = 8;
int O2 = 12;

char iniezione;

void setup(){
   Serial.begin(57600);
   pinMode(Co2, OUTPUT);
   pinMode(O2, OUTPUT);
}

void loop(){
   pH1 = analogRead(A1);
   Serial.println(pH1);
   delay(50);
   Serial.flush();
   
   pH2 = analogRead(A0);
   Serial.println(pH2);
   delay(50);
   Serial.flush();
   
   DO = analogRead(A2);
   Serial.println(DO);
   delay(50);
   Serial.flush();
 
   if (Serial.available() > 0){
      iniezione = Serial.read();
      switch (iniezione) {
      case '1':
         digitalWrite(Co2, HIGH);
         digitalWrite(O2, LOW);
         break;
      case '2':
         digitalWrite(Co2, LOW);
         digitalWrite(O2, HIGH);
         break;
      case '0':
         digitalWrite(Co2, LOW);
         digitalWrite(O2, LOW);
         break;
      default:
         break;
      }
      
      while (Serial.available()){
         Serial.read();
         delay(1);
      }
   }
}

bisogna mandare i valori '1', '2' o '0' per attivare o meno le uscite 8 e 12.

Giacomo.

Fatto. A me non sembra dare problemi. Io però non ho nulla di collegato agli analogici.
Su 8 e 12 ho messo 2 led e funzionano.
P.S. uso la 1.0.5 non credo r2 però.
Allego immagine del monitor seriale prima di inviare 2

Se vi può essere utile, una volta caricato lo sketch, sotto la scritta "Caricamento terminato"

mi esce questa scritta

Dimensione del file binario dello sketch: 5.110 bytes (su un massimo di 258.048 bytes)
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer

Vi dice qualcosa.

Grazie ancora,

Giacomo

Banalmente, hai provato a cambiare il cavo USB ?

Ho provato anche con versione 1.5.5 nessun problema.
Quegli errori non mi dicono nulla ma a me non li da.

provo subito :wink:

Allora

ho cambiato il Cavo

cambiato PC

cambiato Arduino

cambiato IDE (1.0.5, 1.0.5-r2, 1.5.6-r2)

e nulla da fare.

LA cosa più curiosa è che mettendo tutto su un Mac va tutto bene, ma non posso usare VB sul Mac

Se hai qualche altro dispositivo che funziona in serale collegalo al PC e fai un test con la console seriale dell'IDE, giusto per vedere se non è un problema dell'IDE.

Oppure invece di usare il terminale seriale dell'IDE usa Hyperterminal o questo Terminal.

Fra l'altro il terminale dell'IDE non manda nulla finché non si preme il return mentre quello che ho linkato manda il carattere immediatamente.

@ zoomx.

ho provato a fare come dici tu (credo :~).

Ho scaricato il terminal che mi hai postato. Su l'arcuino nuovo con cavo nuovo ho caricato uno sketch come quello postato in precedenza ma togliendo la parte di read, mettendo solo la parte di ricezione, tramite il mac.

int avanti = 8;
int indietro = 12;

char movimento;

void setup(){
 Serial.begin(9600);
 pinMode(avanti, OUTPUT);
 pinMode(indietro, OUTPUT);
 
 
}

void loop(){
  
  if (Serial.available() > 0){
    movimento = Serial.read();
    switch(movimento){
    case '1':
    digitalWrite(avanti, HIGH);
    digitalWrite(indietro, LOW);
    break;
    
    case '2':
    digitalWrite(avanti, LOW);
    digitalWrite(indietro, HIGH);
    break;
    
    case '3':
    digitalWrite(avanti, LOW);
    digitalWrite(indietro, LOW);
    break;
    }
    while (Serial.available()){
      Serial.read();
      delay(1);
    }
  }
}

testato e funziona perfettamente. Poi ho spostato il cavo USB dal mac al PC, aperto il programma, scelto la porta COM4, premuto "Connect" e dato gli ordini dalla text box con di fianco scritto "+CR e -> Send". Ho messo nello sketch il baou rate a 9600 e lasciato nel terminal 9600 senza toccare altro. Come al solito mi prende i primi 3 o 4 comandi e poi si impianta e devo fare Citrl+alt+canc. Una cosa: a me non li manda subito, ma devo premere invio e poi cancellare il carattere prima di mettere quello nuovo, che poi mi mette tutto nel box sotto.

Un'altra cosa: ma è normale che il led 13 rimanga sempre acceso a meno che io non gli dica di spegnersi?

Per collegare altri dispositivi alla seriale per vedere se funziona, non mi viene in mente nulla. Mi consigli di provare con altro?

Grazie mille per i consigli.

Giacomo