Mesure de la vitesse du son
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.