























| | Bip bip
Vous l'avez deviné. IRBOT va pouvoir émettre des sons. 
On commence par des bips. C'est un bon moyen de signalisation.
Pour émettre un bip, rien de mieux qu'un bon vieux buzzer. Mais pas n'importe
quel buzzer, un buzzer piezzo-électrique svp.
Vous me direz, pourquoi pas un buzzer standard qu'on alimente en continu et qui
émet une tonalité unique ?
Ben justement, c'est la tonalité unique qui m'embête. Je préfères émettre
la tonalité qui me plait, et de plus ça nous arrangera bien pour la prochaine
étape qui est "jouer de la musique".
Bon, c'est quoi un buzzer piezzo-électrique ?
C'est un composant électronique qui ressemble à ça.

Une petite capsule qui émet un son lorsqu'on l'alimente avec une tension
alternative. La tonalité est fonction de la fréquence du signal. Ca marche
bien dans une plage de 1000 à 5000 Hz.
Le défi à relever est donc de générer le signal pour le buzzer à partir du
microcontrôleur PIC16F628.
C'est quoi un bip ? C'est un signal d'une fréquence bien audible pendant un
temps court.
Je choisis la fréquence de 2093 Hz qui correpond au Do de la quatrième octave.
Vous me corrigez si je me trompe. On émet ce signal pendant environ 200ms. Ca
fera un beau bip.
Comment générer ce bip ?
Et bien, on va utiliser le module générateur PWM qui équipe le PIC16F628.
C'est quoi cette bête ? Comme son nom l'indique c'est un générateur Pulse
Wide Modulation. En français, modulation de largeur d'impulsion.
En d'autres termes c'est un générateur de fréquence dont on peut faire varier
la largeur d'impulsion. Pour notre cas, on ne va pas faire varier la largeur de
l'impulsion. Ce qu'il nous faut c'est une fréquence stable et précise en
sortie.
Le générateur PWM est très intéressant car il travaille en arrière-plan,
c'est à dire qu'il est indépendant du prog qui tourne dans le pic. Il suffit
de le mettre en route et il génère en permanence un signal alternatif sur la
pin CCP1 (ou encore RB3). On branchera notre buzzer sur cette pin.
Donc pour générer notre bip on va :
 | configurer le générateur PWM pour émettre une fréquence de 2093 Hz
 | mettre le générateur en route
 | et l'arrêter au bout de 200ms
|
| |
Dans la pratique, ça donne ceci.
On crée un fonction son(val, duree)
int1 son(int val, int duree) {
if (TONE) return 1;
TONE=1;
CPT_TONE=duree;
setup_ccp1(CCP_PWM); // Configure CCP1 en PWM
setup_timer_2(T2_DIV_BY_16, val, 1); // définie la période
set_pwm1_duty(25);
}
val correspond à la valeur d'initialisation du
générateur.
Elle est en relation avec la fréquence.
durée correspond à la durée d'émission du son ( en
multiple de 20ms)
Le générateur PWM utilise le TIMER2 pour définir la durée de la période du
signal.
Pour connaître la valeur de val en fonction de la fréquence souhaitée on
applique dans notre cas la formule suivante (ça dépend de la fréquence de
l'oscillateur et du multiplicateur du TIMER2) :
val = 5000000 / (frequence * 16)
Ce qui donne pour une fréquence de 2093 Hz
val = 5000000 / (2093 * 16) = 149
Pour la duree, une autre formule
duree = temps / 20ms
Pour un temps soutaité de 200ms
duree = 200 / 20 = 10
Voilà, l'appel de fonction son(149,10) met donc le générateur en route.
Comment l'arrêter ? Tout simplement dans la routine d'interruption qui est exécutée
toutes les 20ms.
On décompte CPT_TONE toutes les 20ms. Lorsque CPT_TONE arrive à 0, on arrête
le générateur PWM.
Voici le bout de prog qui se trouve dans la routine d'interruption
if (TONE) { // si BIP en cours
if (!CPT_TONE--) {
TONE=0;
setup_ccp1(CCP_OFF); // Fin du BIP
}
}
On peut ainsi générer un bip n'importe ou dans le programme. Par exemple, à
chaque fois que l'on appui sur une touche de la télécommande, lorque IRBOT
change de direction etc ...
Pour simplifier encore l'émission d'un bip, je crée une macro. Cela m'évite
de taper à chaque fois : son (149,10). Il suffit de
simplement taper : bip;
La macro :
#define bip son (149, 10);
Une vidéo de démonstration du bip
http://pro.wanadoo.fr/yves.heilig/Forum/IRBOT/Videos/irbot_bip.avi
Le raccordement du buzzer au PIC

Prochain post : jouer de la musique
|