Outils pour utilisateurs

Outils du site


wiki:tutoriels:arduino:detecter_un_signal_electrique

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
wiki:tutoriels:arduino:detecter_un_signal_electrique [2021/10/19 16:14]
damien.muti [Programme Arduino 2 : Détection analogique]
wiki:tutoriels:arduino:detecter_un_signal_electrique [2024/05/13 17:49]
damien.muti [Simulation LTSpice]
Ligne 16: Ligne 16:
  
 Les logiciels de simulation électronique permettent de schématiser le montage associé. Ici nous avons utilisé le logiciel gratuit [[https://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html|LT-Spice]] : Les logiciels de simulation électronique permettent de schématiser le montage associé. Ici nous avons utilisé le logiciel gratuit [[https://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html|LT-Spice]] :
 +
 +__**Le schéma N°1**__ correspond à une prise de signal avant le transformateur du haut parleur. Il implique une tension d'entrée de 100V environ (trop dangereux):
 {{ :wiki:tutoriels:arduino:montage_detection_signal.png?600 |}} {{ :wiki:tutoriels:arduino:montage_detection_signal.png?600 |}}
 +
 +__**Le schéma N° 2**__ correspond à une prise de signal après le transformateur du haut parleur. Il implique une tension d'une dizaine de volt au maximum. Le transformateur permettant de diviser par 10 la tension porteuse du signal. Le signal utilisé est donc inoffensif. Le schéma du montage est le suivant :
 +{{ :wiki:tutoriels:arduino:sch_son_v2.jpg?600 |}}
  
 Le matériel utilisé ici est le suivant (fournisseur [[https://fr.farnell.com/|Franlell]]): Le matériel utilisé ici est le suivant (fournisseur [[https://fr.farnell.com/|Franlell]]):
Ligne 29: Ligne 34:
  
 ===== Principe de fonctionnement ===== ===== Principe de fonctionnement =====
 +
 +
 +==== Simulation LTSpice (schéma N°2) ====
 +=== Signal à différents points de mesures ===
 +{{ :wiki:tutoriels:arduino:mes_son_v2.jpg?600 |}}
 +
 +Un agrandissement de la fenêtre à un instant où la tension est bien égale à 5V :
 +{{ :wiki:tutoriels:arduino:mes2_son_v2.jpg?600 |}}
  
 ==== Signal envoyé par l’amplificateur sonore ==== ==== Signal envoyé par l’amplificateur sonore ====
Ligne 42: Ligne 55:
  
 On remarque que le signal a une durée totale d'environ 18,5s. l'amplitude du signal varie entre environ +6,5V et -6,5V. On remarque que le signal a une durée totale d'environ 18,5s. l'amplitude du signal varie entre environ +6,5V et -6,5V.
 +
 +
 ====  Masse flottante ====  ====  Masse flottante ==== 
  
Ligne 119: Ligne 134:
  
 ==== Programme Arduino 1 : Détection digitale ==== ==== Programme Arduino 1 : Détection digitale ====
 +
 +Le programme est téléchargeable sur ce lien: [[https://fr.farnell.com/|Sonnerie_Aleatoire_WT2003S_8.ino]] 
 +<code>
 +#include "WT2003S_Player.h"
 +
 +#ifdef __AVR__
 +#include <SoftwareSerial.h>
 +SoftwareSerial SSerial(5, 6); // RX, TX
 +#define COMSerial SSerial
 +#define ShowSerial Serial
 +
 +WT2003S<SoftwareSerial> Mp3Player;
 +#endif
 +
 +#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
 +#define COMSerial Serial1
 +#define ShowSerial SerialUSB
 +
 +WT2003S<Uart> Mp3Player;
 +#endif
 +
 +#ifdef ARDUINO_ARCH_STM32F4
 +#define COMSerial Serial
 +#define ShowSerial SerialUSB
 +
 +WT2003S<HardwareSerial> Mp3Player;
 +#endif
 +
 +
 +uint8_t vol = 10;
 +uint32_t spi_flash_songs = 0;
 +uint32_t sd_songs = 0;
 +STROAGE workdisk = SD;
 +struct Play_history {
 +  uint8_t disk;
 +  uint16_t index;
 +  char name[8];
 +}* SPISong, *SDSong;
 +
 +//////////////////////////////////////////////// mes variables globales et définitions /////////////////
 +#define BOUTON 2
 +#define ENTREE_DETECTEUR_SIGNAL A0
 +#define SEUIL_DETECTION 300 // déclenchement du son si l'entrée A0 > 0,5V soit une valeur de 1023/10 ~ 100
 +uint8_t status;
 +int entreeDetecteur =0;
 +// Defining some status codes from the WT2003S
 +#define STATUS_PLAY 0x01
 +#define STATUS_STOP 0x02
 +#define STATUS_PAUSE 0x03
 +//////////////////////////////////////////
 +
 +/////////////////////////////// Méthodes utilisées dans le setup() et le loop()
 +void readSongName(struct Play_history* ph, uint32_t num, STROAGE disk) {
 +  Mp3Player.volume(0);
 +  delay(100);
 +  switch (disk) {
 +    case SPIFLASH:
 +      Mp3Player.playSPIFlashSong(0x0001);
 +      break;
 +    case SD:
 +      Mp3Player.playSDRootSong(0x0001);
 +      break;
 +    case UDISK:
 +      Mp3Player.playUDiskRootSong(0x0001);
 +      break;
 +  }
 +  ShowSerial.println("2...");
 +  for (int i = 0; i < num ; i++) {
 +    delay(300);
 +    ph[i].disk = disk;
 +    ph[i].index = Mp3Player.getTracks();
 +    Mp3Player.getSongName(ph[i].name);
 +    Mp3Player.next();
 +  }
 +  ShowSerial.println("4...");
 +  Mp3Player.pause_or_play();
 +  Mp3Player.volume(14);
 +  delay(100);
 +}
 +
 +void getAllSong() {
 +  uint8_t diskstatus = Mp3Player.getDiskStatus();
 +  ShowSerial.println(diskstatus);
 +  spi_flash_songs = Mp3Player.getSPIFlashMp3FileNumber();
 +  ShowSerial.print("SPIFlash:");
 +  ShowSerial.println(spi_flash_songs);
 +  if (spi_flash_songs > 0) {
 +    SPISong = (struct Play_history*)malloc((spi_flash_songs + 1) * sizeof(struct Play_history));
 +    readSongName(SPISong, spi_flash_songs, SPIFLASH);
 +  }
 +  if (diskstatus && 0x02) { // have SD
 +    sd_songs = Mp3Player.getSDMp3FileNumber();
 +    ShowSerial.print("SD:");
 +    ShowSerial.println(sd_songs);
 +    if (sd_songs > 0) {
 +      SDSong = (struct Play_history*)malloc((sd_songs + 1) * sizeof(struct Play_history));
 +      ShowSerial.println("1...");
 +      readSongName(SDSong, sd_songs, SD);
 +    }
 +  }
 +}
 +void printSongs() {
 +  ShowSerial.print("-------------------");
 +  ShowSerial.print("index");
 +  ShowSerial.print("<-------->");
 +  ShowSerial.print("name");
 +  ShowSerial.print("-------------------");
 +  ShowSerial.println();
 +  ShowSerial.println("-------------------spi flash-------------------------------");
 +  for (int i = 0 ; i < spi_flash_songs; i++) {
 +    ShowSerial.print("-------------------");
 +    ShowSerial.print(SPISong[i].index);
 +    ShowSerial.print("<-------->");
 +    ShowSerial.print(SPISong[i].name);
 +    ShowSerial.print("-------------------");
 +    ShowSerial.println();
 +  }
 +  ShowSerial.println("-------------------sd card-------------------------------");
 +  for (int i = 0 ; i < sd_songs; i++) {
 +    ShowSerial.print("-------------------");
 +    ShowSerial.print(SDSong[i].index);
 +    ShowSerial.print("<-------->");
 +    ShowSerial.print(SDSong[i].name);
 +    ShowSerial.print("-------------------");
 +    ShowSerial.println();
 +  }
 +}
 +
 +void printMenu(void) {
 +  ShowSerial.println("MP3 Command List:");
 +  ShowSerial.println("-----------------");
 +  ShowSerial.println("'+' or '-'  : raise/lower volume");
 +  ShowSerial.println("'1' ~ '9'   : select a song");
 +  ShowSerial.println("'n'         : next song");
 +  ShowSerial.println("'s'         : switch play disk, spi flash");
 +  ShowSerial.println("'p'         : play or pause");
 +  ShowSerial.println("'w'         : set playmode single no loop");
 +  ShowSerial.println("'x'         : set playmode single loop");
 +  ShowSerial.println("'y'         : set playmode all loop");
 +  ShowSerial.println("'z'         : set playmode random");
 +  ShowSerial.println("'c'         : Copy mp3 to SPIFlash");
 +  ShowSerial.println("             (Yes, this really does go by copy order.)");
 +  ShowSerial.println();
 +  ShowSerial.println("Any other key to show this menu");
 +  ShowSerial.println();
 +}
 +
 +void audio(int cmd) {
 +  ShowSerial.print("play:");
 +  if (workdisk == SD) {
 +    Mp3Player.playSDRootSong(cmd);
 +    ShowSerial.print("Son joué : ");
 +    ShowSerial.println(SDSong[cmd - '0'].name);
 +  }
 +  if (workdisk == SPIFLASH) {
 +    Mp3Player.playSPIFlashSong(cmd - '0' - 1);
 +    ShowSerial.print(cmd + ": ");
 +    ShowSerial.print(SPISong[cmd - '0'].name);
 +  }
 +  ShowSerial.println();
 +}
 +
 +void afficheSerialSon(int i) {
 +  ShowSerial.print("-------------------");
 +  ShowSerial.print(SPISong[i].index);
 +  ShowSerial.print("<-------->");
 +  ShowSerial.print(SPISong[i].name);
 +  ShowSerial.print("-------------------");
 +  ShowSerial.println();
 +}
 +/////////////////////////////////////////////////////////////////////// setup ///////////////////////
 +void setup() {
 +  while (!ShowSerial);
 +  ShowSerial.begin(9600);
 +  COMSerial.begin(9600);
 +  ShowSerial.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
 +  Mp3Player.init(COMSerial);
 +
 +
 +  ShowSerial.println("0...");
 +  getAllSong();
 +  printMenu();
 +  printSongs();
 +
 +  /// volume au max
 +  Mp3Player.volume(32);
 +  // pin du bouton
 +  pinMode(BOUTON, INPUT);
 +}
 +///////////////////////////////////////////// Loop ///////////////////////////////////
 +void loop() {
 +  // tester le statut du lecteur : (1) est en train de jouer, (2): stop, (3): en pause
 +  status = Mp3Player.getStatus();
 +  entreeDetecteur = analogRead(ENTREE_DETECTEUR_SIGNAL);
 +  if ( entreeDetecteur > SEUIL_DETECTION && (status == STATUS_STOP || status == STATUS_PAUSE)) { // si la tension en A0 est supéreure au seuil ET que le son ne joue pas 0x02:stop, 0x03: pause
 +    // debug
 +    ShowSerial.print("ENTREE_DETECTEUR_SIGNAL (A0) : ");
 +    ShowSerial.println(entreeDetecteur);
 +
 +    digitalWrite(13, HIGH); // allumer la led LEDBUILTIN
 +    // sélection aléatoire de l'indice de la musique
 +    byte indexMusic = floor(random(0, sd_songs));
 +    // affiche les caractéristiques de la musique
 +    //afficheSerialSon(indexMusic);
 +    ShowSerial.print("indice musique : ");
 +    ShowSerial.println(indexMusic);
 +    // joue la musique
 +    Mp3Player.playMode(SINGLE_CYCLE);// joue la même musique en boucle
 +    audio(indexMusic); // lance le son
 +  }
 +  else if (entreeDetecteur < SEUIL_DETECTION && status == STATUS_PLAY) { // OU si la tension en A0 est inférieure au seuil ET que le son joue : on l'arrête
 +    // si le bouton est relâché et que le son joue : on l'arrête
 +    digitalWrite(13, LOW);
 +    //Mp3Player.stopPlaying(); // avec la librairie Sparkfun
 +    Mp3Player.pause_or_play();
 +
 +  }
 +}
 +</code>
 +
  
 ==== Programme Arduino 2 : Détection analogique ==== ==== Programme Arduino 2 : Détection analogique ====
  
-Le programme est téléchargeable sur ce lien: Sonnerie_Aleatoire_WT2003S_9_Lecture_Analog.ino+Le programme est téléchargeable sur ce lien: {{ :wiki:tutoriels:arduino:sonnerie_aleatoire_wt2003s_9_lecture_analog.ino.zip |}} 
 + 
  
 <code> <code>
-#include "WT2003S_Player.h" 
  
 +///////// MOdule MP3 ///////////////////////////
 +#include "WT2003S_Player.h"
 #ifdef __AVR__ #ifdef __AVR__
 #include <SoftwareSerial.h> #include <SoftwareSerial.h>
-SoftwareSerial SSerial(5, 6); // RX, TX+SoftwareSerial SSerial(5, 6); // 5-RX, 6-TX
 #define COMSerial SSerial #define COMSerial SSerial
 #define ShowSerial Serial #define ShowSerial Serial
Ligne 167: Ligne 405:
 uint8_t status; uint8_t status;
 boolean etat_entree_signal_ou_bouton = false; boolean etat_entree_signal_ou_bouton = false;
 +boolean etat_bouton = false;
  
 // entrée analogique // entrée analogique
-#define ENTREE_DETECTEUR_SIGNAL A1+#define ENTREE_DETECTEUR_SIGNAL A1 ////////// Système de mesure du signal venant d
 #define SEUIL_DETECTION 100 // déclenchement du son si l'entrée A1 > 5/1023*SEUIL_DETECTION V soit une valeur de 5/1023*100 = 0,488 V #define SEUIL_DETECTION 100 // déclenchement du son si l'entrée A1 > 5/1023*SEUIL_DETECTION V soit une valeur de 5/1023*100 = 0,488 V
 int entreeDetecteur = 0; // variable de mémorisation du signal d'entrée A0 int entreeDetecteur = 0; // variable de mémorisation du signal d'entrée A0
Ligne 282: Ligne 521:
  
 void audio(int cmd) { void audio(int cmd) {
-  ShowSerial.print("play:");+  ShowSerial.println("PLAY");
   if (workdisk == SD) {   if (workdisk == SD) {
     Mp3Player.playSDRootSong(cmd);     Mp3Player.playSDRootSong(cmd);
     ShowSerial.print("Son joué : ");     ShowSerial.print("Son joué : ");
 +    ShowSerial.print("N°=");
 +    ShowSerial.print(cmd);
 +    ShowSerial.print(" ; name : ");
     ShowSerial.println(SDSong[cmd - '0'].name);     ShowSerial.println(SDSong[cmd - '0'].name);
   }   }
Ligne 333: Ligne 575:
   entreeDetecteur = analogRead(ENTREE_DETECTEUR_SIGNAL);   entreeDetecteur = analogRead(ENTREE_DETECTEUR_SIGNAL);
  
- +  etat_bouton = digitalRead(BOUTON)
-  etat_entree_signal_ou_bouton (digitalRead(BOUTON) == HIGH || entreeDetecteur > SEUIL_DETECTION);+  etat_entree_signal_ou_bouton = (etat_bouton == HIGH || entreeDetecteur > SEUIL_DETECTION);
   // debug   // debug
-  // ShowSerial.print("etat_entree_signal_ou_bouton="); +   //ShowSerial.print("etat_entree_signal_ou_bouton="); 
-  // ShowSerial.println(etat_entree_signal_ou_bouton);+   //ShowSerial.println(etat_entree_signal_ou_bouton);
  
   if (etat_entree_signal_ou_bouton == true && (status == STATUS_STOP || status == STATUS_PAUSE) ) {   if (etat_entree_signal_ou_bouton == true && (status == STATUS_STOP || status == STATUS_PAUSE) ) {
Ligne 350: Ligne 592:
     ShowSerial.print("entrée Analog  = ");     ShowSerial.print("entrée Analog  = ");
     ShowSerial.println(entreeDetecteur);     ShowSerial.println(entreeDetecteur);
 +    ShowSerial.print("entrée BOUTON  = ");
 +    ShowSerial.println(etat_bouton);
  
     // si bouton appuyé ET que le son ne joue pas 0x02:stop, 0x03: pause     // si bouton appuyé ET que le son ne joue pas 0x02:stop, 0x03: pause
wiki/tutoriels/arduino/detecter_un_signal_electrique.txt · Dernière modification: 2024/05/13 17:49 de damien.muti