Go Down

Topic: problema connessione Arduino Mega 2560 < Firmata > VisualBasic 2010 (Read 21850 times) previous topic - next topic

GiacomoSam

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?


GiacomoSam

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:

Code: [Select]
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.

nid69ita

A me non convince quel ciclo alla fine dello switch. Prova a commentarlo.
Code: [Select]
while (Serial.available()){
      Serial.read();
      delay(1);
    }
my name is IGOR, not AIGOR

GiacomoSam

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

nid69ita

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)
my name is IGOR, not AIGOR

GiacomoSam

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

GiacomoSam

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.

nid69ita

#67
Apr 24, 2014, 05:49 pm Last Edit: Apr 24, 2014, 05:56 pm by nid69ita Reason: 1
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):
Code: [Select]
 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.
my name is IGOR, not AIGOR

GiacomoSam

#68
Apr 24, 2014, 06:22 pm Last Edit: Apr 24, 2014, 10:12 pm by GiacomoSam Reason: 1
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?

Code: [Select]

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


Consigli quindi di alleggerire il codice?

Grazie mille,

Giacomo

nid69ita

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.
my name is IGOR, not AIGOR

icio

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



GiacomoSam

@ 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

gpb01

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


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 ...  ]:D ]:D ]:D

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita

#73
Apr 25, 2014, 01:29 pm Last Edit: Apr 25, 2014, 01:43 pm by nid69ita Reason: 1

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


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 ...  ]:D ]:D ]:D

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 !?!?!
my name is IGOR, not AIGOR

gpb01


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 ???  :smiley-eek: :smiley-eek: :smiley-eek:

Non credo ... c'è qualche altra cosa sotto ...  :smiley-roll:

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%  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:)
Search is Your friend ... or I am Your enemy !

Go Up