Acelerómetro GY 61 - javierre/nodemcu GitHub Wiki
Se trata de un acelerómetro de 3 ejex (X, Y, Z). Con él podemos medir cualquier aceleración en estos 3 ejes referidos de forma local respecto del sensor, que lleva en la placa las flechas de dirección X e Y además de un punto saliente para el eje Z. Siempre debemos recordar que con la regla de la mano derecha podemos cerrar la mano en el sentido más corto de X a Y y obtener con el pulgar el sentido del eje Z.
El sensor tiene 2 entradas para alimentación y 3 salidas analógicas (para los ejes X, Y, Z), por tanto si usamos una placa como NodeMCU, que sólo tiene una entrada analógica, sólo podremos leer uno de los ejes del acelerómetro.
El rango de medición es +/-3g (g=Gravedad terrestre).
Y si comprobamos en Herramientas->Monitor serie, podemos ver la salida al mover el sensor:
/* Interface Accelerometer with NodeMCU
* By TheCircuit
*/
const int zPin = A0; //z-axis of the Accelerometer
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}
void loop() {
int sensorValue=analogRead(zPin);
float zgravity=(float)(sensorValue-483)*9.8/100;
delay(100);
Serial.print("z-axis : ");
Serial.println(zgravity);
}
Con este sensor podemos medir aceleraciones y frenazos (desaceleraciones), con lo que se puede utilizar para estimar la trayectoria de un robot (al saber si se mueve con velocidad constante o no...). Además, sabiendo que la gravedad vale 9.8m/s^2, también podemos medir el ángulo que forma el sensor (o donde esté colocado) respecto del suelo. Así, si el eje Z debería medir 9.8m/s^2 en situación de reposo y en un momento determinado mide 0 será porque el eje Z del sensor se encuentra a 90º con respecto a la normal de la superficie de la Tierra. En general, el ángulo que forma el sensor con el plano terrestre será (en grados) α = 180*arccos(Z_OUT/9.8)/Pi;.
/* Interface Accelerometer with NodeMCU
* By TheCircuit
*/
#include <math.h>
const int zPin = A0; //z-axis of the Accelerometer
const float Pi = 3.14159;
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}
void loop() {
int sensorValue=analogRead(zPin);
float zgravity=(float)(sensorValue-483)*9.8/100;
delay(100);
Serial.print("z angle : ");
double angle = 180*acos(double(zgravity/9.8))/Pi;
if(isnan(angle))angle=0;
Serial.println(angle);
}