Pour cette première expérimentation en Arduino, nous avons pour objectif d’utiliser un objet élastique, étirable, afin de produire une variation de sons se rapprochant d’une forme d’instrument musical.
Pour ce faire, nous avons d’abord fait fonctionner un simple haut-parleur comme sortie sans autre préoccupation. Ensuite, nous avons ajouté au circuit un potentiomètre afin de pouvoir faire varier les valeurs de fréquences, partant de 261 à 523 hertz (une octave).
Ensuite, nous avons ajouté au circuit un potentiomètre afin de pouvoir faire varier les valeurs de fréquences, partant de 261 à 523 hertz (une octave).
Alors, une fois cette deuxième étape réussie, nous avons tenté d’utiliser ce même principe de variation de fréquence sur l’objet élastique. Il nous fallait alors mapper la tension dans le matériau élastique (ici de la laine tricotée à l’aide d’un tricotin) avec des pinces crocodiles et associer la valeur captée avec la fréquence de sortie. Du point de vue de l’ordinateur, la laine correspond ici à un potentiomètre.
Le principe est simple, plus nous étirons notre laine, plus notre programme lira une résistance en Ohm, plus la fréquence jouée par le programme sera élevée.
La laine n’étant pas extrêmement élastique, la marge entre la première et la dernière note n’est pas très large. Pour s’amuser, nous avons finalement ajouté des fréquences de notes d’octaves bien différentes afin d’avoir un instrument que l’on pourrait qualifier de dysfonctionnel où l’intérêt est de jouer avec les anomalies des fréquences.
const int buzzerPin = 3; // Broche du buzzer
const int potPin = A1; // Broche du potentiomètre
// Fréquences des touches blanches d'un piano (Do3 à Do4 pour simplifier)
const int whiteKeys[] = {65, 74, 83, 117, 261, 293, 440, 493, 523, 698, 784, 880}; // Do, Ré, Mi, Fa, Sol, La, Si, Do
const int numNotes = sizeof(whiteKeys) / sizeof(whiteKeys[0]); // Nombre total de notes
int noteIndex;
void setup() {
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int potValue = analogRead(potPin); // Lecture de la valeur du potentiomètre (0 à 1023)
// Si le potentiomètre est proche de zéro, couper le son
if (potValue < 10) {
noTone(buzzerPin); // Arrêter le son
} else {
// Mappage de la valeur du potentiomètre de 0-1023 sur les notes disponibles
potValue = constrain(potValue, 800, 1000);
noteIndex = map(potValue, 800, 1000, 0, numNotes - 1); // 10 est utilisé pour éviter les valeurs trop proches de 0
noteIndex = constrain(noteIndex, 0, numNotes - 1); // S'assurer que l'index reste valide
tone(buzzerPin, whiteKeys[noteIndex]); // Jouer la note correspondante
}
Serial.print(potValue);
Serial.print(" ");
Serial.println(noteIndex);
delay(50); // Petite pause pour la réactivité
}