problema connessione Arduino Mega 2560 < Firmata > VisualBasic 2010

credo proprio che ci sia una resistenza con scritto 102. Ti mando la foto (anche se di pessima qualità) dovrebbe essere quallo subito sopra la lettera "e" di Keys.

Quindi può essere che la scheda è difettosa?

Photo0158.jpg

Scusatemi se vi rompo ancora le scatole ma sono disperato =(

ho ancora problemi di comunicazione seriale tra PC e Arduino Mega.

com vi ho detto:

ho cambiato PC (ora ho uno con Windows 7)
ho fatto prove con Arduino differenti
sketch vari ma nulla, dopo un po Arduino si impianta e blocca la comunicazione seriale.

Vi aggiorno:

ecco lo sketch che per ora sto cercando di usare:

const int avanti = 8;
const int indietro = 12;
int luceTot;
int luceSu;
int luceGiu;
const int sondaCass = 6;
const int sondaGwp = 5;
const int evScarico = 11;
const int evCarico = 10;
byte sensoreCass;
byte sensoreGwp;
byte sensAvanti;
byte sensIndietro;
const int fineAvanti = 3;
const int fineIndietro = 4;
const int led13 = 13;

char movimento;
char diluizione;


void setup(){
  Serial.begin(57600);
  pinMode(avanti, OUTPUT);
  pinMode(indietro, OUTPUT);
  pinMode(sondaCass, INPUT);
  pinMode(sondaGwp, INPUT);
  pinMode(evCarico, OUTPUT);
  pinMode(evScarico, OUTPUT);
  pinMode(fineAvanti, INPUT);
  pinMode(fineIndietro, INPUT);
  pinMode(led13, OUTPUT);
  digitalWrite(led13, LOW);
  delay(1000);
}

void loop(){
  
  Serial.flush();
  delay(500);

  luceTot = analogRead(A0);
  Serial.println(luceTot);
  delay(100);
  Serial.flush();

  luceSu = analogRead(A1);
  Serial.println(luceSu);
  delay(100);
  Serial.flush();

  luceGiu = analogRead(A2);
  Serial.println(luceGiu);
  delay(100);
  Serial.flush();

  sensoreCass = digitalRead(sondaCass);
  if(sensoreCass == HIGH){
    Serial.println ('1');
  }
  if (sensoreCass == LOW){
    Serial.println ('2');
  }
  delay(100);
  Serial.flush();

  sensoreGwp = digitalRead(sondaGwp);
  if(sensoreGwp == HIGH){
    Serial.println ('3');
  }
  if (sensoreGwp == LOW){
    Serial.println ('4');
  }
  delay(100);
  Serial.flush();

  sensAvanti = digitalRead(fineAvanti);
  if (sensAvanti == HIGH){
    Serial.println('7');
  }
  if (sensAvanti == LOW){
    Serial.println('8');
  }
  delay(100);
  Serial.flush();

  sensIndietro = digitalRead(fineIndietro);
  if (sensIndietro == HIGH){
    Serial.println('5');
  }
  if (sensIndietro == LOW){
    Serial.println('6');
  }
  delay(100);
  Serial.flush();


  if (Serial.available() > 0){
    movimento = Serial.read();
    diluizione = Serial.read();
    switch (movimento) {
    case '1':
      digitalWrite(avanti, HIGH);
      digitalWrite(indietro, LOW);
      break;

    case '2':
      digitalWrite(avanti, LOW);
      digitalWrite(indietro, HIGH);
      break;

    case '0':
      digitalWrite(avanti, LOW);
      digitalWrite(indietro, LOW);
      break;

    }

    switch (diluizione){
    case '3':
      digitalWrite(evScarico, HIGH);
      digitalWrite(evCarico, LOW);
      break;

    case '4':
      digitalWrite(evScarico, LOW);
      digitalWrite(evCarico, HIGH);
      break;

    case '5':
      digitalWrite(evScarico, LOW);
      digitalWrite(evCarico, LOW);
      break;

    }


    while (Serial.available()){
      Serial.read();
      delay(1);
    }
  }
}

ho provato a mettere tanti delay lunghi e forse un Serial.flush() in più ma forse sembra che vada un po meglio, ma si impalla uguale ed è anche molto lento.

Da parte di VB ho messo sia la mandata che la ricezione dei dati in due blocchi try/catch e ho visto che il problema sta proprio nel mandare i dati da PC verso arduino, ed è confermato dal fatto che se non mando nulla da PC ad arduino tutto va perfettamente.

Ho anche cambiato la scheda relè pensando che fosse difettosa, ma nulla (collego i pin di arduino agli IN della scheda, i 5V e GND di arduino a Vcc e GND della scheda e GND e JD-Vcc a un alimentatore da 5V esterno, rimuovendo il Jumper)

Avevo anche dei dubbi sulla corrente erogata dall'USB così ho collegato Arduino a un alimentatore da 9V, 500 ma esterno e la USB solo per la comunicazione seriale.

Ho visto che se il codice è colto (far accendere e spegnere un solo LED) va tutto perfettamente.

Guardando queste due pagine

http://www.leonardomiliani.com/2013/la-memoria-sram-dei-microcontrollori/

http://arduino.cc/en/Tutorial/Memory

mi sono chiesto se non è un problema di SRAM,

perché mi chiude solo la connessione (ora basta solo che scollego fisicamente il cavo usb dal pc, ricollegarlo e rilanciare il programma VB per farlo funzionare perfettamente)

e i segnali in entrata analogica sono poco stabili.

Qualcuno ha qualche idea di cosa stia succedendo?

Vi ringrazio tantissimo per l'infinita pazienza.

Giacomo.

A me non convince quel ciclo alla fine dello switch. Prova a commentarlo.

while (Serial.available()){
      Serial.read();
      delay(1);
    }

sarebbe per svuotare il buffer in ricezione.

all'uscita del while il buffer è vuoto e pronto per ricevere altri dati?

Hai qualche altra prova in mente?

Grazie infinite,

Giacomo

Da VB non mi ricordo come spedisci il dato. Aggiungi anche il \n (new line) ?
Si potrebbe provare (forse però è un pò un casino) con Processing, gira su PC e si programma con una specie di Java. Ha un IDE simile ad Arduino. Era per capire se non è per caso la gestione della seriale di VB ad avere problemi (non credo, però ormai le hai provate tutte)

da VB mando dei byte con un

SerialPort1.write(byte)

credo che mandi solo il byte senza /n. Sarebbe mettercelo?

Il problema è che anche inserendo i dati a mano attraverso la seriale dell'IDE, da sempre problemi.

Credo che il problema si proprio o nella ricezione dei dati da parte di Arduino o nello sketch. mi sembra strano perché va e qualche volta anche per qualche minuto, ma poi si blocca.

Giacomo

anzi

se mando 1 o 2 o 0 mi da molti meno problemi.

se mando 3, 4 o 5 ci mette qualche secondo a partire e spesso non parte, come se ignorasse il comando,

mentre da VB va tutto perfettamente fino a quando non si impunta.

Ancora porta pazienza ma a distanza di giorni non ricordo l'analisi.
Quel che non capisco sono questi println di A0-A1-A2 (ne spedisci 3):

  luceTot = analogRead(A0);
  Serial.println(luceTot);

Questi li fai solo per sapere su Serial Monitor i valori? O li stai spedendo a VB ? Non hanno lunghezza fissa, potrebbe essere una volta 0\n poi 233\n poi 1023\n e solo il \n fa da terminatore. Li leggi da VB ?
A me pareva il dialogo tra Arduino-VB fossero i caratteri 1,2,3,4,5,6,7,8

Quindi a ogni loop() tu spedisci i 3 valori analogici A0-A2 con \n poi spedisci 4 char con \n, 1 per ogni digitale sondaCass, sondaGwp, fineAvanti, fineIndietro. A questo punto leggi da VB sempre 2 char (se presenti), movimento e diluizione.
Giusto ?

Inoltre tu spedisci sempre, di continuo lo stato dei 4 digitali e dei 3 valori analogici, indipendentemente dal fatto che non siano cambiati.

giusto.

I 3 ingressi analogici sono delle misure di luce che mando a VB per registrarli e perché il PC possa elaborarli e mandare dei comandi ad Arduino e non hanno lunghezza fissa (anche per questo li spedisco sempre tutti, altrimenti non saprei di quale sensore è il valore).

A ogni loop mando i 3 valori analogici e lo stato dei 4 ingressi digitali e poi vedo se c'è qualche comando da VB.

Mando sempre anche lo stato degli ingressi digitali, anche se non sono cambiati.

Mi consigli invece di fare una cosa del genere?

if (valoreOra != valorePrecedente){
valorePrecedente = valoreOra;
Serial.println(ValoreOra);
}
else…..

Consigli quindi di alleggerire il codice?

Grazie mille,

Giacomo

No, era giusto per rinfrescarmi la memoria con l'analisi di quello che fai.
Ho però il dubbio che il traffico sulla seriale sia molto e dopo un pò si "ingolfa" il buffer.

l problema è che su arduino UNO si sono dimenticati di mettere il controllo di flusso hardware, in arduino2009 non c'era questo problema perchè il segnale DSR è disponibile sul pin2 di X3, basta collegare questo pin ad un qualsiasi pin di meg328 così quando arduino è impegnato abilita l'ingresso DSR per comunicare al PC l'interruzione del flusso.
E' comunque possibile variare il firmware su mega16u2 aggiungendo le funzioni per la linea DSR, non sò se è già disponibile in rete

E questo per quanto riguarda il contrllo di flusso hard che è quello che preferisco, se preferisci implementare quello software puoi tentare di usare l' XON-XOFF oppure studiarti il sorgente delle stampanti 3D tipo repetier o marlin o etc... per vedere come hanno fatto loro

@ nid69ita

anche io pensavo che la mole di dati fosse molta e che i buffer si potessero ingolfare. Ho provato a scaricarsi i buffer anche più del necessario e mandare i comandi da VB ogni 2 secondi, e sinceramente ho visto dei piccoli miglioramenti.

@icio

sembra molto interessante quello che proponi, ma sinceramente non ho capito molto. Proverò, come suggerito anche precedentemente, a scaricare il video che mi hai postato e cercare di vedere come hai fatto tu. Ora sto usando Arduino mega con il mega16u2. Proverò a cercare in rete qualcosa per variare il firmware. No è che c'è una prova semplice per vedere se il problema è quello che dici tu?

Giacomo

... ma sbaglio o .. te lo fa SOLO con Win e non con Mac ... come dicevi all'inizio ???

GiacomoSam:
Ora controllo un po'. Ho visto che collegando Arduino con un Mac tutto va bene (ma li non ho VB :0).

Se è così ... spiegatemi cosa cavolo c'entrano i buffer e la velocità ...
... se con Mac va e con il PC no ... il problema deve essere altrove ... ]:smiley: ]:smiley: ]:smiley:

Guglielmo

gpb01:
... ma sbaglio o .. te lo fa SOLO con Win e non con Mac ... come dicevi all'inizio ???

GiacomoSam:
Ora controllo un po'. Ho visto che collegando Arduino con un Mac tutto va bene (ma li non ho VB :0).

Se è così ... spiegatemi cosa cavolo c'entrano i buffer e la velocità ...
... se con Mac va e con il PC no ... il problema deve essere altrove ... ]:smiley: ]:smiley: ]:smiley:

Guglielmo

Si ma ha già cambiato versione di Windows, ha cambiato il PC e tante altre prove.
Non conosco Mac, magari quel S.O. gestisce "meglio" la comunicazione seriale di Windows ?

@icio si, hai ragione, ma con un Mac @Giacomo dice che non ha problemi, solo con Windows !?!?!

nid69ita:
Non conosco Mac, magari quel S.O. gestisce "meglio" la comunicazione seriale di Windows ?

... con una scheda (Arduino) che non gestisce handshaking né hardware né software ??? :astonished: :astonished: :astonished:

Non credo ... c'è qualche altra cosa sotto ... :roll_eyes:

Guglielmo

P.S. : ... come sai io ho Mac e non ho mai visto di questi problemi ...
... e passo attraverso HUB USB messi in cascata (... ho 24 porte USB piene al 80% :grin: :grin: :grin:)

Magari VB.NET ha problemi con la gestione seriale ? (Quel cavolo di strato di NET.framework rallenta? )
Però scusa @Giacomo, come hai fatto a provare il programma VB sotto Mac? VB.NET non è solo per Windows ?

... leggi bene Nid ... ti sei perso un pezzo :

GiacomoSam:
Ora controllo un po'. Ho visto che collegando Arduino con un Mac tutto va bene (ma li non ho VB :0).

... quindi ... il problema potrebbe essere VB :grin: :grin: :grin:

Guglielmo

gpb01:
... leggi bene Nid ... ti sei perso un pezzo :

GiacomoSam:
Ora controllo un po'. Ho visto che collegando Arduino con un Mac tutto va bene (ma li non ho VB :0).

... quindi ... il problema potrebbe essere VB :grin: :grin: :grin:
Guglielmo

:grin: :grin: :grin: vero!!!
Quindi su Mac hai fatto prove NON alla stessa velocità della coppia VB-Arduino, giusto?
Perciò quello che dice @icio potrebbe essere il problema, che verrebbe fuori anche sul Mac se avessi il VB

@Giacomo, sò che non è semplice ma potresti pensare di tradurre la parte VB in Processing. Si programma con un IDE simile a quello di Arduino e si programma in Java (che poi è simile al C/C++ che usi su Arduino).
E Processing mi pare gira anche su Mac !!!

nid69ita:
E Processing mi pare gira anche su Mac !!!

Confermo ! :smiley:

Guglielmo

@ Giacomo : ma implementare un minimo di protocollo SW no ???

Non dico che devi fare chissà che, ma il classico :

... dati .. ed in risposta o ... sincronizzerebbe tutto.

Insomma, se occorre scambiarsi seriamente delle informazioni tra un unità ed un altra ... un protocollo occorre pure metterlo in piedi, altrimenti uno incrocia le dita e spera sempre che tutto vada bene (... e si dimentica di Murphy :grin:) ...

Guglielmo