Crea un Reproductor MP3 Interactivo con Arduino y Sensor Ultrasónico de Distancia
Componentes y Suministros
| Componente | Cantidad |
|---|---|
| Arduino UNO | 1 |
| Reproductor MP3 Serie Catalex (requiere tarjeta SD y lector SD para PC) | 1 |
| Sensor Ultrasónico HC-SR04 (Genérico) | 2 |
| Altavoz con entrada jack MP3 | 1 |
Sobre el Proyecto
Cómo Usar el Reproductor MP3 Serie de CATALEX
Mi tutorial previo explica el uso con una sola biblioteca (#include <SoftwareSerial.h>) y funciones sencillas. La función clave es sendCommand() que envía comandos de 8 bytes al módulo MP3 mediante protocolo serie.

Cómo Usar el Sensor Ultrasónico HC-SR04
Tampoco requiere biblioteca. La función measureDistance() envía un pulso de 10µs al pin trigger, mide el eco y calcula la distancia en cm: distance = (duration/2) / 29.1.

Versión 1: Disparador MP3 Simple por Distancia
Si un objeto se acerca a menos de 50 cm, se reproduce un audio. La usé para asustar a mis compañeros de piso con un clip de "¡sorpresa!".
Nota: El código completo .ino está en los adjuntos del proyecto.
void loop() {
if(measureDistance() < 50){
sendCommand(CMD_PLAY_WITHFOLDER, 0X0203); // Reproduce 3ª canción de la 2ª carpeta
delay(1000); // Espera para evitar errores
}
delay(300);
}
Versión 2: Disparador MP3 por Perturbación (Cambio de Distancia)
Esta versión no mira la distancia absoluta, sino la variación entre lecturas consecutivas. Si el cambio supera 20 cm, dispara el audio. Se declaran variables fuera del loop() para estabilidad.
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){
sendCommand(CMD_PLAY_WITHFOLDER, 0X0201); // 1ª canción de la 2ª carpeta
firstTime = 0;
delay(2000);
}
auxDistance = Distance;
delay(300);
}
Versión 3: Dos Sensores de Distancia – Detección de Dirección
Con dos sensores HC-SR04 se puede deducir la dirección del movimiento. El programa reproduce "hola" o "adiós" según la dirección.
- Definir pines para el segundo sensor:
trigPin2 = 10,echoPin2 = 9. - Nuevas variables:
Distance2, auxDistance2, gap2. - Modificar
setup()para inicializar ambos sensores. - Adaptar
measureDistance()para aceptar pines como argumentos. - En
loop(), comparargapygap2para detectar dirección.
if(gap > 20 && gap2 < 20){
// Movimiento hacia la derecha
sendCommand(CMD_PLAY_WITHFOLDER, 0X0201);
Serial.println("RIGHT MOVEMENT DETECTED");
firstTime = 0; delay(2000);
}
if(gap2 > 20 && gap < 20){
// Movimiento hacia la izquierda
sendCommand(CMD_PLAY_WITHFOLDER, 0X0202);
Serial.println("LEFT MOVEMENT DETECTED");
firstTime = 0; delay(2000);
}
¡Feliz hackeo, colegas!
Código
- Versión 1: Disparador MP3 simple por distancia
- Versión 2: Disparador MP3 por perturbación
- Versión 3: Dos sensores, detección de dirección
Versión 1 – Disparador MP3 Simple por Distancia Arduino
// Código reorganizado por Javier Muñoz 10/11/2016
#include <SoftwareSerial.h>
#define ARDUINO_RX 5
#define ARDUINO_TX 6
#define trigPin 13
#define echoPin 12
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);
// Comandos del datasheet Catalex
#define NEXT_SONG 0X01
#define PREV_SONG 0X02
#define CMD_PLAY_W_INDEX 0X03
#define VOLUME_UP_ONE 0X04
#define VOLUME_DOWN_ONE 0X05
#define CMD_SET_VOLUME 0X06
#define CMD_PLAY_WITHVOLUME 0X22
#define CMD_SEL_DEV 0X09
#define DEV_TF 0X02
#define SLEEP_MODE_START 0X0A
#define SLEEP_MODE_WAKEUP 0X0B
#define CMD_RESET 0X0C
#define CMD_PLAY 0X0D
#define CMD_PAUSE 0X0E
#define CMD_PLAY_WITHFOLDER 0X0F
#define STOP_PLAY 0X16
#define PLAY_FOLDER 0X17
#define SET_CYCLEPLAY 0X19
static int8_t Send_buf[8] = {0};
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
delay(500);
sendCommand(CMD_SEL_DEV, DEV_TF);
delay(200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
if(measureDistance(trigPin, echoPin) < 50){
sendCommand(CMD_PLAY_WITHFOLDER, 0X0203);
delay(1000);
}
delay(300);
}
void sendCommand(int8_t command, int16_t dat) {
delay(20);
Send_buf[0] = 0x7e;
Send_buf[1] = 0xff;
Send_buf[2] = 0x06;
Send_buf[3] = command;
Send_buf[4] = 0x00;
Send_buf[5] = (int8_t)(dat >> 8);
Send_buf[6] = (int8_t)(dat);
Send_buf[7] = 0xef;
for(uint8_t i=0; i<8; i++) {
mySerial.write(Send_buf[i]);
Serial.print(Send_buf[i], HEX);
}
Serial.println();
}
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;
return distance;
}
Versión 2 – Disparador MP3 por Perturbación Arduino
// Código reorganizado por Javier Muñoz 10/11/2016
#include <SoftwareSerial.h>
// ... (mismas definiciones que Versión 1)
int firstTime=0;
long Distance, auxDistance, gap=0;
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
delay(500);
sendCommand(CMD_SEL_DEV, DEV_TF);
delay(200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
Distance = measureDistance(trigPin, echoPin);
gap = abs(Distance - auxDistance);
if(firstTime == 0){
auxDistance = Distance; gap = 0; firstTime++; delay(1000);
}
if(gap > 20){
sendCommand(CMD_PLAY_WITHFOLDER, 0X0201);
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;
}
// ... (funciones sendCommand y measureDistance iguales)
Versión 3 – Dos Sensores, Detección de Dirección Arduino
// Código reorganizado por Javier Muñoz 10/11/2016
#include <SoftwareSerial.h>
#define ARDUINO_RX 5
#define ARDUINO_TX 6
#define trigPin 13
#define echoPin 12
#define trigPin2 10
#define echoPin2 9
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);
// ... (mismas definiciones de comandos)
int firstTime=0;
long Distance, auxDistance, gap=0;
long Distance2, auxDistance2, gap2=0;
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
delay(500);
sendCommand(CMD_SEL_DEV, DEV_TF);
delay(200);
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT); pinMode(echoPin2, INPUT);
}
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);
Serial.println("RIGHT MOVEMENT DETECTED");
firstTime = 0; delay(2000);
}
if(gap2 > 20 && gap < 20){
sendCommand(CMD_PLAY_WITHFOLDER, 0X0202);
Serial.println("LEFT MOVEMENT DETECTED");
firstTime = 0; delay(2000);
}
// ... (debug serial)
delay(300);
auxDistance = Distance;
auxDistance2 = Distance2;
}
// ... (funciones sendCommand y measureDistance iguales)
Esquemáticos


Proceso de manufactura
- Construya una Red de Sensores Inalámbrica Económica para su Hogar
- Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
- Construye un estadiómetro digital: Controla tu altura con Arduino y sensor láser
- Integración del sensor de huella capacitivo DFRobot (ID809) con Arduino o ESP8266
- Cómo reproducir audio con Arduino UNO y DFPlayer Mini – Guía paso a paso
- Reproductor MP3 controlado por web con Arduino: Reproducción de audio fácil desde el navegador
- Construye una Torre de Sensores con Arduino Cloud: Temperatura, Movimiento y Gas
- Pistola de Agua Inteligente Activada por Movimiento con Arduino Nano
- Arduino UNO + Shield WiFi: Visualización de Temperatura en Tiempo Real en Web vía Serial
- Sistema Radar Compacto con Arduino Nano, Sensor HC-SR04 y Pantalla 1.8"
- Interruptor Táctil Capacitivo LED con Arduino UNO – Proyecto DIY Fácil