Ci-dessous, les différences entre deux révisions de la page.
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 [2020/06/29 17:46] damien.muti [Programme Python sur Raspberry Pi] |
wiki:tutoriels:arduino:detecter_un_signal_electrique [2022/01/31 16:59] (Version actuelle) damien.muti [Programme Arduino 2 : Détection analogique] |
||
---|---|---|---|
Ligne 11: | Ligne 11: | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | Dans ce tutoriel nous montrons comment, à l'aide d'un montage électronique spécifique et d'un ordinateur, il est possible de détecter un signal électrique afin de lancer un événement tel qu'un son ou un autre média. Nous allons appliquer ce montage et le programme associé | + | Dans ce tutoriel nous montrons comment, à l'aide d'un montage électronique spécifique et d'un ordinateur, il est possible de détecter un signal électrique afin de lancer un événement tel qu'un son ou un autre média. Nous allons appliquer ce montage et le programme associé |
===== Schéma du montage ===== | ===== Schéma du montage ===== | ||
Ligne 17: | Ligne 17: | ||
Les logiciels de simulation électronique permettent de schématiser le montage associé. Ici nous avons utilisé le logiciel gratuit [[https:// | Les logiciels de simulation électronique permettent de schématiser le montage associé. Ici nous avons utilisé le logiciel gratuit [[https:// | ||
{{ : | {{ : | ||
+ | |||
+ | Le matériel utilisé ici est le suivant (fournisseur [[https:// | ||
+ | * D1: Diode faible perte DO-35 (ref : 1N456A) | ||
+ | * AD8551 : Comparator CMOS RAIL/RAIL (ref: [[https:// | ||
+ | * < | ||
+ | * R6,R7 : Résistance 1K, 0,25W 1% (ref: MF25 1K | ||
+ | * R2,R5 : Résistance 1M, 0,25W 1% (ref: MF25 1M) | ||
+ | * C1 et C3 : Condensateur 1uF, 250V, Film, Rad (ref : MPMEF250W10JOI200) | ||
+ | * D2 : Diode Zener 500MW 4,7V (ref : BZX79-C4V7) | ||
Ligne 25: | Ligne 34: | ||
La tension délivrée à la sortie du transformateur K1 sur la ligne de diffusion est : s1(t) avec S1max ≈ 100V pour satisfaire la puissance totale nécessaire à l’alimentation de tous les Hauts Parleurs. | La tension délivrée à la sortie du transformateur K1 sur la ligne de diffusion est : s1(t) avec S1max ≈ 100V pour satisfaire la puissance totale nécessaire à l’alimentation de tous les Hauts Parleurs. | ||
- | Masse flottante | + | |
+ | Il est préférable de mesurer le signal délivré à la sortie du deuxième transformateur K2. L' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | On remarque que le signal a une durée totale d' | ||
+ | ==== | ||
Afin d’être en masse flottante pour détecter le signal électrique arrivant de l’amplificateur sonore nous choisissons de placer 2 condensateur C1 et C2 de 1µF pour prélever le signal. | Afin d’être en masse flottante pour détecter le signal électrique arrivant de l’amplificateur sonore nous choisissons de placer 2 condensateur C1 et C2 de 1µF pour prélever le signal. | ||
L’objectif est d’effectuer un montage permettant d’obtenir une tension de 5V si le signal si le signal électrique associé à la sonnerie, prélevé à la sortie des deux condensateurs C1 et C2, est présent et de 0V sinon. | L’objectif est d’effectuer un montage permettant d’obtenir une tension de 5V si le signal si le signal électrique associé à la sonnerie, prélevé à la sortie des deux condensateurs C1 et C2, est présent et de 0V sinon. | ||
+ | Nous plaçons la résistance R6 pour que le point de mesure en C2 ne soit pas flottant et soumis aux ondes électromagnétiques du milieu ambiant. Si cette résistance n'est pas présente, la tension à l' | ||
+ | |||
+ | ==== Protection du comparateur ==== | ||
+ | |||
+ | Le comparateur AD8551 est alimenté en [0V,5V]. Les caractéristiques sur la [[https:// | ||
==== Mise en forme du signal ==== | ==== Mise en forme du signal ==== | ||
Pour cela, nous utilisons tout d’abord une diode Zener D2 (1N750), associé à la résistance de R5 1MOhm, pour ne laisser passer que les alternances de tensions positives, et limiter les tensions supérieures à 4,7V. Cela permet de protéger la suite du montage. | Pour cela, nous utilisons tout d’abord une diode Zener D2 (1N750), associé à la résistance de R5 1MOhm, pour ne laisser passer que les alternances de tensions positives, et limiter les tensions supérieures à 4,7V. Cela permet de protéger la suite du montage. | ||
Ligne 35: | Ligne 58: | ||
====Détection du signal ==== | ====Détection du signal ==== | ||
Nous utilisons ensuite un montage comparateur à Amplificateur Opérationnel comparateur, | Nous utilisons ensuite un montage comparateur à Amplificateur Opérationnel comparateur, | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | |||
+ | **__Attention__** : La tension de référence du comparateur (patte n°3) doit être expérimentalement réglée aux alentour de 2,2V . | ||
==== Mise en forme, détection d’enveloppe ==== | ==== Mise en forme, détection d’enveloppe ==== | ||
Ligne 46: | Ligne 75: | ||
La sortie vaut 0V si le signal d’entrée est inférieur à V- (réglable par potentiomètre). | La sortie vaut 0V si le signal d’entrée est inférieur à V- (réglable par potentiomètre). | ||
La sortie vaut 5V si le signal d’entrée est supérieur à V-. | La sortie vaut 5V si le signal d’entrée est supérieur à V-. | ||
+ | |||
+ | Physiquement, | ||
+ | |||
+ | Le temps caractéristique de décharge est Tau=R2*C3= 10^6*10^-6 = 1s. Ce temps permet ainsi de pouvoir continuer à lancer de la musique, même si les silences dans le signal d' | ||
===== Simulations (LT-Spice) ===== | ===== Simulations (LT-Spice) ===== | ||
Ligne 51: | Ligne 84: | ||
{{ : | {{ : | ||
+ | ===== Boîtier de protection | ||
+ | A l'aide d'un générateur de boite en ligne ([[https:// | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Les paramètres sont les suivants : | ||
+ | * Sides : 6 | ||
+ | * Inside Diameter : 200mm | ||
+ | * Inside Height : 50mm | ||
+ | |||
+ | Le fichier de la boite est le suivant : {{ : | ||
===== Programme Python sur Raspberry Pi ===== | ===== Programme Python sur Raspberry Pi ===== | ||
Le programme python sur Raspberry Pi s' | Le programme python sur Raspberry Pi s' | ||
Ligne 57: | Ligne 101: | ||
===== Programme Python en utilisant une carte Arduino ==== | ===== Programme Python en utilisant une carte Arduino ==== | ||
A faire ... | A faire ... | ||
- | ===== Application | + | ===== Application |
==== Principe de fonctionnement d’une association de HP sur une ligne 100V ==== | ==== Principe de fonctionnement d’une association de HP sur une ligne 100V ==== | ||
La sonnerie du lycée s’insère dans le cadre d’une sonorisation sur une zone de diffusion large telle que salle de spectacle, kermesse, hypermarché, | La sonnerie du lycée s’insère dans le cadre d’une sonorisation sur une zone de diffusion large telle que salle de spectacle, kermesse, hypermarché, | ||
Ligne 63: | Ligne 107: | ||
* [[http:// | * [[http:// | ||
+ | |||
+ | ==== Câblage audio ==== | ||
+ | |||
+ | {{ : | ||
+ | {{ : | ||
+ | {{ : | ||
+ | |||
+ | ==== Schéma du montage ==== | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ==== Programme Arduino 1 : Détection digitale ==== | ||
+ | |||
+ | Le programme est téléchargeable sur ce lien: [[https:// | ||
+ | < | ||
+ | #include " | ||
+ | |||
+ | #ifdef __AVR__ | ||
+ | #include < | ||
+ | SoftwareSerial SSerial(5, 6); // RX, TX | ||
+ | #define COMSerial SSerial | ||
+ | #define ShowSerial Serial | ||
+ | |||
+ | WT2003S< | ||
+ | #endif | ||
+ | |||
+ | #ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE | ||
+ | #define COMSerial Serial1 | ||
+ | #define ShowSerial SerialUSB | ||
+ | |||
+ | WT2003S< | ||
+ | #endif | ||
+ | |||
+ | #ifdef ARDUINO_ARCH_STM32F4 | ||
+ | #define COMSerial Serial | ||
+ | #define ShowSerial SerialUSB | ||
+ | |||
+ | WT2003S< | ||
+ | #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; | ||
+ | |||
+ | //////////////////////////////////////////////// | ||
+ | #define BOUTON 2 | ||
+ | #define ENTREE_DETECTEUR_SIGNAL A0 | ||
+ | #define SEUIL_DETECTION 300 // déclenchement du son si l' | ||
+ | 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 | ||
+ | ////////////////////////////////////////// | ||
+ | |||
+ | /////////////////////////////// | ||
+ | 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(" | ||
+ | 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(" | ||
+ | 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(" | ||
+ | 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, | ||
+ | } | ||
+ | if (diskstatus && 0x02) { // have SD | ||
+ | sd_songs = Mp3Player.getSDMp3FileNumber(); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(sd_songs); | ||
+ | if (sd_songs > 0) { | ||
+ | SDSong = (struct Play_history*)malloc((sd_songs + 1) * sizeof(struct Play_history)); | ||
+ | ShowSerial.println(" | ||
+ | readSongName(SDSong, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | void printSongs() { | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print("< | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(); | ||
+ | ShowSerial.println(" | ||
+ | for (int i = 0 ; i < spi_flash_songs; | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(SPISong[i].index); | ||
+ | ShowSerial.print("< | ||
+ | ShowSerial.print(SPISong[i].name); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(); | ||
+ | } | ||
+ | ShowSerial.println(" | ||
+ | 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(" | ||
+ | ShowSerial.println(" | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println(" | ||
+ | ShowSerial.println(); | ||
+ | ShowSerial.println(" | ||
+ | ShowSerial.println(); | ||
+ | } | ||
+ | |||
+ | void audio(int cmd) { | ||
+ | ShowSerial.print(" | ||
+ | if (workdisk == SD) { | ||
+ | Mp3Player.playSDRootSong(cmd); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(SDSong[cmd - ' | ||
+ | } | ||
+ | if (workdisk == SPIFLASH) { | ||
+ | Mp3Player.playSPIFlashSong(cmd - ' | ||
+ | ShowSerial.print(cmd + ": "); | ||
+ | ShowSerial.print(SPISong[cmd - ' | ||
+ | } | ||
+ | ShowSerial.println(); | ||
+ | } | ||
+ | |||
+ | void afficheSerialSon(int i) { | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(SPISong[i].index); | ||
+ | ShowSerial.print("< | ||
+ | ShowSerial.print(SPISong[i].name); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(); | ||
+ | } | ||
+ | /////////////////////////////////////////////////////////////////////// | ||
+ | void setup() { | ||
+ | while (!ShowSerial); | ||
+ | ShowSerial.begin(9600); | ||
+ | COMSerial.begin(9600); | ||
+ | ShowSerial.println(" | ||
+ | Mp3Player.init(COMSerial); | ||
+ | |||
+ | |||
+ | ShowSerial.println(" | ||
+ | getAllSong(); | ||
+ | printMenu(); | ||
+ | printSongs(); | ||
+ | |||
+ | /// volume au max | ||
+ | Mp3Player.volume(32); | ||
+ | // pin du bouton | ||
+ | pinMode(BOUTON, | ||
+ | } | ||
+ | ///////////////////////////////////////////// | ||
+ | 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(" | ||
+ | ShowSerial.println(entreeDetecteur); | ||
+ | |||
+ | digitalWrite(13, | ||
+ | // sélection aléatoire de l' | ||
+ | byte indexMusic = floor(random(0, | ||
+ | // affiche les caractéristiques de la musique | ||
+ | // | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(indexMusic); | ||
+ | // joue la musique | ||
+ | Mp3Player.playMode(SINGLE_CYCLE);// | ||
+ | audio(indexMusic); | ||
+ | } | ||
+ | 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' | ||
+ | // si le bouton est relâché et que le son joue : on l' | ||
+ | digitalWrite(13, | ||
+ | // | ||
+ | Mp3Player.pause_or_play(); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Programme Arduino 2 : Détection analogique ==== | ||
+ | |||
+ | Le programme est téléchargeable sur ce lien: {{ : | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | ///////// MOdule MP3 /////////////////////////// | ||
+ | #include " | ||
+ | #ifdef __AVR__ | ||
+ | #include < | ||
+ | SoftwareSerial SSerial(5, 6); // 5-RX, 6-TX | ||
+ | #define COMSerial SSerial | ||
+ | #define ShowSerial Serial | ||
+ | |||
+ | WT2003S< | ||
+ | #endif | ||
+ | |||
+ | #ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE | ||
+ | #define COMSerial Serial1 | ||
+ | #define ShowSerial SerialUSB | ||
+ | |||
+ | WT2003S< | ||
+ | #endif | ||
+ | |||
+ | #ifdef ARDUINO_ARCH_STM32F4 | ||
+ | #define COMSerial Serial | ||
+ | #define ShowSerial SerialUSB | ||
+ | |||
+ | WT2003S< | ||
+ | #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; | ||
+ | |||
+ | //////////////////////////////////////////////// | ||
+ | #define BOUTON 2 | ||
+ | #define ENTREE_SIGNAL_DETECTION 4 // slot D3 (fil blanc) | ||
+ | #define LED 7 | ||
+ | uint8_t status; | ||
+ | boolean etat_entree_signal_ou_bouton = false; | ||
+ | boolean etat_bouton = false; | ||
+ | |||
+ | // entrée analogique | ||
+ | #define ENTREE_DETECTEUR_SIGNAL A1 ////////// Système de mesure du signal venant d | ||
+ | #define SEUIL_DETECTION 100 // déclenchement du son si l' | ||
+ | int entreeDetecteur = 0; // variable de mémorisation du signal d' | ||
+ | |||
+ | |||
+ | // Defining some status codes from the WT2003S | ||
+ | #define STATUS_PLAY 0x01 | ||
+ | #define STATUS_STOP 0x02 | ||
+ | #define STATUS_PAUSE 0x03 | ||
+ | ////////////////////////////////////////// | ||
+ | |||
+ | /////////////////////////////// | ||
+ | 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(" | ||
+ | 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(" | ||
+ | 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(" | ||
+ | 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, | ||
+ | } | ||
+ | if (diskstatus && 0x02) { // have SD | ||
+ | sd_songs = Mp3Player.getSDMp3FileNumber(); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(sd_songs); | ||
+ | if (sd_songs > 0) { | ||
+ | SDSong = (struct Play_history*)malloc((sd_songs + 1) * sizeof(struct Play_history)); | ||
+ | ShowSerial.println(" | ||
+ | readSongName(SDSong, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | void printSongs() { | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print("< | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(); | ||
+ | ShowSerial.println(" | ||
+ | if (spi_flash_songs > 0) { | ||
+ | for (int i = 0 ; i < spi_flash_songs; | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(SPISong[i].index); | ||
+ | ShowSerial.print("< | ||
+ | ShowSerial.print(SPISong[i].name); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(); | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | ShowSerial.println(" | ||
+ | } | ||
+ | ShowSerial.println(" | ||
+ | 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(" | ||
+ | ShowSerial.println(" | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println("' | ||
+ | ShowSerial.println(" | ||
+ | ShowSerial.println(); | ||
+ | ShowSerial.println(" | ||
+ | ShowSerial.println(); | ||
+ | } | ||
+ | |||
+ | void audio(int cmd) { | ||
+ | ShowSerial.println(" | ||
+ | if (workdisk == SD) { | ||
+ | Mp3Player.playSDRootSong(cmd); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(cmd); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(SDSong[cmd - ' | ||
+ | } | ||
+ | if (workdisk == SPIFLASH) { | ||
+ | Mp3Player.playSPIFlashSong(cmd - ' | ||
+ | ShowSerial.print(cmd + ": "); | ||
+ | ShowSerial.print(SPISong[cmd - ' | ||
+ | } | ||
+ | ShowSerial.println(); | ||
+ | } | ||
+ | |||
+ | void afficheSerialSon(int i) { | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.print(SPISong[i].index); | ||
+ | ShowSerial.print("< | ||
+ | ShowSerial.print(SPISong[i].name); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(); | ||
+ | } | ||
+ | /////////////////////////////////////////////////////////////////////// | ||
+ | void setup() { | ||
+ | while (!ShowSerial); | ||
+ | ShowSerial.begin(9600); | ||
+ | COMSerial.begin(9600); | ||
+ | ShowSerial.println(" | ||
+ | Mp3Player.init(COMSerial); | ||
+ | |||
+ | |||
+ | ShowSerial.println(" | ||
+ | getAllSong(); | ||
+ | printMenu(); | ||
+ | printSongs(); | ||
+ | |||
+ | /// volume au max | ||
+ | Mp3Player.volume(32); | ||
+ | // pin du bouton | ||
+ | pinMode(BOUTON, | ||
+ | pinMode(ENTREE_SIGNAL_DETECTION, | ||
+ | pinMode(LED, | ||
+ | } | ||
+ | ///////////////////////////////////////////// | ||
+ | void loop() { | ||
+ | // tester le statut du lecteur : (1) est en train de jouer, (2): stop, (3): en pause | ||
+ | status = Mp3Player.getStatus(); | ||
+ | |||
+ | // lecture entrée analogique A0 -> signal de sortie du détecteur | ||
+ | entreeDetecteur = analogRead(ENTREE_DETECTEUR_SIGNAL); | ||
+ | |||
+ | etat_bouton = digitalRead(BOUTON); | ||
+ | etat_entree_signal_ou_bouton = (etat_bouton == HIGH || entreeDetecteur > SEUIL_DETECTION); | ||
+ | // debug | ||
+ | // | ||
+ | // | ||
+ | |||
+ | if (etat_entree_signal_ou_bouton == true && (status == STATUS_STOP || status == STATUS_PAUSE) ) { | ||
+ | |||
+ | // debug | ||
+ | // | ||
+ | // | ||
+ | |||
+ | // debug | ||
+ | // | ||
+ | // debug | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(entreeDetecteur); | ||
+ | ShowSerial.print(" | ||
+ | ShowSerial.println(etat_bouton); | ||
+ | |||
+ | // si bouton appuyé ET que le son ne joue pas 0x02:stop, 0x03: pause | ||
+ | digitalWrite(LED, | ||
+ | // sélection aléatoire de l' | ||
+ | byte indexMusic = floor(random(0, | ||
+ | // debug | ||
+ | // affiche les caractéristiques de la musique | ||
+ | // | ||
+ | // | ||
+ | // joue la musique | ||
+ | Mp3Player.playMode(SINGLE_CYCLE);// | ||
+ | audio(indexMusic); | ||
+ | } | ||
+ | else if (etat_entree_signal_ou_bouton == false && status == STATUS_PLAY) { | ||
+ | // si le bouton est relâché et que le son joue : on l' | ||
+ | digitalWrite(LED, | ||
+ | // | ||
+ | Mp3Player.pause_or_play(); | ||
+ | |||
+ | } | ||
+ | |||
+ | // debug | ||
+ | // | ||
+ | } | ||
+ | </ |