Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Interaktiver Arduino-MP3-Player mit Ultraschall-Distanzsensor

Komponenten und Zubehör

Komponente Menge
Arduino UNO 1
Catalex Serial MP3 Player (mit microSD-Karte & Kartenleser) 1
Ultraschallsensor HC-SR04 2
Lautsprecher mit 3,5 mm-Klinkeneingang 1

Über das Projekt

Serieller MP3-Player von Catalex nutzen

Für die Ansteuerung wird nur die Bibliothek SoftwareSerial.h benötigt. Die grundlegenden Befehle (Play, Volume, Folder-Navigation) werden über ein 8-Byte-Protokoll (Start 0x7E, Ende 0xEF) gesendet. Beispiel-Funktion sendCommand() im Code unten.

Interaktiver Arduino-MP3-Player mit Ultraschall-Distanzsensor

HC-SR04 Ultraschall-Entfernungssensor nutzen

Keine Bibliothek nötig. Der Sensor sendet einen 10 µs-Puls am Trig-Pin und misst die Echo-Dauer. Entfernung (cm) = (Dauer/2) / 29,1. Funktion measureDistance() im Code.

Interaktiver Arduino-MP3-Player mit Ultraschall-Distanzsensor

Version 1: Einfacher Distanz-Trigger

Erkennt Objekte < 50 cm und startet Wiedergabe (z. B. „Surprise Motherfucker“-Sound zum Erschrecken).

void loop() {
  if (measureDistance() < 50) {
    sendCommand(CMD_PLAY_WITHFOLDER, 0x0203); // 3. Titel im 2. Ordner
    delay(1000);
  }
  delay(300);
}

Version 2: Störungs-/Änderungs-Trigger

Reagiert nicht auf absolute Distanz, sondern auf plötzliche Änderungen (> 20 cm Differenz zur Vorherigen Messung). Verhindert Fehlauslösungen durch firstTime-Logik.

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);
    firstTime = 0; delay(2000);
  }
  auxDistance = Distance; delay(300);
}

Version 3: Zwei Sensoren – Richtungs-Erkennung

Mit zwei HC-SR04 (Pins 13/12 und 10/9) lässt sich die Bewegungsrichtung erkennen: „Hello“ bei Annäherung von rechts, „Bye“ von links.


#define trigPin 13
#define echoPin 12
#define trigPin2 10
#define echoPin2 9

long Distance, auxDistance, gap = 0;
long Distance2, auxDistance2, gap2 = 0;
int firstTime = 0;

void setup() {
  pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
  pinMode(trigPin2, OUTPUT); pinMode(echoPin2, INPUT);
  // ... Serial, MP3-Init ...
}

long measureDistance(int trigger, int echo) {
  digitalWrite(trigger, LOW); delayMicroseconds(2);
  digitalWrite(trigger, HIGH); delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  long duration = pulseIn(echo, HIGH);
  return (duration / 2) / 29.1;
}

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) { // Bewegung rechts
    sendCommand(CMD_PLAY_WITHFOLDER, 0x0201);
    Serial.println("RIGHT MOVEMENT DETECTED");
    firstTime = 0; delay(2000);
  }
  if (gap2 > 20 && gap < 20) { // Bewegung links
    sendCommand(CMD_PLAY_WITHFOLDER, 0x0202);
    Serial.println("LEFT MOVEMENT DETECTED");
    firstTime = 0; delay(2000);
  }
  auxDistance = Distance; auxDistance2 = Distance2; delay(300);
}

Code

Version 1 – Einfacher MP3-Distanz-Trigger

Arduino


//code rearranged by Javier Muñoz 10/11/2016 ask me at javimusama@hotmail.com
#include <SoftwareSerial.h>
#define ARDUINO_RX 5
#define ARDUINO_TX 6
#define trigPin 13
#define echoPin 12
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);

static int8_t Send_buf[8] = {0};
#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 SET_DAC 0X17
#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

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.println();
}

long measureDistance(int trigger, int echo) {
  digitalWrite(trigger, LOW); delayMicroseconds(2);
  digitalWrite(trigger, HIGH); delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  long duration = pulseIn(echo, HIGH);
  long distance = (duration / 2) / 29.1;
  return distance;
}

Version 2 – Störungs-MP3-Distanz-Trigger

Arduino


//code rearranged by 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);

static int8_t Send_buf[8] = {0};
// ... gleiche #defines wie Version 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);
  }
  delay(300);
  auxDistance = Distance;
}

void sendCommand(int8_t command, int16_t dat) {
  if (command == CMD_PLAY_WITHFOLDER || command == CMD_PLAY_WITHVOLUME)
    Serial.print("PLAYING SONG, SLIGHTLY MOVE YOUR HEAD FOR GREAT EFFECT");
  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.println();
}

long measureDistance(int trigger, int echo) {
  digitalWrite(trigger, LOW); delayMicroseconds(2);
  digitalWrite(trigger, HIGH); delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  long duration = pulseIn(echo, HIGH);
  return (duration / 2) / 29.1;
}

Version 3 – Zwei Sensoren, Richtungs-Erkennung

Arduino


//code rearranged by 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);

static int8_t Send_buf[8] = {0};
// ... gleiche #defines ...

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);
  }
  delay(300);
  auxDistance = Distance; auxDistance2 = Distance2;
}

void sendCommand(int8_t command, int16_t dat) {
  if (command == CMD_PLAY_WITHFOLDER || command == CMD_PLAY_WITHVOLUME)
    Serial.print("PLAYING SONG, SLIGHTLY MOVE YOUR HEAD FOR GREAT EFFECT");
  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.println();
}

long measureDistance(int trigger, int echo) {
  digitalWrite(trigger, LOW); delayMicroseconds(2);
  digitalWrite(trigger, HIGH); delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  long duration = pulseIn(echo, HIGH);
  return (duration / 2) / 29.1;
}

Schaltpläne

Interaktiver Arduino-MP3-Player mit Ultraschall-Distanzsensor
Interaktiver Arduino-MP3-Player mit Ultraschall-Distanzsensor

Herstellungsprozess

  1. Günstiges drahtloses Sensornetzwerk für Zuhause selbst bauen
  2. K30 CO₂-Sensor: Echtzeit-Luftqualitätsmessung mit Arduino
  3. Digitales Stadiometer bauen: Körpergröße messen mit Arduino & Lasersensor VL53L0X
  4. DFRobot Kapazitiver Fingerabdrucksensor mit Arduino oder ESP8266 einbinden
  5. Audio-Wiedergabe mit Arduino UNO und DFPlayer Mini – Schritt-für-Schritt-Anleitung
  6. Arduino Web-MP3-Player: Browsergesteuerte Audio-Wiedergabe
  7. Sensorturm mit Arduino Cloud: Temperatur, Bewegung & Gase überwachen
  8. Intelligente, bewegungsaktivierte Wasserpistole mit Arduino Nano
  9. Arduino UNO & WiFi Shield: Echtzeit-Temperaturanzeige im Web via Serial
  10. Kompaktes Arduino-Radar mit HC-SR04 Ultraschallsensor & 1,8″ Display