SciLab. Comunicación de con Arduino con SciLab. Sensor MPU6050


 Para comunicar Arduino con SciLab he realizado el siguiente programa en Ardunio:


//#include " Wire.h "
//#include " I2Cdev.h "
//MPU6050 mpu;
#include " Simple_MPU6050.h "
#define MPU6050_DEFAULT_ADDRESS    0x68
//llar a la clase simplempu6050
MPU simple_MPU6050 mpu;
// Aceleración X Aceleración Y Aceleración Z Giroscopio X Giroscopio Y
Definir OFFSETS  -3014 ,     1012 ,     1276 , -59 ,     183 , -10
 //mpu.on_FIFO(print_Values); //en el bucle de configuración

 
 //Definimos la funcion que vamos a ejecutar con el loop
// Para mandar los datos a Scilab creamos la matriz de datos
datos flotantes [ 9 ]; // lacet, tangage, roulis, hacha, ay, az, wx, wy, wz
int val =   0 ;           /* valor genérico leído desde el puerto serie */

void Imprimir_Valores ( int16_t * gyro, int16_t * accel, int32_t * quat) {
  Cuaternión q;
  VectorFloat gravedad;
  float ypr [ 3 ] = { 0 , 0 , 0 };
  float xyz [ 3 ] = { 0 , 0 , 0 };
  mpu.ObtenerCuaternión ( &q, quat) ;
  mpu.ObtenerGravedad ( &gravedad, &q) ;
  mpu.GetYawPitchRoll( ypr , &q, &gravedad);
  mpu.ConvertirAGrados ( ypr, xyz) ;
 
    //Serial.print(F("Yaw ")); Serial.print(xyz[0]); Serial.print(F(", "));
  //Serial.print(F("Tono ")); Serial.print(xyz[1]); Serial.print(F(", "));
  //Serial.print(F("Roll ")); Serial.print(xyz[2]); Serial.print(F(", "));
  // Serial.println();
 
//************************sistema de control***********


datos [ 0 ] = xyz [ 0 ];
datos [ 1 ]= xyz [ 1 ];
datos [ 2 ]= xyz [ 2 ];
datos [ 3 ]= aceleración [ 0 ];
datos [ 4 ]= aceleración [ 1 ];
datos [ 5 ]= aceleración [ 2 ];
datos [ 6 ]= giroscopio [ 0 ];
datos [ 7 ]= giroscopio [ 1 ];
datos [ 8 ]= giroscopio [ 2 ];


}

void setup () {
  /* inicializar serie */
  Serial.begin ( 115200) ;

     ////////////////////////////
    //solo si se utiliza MPU6050
    /////////////////////////////
   // Unirse al bus I2C (la biblioteca I2Cdev no lo hace automáticamente)
    //Wire.begin();
    mientras (!Serial);
    Serial.println(F ( "Inicio:" ) ) ;
   
   
// PARÁMETRO DE CONFIGURACIÓN MPU6050
  mpu.begin ( ) ;
  mpu.Set_DMP_Output_Rate_Hz(10);    // Establezca la velocidad de salida DMP de 200 Hz a 5 minutos.
  //mpu.Set_DMP_Output_Rate_Seconds(10);   // Establezca la velocidad de salida de DMP en segundos
  //mpu.Set_DMP_Output_Rate_Minutes(5);    // Establezca la tasa de salida de DMP en minutos
 #ifdef DESPLAZAMIENTOS
  Serial.println ( F ( " Usando desplazamientos" ) );
  mpu.SetAddress ( MPU6050_DEFAULT_ADDRESS );
  mpu.load_DMP_Image (OFFSETS); // Lo hace todo por ti

#demás
  Serial.println ( F ( "Dado que no se han definido compensaciones , vamos a calibrar este MPU6050 específico,\n")
                   "Comience colocando el MPU6050 de forma estacionaria sobre una superficie plana para obtener una calibración adecuada del acelerómetro."
                   "Coloca los nuevos desplazamientos en la línea #define OFFSETS... al principio del programa para un inicio súper rápido\n\n"
                   " \t\t\t[Presione cualquier tecla]" ));
  while ( Serial.available ( ) && Serial.read ( )); // búfer vacío
  while ( ! Serial.available ( ));                 // esperar datos
  while ( Serial.available ( ) && Serial.read ( )); // vaciar el búfer
//nuevamente
  mpu.SetAddress ( MPU6050_DEFAULT_ADDRESS );
  mpu.CalibrateMPU ( ) ;
  mpu.cargar_DMP_Imagen( ); // Lo hace todo por ti con la calibración .
#finsi
 mpu.on_FIFO(Print_Values);  stablecer la función de devolución de
//llamada que se activa cuando se recuperan datos FIFO  

 
}

bucle vacío () {
   static unsigned long FIFO_DelayTimer;                        //declaración de una variable.
if (( millis () - FIFO_DelayTimer) >= ( 99 )) {                  // 99ms en lugar de 100ms para comenzar a sondear la MPU 1ms antes de que lleguen los datos.
  if ( mpu.dmp_read_fifo ( false )) FIFO_DelayTimer = millis ( ); //  false = no se requiere conexión de pin de interrupción y cuando llegan datos al búfer FIFO se reinicia el temporizador
                                                             //falso = no se requiere adjuntar un pin de interrupción y cuando los datos llegan al búfer FIFO, reinicie el temporizador
}
 
if ( Serial . available ()!= 0 ) {
    val = Serial.read ( ) ;
  }
 
  //caso G -> tratar con MPU6050
  (val== 71 ){
    while ( Serial.available ( ) == 0 ) { }; // Esperando carácter
      val = Serial.read ( ) ;
     
      Si (val== 114 ) { //r = leer
        //obtener_datos_MPU6050();
       
      for ( int d = 0 ; d < 9 ; d++){
        Serial.print(data[d], 3);   // 3 decimales
        if(d < 8) Serial.print(" "); // separador espacio
        }
      Serial.println(); // salto de línea al final

             
        }
       
       
        val=- 1 ;
       
      }
     
       
  }  
En SCiLAB el Programa es:
atomsLoad ( " serial " ) ;
arduino  =  openserial ( " COM3 " ,  " 115200,n,8,1 " ) ;

// matriz para guardar datos
datos = [];
yaw = []; pitch = []; roll = [];

for k=1:50   // número de lecturas
    writeserial(arduino,"Gr");   // pedir datos
    sleep(200);                  // esperar respuesta
    linea = readserial(arduino);

    if linea <> [] then
        partes = tokens(linea,"");// separar por espacios
        ifsize(partes,"*")==9 then// solo procesar si hay 9 valores
        fila = [ ] ;
        para i = 1 : 9 fila ( i ) = strtod ( partes ( i ) ) ;
        FIN          

            // añadir fila a la matriz
            datos($+1,:) = fila;

            // acumular guiñada, cabeceo, alabeo 
            guiñada ( $ + 1 )  =  fila ( 1 ) ; 
            cabeceo ( $ + 1 )  =  fila ( 2 ) ; 
            alabeo ( $ + 1 )  =  fila ( 3 ) ;

            // graficar en tiempo real
            clf();
            plot([yaw' pitch' roll']);
            legend(["Yaw","Pitch","Roll"]);
            xtitle("Evolución de ángulos");
        else
            disp("Ignorado: " + linea); // línea de inicialización
        end
    end
end

closeserial ( arduino ) ;

// exportar con cabecera
cabecera = "Yaw,Pitch,Roll,Ax,Ay,Az,Wx,Wy,Wz";
lineas = [];
for i=1:size(datos,1)
    lineas(i) = string(datos(i,1)) + "," + string(datos(i,2)) + "," + ...
                string(datos(i,3)) + "," + string(datos(i,4)) + "," + ...
                string(datos(i,5)) + "," + string(datos(i,6)) + "," + ...
                string(datos(i,7)) + "," + string(datos(i,8)) + "," + ...
                string(datos(i,9));
end
todo = [cabecera; lineas];
mputl(todo, "mpu6050_datos.csv");

// mostrar en consola
disp("Matriz de datos:");
disp(datos);

Por último, es necesario modificar el archivo de comunicación que no funcionaba, 
el que venía por defecto. Si deseas descargarlo, pulsa AQUÏ. 
Para copiarlo en el ordenador, debes ir a la carpeta indicada y reemplazar el archivo existente.
C:\Usuarios\Diego\AppData\Roaming\Scilab\scilab-2024.0.0\atoms\x64\serial\0.5\macros

No hay comentarios:

Publicar un comentario