Bonjour,
Je suis nouveau sur le forum, je vous explique en quelques mots ce qui m'amène à demander de l'aide : Je rame depuis plusieurs jours pour résoudre un problème probablement simple pour les initiés.
Je souhaite faire un instrument de musique de type harpe laser avec 12 notes (12 lasers et 12 LDR). Le programme de base fonctionne parfaitement avec FL Studio et une carte Léonardo, j’obtiens bien les 12 notes.
#include "MIDIUSB.h"
#define LED 13 //Associe 13 au mot "LED" dans le programme
const byte TOTAL_LDR = 12;
// Toutes les broches sont utilisées. Chaque photo résistance (LDR) est reliée à chaque broche.
const byte LDR_PIN[TOTAL_LDR] = {1,2,3,4,5,6,7,8,9,10,11,12};
// Chaque hauteur de note correspond à chaque broche. Chaque note est associée à une valeur numérique (échelle de fréquence).
// Correspondance hauteur de note (pitch) : C1=24 ... B1=35 C2=36 ... B2=47 C3=48 ... B3=59 C4=60 ... B4=71 C5=72 ... B5=83 C6=84 ... B6=95 C7=96 ... B7=107
const byte LDR_PITCH[TOTAL_LDR] = {48,49,50,51,52,53,54,55,56,57,58,59};
// Etat actuel des LDR.
byte currentRead[TOTAL_LDR];
// Lecture des entrées temporaires pour vérifier l'état actuel.
byte tempRead;
// La fonction setup s'exécute une seule fois en pressant setup ou en alimentant la carte
void setup() {
pinMode(LED, OUTPUT);
// Initialisez toutes les broches LDR en tant qu'entrée pull-up.
for (byte i = 0; i < TOTAL_LDR; i++) {
pinMode(LDR_PIN[i], INPUT_PULLUP);
}
}
// La fonction loop s'exécute en boucle, indéfiniment.
void loop() {
for (byte i = 0; i < TOTAL_LDR; i++) {
// Lire l'état numérique des broches LDR.
// Dans les entrées pull-up, la logique est inversée (HIGH : reçoit le faisceau laser, LOW : faisceau interrompu).
byte LDRState = digitalRead(LDR_PIN[i]);
// Stocker temporairement l'état numérique.
tempRead = LDRState;
// Continuer uniquement si le dernier état est différent de l'état actuel.
if (currentRead[i] != tempRead) {
delay(2);
// Obtenir la hauteur qui correspond au faisceau interrompu.
byte pitch = LDR_PITCH[i];
// Enregistrez le nouvel état.
currentRead[i] = tempRead;
// Joue ou coupe la note en fonction de l'état (coupure du faisceau: Low ou pas de coupure: Hight).
if (LDRState == LOW) {
noteOn(pitch);
digitalWrite(LED, HIGH);
} else {
noteOff(pitch);
digitalWrite(LED, LOW);
}
}
}
}
//Définit la fonction noteOn pour envoyer à l'ordinateur le signal midi correspondant à la note jouée.
void noteOn(byte pitch) {
MidiUSB.sendMIDI({0x09, 0x90, pitch, 127});
MidiUSB.flush();
}
void noteOff(byte pitch) {
MidiUSB.sendMIDI({0x08, 0x80, pitch, 0});
MidiUSB.flush();
}
Je voudrais maintenant rajouter deux boutons qui me permettent de passer à l'octave supérieure ou inférieure et c'est là que ça se complique.
J'ai utilisé ce programme pour intégrer la lecture d'état du bouton
boolean buttonWasUp = true;
boolean ledEnabled = false;
void setup() {
pinMode(10, OUTPUT);
pinMode(A0, INPUT_PULLUP);
}
void loop() {
boolean buttonIsUp = digitalRead(A0);
if (buttonWasUp && !buttonIsUp) {
delay(10);
buttonIsUp = digitalRead(A0);
if (!buttonIsUp) {
ledEnabled = !ledEnabled;
digitalWrite(13, ledEnabled);
}
}
buttonWasUp = buttonIsUp;
}
Je l'ai intégré à cet endroit dans le programme
void loop() {
for (byte i = 0; i < TOTAL_LDR; i++) {
// Lire l'état numérique des broches LDR.
// Dans les entrées pull-up, la logique est inversée (HIGH : reçoit le faisceau laser, LOW : faisceau interrompu).
byte LDRState = digitalRead(LDR_PIN[i]);
// Stocker temporairement l'état numérique.
tempRead = LDRState;
// Continuer uniquement si le dernier état est différent de l'état actuel.
if (currentRead[i] != tempRead) {
// See https://www.arduino.cc/en/pmwiki.php?n=Tutorial/Debounce
delay(2);
// Obtenir la hauteur qui correspond au faisceau interrompu.
byte pitch = LDR_PITCH[i];
// Enregistrez le nouvel état.
currentRead[i] = tempRead;
// Joue ou coupe la note en fonction de l'état (coupure du faisceau: Low ou pas de coupure: Hight).
if (LDRState == LOW) {
noteOn(pitch);
digitalWrite(LED, HIGH);
} else {
noteOff(pitch);
digitalWrite(LED, LOW);
}
boolean buttonIsUp = digitalRead(A0);
if (buttonWasUp && !buttonIsUp) {
delay(10);
buttonIsUp = digitalRead(A0);
if (!buttonIsUp) {
ledEnabled = !ledEnabled;
digitalWrite(13, ledEnabled);
}
}
buttonWasUp = buttonIsUp;
}
}
}
Mais quand je fais cela, l'état du bouton n'est plus reconnu (la led 13 ne s'allume/s'éteint pas).
J'espère avoir exposé le problème à peu près clairement car je suis novice. Quelqu'un aurait-il une solution ? Merci d'avance.
Olivier