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
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 ejesimport 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
|
0°
|
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
hola, gran aporte.
ResponderEliminarquisiera saber si me puedes regalar el plano de conexión para probarlo. mi correo es:
lordomar979@gmail.com
Muchas Gracias.
hola,
ResponderEliminarquisiera saber si me puedes regalar el plano de conexión para probarlo. mi correo es:
diego.barba89@gmail.com
Muchas Gracias.
Hola, me gustaria saber si me podrias ayudar para acondicionar el valor de "Z' ya que estoy utilizando un acelerometro en las tres dimensiones
ResponderEliminargracias