Sensor para detectar impacto de pelota

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

Actualmente estoy usando discos piezoeléctricos firmemente fijados en la madera de la raqueta.

Sin embargo, además de detectar correctamente el impacto, el sensor también detecta aceleraciones bruscas en la raqueta. Como 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 lo más rápido posible y si el promedio de las últimas 10 medidas alcanza un umbral, considero el impacto detectado. (Probé con otros números además del 10).

Preguntas:

  • ¿Hay un mejor sensor para este propósito?
  • Si no, ¿cómo puedo diferenciar (o filtrar) los movimientos repentinos de los impactos de pelota?
Recomendaría usar un acelerómetro.
un simple micrófono podría funcionar.
@Trevor Me gusta tu idea, pero puede ser difícil filtrar los golpes de los oponentes, o si la pelota simplemente rebota en el suelo. Una combinación de un micrófono y un acelerómetro se aseguraría de que se produjera un golpe y de que tu raqueta se balanceara. O micrófono + discos piezoeléctricos.
Volcar varios impactos de ejemplo en Excel y diseñar un algoritmo de procesamiento en Excel. Pruebe el algoritmo contra falsos impactos.
Creo que usar un sensor piezoeléctrico es una buena idea (acondicionamiento de señal barato y muy simple). Yo esperaría que la señal en el impacto de la pelota fuera mucho más fuerte (voltaje más alto) y más corta (FWHM < 0.1s) que cualquier aceleración causada por el movimiento manual de la raqueta. Debería ser fácil discriminar ambas señales.
Puede combinar datos de piezo y micrófono para obtener resultados más precisos. No tienes que depender de un solo sensor.

Respuestas (2)

Creo que necesita 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 pelota, o descargar sus datos ADC y trazarlos (como mencionó @Harry Svensson). Si no tiene buenos datos, entonces solo está adivinando el algoritmo correcto.

Creo que el golpe de la pelota tendrá un tiempo de aumento de voltaje muy rápido, mientras que los movimientos de la mano tendrán un tiempo de aumento lento. Si los datos lo confirman, entonces podría colocar un opamp configurado como diferenciador antes del ADC. Su salida variará según la rapidez con la que cambie la señal piezoeléctrica, en lugar de basarse en el nivel real.

ingrese la descripción de la imagen aquí

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

Básicamente, cuanto más rápido suba (o baje) la señal de voltaje piezoeléctrico, mayor será la excursión de Vout. Su código entonces solo busca exceder un umbral como su algoritmo actual.

Tenga en cuenta que la excursión de voltaje más alta puede ser positiva o negativa durante el golpe de la pelota, dependiendo de la forma en que haya orientado su piezoeléctrico. Su análisis de los datos sin procesar de su sensor lo revelará.

Si su MCU es lo suficientemente rápido, incluso podría hacerlo digitalmente en tiempo real. Básicamente, solo necesita ver la diferencia entre las muestras y disparar cuando vea una gran diferencia.

Este tipo de cosas se pueden hacer con la discriminación de eventos .

Un discriminador de eventos acepta señales con la amplitud y el contenido de frecuencia adecuados.

Para lograr esto en un microcontrolador simple de capacidad moderada (digamos 16 MHz o mejor):

Olvídese del A2D y aplique su señal piezoeléctrica a un comparador analógico. La salida del comparador luego se conecta a un pin de entrada configurado como una interrupción.

Una vez que llegue el primer pulso, inicie un temporizador y continúe contando los pulsos de entrada. Una vez que se detecte el número deseado de pulsos, o se haya agotado el tiempo, salga del bucle.

Si obtiene el número deseado de conteos y el temporizador está por debajo de algún conteo, entonces la señal tiene una frecuencia demasiado alta y se puede descartar.

Si el temporizador ha expirado y el conteo sigue siendo demasiado bajo, entonces la señal tiene una frecuencia demasiado baja y se puede descartar.

De lo contrario, la señal se puede contar como un evento .

Por supuesto, podría hacer todo esto con sus datos A2d, solo necesitaría una CPU con más potencia.

" ¿Cuáles son los ajustes correctos? " Mire el rebote de una pelota con un visor conectado a la salida del comparador. Determine el número de pulsos que son los más comunes para un solo rebote de una pelota de ping pong, así como el tiempo mínimo y máximo correspondiente a la frecuencia.

¡Buena suerte!

Pseudocó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; 
    }
Para el "pseudocódigo" seguro que hay una gran cantidad de fuente C sintácticamente correcta y específica del dispositivo ...
@Cuadue ya, uso el término para quitar cualquier responsabilidad por el (mal) uso.