Go Down

Topic: Problema di codifica e scambio dati tra Arduino Uno e Matlab (Read 339 times) previous topic - next topic

carmine19

Ciao a tutti, mi sono iscritto da poco al forum ma volevo sottoporvi un problema.
Nel mio percorso di tirocinio universitario sto lavorando con Arduino e Matlab e sto avendo un problema nella codifica dei dati.

In sostanza ho bisogno di mandare un numero che va da 0 a 1023 da Matlab ad Arduino e lo faccio con il comando
Code: [Select]
fprintf(s,'%u',num) il problema sorge quando dal lato Arduino vado a leggere il dato con il comando
Code: [Select]
Serial.read() una volta letto il numero lo mando a un Pin PWM con il comando
Code: [Select]
analogWrite(Pin,numero).
Nel fare questa operazione ho notato che quando Arduino legge il numero lo fa in formato ascii e ovviamente mi rimanda indietro al Matlab l'equivalente decimale del numero in ASCII mentre io ho bisogno del mio numero di partenza.
Sapete per caso come posso fare per risolvere questo problema?
Vi lascio il di codice Matlab e Arduino che ho elaborato.

Matlab
Code: [Select]
while(true)
fprintf(s,'%c','W');
fprintf(s,'%i',5);
r1=fscanf(s,'%s')
end


Arduino
Code: [Select]
if (mode == 'W') {
r = Serial.read();
Serial.println(r,DEC);
}


Quando io mando il numero 5 ad Arduino lo riceve e me lo rifaccio mandare indietro, ho provato con il formato dec, bin e oct ma mi manda indietro sempre l'equivalente ascii del numero 5 rispettivamente nel formato decimale (53), nel formato binario (110101) e nel formato ottale (65).

gpb01

#1
Nov 15, 2013, 01:27 pm Last Edit: Nov 15, 2013, 01:30 pm by gpb01 Reason: 1
Ciao,
prima di tutto, essedo il tuo primo post, ti consiglio di andarti a presentare QUI e di leggere il regolamento QUI.

Poi,
l'errore fondamentale che fai e NON aver letto come funziona la Serial.read() ...
... la Serial.Read() legge UN carattere (che dal tuo programma arriva in ASCII) alla volta dal serial buffer, mentre tu gli stai mandando più caratteri rappresentanti il tuo numero (che, se è di più di una cifra ... rimane nel buffer).

E' un argomento di cui si è parlato decine e decine di volte sul forum ... fai un po' di ricerche e troverai anche esempi fatti per risolvere la cosa. ;)

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

nid69ita

Ti ho risposto su facebook  :smiley-mr-green:

Qualcosa non torna. Un numero da 0 a 1023 non può essere un byte (0-255). Da Arduino leggi un solo byte, che poi utilizzi per un pin PWM, il quale accetta solo un byte (valore tra 0-255). Da Arduino devi leggere 2 byte e ricomporre l'intero che spedisci. Poi puoi usare la map() per portare il valore nel range 0-255 per il PWM. Ora a MathLab tu chiedi ad Arduino di spedire indietro un valore che potrà essere il valore intero o quello convertito per la analogWrite(). Potresti usare una specie di map() già in MathLab e portare il numero tra 0-255, già pronto per il PWM.
my name is IGOR, not AIGOR

PaoloP

Puoi usare Serial.ParseInt() --> http://arduino.cc/en/Reference/ParseInt

Go Up