Calcule la distancia de los vectores del acelerómetro.
\ $ L = \ sqrt {x ^ 2 + y ^ 2 + z ^ 2} \ $
Tendrá aproximadamente una g activa en todo momento debido a la gravedad. Así que L debería ser aproximadamente 1 cuando la bicicleta no se mueve, y algo oscila cerca de 1 cuando te mueves.
Entonces, lo que realmente te interesa son las vibraciones causadas por la bicicleta en movimiento, no te interesa el ruido de gravedad de frecuencia larga. Esto significa que un filtro de paso alto dará un valor pequeño, cerca de 0.
El filtro de paso alto más simple sería algo como esto:
L_HP = L-L_t1;
L = L_t1;
-
L estará de acuerdo con la ecuación anterior
-
L_t1 será el valor anterior de L
-
L_HP contendrá información sobre las vibraciones sin ningún desplazamiento
Y todo lo que necesitas es una declaración if para decidir qué ruido se deriva de andar en bicicleta o de cualquier otro ruido no deseado.
if(L_HP>0.1){
//We've detected that the bike is moving
}
Pero a medida que las vibraciones vayan y vengan, la afirmación if se volverá verdadera y falsa en los pequeños momentos en que la manejemos, por lo que necesitará un temporizador que se active cada vez que detectemos que la bicicleta se está moviendo. Así que un temporizador como 1 segundo debería ser suficiente. Si puedes, usa los temporizadores reales que vienen con los microcontroladores, escribiré un pseudo código para que obtengas la información más precisa.
En definitiva, esta es la idea de cómo se puede hacer.
/*initiation*/{
float x = 0;
float y = 0;
float z = 0;
float L_HP = 0;
float L = 0;
float L_t1 = 0;
int timer=0;
}
/*major loop of the microcontroller*/{
L = sqrt(x*x+y*y+z*z);
L_HP = L-L_t1;
L = L_t1;
if(L_HP>0.1){//0.1 means g force of 0.1, you will have to
//change this threshold to something that you prefer.
timer = 10000;//Or some value that equals to 1 second
}
if(timer==0){
//We're not moving any more
}else{
//We're moving
timer -= 1;
}
}
Si el cálculo de la variable L lleva demasiado tiempo, entonces use L = abs (x) + abs (y) + abs (z), ganará ' Sea tan preciso, pero hará que el código se ejecute mucho más rápido.
Es difícil dar ayuda específica cuando no ha compartido el código, el microcontrolador, el lenguaje de programación, los problemas que realmente ha encontrado. Pero esta información general debería ser suficiente, si no es así, entonces elimine su pregunta y espere que alguien más la acompañe.
Buena suerte.