Jukebox Aléatoire

Porteur(s) du projet : Damien MUTI (Prof. de Numérique)

Date : 03/2021

objectif : Lancer des sons aléatoirement en appuyant sur un bouton.

Contexte : Sonnerie aléatoire

Fichiers :

Liens :

Capteurs/Actionneurs :

Bouton poussoir

Module son Grove MP3 V3

Intentions : explication du projet et objectifs

Lorsqu'on appuie sur un bouton poussoir connecté à l'entrée digitale d'une carte Arduino, elle sélectionne aléatoirement une musique et la joue tant que le doigt reste appuyé sur le bouton, via un module Grove MP3 V3.

le schéma suivant résume la situation : A REVOIR

Plans et schémas de fonctionnement

Programme et montage Arduino

Le montage permettant de capter le signal provenant du bouton poussoir est le suivant :

Lorsqu'on appuie sur le bouton poussoir, la va valeur lue par la broche d'entrée digitale “pin” passe de 0V à 5V.

Il est beaucoup plus simple d'utiliser un bouton poussoir en Grove branché sur le slot D2.

Le montage Arduino est le suivant : sonnerie_aleatoire_wt2003s_3.zip

Le programme permettant d'envoyer les données à Processing via le port série est le suivant : test_bouton_1.ino.zip

#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
uint8_t status;
// 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();
if (digitalRead(BOUTON) == HIGH && (status == STATUS_STOP || status == STATUS_PAUSE) ) {
// si bouton appuyé ET que le son ne joue pas 0x02:stop, 0x03: pause
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 (digitalRead(BOUTON) == LOW && status == STATUS_PLAY) {
// si le bouton est relâché et que le son joue : on l'arrête
digitalWrite(13, LOW);
//Mp3Player.stopPlaying();
Mp3Player.pause_or_play();
}
}