Usar un acelerómetro para medir aceleraciones es una de las cosas más sencillas del mundo de la electrónica y a su vez es extremadamente útil. Imagina que necesitas saber que inclinación tiene el terreno sobre el que está tu Robot o tu vehículo tele-controlado. Podemos medirlo gracias a los datos del acelerómetro y un poco de trigonometría.

Acelerómetro MPU_6050
Acelerómetro MPU_6050

Gracias a un acelerómetro no solo podemos medir la orientación en base a la aceleración de la gravedad, sino que también podemos medir otro tipo de aceleraciones. Por ejemplo, las aceleraciones a las que nos vemos sometidos al subirnos a una montaña rusa.

Cómo usar el acelerómetro en Arduino

Este tipo de dispositivos son fáciles de usar con Arduino ya que se comunican con el mundo via I2C o SPI. Por tanto, para poder obtener una lectura tenemos que establecer una comunicación serie con el componente y pedirle que nos envíe el último dato.

En este vídeo puedes ver cómo leer los datos de aceleración usando Arduino.


El código de Arduino

El siguiente código es el que uso en el vídeo.

Ten en cuenta que si queremos usar otro acelerómetro distinto al MPU_6050 tenemos que adaptar el código a las posiciones de memoria que nos indique el datasheet.

/*
* Puedes distribuirlo y modificar el código.
*
* RincónIngenieril
* Versión: 1.0
* Fecha: 18/07/2015
*/
#include<Wire.h>
//Dirección I2C del acelerómetro
const int MPU=0x68;
// Variables para aceleración
int16_t AcX,AcY,AcZ;
// Variable para temperatura
int16_t Tmp;
// Variables para velocidad angular
int16_t GyX,GyY,GyZ;
void setup(){
Wire.begin();		//Iniciar I2C
Wire.beginTransmission(MPU);	//Iniciar comunicación
Wire.write(0x6B);  // Configurar regisstro
Wire.write(0);     // Despertar al múdulo de sleep
Wire.endTransmission(true);	//Finalizar transmisión
Serial.begin(9600);	//Abrir puerto serie
}
void loop(){
Wire.beginTransmission(MPU);	//Iniciar comunicación
Wire.write(0x3B);  // Registro desde el que empezamos a leer
Wire.endTransmission(false);
Wire.requestFrom(MPU,14,true);  // Pedimos 14 registros
//Recibimos los registos de la memoria del MPU-6050
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
//Imprimimos en el puero serie
Serial.print("AcX = "); Serial.print(AcX);
Serial.print(" | AcY = "); Serial.print(AcY);
Serial.print(" | AcZ = "); Serial.print(AcZ);
//La temperatura hay que calcularla
//temperatura = (tmp/340.00)+36.53
Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);
Serial.print(" | GyX = "); Serial.print(GyX);
Serial.print(" | GyY = "); Serial.print(GyY);
Serial.print(" | GyZ = "); Serial.println(GyZ);
delay(200);
}

Introducción a los acelerómetros


Enrique Gómez

Ingeniero Electrónico Industrial y Automático, amante de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars, cuenta más de lo que parece. Puedes saber más sobre mi y sobre mis trabajos en enrique.rinconingenieril.es
Suscribete
Notificame
guest
0 Comments
Inline Feedbacks
View all comments