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