Cómo detectar el acelerómetro se está moviendo

0

Estoy utilizando el acelerómetro de 3 ejes MCU Intergrade y lo puse en la bicicleta. Quiero detectar que la bicicleta se está moviendo o se detiene. Pero el ruido de vibración dejó que mi función fallara.

¿Alguien podría compartir información sobre la detección de acelerómetros en movimiento?

Gracias.

    
pregunta vk8051

3 respuestas

2

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.

    
respondido por el Harry Svensson
2

Es simple: probablemente no puedas.

Los acelerómetros no pueden distinguir entre ninguna velocidad uniforme, incluido cero. Por definición, la velocidad uniforme de cualquier magnitud tiene una aceleración cero.

Si puede determinar cuándo el acelerómetro está en reposo (por ejemplo, como comentó Tomnexus, buscando la ausencia de ruido), entonces, en principio, puede integrar la aceleración para obtener velocidad.

Por otra parte, si el ruido al que te refieres es el ruido del acelerómetro que se produce cuando el acelerómetro está parado, es probable que no tengas suerte. Puede integrar la señal y dejar que el ruido (más o menos) se promueva, pero eso solo funcionará si la señal promedio es significativamente más alta que la especificación de deriva del acelerómetro. Sin saber más, no hay forma de saber si tienes una oportunidad.

    
respondido por el WhatRoughBeast
0

La forma más confiable sería colocar el acelerómetro en una posición fija en el interior de la llanta. Al menos un eje variaría sinusoidalmente alrededor de \ $ \ pm 1g \ $, ya que va del lado derecho hacia arriba debido a la rotación de la rueda. Necesitaría un anillo deslizante para evitar que los cables se retuerzan, a menos que se encuentre en un módulo independiente. La comunicación inalámbrica también sería una opción viable.

De hecho, su velocidad sería una función lineal con la frecuencia de la onda sinusoidal.

    
respondido por el Scott Seidman

Lea otras preguntas en las etiquetas