Codice non funzionante con Arduino Mega

Salve a tutti
ho un problema alquanto strano. Ho scritto un codice per far comunicare Matlab e Arduino... in pratica da matlab invio dei valori via seriale all'Arduino che arrivano da un Joystick. Il codice è scritto sicuramente bene in quanto con un arduino Uno è tutto perfettamente funzionante... il problema sorge quando utilizzo un Arduino Mega2560... scollegando semplicemente l'Uno e collegando il Mega, non funziona più niente (ovviamente ho cambiato la porta COM e la board in IDE)... sembra che la comunicazione seriale funzioni in modo diverso... Ho provato a cambiare board con altri mega, ma il problema è sempre lo stesso... qualcuno può aiutarmi? Allego il codice lato Matlab e lato IDE.

char Matlab[3];                // definisco un vettore con una dimensione pari al
int NumValSerAttesi = 3;       //numero di valori che arrivano da Matlab
int val1 = Matlab[1];
int val2 = Matlab[2];
void setup() {
  Serial.begin(9600);    // apro la comunicazione seriale e imposto i PIN della
  pinMode(9, OUTPUT);   // leva di sicurezza
  pinMode(3, OUTPUT);   //acceleratore
  pinMode(10, OUTPUT);   //freno sx
  pinMode(11, OUTPUT);   //freno dx
}
void loop() {
 if (Serial.available() >= NumValSerAttesi ) { 
    for (int i = 0; i < NumValSerAttesi; i++)  
      Matlab[i] = (Serial.read() - 48); } 
      val1 = map(Matlab[1], 0, 9, 0, 255);
      val2 = map(Matlab[2], 1, 9, 1, 255);
 if (Matlab[0] == 1) {            
    digitalWrite(9, HIGH);  }         
  else {
    digitalWrite(9, LOW);  }
 if (Matlab[1] > 0) {     // Matlab[3] è riferito al segnale  che arriva dalla leva
    analogWrite(3, val1);  }    
  else {
    digitalWrite(3, LOW);  }
 if (Matlab[2] == 5) {
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);  }
 if (Matlab[2] < 5) {
    analogWrite(10, -val2);  }
 if (Matlab[2] > 5) {
    analogWrite(11, val2);  }
  Serial.flush();
  delay(1);
}

Matlab:

function Matlab_Arduino_joyUTV(sample)
clc;
joy = vrjoystick(1);     % funzione che permette di ricevere i segnali dal joystick collegato via USB
delete(instrfind({'Port'},{'COM9'}))      %cancella tutto ciò che era presente nella seriale
porta_seriale=serial('COM9','BaudRate',9600);         %apro comunicazione seriale
warning('off','Matlab:serial:fscanf:unsuccessfulRead')
fopen(porta_seriale);
cont_sample=1;
while cont_sample<=sample    
    [axes, buttons, povs] = read(joy);        %leggo tutto ciò che arriva dal joystick
    grill=buttons(1);                         %grilletto
%     a=buttons(7);                             %bottone d7
%     b=buttons(6);                             %bottone d6
    c=axes(4);                                %leva 
    d=c*10000;                              
    f=axes(1);                                %asse 1 (dx/sx)
    g=f*10000;
         
%----"mappatura" dei segnali che arrivano dalla leva (d) e dall'asse1 (g)----%
if (4004<d)&&(d<5240)                           
    e=0;
end
if ((g>-7000)&&(g<-5090))
    h=1;
end    
if ((d<4003)&&(d>2769))
    e=1;
end
if ((g>-5091)&&(g<-3618))
    h=2;
end
if ((d<2768)&&(d>1534))
    e=2;
end
if ((g>-3619)&&(g<-2146))
    h=3;
end
if ((d<1533)&&(d>299))
    e=3;
end
if ((g>-2147)&&(g<-674))
    h=4;
end
if ((d<298)&&(d>-936))
    e=4;
end
if ((g>-675)&&(g<798))
    h=5;
end    
if ((d<-935)&&(d>-2171))
    e=5;
end
if ((g>799)&&(g<2270))
    h=6;
end
if ((d<-2172)&&(d>-3406))
    e=6;
end
if ((g>2271)&&(g<3742))
    h=7;
end
if ((d<-3407)&&(d>-4641))
    e=7;
end
if ((g>3743)&&(g<5214))
    h=8;
end
if ((d<-4642)&&(d>-5876))
    e=8;
end
if (g>5215)
    h=9;
end
if (d<-5877)&&(d>-7115)
    e=9;
end
pause(0.1);
%---INVIO DATI "MAPPATI" SULLA SERIALE---%
%     fprintf(porta_seriale,'%c',num2str('x'));
    fprintf(porta_seriale,'%c',num2str(grill));   
%     fprintf(porta_seriale,'%c',num2str(a));
%     fprintf(porta_seriale,'%c',num2str(b));
    fprintf(porta_seriale,'%c',num2str(e));
    fprintf(porta_seriale,'%c',num2str(h));
    C=[grill e h]
%---all'ultimo ciclo spegni tutti i segnali---%
if cont_sample==sample                   
    a=0;                                 
    b=0;
    grill=0;
    e=0;
    h=5;
%     fprintf(porta_seriale,'%c',num2str('x'));
    fprintf(porta_seriale,'%c',num2str(grill));
%     fprintf(porta_seriale,'%c',num2str(a));
%     fprintf(porta_seriale,'%c',num2str(b));
    fprintf(porta_seriale,'%c',num2str(e));
    fprintf(porta_seriale,'%c',num2str(h));
end
cont_sample=cont_sample+1;  
end
%chiusura comunicazione seriale 
fclose(porta_seriale);
delete(porta_seriale);
clear all
fprintf('fine')

end

Ocio che il Mega ha 3 seriali ...

Quindi usa questo codice:

Serial1.begin(9600);

and

Serial1.available()

Praticamente aggiungi l'1, che corrisponde alla seriale via USB

http://arduino.cc/en/Serial/begin

ho dimenticato di dire che avevo già effettuato questa correzione... ma non va comunque

Vedo che stai usando flush() alla fine del loop, ma questa funzione serve solo a svuotare il buffer di uscita a partire dall'IDE 1.0.0.

Per svuotare quello di entrata devi usare la funzione di lettura Serial.read per tutti i byte ancora presenti.

Usando la MEGA ti consiglio di usare una delle altre porte seriali che hai a disposizione in modo da non perdere l'utilissimo Serial Monitor.

Grazie per il consiglio molto utile. Però non capisco perchè con l'Uno funziona e col Mega no... lo stesso codice, a meno del cambiamento della porta seriale, dovrebbe funzionare comunque...

"non funziona" é una descrizione di nessun aiuto.
descrivi per favore dettagliatamente i sintomi del malfunzionamento.
Ciao Uwe

La pressione di un pulsante sul joystick dovrebbe far accendere un determinato led al banco. Ebbene ciò non accade in quanto si accendono led che non dovrebbero accendersi o comunque non si accendono per niente...

vi prego aiutatemi, ho provato di tutto :frowning:

Gioppi:
La pressione di un pulsante sul joystick dovrebbe far accendere un determinato led al banco. Ebbene ciò non accade in quanto si accendono led che non dovrebbero accendersi o comunque non si accendono per niente...

Nello Sketch non leggi nessun Joystick.
Ciao Uwe

si, infatti lo leggo da Matlab che manda all'arduino dei valori... a seconda dei valori che gli arrivano, si devono accendere dei pin piuttosto di altri...
ciao, Giovanni

sicuramente non c'entra nulla :slight_smile:
ma sembra un caso simile (in alcuni rari casi) con processing e arduino, con la UNO funziona sempre, mentre per far funzionare la Mega si devono mettere 2 secondi di delay nel setup dello sketch di processing se non non funzia.

@camperos grazie per la risposta... quindi dove dovrei inserire il delay(2000)?

è un tentativo dato che non trovi soluzione...
per via seriale se i dati vengono trasmessi immediatamente senza un evento subito dopo la connessione il mega non fa a tempo a connettersi completamente, questo è quanto sembra succedere con il mega, con la uno invece funziona sempre.

non conosco Matlab, con processing si fa così:

void setup () { 
.....

myPort = new Serial(this, "COM3", 9600);
delay (2000);//si modifica solo con questo  

}

@camperos ovunque tu abiti, ti devo una cena!
Non ci sarei mai arrivato ad una soluzione del genere, stavo impazzendo! Grazie mille !
Per completezza e per chi avrà lo stesso problema, basta inserire un pause(2) sul programma Matlab dopo aver aperto la porta seriale (fopen(...)).