Este sensor es un giroscopio y acelerómetro de tres ejes. Pulsa aquí para ver más información del sensor MPU-6050.
En el PC se utiliza un programa realizado en Lazarus que recibe los datos del MPU-6050 y los visualiza en forma de gráfico...
El programa propone por defecto el puerto "COM6:" en Windows y el puerto "/dev/ttyUSB0" en Linux. Si se tratase de otro puerto habrá que cambiarlo en la pantalla del programa...
Vídeo del funcionamiento de este montaje (Archivo MP4. Tamaño: 145 MB)
En este montaje se usa la conexión con protocolo I2C para la comunicación entre el sensor y el Arduino Nano. Se utiliza un "Level Converter MH" de 4 conexiones para convertir el voltaje de las señales de 5V del Arduino Nano a las señales de 3.3V del MPU-6050.
Cableado entre el Arduino Nano, el conversor de nivéles lógicos y el sensor MPU-6050
Arduino Nano | Conversor voltajes | Sensor MPU-6050 |
---|---|---|
GND | GND | GND |
5V | HV | - |
3V | LV | VCC |
A5 | HV1 | - |
A4 | HV2 | - |
- | LV1 | SCL |
- | LV2 | SDA |
D2 | - | INT |
Programación del Arduino Nano con el sensor MPU-6050
Para probar el funcionamiento de este sensor se ha utilizado en el Arduino Nano el programa "MPU6050_angulo.ino" que ofrece la página web https://arduproject.es/mpu6050-y-su-programacion/ y que se puede descargar desde el repositorio de GitHub "DRONE DESDE CERO - Sensor MPU6050". En las siguientes líneas se muestra ese programa...
/* Leer sensor MPU6050 (datos raw o sin procesar) Más información en https://arduproject.es/mpu6050-y-su-programacion/ */ #define usCiclo 5000 // Ciclo de ejecución de software en microsegundos #include <Wire.h> // MPU6050 #define MPU6050_adress 0x68 float gyro_Z, gyro_X, gyro_Y, temperature, gyro_X_cal, gyro_Y_cal, gyro_Z_cal; int gx, gy, gz, cal_int; float acc_total_vector, ax, ay, az; bool set_gyro_angles, accCalibOK = false; float acc_X_cal, acc_Y_cal, acc_Z_cal, angulo_pitch_acc, angulo_roll_acc, angulo_pitch, angulo_roll; long tiempo_ejecucion, loop_timer; void setup() { Wire.begin(); Serial.begin(115200); // Iniciar sensor MPU6050 MPU6050_iniciar(); // Calibrar giroscopio y acelerómetro. El sensor tiene que estar inmovil y en una supercifie plana. // Leer los datos del MPU6050 3000 veces y calcular el valor medio for (cal_int = 0; cal_int < 3000 ; cal_int ++) { MPU6050_leer(); // Leer sensor MPU6050 gyro_X_cal += gx; gyro_Y_cal += gy; gyro_Z_cal += gz; acc_X_cal += ax; acc_Y_cal += ay; acc_Z_cal += az; delayMicroseconds(50); } gyro_X_cal = gyro_X_cal / 3000; gyro_Y_cal = gyro_Y_cal / 3000; gyro_Z_cal = gyro_Z_cal / 3000; acc_X_cal = acc_X_cal / 3000; acc_Y_cal = acc_Y_cal / 3000; acc_Z_cal = acc_Z_cal / 3000; accCalibOK = true; loop_timer = micros(); } void loop() { // Nuevo ciclo while (micros() - loop_timer < usCiclo); tiempo_ejecucion = (micros() - loop_timer) / 1000; loop_timer = micros(); MPU6050_leer(); // Leer sensor MPU6050 MPU6050_procesar(); // Procesar datos del sensor MPU6050 // Monitor Serie Serial.print(angulo_pitch); Serial.print("\t"); Serial.println(angulo_roll); } // Iniciar sensor MPU6050 void MPU6050_iniciar() { Wire.beginTransmission(MPU6050_adress); Wire.write(0x6B); // PWR_MGMT_1 registro 6B hex Wire.write(0x00); // 00000000 para activar Wire.endTransmission(); Wire.beginTransmission(MPU6050_adress); Wire.write(0x1B); // GYRO_CONFIG registro 1B hex Wire.write(0x08); // 00001000: 500dps Wire.endTransmission(); Wire.beginTransmission(MPU6050_adress); Wire.write(0x1C); // ACCEL_CONFIG registro 1C hex Wire.write(0x10); // 00010000: +/- 8g Wire.endTransmission(); } // Leer sensor MPU6050 void MPU6050_leer() { // Los datos del giroscopio y el acelerómetro se encuentran de la dirección 3B a la 14 Wire.beginTransmission(MPU6050_adress); // Empezamos comunicación Wire.write(0x3B); // Pedir el registro 0x3B (AcX) Wire.endTransmission(); Wire.requestFrom(MPU6050_adress, 14); // Solicitar un total de 14 registros while (Wire.available() < 14); // Esperamos hasta recibir los 14 bytes ax = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) ay = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) az = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L) temperature = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L) gx = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L) gy = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L) gz = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L) } // Cálculo de velocidad angular (º/s) y ángulo (º) void MPU6050_procesar() { // Restar valores de calibración del acelerómetro ax -= acc_X_cal; ay -= acc_Y_cal; az -= acc_Z_cal; az = az + 4096; // Restar valores de calibración del giroscopio y calcular // velocidad angular en º/s. Leer 65.5 en raw equivale a 1º/s gyro_X = (gx - gyro_X_cal) / 65.5; gyro_Y = (gy - gyro_Y_cal) / 65.5; gyro_Z = (gz - gyro_Z_cal) / 65.5; // Calcular ángulo de inclinación con datos del giroscopio // 0.000000266 = tiempo_ejecucion / 1000 / 65.5 * PI / 180 angulo_pitch += gyro_X * tiempo_ejecucion / 1000; angulo_roll += gyro_Y * tiempo_ejecucion / 1000; angulo_pitch += angulo_roll * sin((gz - gyro_Z_cal) * tiempo_ejecucion * 0.000000266); angulo_roll -= angulo_pitch * sin((gz - gyro_Z_cal) * tiempo_ejecucion * 0.000000266); // Calcular vector de aceleración // 57.2958 = Conversion de radianes a grados 180/PI acc_total_vector = sqrt(pow(ay, 2) + pow(ax, 2) + pow(az, 2)); angulo_pitch_acc = asin((float)ay / acc_total_vector) * 57.2958; angulo_roll_acc = asin((float)ax / acc_total_vector) * -57.2958; // Filtro complementario if (set_gyro_angles) { angulo_pitch = angulo_pitch * 0.99 + angulo_pitch_acc * 0.01; angulo_roll = angulo_roll * 0.99 + angulo_roll_acc * 0.01; } else { angulo_pitch = angulo_pitch_acc; angulo_roll = angulo_roll_acc; set_gyro_angles = true; } }
Pulsa aquí para descargar el código "MPU6050_angulo.ino" o accede al repositorio de GitHub del creador de este programa: "DRONE DESDE CERO - Sensor MPU6050"
Programa para el PC
- Descargar ejecutable del programa para un PC con Linux tipo Debian de 64 bits: mpu6050laz-lin-ejecutable.zip (Archivo ZIP. Tamaño: 6,7 MB)
- Descargar ejecutable del programa para un PC con Windows: mpu6050laz-win-ejecutable.zip (Archivo ZIP. Tamaño: 5,1 MB)
- Descargar el código fuente del programa para un PC con Linux: mpu6050laz-lin-fuentes.zip (Archivo ZIP. Tamaño: 8,3 MB)
- Descargar el código fuente del programa para un PC con Windows: mpu6050laz-win-fuentes.zip (Archivo ZIP. Tamaño: 2,8 MB)
- Descargar la librería SYNAPSE desde la web de Ararat: http://www.ararat.cz/synapse/lib/exe/fetch.php/file:synapse40.zip (Archivo ZIP. Tamaño 898 KB)
Ver información del sensor MPU-6050