MATLAB -> Arduino

Salve a tutti,
non riesco ad interfacciare in scrittura l'Arduino Mega dal MATLAB.
Sono riuscito subito a leggere i dati dell'Arduino con il seguente codice:

codice MATLAB:

s = serial('COM5, 'BaudRate', 19200);
fopen(s)
fprintf(s, 'hello arduino!');
end
fclose(s);

codice Arduino:

byte input = 0;

void setup()
{
Serial.begin(9600);
}

void loop()
{
if (Serial.available())
{
input = Serial.read();
Serial.print(input);
}
}

Adesso vorrei utilizzare il MATLAB non solo in lettura dall'Arduino ma anche in scrittura.

Ho provato con il seguente codice ma non funziona:

codice Arduino:

byte input = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available())
{
input = Serial.read();
Serial.print(input);
}
}

codice MATLAB:

function varargout = test(varargin)
s = serial('COM5');
set(s,'BaudRate',9600);
set(s,'DataBits',8);
set(s,'StopBits',1);
set(s,'Parity','none');

fopen(s);

fwrite(s, 5,'uint8','async');
fread(s)

fclose(s);
delete(s);
clear s;
end

la prima volta che ho provato mi ha dato questo output:

Warning: The specified amount of data was not returned within the Timeout period.
ans = Empty matrix: 1-by-0

e le volte successive soltanto:

Warning: The specified amount of data was not returned within the Timeout period.

come posso fare? qualche suggerimento?

grazie a chi risponderà.

Ciao, anche io ho usato arduino con MATLAB ed è veramente divertente :slight_smile:
Per cosa lo usi precisamente?

Per il tuo problema posso dire:

Consiglio 1: prova a sostituire, nel codice Arduino if (Serial.available()) con if (Serial.available()>0)
Sicuramente il problema non sarà questo ma una prova...

Consiglio 2: In Matlab costruisci una funzione "test" che tutte le volte che la invochi istanzia un oggetto "s" seriale.
Non puoi crearlo fuori dalla funzione e poi utilizzarlo aprendo e chiudendo ad ogni giro?

Domanda: Utilizzi fwrite: non ho matlab sotto mano purtroppo ma come mai usi 'uint8'?
Quali altre opzioni su fwrite?
E perchè subito dopo usi fread?
Arduino deve rispondere in qualche modo al tuo input?

Per il momento sto cercando di imparare come interfacciare perfettamente Arduino con MATLAB sia in lettura che in scrittura. Le applicazioni possibili sono tantissime! A me servirà per il monitoraggio di servi. Tu per cosa l'hai utilizzato?

Ho letto i tuoi consigli, il primo con o senza il >0 il codice è lo stesso, il secondo hai ragione, è molto più pratico, però facendo il tutto in una funzione sola dovrebbe funzionare lo stesso ma nada.

si, arduino dovrebbe rispondere inviandomi indietro serialmente il valore che gli ho passato tramite Matlab, in questo modo riesco a sapere se riesco nell'operazione di write.

per quanto riguarda fwrite l'ho utilizzato in questo modo:

fwrite(obj,A,'precision','mode')

dove uint8 = 8-bit unsigned integer

uso male fwrite?

Per la verità io ho solo fatto un po' di prove dato che utilizzo Matlab per altre cose.
Ho visto che funziona molto bene ma mi sono fermato li anche perchè vorrei fare una prova con Scilab, Octave o similari dato che il pacchetto Matlab costa un occhio della testa... e se volessi utilizzarlo per piccole aziende non va molto bene...

Non penso che tu utilizzi male fwrite.
Ma arduino è alimentato con la USB del PC?
Potrebbe essere che le due comunicazioni seriali vadano in conflitto.
Non sono un esperto in merito (per questo ti consiglio di cercare anche sul forum post vecchi) ma mi sembra che il problema possa essere proprio questo.

In tal caso potresti risolvere utilizzando la libreria SoftSerial che utilizza due pin diversi da quelli per la connessione seriale per comunicare con l'esterno...

l'alimentazione è via usb. Sai forse è questo il problema. Ora che ci penso quando provo ad interfacciare l'arduino direttamente dal matlab e non mi restituisce quello che vorrei, quando riprovo a programmarlo matlab mi dice che la com è occupata. quindi banalmente esco dal matlab e rientro.

tu hai già usato la libreria SoftSerial?
ma se è questo il problema possibile che non si possa utilizzare una sola com per write e read? mmm :-/

Devo ammettere la mia ignoranza...
Non ti saprei dire.
In teoria si: da terminale funziona correttamente.
Non è che anche in Matlab devi "aspettare" che arrivino informazioni?
Qualcosa tipo if(arrivainput()>0){Fai qualcosa} anzichè accodare il read subito dopo il write?
Magari, semplicemente, arduino non riesce ad inviare la risposta immediatamente dopo come si aspetta Matlab...

PS: Sei di Milano vero?

Penso sia proprio un problema di temporizzazione tra matlab e arduino. sono sicuro che matlab scriva su arduino (perchè il tutto parte quando la serial.avaible()>0 cioè quando invio qualcosa tramite seriale) però quando devo leggere probabilmente arduino invia ma matlab non è pronto a ricevere! devo capire come sincronizzare l'operazione.

ps: Sono di Roma, ma perchè hai detto "sei di Milano, vero?" :smiley: