Acelerómetro con Arduino Uno: cableado y código ADXL335 (GY-61)

Para controlar las cosas a través del movimiento de gestos, GY-61 es un módulo de forma excelente y económica que permite administrar los momentos de las tres direcciones

En este tutorial, conectaremos el acelerómetro GY-61 con Arduino Uno, incluido el código, el diagrama de conexión y la lista de componentes.

Acelerómetro ADXL335 (GY-61)

Un acelerómetro es un dispositivo que mide la fuerza de aceleración debida a la gravedad a lo largo de los ejes X, Y y Z. Se aplica en todas las aplicaciones que requieren detección de inclinación. El acelerómetro mide la aceleración y produce un voltaje proporcional a la aceleración. Cualquier microcontrolador con PIN analógicos puede leer este voltaje.

En los teléfonos móviles, el arma secreta detrás de la detección de la rotación automática de la pantalla o la detección de inclinación utilizada en los juegos es el acelerómetro. Se aplica ampliamente en aplicaciones de detección de movimiento e inclinación de baja potencia, rentables, como teléfonos móviles y sistemas de juegos, etc.

Principio de funcionamiento del acelerómetro

Para comprender el funcionamiento de un acelerómetro, usar un ejemplo nos ayudará a comprender mejor el principio físico. Considere una pelota dentro de un cubo y de alguna manera suspendida en el aire. Si aplicamos una fuerza de manera que la pelota se desplace hacia el lado izquierdo con una aceleración de 1g (1g de aceleración equivale a 9,8 m/s2 de aceleración de la gravedad), la pelota chocará contra la pared X con una aceleración medida igual a 1 g. Entonces, en este caso, el valor de X será 1, mientras que el valor de los ejes Y y Z será cero.

Ahora, en otro caso, si colocamos el cubo en la superficie del suelo, entonces la pelota golpeará la pared Z con una fuerza de 1 g a lo largo del eje Z. Nuevamente aquí el valor de Z es 1 y el valor de X e Y es 0:

El acelerómetro tiene un tipo de estructura de chip específico diseñado en su superficie que tiene la capacidad de medir la aceleración. Hay dos tipos de placas en esta estructura: una placa fija y la otra está sostenida por un resorte que se desvía por la aceleración. Los resortes de polisilicio sostienen la estructura. La estructura tiene la capacidad de desviarse cada vez que aplicamos aceleración en cualquier eje en particular. Por ejemplo, cuando se aplica aceleración a lo largo del eje x, los resortes que sostienen la estructura se desvían y, de esta manera, detecta la aceleración a lo largo del eje x. Lo mismo ocurre con todos los demás ejes. Como resultado de la desviación, cambia la capacitancia entre las placas fijas y las placas suspendidas por resortes. La cantidad de cambio producido en la capacitancia es proporcional a la cantidad de aceleración o desviación causada a lo largo de cualquier eje.

Explicación del Acelerómetro con respecto al dieléctrico

Descripción del hardware y asignación de pines

El acelerómetro tiene un rango de detección entre -3g y 3g. El sensor tiene la capacidad de medir la aceleración dinámica así como la aceleración estática, siendo esta última debida a la detección de gravedad o inclinación. El movimiento, el choque o la vibración producen una aceleración dinámica.

ADXL335 (MPU 6050) funciona con voltaje en un rango entre 1,8 voltios y 3,6 voltios. Consume 350 microamperios. Como el pin de 3,3 voltios está disponible en Arduino Uno, se vuelve muy adecuado para interactuar con nuestro microcontrolador. Arduino puede leer los pines que proporcionan el valor para el eje x, el eje y y el valor de aceleración del eje z.

VCC: Este es el pin de alimentación. Desde Arduino Uno, conecte 3,3 voltios o 5 voltios en este pin.

XOUT: el pin de salida X emite el valor analógico producido en proporción a la aceleración a lo largo del eje X.

YOUT: Y out pin emite el valor analógico producido en proporción a la aceleración a lo largo del eje Y.

ZOUT: Z out pin emite el valor analógico producido en proporción a la aceleración a lo largo del eje Z.

GND: este pin de tierra se conecta al pin de tierra en Arduino Uno.

ST (AUTOPRUEBA): El pin de autoprueba nos permite verificar si el sensor está funcionando o no

Configuración de pines de ADXL335.jpg

Lo que necesitamos

Como de costumbre, sugiero agregar desde ahora a su carrito de compras de comercio electrónico favorito todo el hardware necesario, para que al final pueda evaluar los costos generales y decidir si continúa con el proyecto o los elimina del carrito de compras. Entonces, el hardware será solo:

Consulta precios de hardware en los siguientes enlaces:

Procedimiento paso a paso

Conexión con Arduino

Como se muestra en la imagen a continuación, el sensor se conecta con Arduino Uno. Siga el cableado que, de acuerdo con Arduino Uno Pinout para realizar las conexiones.

PIN Arduino >> PIN ADXL:

La conexión de Arduino con ADXL 335 no es tan difícil. A continuación se muestra una imagen que se explica por sí misma. El pin Vcc se conecta con el pin 3.3v en Arduino Uno y el pin GND en el sensor se conecta con el pin de tierra en Arduino. Los pines X OUT, Y OUT, Z OUT se conectan a los pines analógicos de Arduino, a saber, A0, A1 y A2.

Obtenga Accelerometer.ino y la explicación del código

Conecte su PC a Arduino y abra Arduino IDE. Para los primeros pasos, puede consultar el tutorial Conexión de PC con Windows con Arduino. Puedes obtener el código .ino desde mi área de descargas con el siguiente enlace:

Acelerómetro.ino

El código comienza con líneas donde declaramos los pines analógicos de entrada. Como el ADC de Arduino es de 10 bits, los valores máximo y mínimo reciben el valor 0 y 1023 en las variables RawMin y RawMax.

La constante «sampleSize» creará lecturas de ejes con un cálculo promedio en un número de muestras (10). Esto permite evitar lecturas temporales que puedan afectar la precisión del dispositivo.

En la función de configuración, inicializamos el monitor serie con una velocidad de 9600 baudios.

const int xInput= A0; const int yInput= A1; const int zInput= A2; int RawMin=0; int RawMax=1023; const int sampleSize = 10;  void setup() { Serial.begin(9600); }

Ahora, en la sección de bucle, la primera línea lee la entrada x (valor de la aceleración a lo largo del eje x) y la almacena en una variable llamada «xRaw». La función ReadAxis() es una función personalizada que se describirá más adelante en el código.

void loop() { int xRaw = ReadAxis(xInput); int yRaw = ReadAxis(yInput); int zRaw = ReadAxis(zInput);

Luego, usando la siguiente línea en el código, el mapa de valores entre -3000 y 3000. Por ejemplo, si el valor de «xRaw» es 0, entonces el valor de «xScaled» será -3000 y, en caso de que el valor sea máximo, entonces «xScaled» tendrá un valor de 3000. Lo mismo ocurre con yScaled y zScaled.

long xScaled = map(xRaw, RawMin, RawMax, -3000,3000); long yScaled = map(yRaw, RawMin, RawMax, -3000,3000); long zScaled = map(zRaw, RawMin, RawMax, -3000,3000);

Ahora, en la variable xScaled, yScaled y zScaled se dividen por 1000 y, por lo tanto, su valor se vuelve entre -3 y 3, que es el rango del sensor.

float xAccel = xScaled/1000.0; float yAccel = yScaled/1000.0; float zAccel = zScaled/1000.0;

Ahora estas variables denominadas ‘xAccel, yAccel, zAccel’ son los valores de la aceleración gravitatoria a lo largo de los ejes x, y y z. Sus valores se muestran en el monitor serie.

Serial.print("X, Y, Z :: "); Serial.print(xRaw); Serial.print(", "); Serial.print(yRaw); Serial.print(", "); Serial.print(zRaw); Serial.print(" :: "); Serial.print(xAccel,0); Serial.print("G, "); Serial.print(yAccel,0); Serial.print("G, "); Serial.print(zAccel,0); Serial.print("G, "); delay(200); }

Finalmente, la definición de la función ReadAxis(). Como puede ver en el código, simplemente lee el valor analógico del PIN y repite la medición un número de veces igual al valor «sampleSize» (10), sumándolo a la variable local «lectura». Al final de la función, antes de devolver el valor leído al ciclo principal, dividimos el resultado por «sampleSize» para obtener el promedio matemático:

int ReadAxis(int axisPin) { long reading=0; analogRead(axisPin); delay(1); for(int i=0; i< sampleSize;i++)   {   reading += analogRead(axisPin);   } return reading/sampleSize; }