Salve ho trovato questo sketch che riproduce differenti file mp3 in base a due sensori ultrasuoni
//code rearranged by Javier Muñoz 10/11/2016 ask me at javimusama@hotmail.com
#include <SoftwareSerial.h>
#define ARDUINO_RX 5//should connect to TX of the Serial MP3 Player module
#define ARDUINO_TX 6//connect to RX of the module
#define trigPin 13//for the FIRST distance module
#define echoPin 12
#define trigPin2 2//for the SECOND distance module
#define echoPin2 3
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);//init the serial protocol, tell to myserial wich pins are TX and RX
////////////////////////////////////////////////////////////////////////////////////
//all the commands needed in the datasheet(http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf)
static int8_t Send_buf[8] = {0} ;//The MP3 player undestands orders in a 8 int string
//0X7E FF 06 command 00 00 00 EF;(if command =01 next song order)
#define NEXT_SONG 0X01
#define PREV_SONG 0X02
#define CMD_PLAY_W_INDEX 0X03 //DATA IS REQUIRED (number of song)
#define VOLUME_UP_ONE 0X04
#define VOLUME_DOWN_ONE 0X05
#define CMD_SET_VOLUME 0X06//DATA IS REQUIRED (number of volume from 0 up to 30(0x1E))
#define SET_DAC 0X17
#define CMD_PLAY_WITHVOLUME 0X22 //data is needed 0x7E 06 22 00 xx yy EF;(xx volume)(yy number of song)
#define CMD_SEL_DEV 0X09 //SELECT STORAGE DEVICE, DATA IS REQUIRED
#define DEV_TF 0X02 //HELLO,IM THE DATA REQUIRED
#define SLEEP_MODE_START 0X0A
#define SLEEP_MODE_WAKEUP 0X0B
#define CMD_RESET 0X0C//CHIP RESET
#define CMD_PLAY 0X0D //RESUME PLAYBACK
#define CMD_PAUSE 0X0E //PLAYBACK IS PAUSED
#define CMD_PLAY_WITHFOLDER 0X0F//DATA IS NEEDED, 0x7E 06 0F 00 01 02 EF;(play the song with the directory \01\002xxxxxx.mp3
#define STOP_PLAY 0X16
#define PLAY_FOLDER 0X17// data is needed 0x7E 06 17 00 01 XX EF;(play the 01 folder)(value xx we dont care)
#define SET_CYCLEPLAY 0X19//data is needed 00 start; 01 close
#define SET_DAC 0X17//data is needed 00 start DAC OUTPUT;01 DAC no output
////////////////////////////////////////////////////////////////////////////////////
int firstTime=0;//we need to declare firstTime outside the loop
long Distance,auxDistance,gap=0;
long Distance2,auxDistance2,gap2=0;
void setup()
{
Serial.begin(9600);//Start our Serial coms for serial monitor in our pc
mySerial.begin(9600);//Start our Serial coms for THE MP3
delay(500);//Wait chip initialization is complete
sendCommand(CMD_SEL_DEV, DEV_TF);//select the TF card
delay(200);//wait for 200ms
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
}
void loop()
{
Distance=measureDistance(trigPin,echoPin);//measure distance1 and store
Distance2=measureDistance(trigPin2,echoPin2);//measure distance2 and store
gap=abs(Distance-auxDistance);// calculate the difference between now and last reading
gap2=abs(Distance2-auxDistance2);// calculate the difference between now and last reading
if(firstTime==0){//necesary for stability things
auxDistance=Distance;
auxDistance2=Distance2;
gap=0;
gap2=0;
//does it only the first time after play a song to avoid first loop malfuntcion
firstTime++;
delay(2000);
}
if(gap>10 and gap2<10 ){ //if distance variation is 20cm
sendCommand(CMD_PLAY_WITHFOLDER, 0X0F01);
firstTime=0;//avoid errors!!we dont like errors
Serial.println("RIGHT MOVEMENT DETECTED");
delay(2000);
}
if(gap2>10 and gap<10){ //if distance variation is 20cm
sendCommand(CMD_PLAY_WITHFOLDER, 0X0F03);
firstTime=0;//avoid errors!!we dont like errors
Serial.println("LEFT MOVEMENT DETECTED");
delay(2000);
}
/*
Serial.println("\\\\\\\\\\\\\\\\\\\\\\");//debugggggg
Serial.print(" New Distace:");//debugggggg
Serial.print(Distance);
Serial.print(" Old Distance: ");
Serial.print(auxDistance);
Serial.print(" GAP ");
Serial.println(gap);
Serial.print("New Distace2:");//debugggggg
Serial.print(Distance);
Serial.print(" Old Distance2: ");
Serial.print(auxDistance);
Serial.print(" GAP2 ");
Serial.println(gap);
Serial.println("\\\\\\\\\\\\\\\\\\\\\\");//debugggggg
*/
delay(300);
auxDistance=Distance;//store the value for the if() in the next loop
auxDistance2=Distance2;//store the value for the if() in the next loop
}
void sendCommand(int8_t command, int16_t dat)
{
if (command==CMD_PLAY_WITHFOLDER or command==CMD_PLAY_WITHVOLUME){Serial.print("PLAYING SONG, SLIGHTLY MOVE YOUR HEAD FOR GREAT EFFECT");}
delay(20);
Send_buf[0] = 0x7e; //starting byte
Send_buf[1] = 0xff; //version
Send_buf[2] = 0x06; //the number of bytes of the command without starting byte and ending byte
Send_buf[3] = command; //
Send_buf[4] = 0x00;//0x00 = no feedback, 0x01 = feedback
Send_buf[5] = (int8_t)(dat >> 8);//datah
Send_buf[6] = (int8_t)(dat); //datal
Send_buf[7] = 0xef; //ending byte
for(uint8_t i=0; i<8; i++)//
{
mySerial.write(Send_buf[i]) ;//send bit to serial mp3
}
Serial.println();
}
long measureDistance(int trigger,int echo){
long duration, distance;
digitalWrite(trigger, LOW); //PULSE ___|---|___
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;
}
Il problema è che nel monitor seriale si vede il cambio di sensore e tutto funziona correttamente, ma la musica non viene riprodotta! La scheda mp3 funziona in quanto un altro sketch con un solo sensore fa riprodurre correttamente il brano!
//code rearranged by Javier Muñoz 10/11/2016 ask me at javimusama@hotmail.com
#include <SoftwareSerial.h>
#define ARDUINO_RX 6//should connect to TX of the Serial MP3 Player module
#define ARDUINO_TX 5//connect to RX of the module
#define trigPin 13//for the distance module
#define echoPin 12
#define trigPin2 2//for the distance module
#define echoPin2 3
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);//init the serial protocol, tell to myserial wich pins are TX and RX
////////////////////////////////////////////////////////////////////////////////////
//all the commands needed in the datasheet(http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf)
static int8_t Send_buf[8] = {0} ;//The MP3 player undestands orders in a 8 int string
//0X7E FF 06 command 00 00 00 EF;(if command =01 next song order)
#define NEXT_SONG 0X01
#define PREV_SONG 0X02
#define CMD_PLAY_W_INDEX 0X03 //DATA IS REQUIRED (number of song)
#define VOLUME_UP_ONE 0X04
#define VOLUME_DOWN_ONE 0X05
#define CMD_SET_VOLUME 0X06//DATA IS REQUIRED (number of volume from 0 up to 30(0x1E))
#define SET_DAC 0X17
#define CMD_PLAY_WITHVOLUME 0X22 //data is needed 0x7E 06 22 00 xx yy EF;(xx volume)(yy number of song)
#define CMD_SEL_DEV 0X09 //SELECT STORAGE DEVICE, DATA IS REQUIRED
#define DEV_TF 0X02 //HELLO,IM THE DATA REQUIRED
#define SLEEP_MODE_START 0X0A
#define SLEEP_MODE_WAKEUP 0X0B
#define CMD_RESET 0X0C//CHIP RESET
#define CMD_PLAY 0X0D //RESUME PLAYBACK
#define CMD_PAUSE 0X0E //PLAYBACK IS PAUSED
#define CMD_PLAY_WITHFOLDER 0X0F//DATA IS NEEDED, 0x7E 06 0F 00 01 02 EF;(play the song with the directory \01\002xxxxxx.mp3
#define STOP_PLAY 0X16
#define PLAY_FOLDER 0X17// data is needed 0x7E 06 17 00 01 XX EF;(play the 01 folder)(value xx we dont care)
#define SET_CYCLEPLAY 0X19//data is needed 00 start; 01 close
#define SET_DAC 0X17//data is needed 00 start DAC OUTPUT;01 DAC no output
////////////////////////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(9600);//Start our Serial coms for serial monitor in our pc
mySerial.begin(9600);//Start our Serial coms for THE MP3
delay(500);//Wait chip initialization is complete
sendCommand(CMD_SEL_DEV, DEV_TF);//select the TF card
delay(200);//wait for 200ms
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
}
void loop()
{
if(measureDistance(trigPin,echoPin)<10 and measureDistanceEnd(trigPin2,echoPin2)>10){
sendCommand(CMD_PLAY_WITHVOLUME, 0X0F02);//play the first song with volume 15 class
delay(1000);//the programm will send the play option each 100 seconds to the catalex chip
} else if (measureDistance(trigPin,echoPin)>10 and measureDistanceEnd(trigPin2,echoPin2)<10){
sendCommand(STOP_PLAY, 0X16);
}
delay(300);
}
void sendCommand(int8_t command, int16_t dat)
{
delay(20);
Send_buf[0] = 0x7e; //starting byte
Send_buf[1] = 0xff; //version
Send_buf[2] = 0x06; //the number of bytes of the command without starting byte and ending byte
Send_buf[3] = command; //
Send_buf[4] = 0x00;//0x00 = no feedback, 0x01 = feedback
Send_buf[5] = (int8_t)(dat >> 8);//datah
Send_buf[6] = (int8_t)(dat); //datal
Send_buf[7] = 0xef; //ending byte
for(uint8_t i=0; i<8; i++)//
{
mySerial.write(Send_buf[i]) ;//send bit to serial mp3
Serial.print(Send_buf[i],HEX);//send bit to serial monitor in pc
}
Serial.println();
}
long measureDistance(int trigger,int echo){
long duration, distance;
digitalWrite(trigger, LOW); //PULSE ___|---|___
delayMicroseconds(20);
digitalWrite(trigger, HIGH);
delayMicroseconds(20);
digitalWrite(trigger, LOW);
duration = pulseIn(echo, HIGH);
distance = (duration/2) / 29.1;
Serial.println("distance:");
Serial.println(distance);
return distance;
}
long measureDistanceEnd(int trigger,int echo){
long duration, distance;
digitalWrite(trigger, LOW); //PULSE ___|---|___
delayMicroseconds(20);
digitalWrite(trigger, HIGH);
delayMicroseconds(20);
digitalWrite(trigger, LOW);
duration = pulseIn(echo, HIGH);
distance = (duration/2) / 29.1;
Serial.println("distance end:");
Serial.println(distance);
return distance;
}
io credo che sia un problema di libreria!
COsì ho corretto quello che mi funzionava, però se al posto di stop ci metto il fatto che debba riprodurre una traccia diversa non l mo fa!
" NOTE: The folder name needs to be mp3, placed under the SD card root directory, and the mp3 file name needs to be 4 digits, for example, "0001.mp3", placed under the mp3 folder. If you want to name it in Both English and Chinese, you can add it after the number, for example, "0001hello.mp3" or "0001后来.mp3"."
Hai fatto così?
... mi sembra che NON abbia nulla a che vedere con i prodotti di DFRobot ... quelli sono basati sul chip JQ8400 questo è basato su YX5300 (come da pdf indicato nel sorgente) ...
Il datasheet del YX5300 è in cinese (o lingua simile) ... ho usato Google Translator per tradurlo in Italiano ... prova avedere se può esserti utile per capire il funzionamento del chip:
(3) Make sure your micro sd card is formatted as FAT16 or FAT32 and there is some songs in it.
May be you should creat folder “01” and “02”, and put some songs with the name 001xxx.mp3 /
002xxx.mp3 / 003xxx.mp3 in the two folder. Some commands need them.
Allora alla fine i due sensori funzionano e riproducono correttamnete tracce diverse in base al loro avvicinamento e rimangono in play allontanandosi:
void loop()
{
if(measureDistance(trigPin,echoPin)<10){
sendCommand(CMD_PLAY_WITHVOLUME, 0X0F01);//play the first song with volume 15 class
delay(1000);
}
if (measureDistanceEnd(trigPin2,echoPin2)<10){
sendCommand(CMD_PLAY_WITHVOLUME, 0X0F02);
delay(1000);
}
delay(300);
}
Ora però vi spiego il progetto che è un po più complesso:
ho un'ingresso, diciamo di un ufficio, subito dopo l'ingresso una scala per salire, mentre entrando a destra la toilette.
Entrando vorrei far partire una voce che invita a salire le scale per fare determinate cose ed accendesse delle stripled sugli scalini, se però uno entra e va verso destra un altro sensore rileva la distanza ed avvisa che in quella direzione ci sono i servizi e farebbe illuminare tipo una freccia (fatta di stripled) che indica la porta dei servizi. Il terzo sensore invece diciamo che è posizionato all'inizio delle scale e dovrebbe evitare che qualcuno andando via, ed oltrepassando la porta quindi, sentisse il messaggio di benvenuto! Il tutto non dovrebbe avvenire in loop perchè se una persona ad esempio è lenta a salire non deve essere tartassato da questi messaggi (credo che quello si imposti con un delay ampio!
Volendo potrei collegare anche riproduttori mp3 diversi, però preferirei con uno solo
E se ci sono 2 persone che si muovono in 2 direzioni diverse?
Una tecnologia è utile solo funziona bene, e qua ci vogliono una o più telecamere ad alta risoluzione che attribuisce ad ogni persona un #ID e lo segue in modo individuale, tipo la serie TV POI Person of interest, tanto per capirci, con Arduino a 8 bits non si fa nulla , solo ciofeche
Ovviamente non devo creare un software da vendere alla bmw alla apple o cosa, ma è per una mia attività che d'estate ha la sala interna senza personale e quindi magari se entra qualcuno rimane disorientato .... è un modo di accogliere in modo diverso! E' ovvio, come giustamente dici, che una cosa più "adatta" sarebbe magari tramite cam e riconoscimento magari con un raspberry o schede simili!