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













