Aller au contenu


paquito

Inscrit(e) (le) 22 nov. 2021
Déconnecté Dernière activité janv. 10 2022 04:53
-----

Sujets que j'ai initiés

Interrompre un fichier audio en cours de lecture en fonction d'une variable

22 novembre 2021 - 08:51

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