martes, 14 de agosto de 2012

Proyecto Galatea, unión con Matlab (Comunicación Matlab -> Arduino)

Bien pues continuo haciendo experimentos para el nuevo sistema de control y parece que da sus frutos, por ahora necesito conseguir una comunicacion bidireccional entre Arduino y Matlab, para monitorizar que va pasando por "su cabeza".

Por ahora de Arduino -> Matlab, me esta dandos ligeros problemas, ya que por alguna razón solo recibo desde matlab el primer dato, aunque desde el Arduino este mandado mas.

La comunicacion Matlab -> Arduino, funciona correctamente.

Os dejo un resumen del código que se necesita:

Primero arrancamos arduino con este código ( lo que hago básicamente es cambiar la velocidad de un motor desde matlab):

int ledPin = 13;
char * val ="0";

int vel = 120;
int numero = 0;
int tipoUnidad = 0;
int motor = 11;
void setup(){
   Serial.begin(9600);
   equilibrarMotores(); 

   pinMode(ledPin, OUTPUT );
}

void loop(){
   if (Serial.available() > 0) {
     val[0] = Serial.read(); // lee el byte de entrada:     
  
       int num = atoi(val);
       switch(tipoUnidad){
          case 0:
             numero += num*100;
             tipoUnidad++;
             break;
          case 1:
             numero += num*10;  
             tipoUnidad++;      
             break;
          case 2:
             numero += num; 
             analogWrite (motor,numero);                                            
             digitalWrite(ledPin, HIGH);   // enciende el LED
             delay(20);                  // espera por un segundo
             digitalWrite(ledPin, LOW);    // apaga el LED
             delay(20);             
             numero = 0; 
             tipoUnidad=0;            
            
             break;   
           default:   
             break;     
       }   

     Serial.flush();
   } 
}


Luego arrancamos el Matlab y ponemos lo siguiente:

placa = serial( 'COM3' , 'BaudRate', 9600 );
fopen( placa );

fprintf(placa,'%s','160')

El problema de todo esto (al menos que me ha surgido a mi) es que recibimos bytes y hay que tratarlos desde Arduino, y espero que si lo que queremos es un control de vuelo, este parseo no consuma demasiado calculo en la cpu del Arduino, sino no valdrá para nada.

En el   fprintf(placa,'%s','160'), puedes enviar cadenas más largas, tipo : 160145129, pero siempre (al menos para que este codigo funcione) en grupos de 3.

Se me olvidaba , Matlab posee una libreria para Arduuino de pago, (45€ creo), pero creo que no hay necesidad de pagar.

Un saludo.
Tags: ,

Ude

Eduardo Parada Pardo

Soy desarrollador e investigador en robótica, me gusta aprender nuevas tecnologías y todo lo relacionado con el mundo de la robótica. Si te gusta este blog, no dudes en preguntar cualquier duda.

0 comentarios:

 

Productos y tecnologias usadas en este blog:

  • Copyright © LuneGate™ is a registered trademark.
    Designed by Templateism. Hosted on Blogger Platform.