domingo, 10 de febrero de 2013

Probando el acelerometro "MMA7361L" con Arduino y Processing



En esta ocasión estaremos probando este acelerómetro de la compañía Freescale, conectándolo a arduino y usando processing para visualizar los datos de una forma muy interesante.

Las características generales del  MMA7361L son:

  • Salida analógica
  • Alimentación a 3.3V
  •  De 3 ejes,  x, y, z
  •  Selector de gravedad (+-1.5 G y 6 G)
  •   Detector de caída libre
  • Modo de “sleep”
  •  Bajo consumo de corriente 500 µA
Recomiendo leas la hoja de datos de este dispositivo.

 

Tuve la oportunidad de comprar este acelerómetro montado en un pequeño PCB. Que es compatible con protoboard, el cual incluye el acelerómetro, un regulador para usar el chip a 5V, y un led que indica que si hay alimentación eléctrica. La tarjetita en cuestión esta:



 
La conexión con Arduino es muy simple:

PCB con acelerómetro
Arduino
GND
GND
5V o 3.3V *
5V o 3.3V *
SL (sleep)
3.3V 
X
A0
Y
A1

*Tener cuidado de conectar a las terminales correctas del voltaje que elijamos.

Como se aprecia, utilizaremos 2 entradas analógicas del arduino, en el programa leeremos esos ejes y los enviaremos por conexión serial, si el arduino recibe una ‘x’ enviara el valor del eje X, y si recibe una ‘y’ enviara el valor del eje Y, si no recibe nada no enviara tampoco nada.

El programa es bastante sencillo y es el siguiente:


//Codigo hecho por Noé Ibáñez Ramírez
//Microcontroleando.blogspot.com.mx
//Acelerometro 3 ejes
byte pon;

void setup(){
  Serial.begin(9600); //Configuracion de la UART
  }

void loop(){

  if (Serial.available() > 0) {   //Si la conexion esta presente, lee el valor y lo carga a una variable llamada inByte
    int inByte = Serial.read();

  switch (inByte) {    //Comparamos el valor leido de la comunicacion UART
 
    case 'x':  //Si recibimos una X, leemos el valor del eje X (A0) y lo enviamos por la UART                    
    { 
    int val=analogRead(0);  //Lee el canal analogico 0
    val=val/4;              //convertimos nuestro valor de 10 bits en uno de 8bits
    Serial.print(val,pon);  //Envia el dato como un byte
    delay(45);  
    break;}
   
    case 'y':                //Si recibimos una Y, leemos el valor del eje Y (A1) y lo enviamos por la UART
    {
    int val=analogRead(1);   //Lee el canal analogico 1
    val=val/4;               //convertimos nuestro valor de 10 bits en uno de 8bits
    Serial.print(val,pon);   //Envia el dato como un byte
    delay(45);
    break; }
  }
}
}


Teniendo esto pasamos a la parte de processing, para los que ya manejan el programa sabrán que es bastante fácil de usar, para los que no lo conocen, aquí hay un link donde explica de que hablamos.

El programa hecho en processing envía por el puerto serie primero una ‘x’ y guarda el valor que le envía el arduino, después envía una ‘y’ y también guarda ese valor, después dibuja una figura en 3D, que rota de acuerdo a los valores leídos antes. Es el funcionamiento del programa, el código es el siguiente:

//Codigo hecho por Noé Ibáñez Ramírez
//Microcontroleando.blogspot.com.mx
//Acelerometro 3 ejes
 
 import processing.serial.*;  //importamos la biblioteca necesaria para la conexion serial

Serial myPort;  // Creamos un objeto de la clase "Serial"
int val;      // En esta variable guardaremos los valores recibido en el puerto serial

void setup()
{
    size(600, 400, P3D);  //Tamaño de la ventana y aclaramos que usaremos P3D para el 3D
    myPort = new Serial(this, "COM9", 9600);  //Configuracion de la conexion serial, revisar el COM al que se encuentra conectado su arduino
    smooth();   
    frameRate(60);   //Cuadros por segundo que se dibujaran
    stroke(20,11,36);  //Color del delineado de la figura
}
int i=0;    //Declaracion de variables
float x=0;
float y=0;

void draw()
{
    background(0);  //Fondo de color negro
  
   myPort.write('x');   //Escribe en el puerto una 'x'
 
     if ( myPort.available() > 0) {  //Espera a recibir un dato
     val=myPort.read();     // Lee ese valor y lo guarda en val
     x=-(val-88)*2.25;  //Acondicionamiento del dato
    }
   
    myPort.write('y');  //Escribe en el puerto una 'y'
 
     if ( myPort.available() > 0) {  //Espera a recibir un dato
     val=myPort.read();      // Lee ese valor y lo guarda en val
     y=(val-90)*2.25;  //Acondicionamiento del dato
    }
   
    pushMatrix();    //Dibujando el objeto 3D
    translate( width/2, height/2); //Lo situamos en medio de la pantalla
    rotateX(radians(x));   //Rotamos en X
    rotateZ(radians(y));   //Rotamos en Y
    fill(48,218,37);      //Color de relleno de la figura
    box(100, 70, 180);   //Dimensiones de la figura
    popMatrix();
  
}


 Ahora miremos la siguiente imagen:



Se midieron valores de los ejes X y Y en 3 posiciones distintas (Al final en el video se entenderá un poco más esto), obteniendo el voltaje con un multímetro:

Eje
90°
-90°
X
1.7 V
0.8 V
2.5 V
Y
1.8 V
1 V
2.6 V

Estos valores son los que se usaron para calcular la parte que llamo “acondicionar el dato”, lo que hace es utilizar los valores leídos y convertirlos a un dato que sirva para rotar la figura. Nota: Si hace falta y alguien lo requiere puedo explicar más ampliamente en otro post esta última parte. 


Bien pues no queda más que dejar el resultado en un video:

 

Espero les haya gustado el post, si tienen alguna duda, sugerencia o reclamo dejen un comentario o envíen un correo, les contestare a la brevedad.

Saludos

3 comentarios:

  1. hola, gran aporte.
    quisiera saber si me puedes regalar el plano de conexión para probarlo. mi correo es:
    lordomar979@gmail.com
    Muchas Gracias.

    ResponderEliminar
  2. hola,
    quisiera saber si me puedes regalar el plano de conexión para probarlo. mi correo es:
    diego.barba89@gmail.com

    Muchas Gracias.

    ResponderEliminar
  3. Hola, me gustaria saber si me podrias ayudar para acondicionar el valor de "Z' ya que estoy utilizando un acelerometro en las tres dimensiones
    gracias

    ResponderEliminar