Pages: [1]   Go Down
Author Topic: Problema di codifica e scambio dati tra Arduino Uno e Matlab  (Read 297 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
fprintf(s,'%u',num)
il problema sorge quando dal lato Arduino vado a leggere il dato con il comando
Code:
Serial.read()
una volta letto il numero lo mando a un Pin PWM con il comando
Code:
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:
while(true)
fprintf(s,'%c','W');
fprintf(s,'%i',5);
r1=fscanf(s,'%s')
end

Arduino
Code:
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).
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5982
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley-wink

Guglielmo
« Last Edit: November 15, 2013, 07:30:48 am by gpb01 » Logged

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

ivrea (to)
Online Online
Faraday Member
**
Karma: 87
Posts: 5009
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

my name is IGOR, not AIGOR

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7188
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: [1]   Go Up
Jump to: