La Paire Larsen sont deux structures qui génèrent du son. Fortement inspirés des oeuvres des Peter Vogel, elles sont en fait un circuit électronique qui capte le bruit électromagnétique ambiant grâce à une antenne, qu’un ATTiny transforme périodiquement en notes audibles. Les deux structures sont identiques et embarquent le même programme, pourtant quand on les place de part et d’autre de sa tête, on entend deux mélodies infernales mais complètement différentes.
MATÉRIEL :
- ATTiny / 556 (ATtiny85-20PU – http://www.farnell.com/datasheets/1693899.pdf)
- Haut-parleur
- Résistance
- Corde à piano
- Porte pile
MONTAGE :
SOURCE :
La programmation d’un ATTiny se fait un peu différemment d’un Arduino classique. Vous aurez besoin d’une carte Arduino UNO et d’un condensateur. David Mellis vous explique tout (en anglais).
// PaireLarsen.ino /* Liste des notes. Ce sont des valeur spéciales qui on été calculée à l'avance pour correspondre à la fréquence du processeur. */ const int notes[] = {239,225,213,201,190,179,169,159,150,142,134,127}; // PIN sur laquelle se trouve le haut-parleur int Speaker = 1; void setup() { /* On définit les entrées/sorties, A2 ne sera pas connectée et captera des valeurs aléatoires en fonction du bruit électromagnétique ambiant Speaker servira à sortir le signal sonore */ pinMode(A2, INPUT); pinMode(Speaker, OUTPUT); delay(500); } void loop() { // On lit une valeur aléatoire int reading = analogRead(A2); TinyTone( // On met à l'échelle la valeur afin de trouver un nombre entre 0 et le nombre de notes // Ce sera le numéro de notre note. notes[numéro] récupère la note qui correspond. notes[(reading/10) % 12], // On reprend notre valeur aléatoire pour déterminer une octave alétoire entre 2 et 4 2 + reading % 3, // Idem, pour trouver une durée aléatoire 50 + 50 * ((reading/100) % 3) ); } /* Cette fonction optimisé pour l'ATTiny génére un signal sonore qui correspond à la note, l'octave et la durée spécifiée. Source et détails : http://www.technoblogy.com/show?KVO */ 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 }