samedi 10 février 2018

Jouer une mélodie avec l'ATTiny85

Si, tout comme moi, vous programmez l'ATTiny85 avec l'IDE Arduino et le noyau ATtiny par David A. Mellis, vous avez peut-être été frustré par l'absence de support pour la fonction "tone()" qui permet, sur une carte Arduino, de produire un son dont on peut contrôler la fréquence à volonté.


Il existe toutefois un remède, proposé par David Johnson-Davies dans son excellent blog Technoblogy: dans un sketch qu'il a baptisé "TinyTone", il utilise le timer/counter1 de l'ATtiny85 pour produire l'équivalent de ce que fait la fonction tone() sur l'Arduino.

Programmation de l'ATTiny

Au besoin, référez-vous à ce billet pour la façon d'installer le noyau ATtiny de David A. Mellis et programmer l'ATTiny au moyen d'une carte Arduino.

Sketch

Le sketch ci-dessous est celui publié par David Johnson-Davies, dans lequel je me suis contenté de modifier la mélodie (il s'agit d'À la Claire Fontaine) de la fonction playTune().  Le contenu de la fonction TinyTone() peut vous sembler obscur si vous n'êtes pas familier avec la manipulation des registres de l'ATTiny, mais vous n'aurez probablement pas besoin de la modifier.


/****************************************************
TinyTone for ATtiny85
Basé sur le programme original de David Johnson-Davies:
http://www.technoblogy.com/show?KVO
Plus de détails:
http://electroniqueamateur.blogspot.com/2018/02/jouer-une-melodie-avec-lattiny85.html
*****************************************************/
// Notes
const int Note_C = 239;
const int Note_CS = 225;
const int Note_D = 213;
const int Note_DS = 201;
const int Note_E = 190;
const int Note_F = 179;
const int Note_FS = 169;
const int Note_G = 159;
const int Note_GS = 150;
const int Note_A = 142;
const int Note_AS = 134;
const int Note_B = 127;
int Speaker = 1;
void setup()
{
pinMode(Speaker, OUTPUT);
}
void loop()
{
playTune();
delay(1000);
}
void TinyTone(unsigned char divisor, unsigned char octave, unsigned long duration)
{
TCCR1 = 0x90 | (8 - octave); // for 1MHz clock
// TCCR1 = 0x90 | (11-octave); // for 8MHz clock
OCR1C = divisor - 1; // set the OCR
delay(duration);
TCCR1 = 0x90; // stop the counter
delay(10); // pour la séparation des notes identiques successives
}
// Mélodie (À la claire fontaine)
void playTune(void)
{
//TinyTone (note, octave, durée);
TinyTone(Note_C, 4, 800);
TinyTone(Note_C, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_D, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_D, 4, 400);
TinyTone(Note_C, 4, 800);
TinyTone(Note_C, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_D, 4, 400);
TinyTone(Note_E, 4, 800);
TinyTone(Note_E, 4, 800);
TinyTone(Note_E, 4, 400);
TinyTone(Note_D, 4, 400);
TinyTone(Note_C, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_G, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_G, 4, 800);
TinyTone(Note_G, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_C, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_D, 4, 800);
TinyTone(Note_C, 4, 800);
TinyTone(Note_C, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_E, 4, 400);
TinyTone(Note_D, 4, 200);
TinyTone(Note_C, 4, 200);
TinyTone(Note_E, 4, 400);
TinyTone(Note_C, 4, 400);
TinyTone(Note_E, 4, 800);
TinyTone(Note_E, 4, 400);
TinyTone(Note_D, 4, 200);
TinyTone(Note_C, 4, 200);
TinyTone(Note_E, 4, 400);
TinyTone(Note_D, 4, 400);
TinyTone(Note_C, 4, 800);
}

Circuit

Après avoir programmé l'ATTiny85, il ne reste plus qu'à lui ajouter un haut-parleur sur la broche physique numéro 6 (également nommée broche 1 pour l'IDE Arduino), tel qu'illustré ci-dessous.


Vidéo du résultat


Aller plus loin

Pour générer des sons plus sophistiqués, vous pouvez également jeter un oeil sur le Tiny Synth, également développé par David Johnson-Davies et présenté dans son blog Technoblogy.  De plus, David vient tout juste de publier une version améliorée de sa fonction "TinyTone()".

Yves Pelletier   (TwitterFacebook)

1 commentaire:

  1. Un grand merci. Je vais tout de suite m'y pencher pour remplacer les 328 par les ATTiny pour mon bruiteur diesel de bateau RC... Pascal / F4CVM

    RépondreSupprimer