Para comunicar Arduino con SciLab he realizado el siguiente programa en Ardunio:
//#include " Wire.h "
//#include " I2Cdev.h "
//#include " MPU6050_6Axis_MotionApps20.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
sí (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 espaciosifsize(partes,"*")==9 then// solo procesar si hay 9 valoresfila = [ ] ;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