Mesure de la vitesse du son

De Wiki LOGre
Aller à : navigation, rechercher


Projet réalisé par : Fred et Edgar.

Ce projet éphémère consiste à monter une petite expérience pour mesurer la vitesse du son dans l'air et dans une barre d'acier. Le but est de la montrer à l'Open Bidouille Camp Grenoble 2016, dans le cadre de la fête de la science.

Dans l'air

Le dispositif émetteur génère des courtes salves (5 oscillations à environ 1 kHz, soit 5 ms), qui se répètent toutes les 20 ms (soit 50 Hz). Il génère aussi un signal TTL qui est à l'état haut pendant l'émission de la salve et qui sert à déclencher l'oscilloscope. Ce dernier est donc toujours synchronisé sur l'émission.

Le récepteur, basé sur un micro à electret, fournit le signal qui est affiché à l'oscilloscope.

Lorsqu'on éloigne l'émetteur du récepteur, le signal vu à l'oscilloscope doit se décaler à raison d'environ 30 µs/cm.

Le dispositif émetteur est une électronique montée sur plaque d'essai qui comprend :

  • un microcontrôleur ATtiny25V qui génère le signal
  • un amplificateur à base de LM386
  • un haut parleur
  • une pile 9 V qui alimente directement le LM386
  • un régulateur linéaire 5 V pour alimenter l'ATtiny

Génération des salves

Il s'agit d'un signal PWM généré par le timer 0 de l'ATtiny. Sa fréquence est commutée périodiquement entre 1 kHz et 1 MHz environ. Le signal à 1 MHz est filtré en aval.

Le timer 1 fournit deux interruptions périodiques (overflow et compare match) qui sont utilisées pour changer la fréquence du timer 0. Elles servent aussi à générer le signal de synchronisation pour l'oscillo.

Voici le code :

/*
 * sound-pulses-t25.c: Generate audio pulses to measure sound speed.
 *
 * Version for ATtiny25/45/85.
 *
 * Ouputs:
 *  - audio pulses on OC0B = PB1 = pin 6 on 8 pin packages
 *  - pulse gate (for triggering scope) on PB0 = pin5.
 *
 * The audio pulses are 5 periods of a 977 Hz square wave, repeated
 * every 20 ms. Between the pulses, the output is a 1 MHz square wave,
 * which should be filtered out.
 */
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
 
// Start pulse on timer1 overflow.
ISR(TIMER1_OVF_vect)
{
    PORTB  |= _BV(PB0);    // trigger HIGH
    GTCCR  = _BV(PSR0);    // prescaler reset
    TCNT0  =  5;           // phase fine-tuning
    TCCR0B |= _BV(CS02);   // clock timer 0 at F_CPU / 1024
}
 
// Stop pulse on TIMER1_COMPB.
ISR(TIMER1_COMPB_vect)
{
    PORTB  &= ~_BV(PB0);   // trigger LOW
    TCCR0B &= ~_BV(CS02);  // clock timer 0 at F_CPU / 1
}
 
int main(void)
{
    // Set the clock to 8 MHz.
    CLKPR  = _BV(CLKPCE);  // enable prescaler change
    CLKPR  = 0;            // prescaler = 1
 
    // Configure output pins.
    DDRB   = _BV(PB1)      // audio output
           | _BV(PB0);     // trigger
 
    // Configure timer 0 for 50% duty cycle PWM.
    OCR0A  =  8 - 1;       // period = 8 cycles
    OCR0B  =  4 - 1;       // high = 4 cycles
    TCCR0A = _BV(COM0B1)   // non-inverting PWM on OC0B
           | _BV(WGM00)    // fast PWM, top = OCR0A
           | _BV(WGM01);   // ditto
    TCCR0B = _BV(WGM02)    // ditto
           | _BV(CS00);    // clock initially at F_CPU / 1
 
    // Configure timer 1 for a ~ 5 ms pulse every ~ 20 ms.
    OCR1C  = 20480/256-1;  // period = 20480 us
    OCR1B  =  5120/256-1;  // high = 5120 us
    TIMSK  = _BV(TOIE1)    // enable TIMER1_OVF interrupt
           | _BV(OCIE1B);  // enable TIMER1_COMPB interrupt
    TCCR1  = _BV(PWM1A)    // PWM = CTC + TOV, top = OCR1C
           | _BV(CS12)     // clock at F_CPU / 2048, period = 256 us
           | _BV(CS13);    // ditto
 
    // Sleep between interrupts.
    sei();
    sleep_enable();
    for (;;) sleep_cpu();
}

À noter que ceci a été testé sur un Arduino Uno avant d'avoir été adapté pour l'ATtiny25V.

Amplification

Voici le circuit monté sur la plaque d'essai :

   ATtiny ──╴47kΩ╶──┬─────┐               ┌───────┐
                    │     │             ┌─┤+   out├───┬──╴220µF╶──┐
                    │    10kΩ ←─╴470nF╶─┘ │ LM386 │   │           │
                  2.2nF   │             ┌─┤−      │  47nF         │
                    │     │             │ └───────┘   │           HP
                    │     │             │            10Ω          │
                    │     │             │             │           │
                    ┷     ┷             ┷             ┷           ┷

Derrière l'ATtiny il y a, dans l'ordre :

  • un filtre passe-bas qui coupe vers 10 kHz ;
  • un potentiomètre pour régler le volume ;
  • une capa de découplage pour enlever la composante continue ;
  • l'amplificateur avec, en sortie, un circuit recopié de la fiche technique.

La résistance de 47 kΩ sert aussi à garantir qu'on ne dépasse jamais l'amplitude maximale acceptable en entrée.

Détection

Dans une barre d'acier

Génération

La partie mobile d'un relais est utilisée comme « marteau » pour frapper l'extrémité de la barre.