Bonsoir à tous,
Etant débutant dans la programmation avec arduino, je vais essayer d'exposer le problème du projet le plus clairement possible, que je n'arrive pas à résoudre.
Le principe du code est de commander 12 fonctions pour un canal de récepteur de radiocommande avec un arduino nano sans modifier l'émetteur, à partir de 3 impulsions tout au plus sur le manche soit au maxi ou au mini, dans un temps variable dépendant du nombre de celles-ci afin augmenter la rapidité d’exécution.
A partir de ce code qui fonctionne correctement j'ai associé un lecteur de carte Micro SD SPI Reader Mémoire Lecteur Micro SD TF Memory Card Module Shield, j'arrive bien à écouter la mélodie choisie en fonction de la valeur d'un compteur, mais il faut j’attende que celle-ci soit terminée pour en sélectionner une autre, je souhaiterai pouvoir l'interrompre dès que mon compteur change de valeur.
Les 6 premières fonctions sont réalisées comme suivant :
-Fonction 1 : 1 impulsion courte du neutre vers le maxi
-Fonction 2 : 2 impulsions courtes du neutre vers le maxi
-Fonction 3 : 3 impulsions courtes du neutre vers le maxi
-Fonction 4 : 1 impulsions courte du neutre vers le mini
-Fonction 5 : 2 impulsions courtes du neutre vers le mini
-Fonction 6 : 3 impulsions courtes du neutre vers le mini
Note : une impulsion courte étant inférieure à 1 seconde
Les 6 dernières sont réalisées comme suivant :
-Fonction 7 :1 impulsion longue du neutre vers le maxi
-Fonction 8 : 2 impulsions dont 1 longue et 1 courte du neutre vers le maxi
-Fonction 9 : 3 impulsions dont 1 longue et 2 courtes du neutre vers le maxi
-Fonction 10 :1 impulsion longue du neutre vers le mini
-Fonction 11 : 2 impulsions dont 1 longue et 1 courte du neutre vers le mini
-Fonction 12 : 3 impulsions dont 1 longue et 2 courtes du neutre vers le mini
Note : une impulsion longue étant supérieure à 1 seconde et inférieure à 1,5 seconde
L'ordre de « position » de l'impulsion longue est indifférente
Le code est le suivant:
//DEFINITION DES VARIABLES // Le canal 3 Manche côté droit de la RC Graupner à fond en BAS ( mini) et à fond en HAUT (maxi) int Signal_Canal_3 = 2; // Signal du récepteur du canal 3 Broche D2 int Duree_Signal_Canal_3; // Durée du signal du canal 3 en microseconde ( pour visualiser le temps mini et temps maxi sur le moniteur série) int Valeur_Signal_Canal_3; // Valeur de la durée du signal du canal 3 convertie en pourcentage ( pour commander les relais) int Temps_Mini_3 = 1070; // Durée mini de l'impulsion du signal en microseconde ( manche au mini) ( pour débugger) int Temps_Maxi_3 = 1870; // Durée maxi de l'impulsion du signal en microseconde ( manche au maxi) ( pour débugger) //on définit les temporisations int Tempo_Cycle_Impulsions = 0; // Temporisation du cycle d'impulsions sur le manche du canal 3 int Tempo_Impulsion_Longue = 0; // Temporisation de l'impulsion longue sur le manche du canal 3 int Temps_Tempo_Cycle_Impulsions = 0; // Temps de validation de la temporisation du cycle d'impulsions sur le manche du canal 3 //on définit les mémoires utilisées int Memoire_Impulsion_Longue = 0; // Mémoire d'activation de l'impulsion longue int Memoire_Valeur_Haute_Canal_3 = 0; // Mémoire de la valeur haute du signal du canal 3 ( +5 volts pour éviter de compter des impulsions lors du maintien du manche en position maxi ou mini) int Memoire_Bruitage = 0; // Mémoire de la mélodie à écouter // On définit le compteur d'impulsion du canal 3 int Compteur_Impulsions = 0; // On définit la variable du temps actuel en ms unsigned long Temps; // On définit la variable du temps de départ en ms pour mémoriser le temps écoulé depuis l'activation de la temporisation de cycle d'impulsions unsigned long Temps_Depart_Tempo_Cycle_Impulsions; // On définit la variable du temps de départ en ms pour mémoriser le temps écoulé depuis l'activation de la temporisation de l'impulsion longue unsigned long Temps_Depart_Tempo_Impulsion_Longue; //on définit les librairies utilisées #include <SPI.h>// Pour la communication avec la carte SD #include <SD.h> // Inclure la librairie SD #include <TMRpcm.h> // bibliothèque de mélodie TMRpcm tmrpcm; // on définit la broche du CS du lecteur de carte SD (shield SD) #define SDPIN 10 void setup() { Serial.begin(9600); // Vitesse de transmission if (!SD.begin(SDPIN)) // On initialise du lecteur de carte micro SD { Serial.println("initialisation ratée!"); return; } tmrpcm.speakerPin = 9; // Speaker sur la broche 9 tmrpcm.setVolume(5);// On définit la gestion du volume 0 à 7 tmrpcm.quality(1); // qualité audio 0 ou 1 } void loop() { // ACQUISITION ET TRAITEMENT DU SIGNAL DU CANAL 3 DE L'EMETTEUR RC // On Mesure la durée du signal canal 3 Duree_Signal_Canal_3 = pulseIn(Signal_Canal_3, HIGH); // On Convertit la durée du signal du canal 3 en pourcentage ( -100% = au manche mini, +100% = au manche maxi, le neutre étant à 0%) Valeur_Signal_Canal_3 = map(Duree_Signal_Canal_3, Temps_Mini_3, Temps_Maxi_3, -100, 100); // Si le signal du canal 3 n'est pas dans la plage de temps ( mini ou maxi) avec une tolérance if ( Duree_Signal_Canal_3 <= 1055 || Duree_Signal_Canal_3 >= 1895 ) { Valeur_Signal_Canal_3 = 0; // On considère que la valeur du signal du canal 3 est égale à 0% ( manche au neutre) Compteur_Impulsions = 0; Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 } // COMPTAGE DES IMPULSIONS DU MANCHE DU CANAL 3 if (Memoire_Valeur_Haute_Canal_3 == 0) // Si la mémoire de la valeur haute du canal 3 est égale à 0 (0V) { if ((Valeur_Signal_Canal_3) >= 80) //Si la valeur du signal du canal 3 est supérieure ou égale 80% ( manche considéré au maxi) { Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3 Tempo_Cycle_Impulsions = 1; // On active la temporisation du cycle d'impulsions sur le manche du canal 3 Tempo_Impulsion_Longue = 1; // On active la temporisation de l'impulsion longue sur le manche du canal 3 Compteur_Impulsions++;// On incrémente de 1 dans le compteur delay(100); // Attente 100ms } if ((Valeur_Signal_Canal_3) <= -80) //Si la valeur du signal du canal 3 est égale -80% ( manche considéré au mini) { Memoire_Valeur_Haute_Canal_3 = 1;// On active la mémoire de la valeur haute du signal du canal 3 Tempo_Cycle_Impulsions = 1; // On active la temporisation du cycle d'impulsions sur le manche du canal 3 Tempo_Impulsion_Longue = 1; // On active la temporisation de l'impulsion longue sur le manche du canal 3 Compteur_Impulsions--;// On décrémente de 1 dans le compteur delay(100); // On attend 100ms } } if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10)) //Si la valeur du signal du canal 3 est comprise entre -10% et 10% { Memoire_Valeur_Haute_Canal_3 = 0; // On désactive la mémoire de la valeur haute du signal du canal 3 } // ACTIVATION DE LA TEMPORISATION DE L'IMPULSION LONGUE SUR LE MANCHE DU CANAL 3 if (( Tempo_Impulsion_Longue) == 0 ) // Si la temporisation de l'impulsion longue sur le manche du canal 3 est désactivée { Temps_Depart_Tempo_Impulsion_Longue = millis();// On charge le temps actuel dans la variable temps de départ de la temporisation de l'impulsion longue sur le manche du canal 3(temps départ temporisation n°2 = temps actuel) } if (( Tempo_Impulsion_Longue) == 1 ) // Si la temporisation de l'impulsion longue sur le manche du canal 3 est activée, { Temps = millis();// On charge le temps actuel dans la variable temps if (Temps - Temps_Depart_Tempo_Impulsion_Longue >= 1000 ) //Si la temporisation de l'impulsion longue sur le canal 3 est supérieure ou égale à 1.5 seconde { Memoire_Impulsion_Longue = 1;// On active la mémoire de l'impulsion longue sur le manche du canal 3 } } // DESACTIVATION DE LA TEMPORISATION DE L'IMPULSION LONGUE SUR LE MANCHE DU CANAL 3 if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))//Si la valeur du signal du canal 3 est comprise entre -10% et 10% { Tempo_Impulsion_Longue = 0; // On désactive la temporisation d'impulsion longue sur le manche du canal 3 } // CALCUL DU TEMPS DE LA TEMPORISATION DU CYCLE D'IMPULSIONS SUR LE MANCHE DU CANAL 3 if ( Memoire_Impulsion_Longue == 0)//Si la temporisation d'impulsion longue sur le manche du canal 3 n'est pas est activée { Temps_Tempo_Cycle_Impulsions = abs(Compteur_Impulsions) * 700 + 1000; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 1 seconde soit 3.8 secondes pour 4 impulsions } if ( Memoire_Impulsion_Longue == 1)//Si la temporisation d'impulsion longue sur le manche du canal 3 est activée { Temps_Tempo_Cycle_Impulsions = abs(Compteur_Impulsions) * 700 + 2500; // Le temps de cycle d'impulsions est égal 0.7s x nbre d'impulsions plus 2.5 secondes soit 5.3 secondes pour 4 impulsions } // ACTIVATION DE LA TEMPORISATION DU CYCLE D'MPULSIONS SUR LE MANCHE DU CANAL 3 if (( Tempo_Cycle_Impulsions) == 0 ) // Si la temporisation de cycle d'impulsions est désactivée { Temps_Depart_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable temps de départ de la temporisation (temps départ temporisation = temps actuel) } // TRAITEMENT DES IMPULSIONS DU CANAL 3 ET ACTIVATION DES MELODIES if (( Tempo_Cycle_Impulsions) == 0 ) // Si la temporisation est désactivée du cycle d'impulsions sur le manche du canal 3 { Temps_Depart_Tempo_Cycle_Impulsions = millis();// On charge le temps actuel dans la variable temps de départ de la temporisation (temps départ temporisation = temps actuel) } if (( Tempo_Cycle_Impulsions) == 1 ) // Si la temporisation de cycle d'impulsions est activée, { Temps = millis();// On charge le temps actuel dans la variable temps if (Temps - Temps_Depart_Tempo_Cycle_Impulsions >= Temps_Tempo_Cycle_Impulsions ) //Si la temporisation du cycle d'impulsions sur le manche du canal 3est supérieure ou égale au temps déterminé { if ((Valeur_Signal_Canal_3 >= -10) && (Valeur_Signal_Canal_3 <= 10))// Si la valeur du signal du canal 3 est comprise entre -10% et +10% ( manche du canal 3 au neutre ) { //BRUITAGE if ( Memoire_Impulsion_Longue == 0) // Si la mémoire de l'impulsion longue est désactivée { // Alarme 1 if (Compteur_Impulsions == 1) // Si le compteur d'impulsions est égal à 1 { Memoire_Bruitage = 1; // On active la mémoire de bruitage à 1 Compteur_Impulsions = 0; // On reset le compteur à 0 Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3 tmrpcm.play("Alarm1.wav");// On diffuse la mélodie Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0 } // Corne de brume if (Compteur_Impulsions == 2) // Si le compteur d'impulsions est égal à 2 { Memoire_Bruitage = 2; // On active la mémoire de bruitage à 2 Compteur_Impulsions = 0; // On reset le compteur à 0 Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3 tmrpcm.play("Horn1.wav");// On diffuse la mélodie Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0 } //Ancre if (Compteur_Impulsions == -1) //Si le compteur d'impulsions est égal à -1 { Memoire_Bruitage = 4; // On active la mémoire de bruitage à 4 Compteur_Impulsions = 0; // On reset le compteur à 0 Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3 tmrpcm.play("Ancre.wav");// On diffuse la mélodie Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0 } // Sonnette if (Compteur_Impulsions == -2) // Si le compteur d'impulsions est égal à -2 { Memoire_Bruitage = 5; // On active la mémoire de bruitage à 5 Compteur_Impulsions = 0; // On reset le compteur à 0 Tempo_Cycle_Impulsions = 0; // On désactive la temporisation de cycle d'impulsions sur le manche du canal 3 tmrpcm.play("Ring.wav");// On diffuse la mélodie Memoire_Bruitage = 0; // On reset la mémoire de bruitage à 0 } } } Compteur_Impulsions = 0;// On désactive le compteur si aucune condition ci-dessus est vraie Tempo_Cycle_Impulsions = 0; // On désactive la temporisation du cycle d'impulsions sur le manche du canal 3 si aucune condition ci-dessus est vraie } } // DESACTIVATION DE LA MEMOIRE DE LA TEMPORISATION N° 2 if (Compteur_Impulsions == 0) { Memoire_Impulsion_Longue = 0;// On désactive la mémoire de la temporisation de l'impulsion longue sur le manche du canal 3 } // AFFICHAGE DES INFORMATIONS SUR LE MONITEUR SERIE // On affiche la valeur du compteur sur le moniteur série Serial.print(" Compteur = "); Serial.println(Compteur_Impulsions); // On affiche l'état de la mémoire de la temporisation de l'impulsion longue sur le manche du canal 3 sur le moniteur série ( pour débugger) Serial.print("Mémoire Tempo 2="); Serial.println(Memoire_Impulsion_Longue); delay (00); // Pas nécessaire mais on attend 0.1 seconde avant d'afficher d'autres valeurs sur le moniteur série ( pour débugger) }
Pour information ce code avec la liaison série fonctionne correctement à mon souhait:
#include <SPI.h> #include <SD.h> // Inclure la librairie SD #define SDPIN 10 // Chip Select du lecteur SD // Inclure la bibliothèque tmrpcm (gestion de fichiers .wav). #include <TMRpcm.h> TMRpcm tmrpcm; char caractere; // Définition du caractère pour la gestion dans le moniteur série void setup() { Serial.begin(9600); // début de la communication série tmrpcm.speakerPin = 9; // Speaker sur la pin 9 tmrpcm.setVolume(4); // gestion du volume de 0 à 7 tmrpcm.quality(1); // qualitée audio 0 ou 1 // Initialisation de la carte SD if (!SD.begin(SDPIN)) { Serial.println("initialisation ratée!"); // S'il y a un soucis "initialisation ratée!" s'affichera au moniteur return; } Serial.println("tapez un caractere -> a, b ou c " ); } void loop() { if (Serial.available()) { caractere = Serial.read(); if (caractere == 'a') { // Si le caractère recu dans le moniteur série est "a" Serial.println("Lecture"); // Ecrit dans le moniteur série tmrpcm.play("Alarm1.wav"); // } if (caractere == 'b') { // Si le caractère recu dans le moniteur série est "b" Serial.println("Lecture"); // Ecrit dans le moniteur série tmrpcm.play("Horn1.wav"); // Joue le son "son8bit.wav" } if (caractere == 'c') { // Si le caractère reçu dans le moniteur série est "c" Serial.println("Lecture"); // Ecrit dans le moniteur série tmrpcm.play("Ancre.wav"); // Joue le son "son8bit.wav" } } }
Dans l'attente de votre aide, je remercie par avance l'ensemble des membres de la communauté qui me permettront d'achever mon projet d'animation sonore de mon chalutier.
Cordialement
François