EJERCICIO Lectura de un acelerómetro Memsic 2125

Descripción del ejercicio

El acelerómetro Memsic 2125 es un acelerómetro de dos ejes de Parallax capza de medir aceleraciones de hasta 2G. A la hora de realizar mediciones muy precisas, el sensor cuenta con un pin de temperatura que puede ser utilizado para compensar posibles errores.

Los pins dedicados a realizar mediciones de aceleración se pueden conectar directamente a las entradas digitales de la placa Arduino, mientras que el pin de temperatura debe ser contemplado como entrada analógica. Los pines de aceleración envían al PC señales en forma de pulsos cuya amplitud representa la aceleración.

El ejemplo que aquí se muestra lo implementó Anders Gran, mientras que el software fue desarrollado por Marcos Yarza, que es el investigador de tecnologías de aceleración para la placa Arduino en la Universidad de Zaragoza, España. Las conexiones a la placa son mínimas ... sólo los pines correspondientes a los dos ejes (X,Y) están conectados a la placa. El pin de temperatura no lo utilizamos.

Elementos necesarios:

  • Un sensor de aceleración Mensic 2125.
  • Una placa protoboard.
  • Cables para realizar las conexiones.

Detalle del conexionado del sensor Memsic 2125

Esquema

Placa protoboard con un acelerómetro conectado. Imágen de Anders Gran

Código fuente

/* Sensor de aceleración (Acelerómetro)

 * -------------------------------------
 *
 * Lee un acelerómetro de 2D conectado a una
 * par de entrdas digitales y envía sus valores
 * a través del puerto serie. El LED de monitorización
 * parpadea una vez enviada la información
 *
 *
 * http://www.0j0.org
 * copyleft 2005 K3 - Malmo University - Sweden
 * @author: Marcos Yarza
 * @hardware: Marcos Yarza
 * @project: SMEE - Experiential Vehicles
 * @sponsor: Experiments in Art and Technology Sweden, 1:1 Scale
 */

 int ledPin = 13;                    // PIN del LED
 int xaccPin = 7;                    // PIN de la coordenada X del acelerómetro
 int yaccPin = 6;                    // PIN de la coordenada Y del acelerómetro
 int value = 0;                      // Lectura del sensor
 int accel = 0;                      // Aceleración
 char sign = ' ';                    // Signo de la aceleración
 int timer = 0;                      // Amplitud de la señal
 int count = 0;                      // Contador

void setup() {

  beginSerial(9600);                 // Inicializa las comunicaciones a 9600 baudios
  pinMode(ledPin, OUTPUT);           // PIN del LED --> Salida
  pinMode(xaccPin, INPUT);           // PIN de coordenada X --> Entrada
  pinMode(yaccPin, INPUT);           // PIN de coordenada Y --> Entrada

}

/* (int)operateAcceleration

 * función que calcula la aceleración
 * devuelve un entero
 */

int operateAcceleration(int time1) {

  return abs(8 * (time1 / 10 - 500));

}

/* (void) readAccelerometer

 * procedimeinto para leer el sensor, calcula
 * la aceleración y muestra el valor
 */

void readAcceleration(int axe){

  timer = 0;
  count = 0;
  value = digitalRead(axe);
  while(value == HIGH) {                // Itera hasta leer un valor BAJO en el pin
    value = digitalRead(axe);
  }
  while(value == LOW) {                 
    value = digitalRead(axe);           // Itera hasta leer un valor ALTO en el pin
  }
  while(value == HIGH) {
    value = digitalRead(axe);           // Itera hasta leer de nuevo un valor BAJO en el pin y cuenta.
    count = count + 1;
  }
  timer = count * 18;                   // Calcula el tiempo en milisegundos
  if (timer > 5000){                    // Signo de opración: + o - en función del tiempo 
    sign = '+';
  }
  if (timer < 5000){
    sign = '-';
  }
  accel = operateAcceleration(timer);   // Determina el valor de la aceleración
  if (axe == 7){                        // Representa la aceleración sobre el puerto serie
    printByte('X');
  } 
  else {
    printByte('Y');
  }
  printByte(sign);
  printInteger(accel);
  printByte(' ');

}

void loop() {

  readAcceleration(xaccPin);             // Lee y representa la aceleración en el eje X
  readAcceleration(yaccPin);             // Lee y representa la aceleración en el eje Y
  delay(300);
  digitalWrite(ledPin, LOW);

}

Acelerómetro montado por M. Yarza en una placa de prototipos.

Este ejemplo es una adaptación del anterior. Marcos Yarza le añadió dos resistencias de 220 ohmios a los pines de salida del acelerómetro. La placa elegida para realizar este pequeño circuito es una parte de una placa de prototipos. El código en este caso es el mismo que antes (cambiando los pines de entrada a los pines 2 y 3), pero la instalación de la placa permite incrustar el circuito completo en un espacio mucho más pequeño.