5 votos

Sensor para detectar el impacto de la bola

Quiero detectar el impacto de una pelota contra una raqueta de tenis de mesa.

Actualmente estoy usando Piezo discos fija firmemente en la raqueta de madera.

Sin embargo, además de detectar correctamente el impacto, el sensor detecta aceleraciones de repente en la raqueta. Como un ejemplo, es muy común hacer un movimiento rápido hacia atrás justo antes de golpear la pelota.

Mi enfoque es muy ingenuo: estoy leyendo el ADC tan rápido como sea posible y si el promedio de los últimos 10 medidas alcanza un umbral, considero que el impacto detectado. (He probado otros números además de 10.)

Preguntas:

  • Hay un mejor sensor para este propósito?
  • Si no, ¿cómo puedo diferenciar (o filtrar) los movimientos repentinos de la bola de impactos.

4voto

army Puntos 216

Este tipo de cosa se puede hacer con el evento de la discriminación.

Un evento discriminador acepta señales con la debida amplitud y contenido de frecuencia.

Para lograr esto en un simple micro-controlador de moderada capacidad de decir a 16MHz o mejor):

Olvidar el A2D, y aplicar su piezo señal a un comparador analógico. El comparador de salida, a continuación, se conecta a un pin de entrada configurada como una interrupción.

Una vez que el 1 de pulso llega, iniciar un temporizador, y continuar el conteo de pulsos de entrada. Una vez que el número de pulsos detectados, o el temporizador ha terminado, salir del bucle.

Si usted consigue el número de cuenta, y el temporizador está por debajo de algunos de recuento, a continuación, la señal es demasiado alta frecuencia, y puede ser descartado.

Si el temporizador ha expirado, y el número es demasiado bajo, entonces la señal es demasiado baja frecuencia, y puede ser descartado.

Otra cosa, la señal puede ser considerado como un evento.

Por supuesto, usted puede hacer todo esto con su A2d de datos, se acaba de tomar un cpu con más caballos de fuerza.

"¿Cuáles son los ajustes correctos?" Mirar en una bola de rebote con un alcance conectado al comparador de salida. Determinar el número de pulsos que son las más comunes por s sola pong pelota de rebote, así como el mínimo y el máximo de tiempo correspondiente a la frecuencia.

Buena suerte!

Pseudo Código:

//******************************************************************************
    //
    // INTERRUPT HANDLERS
    //
    //******************************************************************************
    // Port 1 interrupt service routine
    #pragma vector=PORT1_VECTOR
    __interrupt
    void Port_1(void) {
        //Only defined interrupt should be (P1.0).  Yes, slimy cheating here to keep things fast.

        //Bit1.0 - Initial Pulse detected.  Start Discrimination.

        //Start Window timing, TA1R should already be set to 0 somewhere else.
        TA1CTL |= TIMER_A_CONTINUOUS_MODE;

        //Start Pulse counting, TA2R should already be set to 0 somewhere else.
        TA2CTL |= TIMER_A_CONTINUOUS_MODE;

        //Disable this pin input interrupt
        P1IE = 0x0; //Hard-coded and blunt-force trauma for speed.

        State = Active;
    }

    //Handle interrupts from Timer A1 ('Timer1_A'), section 0 ('0') which connects to CCR0
    //This is the Frequency Window timer.
    #pragma vector=TIMER1_A0_VECTOR
    __interrupt
    void TIMER1_A0_ISR(void){
        //if we've made it here, then we've run out of time.  Abort.  Low Frequency.

        //Turn off/reset Pulse counter
        Timer_A_stop(TIMER_A2_BASE);
        Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0);

        //Turn off/reset this (Window) counter
        Timer_A_stop(TIMER_A1_BASE);

        State = LowF;
    }
    //Handle interrupts from Timer A2 ('Timer2_A'), section 0 ('0') which connects to CCR0
    //This is the pulse counter.
    #pragma vector=TIMER2_A0_VECTOR
    __interrupt
    void TIMER2_A0_ISR(void){
        //if we've made it here, then we have enough pulses. Check for event...

        //Turn off/reset the window counter
        Timer_A_stop(TIMER_A1_BASE);
        Timer_A_clearCaptureCompareInterrupt(TIMER_A1_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0);

        //Turn off/reset this (Pulse) counter
        Timer_A_stop(TIMER_A2_BASE);

        //Verifiy timer results outside the ISR, and determine is this is really a good event
        State = Verify; 
    }

3voto

user92574 Puntos 13

Creo que usted necesita para conectar el sensor a un osciloscopio y comparar la señal de voltaje durante los movimientos de la mano y durante el impacto de la bola, o volcado su ADC de datos y de la trama (como @Harry Svensson mencionado). Si no tienes buenos datos, entonces usted es sólo una suposición en el algoritmo correcto.

Creo que el balón pegó en un muy rápido aumento de tensión del tiempo, mientras que los movimientos de la mano será lento tiempo de subida. Si los datos confirma esto, entonces usted podría poner un amplificador operacional configurado como un elemento diferenciador ante la ADC. La salida variará en función de cómo de rápido el piezo señal va a cambiar, en lugar de estar basado en el nivel real .

enter image description here

El diagrama de arriba es de un buen tutorial sobre el elemento diferenciador del circuito en http://www.electronics-tutorials.ws/opamp/opamp_7.html

Básicamente, el más rápido de los componentes de voltaje de la señal aumenta (o disminuye) la mayor Vsal excursión será. El código que, a continuación, sólo tiene que buscar que superen un umbral como su presente algoritmo.

Tenga en cuenta el voltaje más alto de la excursión puede ser positivo o negativo durante el balón pegó dependiendo de la forma en que ha orientado su piezoeléctrico. Su análisis de la raw del sensor de datos revelará este.

Si el MCU es lo suficientemente rápido, incluso se podría hacer esto de forma digital en tiempo real. Básicamente, usted sólo tiene que mirar la diferencia entre las muestras y se disparan cuando usted ve una gran diferencia.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X