Créer un lecteur MP3 interactif Arduino avec capteur de distance ultrasonique
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Lecteur MP3 série Catalex (avec carte microSD et adaptateur carte SD pour PC) | 1 |
| Capteur ultrasonique HC-SR04 (genérique) | 2 |
| Haut-parleur avec entrée jack MP3 | 1 |
À propos du projet
Utilisation du lecteur MP3 série Catalex
Mon tutoriel précédent explique l'utilisation de ce module avec la seule bibliothèque SoftwareSerial.h et des fonctions simples. Voici la fonction d'envoi de commande :
void sendCommand(int8_t command, int16_t dat) {
if (command==CMD_PLAY_WITHFOLDER || command==CMD_PLAY_WITHVOLUME){
Serial.println("PLAYING SONG, SLIGHTLY MOVE YOUR HEAD FOR GREAT EFFECT");
}
delay(20);
Send_buf[0] = 0x7e; // octet de début
Send_buf[1] = 0xff; // version
Send_buf[2] = 0x06; // nombre d'octets de commande (sans début/fin)
Send_buf[3] = command;
Send_buf[4] = 0x00; // 0x00 = pas de retour, 0x01 = retour
Send_buf[5] = (int8_t)(dat >> 8); // data high
Send_buf[6] = (int8_t)(dat); // data low
Send_buf[7] = 0xef; // octet de fin
for(uint8_t i=0; i<8; i++) {
mySerial.write(Send_buf[i]);
}
Serial.println();
}

Utilisation du capteur ultrasonique HC-SR04
Également couvert dans un tutoriel précédent, sans bibliothèque nécessaire. Voici la fonction de mesure de distance :
long measureDistance() {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
Serial.println("distance:");
Serial.println(distance);
return distance; // en cm
}

Version 1 : Déclencheur MP3 simple par distance
Installez la bibliothèque SoftwareSerial.h si nécessaire. Dans cette version, si un objet approche à moins de 50 cm, le MP3 se déclenche. Je l'ai utilisé pour faire peur à mes colocataires avec un clip audio « surprise motherfucker ».
Note : Le code complet .ino est dans les pièces jointes du projet.
void loop() {
if(measureDistance() < 50) {
sendCommand(CMD_PLAY_WITHFOLDER, 0X0203); // 3ème chanson du 2ème dossier
delay(1000); // éviter les erreurs
}
delay(300);
}
Version 2 : Déclencheur MP3 par variation de distance (perturbation)
Cette version ne se soucie pas de la distance absolue, mais détecte les différences entre lectures successives. Si des déclenchements intempestifs surviennent, augmentez la valeur dans if(gap > 20). De nouvelles variables sont déclarées hors boucle.
int firstTime = 0;
long Distance, auxDistance, gap = 0;
void loop() {
Distance = measureDistance(trigPin, echoPin);
gap = abs(Distance - auxDistance);
if(firstTime == 0) {
auxDistance = Distance;
gap = 0;
firstTime++;
delay(1000);
}
if(gap > 20) { // variation > 20 cm
sendCommand(CMD_PLAY_WITHFOLDER, 0X0201); // 1ère chanson du 2ème dossier
firstTime = 0;
delay(2000);
}
Serial.print("New Distace:");
Serial.print(Distance);
Serial.print(" Old Distance: ");
Serial.print(auxDistance);
Serial.println(gap);
delay(300);
auxDistance = Distance;
}
Version 3 : Deux capteurs de distance – détection de direction
Avec deux capteurs, on peut deviner la direction du mouvement. Le programme dit « hello » ou « bye » selon la direction.
- Définir deux paires de broches pour le second HC-SR04 :
#define trigPin 13 // premier module
#define echoPin 12
#define trigPin2 10 // second module
#define echoPin2 9
- Nouvelles variables :
long Distance, auxDistance, gap = 0;
long Distance2, auxDistance2, gap2 = 0;
- Dans
setup(), déclarer les nouvelles broches :
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
- Modifier
measureDistance()pour accepter les broches en arguments :
long measureDistance(int trigger, int echo) {
long duration, distance;
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
duration = pulseIn(echo, HIGH);
distance = (duration/2) / 29.1;
Serial.println("distance:");
Serial.println(distance);
return distance;
}
- Dans
loop():
void loop() {
Distance = measureDistance(trigPin, echoPin);
Distance2 = measureDistance(trigPin2, echoPin2);
gap = abs(Distance - auxDistance);
gap2 = abs(Distance2 - auxDistance2);
if(firstTime == 0) {
auxDistance = Distance;
auxDistance2 = Distance2;
gap = 0; gap2 = 0;
firstTime++;
delay(2000);
}
if(gap > 20 && gap2 < 20) {
sendCommand(CMD_PLAY_WITHFOLDER, 0X0201);
firstTime = 0;
Serial.println("RIGHT MOVEMENT DETECTED");
delay(2000);
}
if(gap2 > 20 && gap < 20) {
sendCommand(CMD_PLAY_WITHFOLDER, 0X0202);
firstTime = 0;
Serial.println("LEFT MOVEMENT DETECTED");
delay(2000);
}
// ... affichage debug ...
delay(300);
auxDistance = Distance;
auxDistance2 = Distance2;
}
Bon bidouillage !
Code
- Version 1 : Déclencheur MP3 simple par distance
- Version 2 : Déclencheur MP3 par perturbation
- Version 3 : Deux capteurs, détection de direction
Les trois versions complètes (avec includes, définitions, setup, loop) sont fournies dans la section code du projet original.
Schémas


Processus de fabrication
- Construire un réseau de capteurs sans fil abordable pour votre maison
- Capteur CO2 K30 : Surveillance en temps réel de la qualité de l'air intérieur
- Construisez un Stadiomètre Numérique : Suivez la Croissance avec Arduino et Capteur Laser
- Intégrer un capteur d'empreintes capacitif DFRobot (ID809) avec Arduino ou ESP8266
- Comment lire de l'audio avec Arduino UNO et DFPlayer Mini – Guide étape par étape
- Lecteur MP3 piloté par navigateur avec Arduino et shield PHPoC WiFi
- Tour de Capteurs avec Arduino Cloud : Température, Mouvement et Gaz
- Pistolet à eau intelligent à détection de mouvement avec Arduino Nano
- Arduino UNO & Shield WiFi : Affichage température temps réel sur le Web via série