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


Mon contenu
Homme



