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.
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); }