Pages: [1]   Go Down
Author Topic: problemas serial mathlab/arduino [Solucionado]  (Read 1580 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola chicos, estoy intentado desde mathlab -esto es igual-creo, mandar información a arduino.
La idea es que es enviar un comando y un valor, el comando en de 8 bits y el valor es de 16 bits.
he hecho el codigo que veis más abajo y para probarlo abro el monitor que trae el ide por defecto de arduino y pongo 99 -que es digamos el comando de prueba- si es reconocido, pasa a leer el valor...
el problema es que parece que no lee nada...alguna ayudita?. Gracias.

Code:
// definir variables
unsigned int t_motor;
byte comando;
 
void setup() {
             }  
        
        
 
 
 
void loop() {

Serial.flush();
delay(50);
if (Serial.available()>0){
   delay(500);
   comando=Serial.read();
   if (comando==99){
                    digitalWrite(13,HIGH);
                    delay(5000);
                    t_motor=Serial.read();
                    Serial.println(t_motor,DEC);
                   }
      
   }  
  
   digitalWrite(13,LOW);
  
}

« Last Edit: April 22, 2012, 12:39:34 pm by angel67 » Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En el setup() te falta el serial.begin
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En el setup() te falta el serial.begin
juas!, pues es verdad, pero sigo teniendo un problema

parece que el comando en 8 bits lo lee correcto porque entra en el if y activa el led.

Pero el segundo numero que es en 16bits no lo interpreta correctamente, porque
el tiempo que envio (en milisegundos-por eso lo de 16bits)...no es correcto...
ahora queda así el código en arduino
Code:


// definir variables
unsigned int t_motor;
byte comando;
 
void setup() {
              pinMode(13,OUTPUT);
              Serial.begin(9600);
             
             }   
       
       
 
 
 
void loop() {

//Serial.flush();
delay(50);
if (Serial.available()>0){
   delay(500);
   comando=Serial.read();
   if (comando==99){
                    digitalWrite(13,HIGH);
                    t_motor=Serial.read();
                    Serial.println(t_motor,DEC);
                    delay(t_motor);
                   
                   }
     
   } 
 
   digitalWrite(13,LOW);
   
}




por ejemplo envio desde mathlab esto:

Code:
%borrar previos
delete(instrfind({'Port'},{'COM3'}));
%crear objeto serie
s = serial('COM3','BaudRate',9600,'Terminator','CR/LF');
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');
%abrir puerto
fopen(s);

pause(3);

comando=99;
t_motor=2200;
fwrite(s,comando,'uint8');
pause(2);
fwrite(s,t_motor,'uint16');

a = fscanf(s,'%d')';
a

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

y lo que obtengo en a
es: a =

       65535

alguna idea

 
« Last Edit: April 22, 2012, 07:20:09 am by angel67 » Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lee con detenimiento que devuelve Serial.read
http://arduino.cc/es/Serial/read

Si no leemos la documentación y las cosas no funcionan, no estaría mal leerla.
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lee con detenimiento que devuelve Serial.read
http://arduino.cc/es/Serial/read

Si no leemos la documentación y las cosas no funcionan, no estaría mal leerla.
ok, entonces veo que no hay manera de leer directamente un numero de 16bits,
luego tengo que leer 2 bytes consecutivos y transformalos en un integer, no?
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Exacto!

Puedes hacer por ejemplo:

Code:
int leer16bits(){
  int num;
  num = Serial.read();
  num += Serial.read() << 8;
  return num;
}
« Last Edit: April 22, 2012, 10:31:01 am by chiva » Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pues sigo sin resolverlo...una vez modificado el código según tus gentiles consejos queda así el de arduino
Code:
// definir variables
unsigned int t_motor;
byte comando, bytelow, bytehigh;
 
void setup() {
              pinMode(13,OUTPUT);
              Serial.begin(9600);
             
             }   
       
void loop() {

delay(50);
if (Serial.available()>0){
   delay(500);
   comando=Serial.read();
   if (comando==99){
                    digitalWrite(13,HIGH);
                    t_motor=leer16bits();
                    Serial.print(t_motor);
                    delay(t_motor);
                    Serial.flush();
                   }
     
   } 
 
   digitalWrite(13,LOW);
   
}

int leer16bits(){
  int num;
  num = Serial.read();
  num += Serial.read() << 8;
  return num;
}


y ahora lo que he puesto en mathlab

Code:
%borrar previos
delete(instrfind({'Port'},{'COM3'}));
%crear objeto serie
s = serial('COM3','BaudRate',9600,'Terminator','CR/LF');
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');
%abrir puerto
fopen(s);

pause(3);

comando=99;
t_motor=2200;
fwrite(s,comando,'uint8');
pause(2);
fwrite(s,t_motor,'uint16');


a=fscanf(s,'%d');
a

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

y el resultado es:
a =

       65279

cuando me debería devolver el valor de la variable t_motor=2200

ademas cuando aplica el delay para dejar el led encedido no lo hace por 2200milisegundos....luego
algo no está recibiendo (o enviando bien)?
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No se exactamente como manda Matlab los datos, pero puede que tengas que cambiar el 'terminator' a nada, mira si hay una opción que haga eso, no mande ni CR ni LF.
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si ya busque la opción
he anadido en mathlab s.Terminator='';
pero  no parece hacer nada....
de todas formas eso sería a la hora de usar el Serial.print recogido en mathlab por el scanf

lo que no explica por que el led no luce el tiempo que le envio desde mathlab mediante fwrite
y recogido en Serial.read por tu subrutina....
ya que según la documentacion de mathlab sólo se envian byte secos segun pone en su documentación:

http://www.mathworks.es/help/techdoc/ref/serial.fwrite.html


ufff....esto es medio pesadilla!

Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quita el delay(2) del codigo de matlab
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quita el delay(2) del codigo de matlab
acabo de hacer eso, antes de leer lo que me has puesto...y funciona!
posteo el código completo, porque tampoco se lleva bien con el envio desde mathlab de código de 16bits...
así que he tenido que hacer esto....pero ahora va bien, gracias por la ayuda:

arduino:
Code:
// definir variables
int t_motor;
byte comando, bytelow, bytehigh;
 
void setup() {
              pinMode(13,OUTPUT);
              Serial.begin(9600);
             
             }   
 
void loop() {

//Serial.flush();
delay(50);
if (Serial.available()>0){
   delay(500);
   comando=Serial.read();
   if (comando==99){
                    digitalWrite(13,HIGH);
                    bytelow=Serial.read();
                    bytehigh=Serial.read();
                    t_motor=bytehigh+bytelow*256;
                    Serial.println(comando);
                    Serial.println(bytelow);
                    Serial.println(bytehigh);
                    Serial.println(t_motor);
                    delay(t_motor);
                    Serial.flush();
                   }
     
   } 
 
   digitalWrite(13,LOW);
   
}


mathlab:
Code:
%borrar previos
delete(instrfind({'Port'},{'COM3'}));
%crear objeto serie
s = serial('COM3','BaudRate',9600,'Terminator','CR/LF');
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');

%abrir puerto
fopen(s);

pause(3);

comando=99;
t_motor=2200;
fwrite(s,comando,'uint8');
highbyte=floor(t_motor/256);
lowbyte=t_motor-highbyte*256;
data=[highbyte lowbyte];
fwrite(s,data,'uint8');

pause(2);

for i=1:4
a=fscanf(s,'%d');
b(i)=a;
end
b
fclose(s);
delete(s);
clear s;
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

De nada smiley-wink
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Pages: [1]   Go Up
Jump to: