Comunicazione real time Matlab Arduino via porta seriale

Salve a tutti,

Cercherò di essere conciso :slight_smile:

Non sono un esperto di elettronica ne di informatica.
Avrei bisogno di chiarimenti riguardo a come e che tipo di variabili inviare da matlab ad arduino e viceversa, tramite comunicazione seriale.
In pratica ho scritto questo codice per matlab

a = serial('/dev/ttyUSB0','BaudRate',4800);
fopen(a);
true = 1;
POS = 48;

while true
    fwrite(a, POS, 'char');
    
    POS = input('Posizione motore:   ');
    
    data = fread(a,1,'char')
    
    true = input('to finish press 0:.... to continue press another value:   '); 
       
end
fclose(a)

in cui definisco la comunicazione seriale e il voglio definire dei valori da mandare da ad arduino, da qui poi vorrei mandarli a dei servomotori, lo sketch per arduino è questo

#include<Servo.h>

int matlabData;
int A;
int pos;
int a;
 
 Servo M1; 
void setup() 
{
  M1.attach(9,500,2500);
  Serial.begin(4800);
}
 
void loop() 
{
   
   if(Serial.available()>0) // if there is data to read
   {
    matlabData = Serial.read(); // read data
      if(matlabData>0 && matlabData<180)
      
      int pos = matlabData;
       M1.write(pos);
      A = 100;      
      Serial.println(A,DEC);
   }
      
    }

Ovviamente i codici che ho scritto sono la versione semplificata di quello che vorrei fare. Io vorrei leggere le posizioni dei motori da arduino, inviare questi dati a matlab, processarli in uno script e rinviarli ad arduino per poi inviarli ai motori.

Ora volevo iniziare piano piano. Volevo scrivere un dato da matlab, mandarlo ad arduino e riportarlo indietro per vedere se in matlab ritornasse lo stesso valore inviato. Beh questo non accadeva infatti nei codici scritti noterete che invio un valore da matlab e vorrei che da arduino tornasse sempre il valore A=100 con A variabile di tipo int.
Beh questo non accade, mi ritorna un numero di 2 cifre che periodicamente assume questi valori 48, 48, 13, 10.

Potreste aiutarmi a capire dove sbaglio e indirizzarmi su quali tipo di testi o articoli leggere per chiarirmi queste idee?

Ciao,
il problema è che la Serial.read() legge UN solo carattere alla volta quindi, se tu gli trasmetti la stringa 100, che in ASCII è 0x31 0x30 0x30 0x00 tu leggi il primo carattere e stop ... :~

Devi vedere come la stringa che mandi sulla seriale viene codificata sul PC (ovvero se come sequenza di caratteri ASCII terminati da NUL o in altro modo) e, su Arduino, devi gestire un loop di ricezione di tutti i caratteri per ricostruire la stringa che poi dovrai convertire in un valore numerico ... :roll_eyes:

Guglielmo

Ok grazie della preziosa informazione, è proprio il core di quello che NON avevo capito.

Devi vedere come la stringa che mandi sulla seriale viene codificata sul PC (ovvero se come sequenza di caratteri ASCII terminati da NUL o in altro modo)
In pratica come il mio pc codifica la stringa da cosa dipende?

[\b]su Arduino, devi gestire un loop di ricezione di tutti i caratteri per ricostruire la stringa che poi dovrai convertire in un valore numerico[\b]
Immagino che quindi dovrei impostare qualcosa come una funzione nel mio sketch che ricomponga la stringa e poi ovviamente riconvertirlo. La cosa sembra più macchinosa di quella che credevo ma potrei "automatizzare" la cosa con delle funzioni spendendo un po di tempo.
Tuttavia la mia idea iniziale era utilizzare il simulink per la comunicazione con i servomotori poiché nella libreria ci sono blocchi appositi per la comunicazione con i servomotori. Ma a proposito provo a fare qui una domanda... per far funzionare la comunicazione tra arduino e simulink devo essere provvisto di un compilatore sul mio pc che converta il modello simulink in codice C#, adesso io ho un compilatore solo per il mio matlab installato su UBUNTU (il compilatore qui è presente gia di suo), ma non per la mia versione su Windows e se non ho capito male la libreria per arduino su simulink funziona solo da Windows. La domanda quindi è: Sono in circolazione compilatori alternativi a quelli forniti dal sito ufficiale MathWorks che sono a pagamento e sono rilasciati al massimo per una versione di prova di 30 giorni?

cld05:
...
In pratica come il mio pc codifica la stringa da cosa dipende?

Dipende come TU la fai trasmettere sulla seriale e come il PC fisicamente la trasmette ... la cosa più semplice è che tu mandi un qualche cosa di noto (es. il numero 123) verso la seriale e su Arduino fai un loop che ti stampa il valore di ogni singolo carattere ricevuto ... così vedi realmente cosa arriva :wink:

cld05:
Immagino che quindi dovrei impostare qualcosa come una funzione nel mio sketch che ricomponga la stringa e poi ovviamente riconvertirlo. La cosa sembra più macchinosa di quella che credevo ma potrei "automatizzare" la cosa con delle funzioni spendendo un po di tempo.

Mah ... fai un loop che riceve i caratteri e, nel momento che arriva il terminatore, fai una conversione da stringa a numero. La stdlib contiene varie funzioni di conversione :wink:

... Per il resto non ti so aiutare ... non uso quei prodotti ...

Guglielmo

Grazie mille dei suggerimenti dei chiarimenti :slight_smile:
Cercherò ulteriori informazioni sull'altra strada e cercherò comunque di gestire la comunicazione seriale

Grazie ancora :slight_smile: