Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Crea un Reproductor MP3 Interactivo con Arduino y Sensor Ultrasónico de Distancia

Componentes y Suministros

ComponenteCantidad
Arduino UNO1
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 MP31

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.

Crea un Reproductor MP3 Interactivo con Arduino y Sensor Ultrasónico de Distancia

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.

Crea un Reproductor MP3 Interactivo con Arduino y Sensor Ultrasónico de Distancia

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.

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 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

Crea un Reproductor MP3 Interactivo con Arduino y Sensor Ultrasónico de Distancia
Crea un Reproductor MP3 Interactivo con Arduino y Sensor Ultrasónico de Distancia

Proceso de manufactura

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