Você já pensou em criar uma caixa de som utilizando o df player mini com Arduino e controlada através de gestos? Se já pensou, acredite, pois é possível! Nesse artigo você vai aprender a criar sua caixa musical controlada pelo Sensor de Gestos APDS9960 e montar o seu projeto com o DFPlayer Mini.
Em época de pandemia, como a que estamos passando, projetos que permitam acionar mecanismos sem toque estão em alta, evitando toques físicos desnecessários. Já pensou em controlar seu Módulo MP3 Arduino somente por meio de gestos, passando músicas, retornando ou mesmo fazendo ajustes de volume?
Esse projeto permite a você controlar suas músicas através de 4 tipos de gestos: movimento para esquerda, direita, cima e baixo. Cada gesto realizará um controle diferente na execução musical.
Dessa forma, com esse artigo você aprenderá a utilizar o Módulo MP3 DFPlayer Mini, configurar a comunicação com o sensor de gestos APDS9960 e ainda criar sua caixa musical com a união dos vários dispositivos de MP3 e sensor de um modo rápido e prático.
Produtos Necessários para Desenvolver o Projeto com Sensor de Gestos APDS9960
Para garantir esses resultados você precisará dos seguintes elementos eletrônicos na nossa loja:
- Protoboard;
- Jumpers;
- Arduino Nano;
- Resistor 330R;
- Módulo DFPlayer Mini;
- Módulo sensor de gestos APDS9960;
- Speaker.
Esquemático do Projeto com Sensor de Gestos APDS9960
A seguir, apresentaremos a estrutura do circuito eletrônico do player de som controlado por gestos.
Esse circuito é dividido em três partes importantes: o sensor de gestos, o Arduino NANO e o DFPlayer Mini. Cada dispositivo será fundamental na aplicação.
O Arduino Nano é o responsável por realizar a leitura e processamento do gesto realizado com o sensor APDS9960. Após o processamento e reconhecimento do gesto, o Arduino enviará um comando para o DFPlayer Mini com Arduino. O Arduino poderá enviar 4 comandos possíveis: avançar música, retroceder música, aumentar ou baixar o volume.
O circuito da protoboard é apresentado a seguir.
Agora, vou te apresentar a programação completa para desenvolver esse projeto.
Desenvolvimento e discussão da Lógica de Programação do Projeto Sensor de Gestos APDS9960
A lógica do projeto é apresentada abaixo e possui um funcionamento muito simples. Primeiramente, foram declaradas as bibliotecas de uso dos dispositivos e funcionalidades utilizadas: comunicação serial, df player mini com arduino e Sensor de Gestos APDS9960, conforme apresentadas nas linhas 1 a 3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
#include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" #include "Adafruit_APDS9960.h" Adafruit_APDS9960 apds; DFRobotDFPlayerMini myDFPlayer; SoftwareSerial mySoftwareSerial(10, 11); // RX, TX char command; int pausa = 0; void setup() { Serial.begin(9600); //INICIALIZA A SERIAL mySoftwareSerial.begin(9600); //Verifica se o modulo esta respondendo e se o //cartao SD foi encontrado Serial.println(); Serial.println(F("DFRobot DFPlayer Mini")); Serial.println(F("Inicializando o Modulo DFPlayer MP3.")); if (!myDFPlayer.begin(mySoftwareSerial)) { Serial.println(F("Nao inicializado:")); Serial.println(F("1. Verifique as conexões do DFPlayer Mini.")); Serial.println(F("2. Insira um SD Card.")); while (true); } Serial.println(); Serial.println(F("Modulo DFPlayer Mini inicializado!")); //Definicoes iniciais myDFPlayer.setTimeOut(500); myDFPlayer.volume(20); //Volume 5 myDFPlayer.EQ(0); //Equalizacao normal if(!apds.begin()) { //Se o sensor não for inicializado, faca Serial.println("Falha ao inicializar o dispositivo. Verifique as conexoes!"); //Imprime o texto no monitor serial } else { Serial.println("Dispositivo inicializado!"); //IMPRIME O TEXTO NO MONITOR SERIAL } //Habilita o modo de deteccao de gesto quando o sensor detectar algo proximo apds.enableProximity(true); apds.enableGesture(true); } void loop() { uint8_t gesture = apds.readGesture(); //Realiza a leitura do gesto //Aumenta o Volume if(gesture == APDS9960_UP) { myDFPlayer.volumeUp(); Serial.print("Volume atual:"); Serial.println(myDFPlayer.readVolume()); } //Retorna para a musica anterior if(gesture == APDS9960_LEFT) { myDFPlayer.previous(); Serial.println("Anterior:"); Serial.print("Trilha atual:"); Serial.println(myDFPlayer.readCurrentFileNumber()-1); } //Avança para a proxima musica if(gesture == APDS9960_RIGHT) { myDFPlayer.next(); Serial.println("Proxima:"); Serial.print("Trilha atual:"); Serial.println(myDFPlayer.readCurrentFileNumber()+1); } //Diminui volume if(gesture == APDS9960_DOWN) { myDFPlayer.volumeDown(); Serial.print("Current Volume:"); Serial.println(myDFPlayer.readVolume()); } } |
Após isso, foram criados os objetos apds e myDFPlayer. Esses objetos serão utilizados para manipulação das funções ao longo do código.
5 6 |
Adafruit_APDS9960 apds; DFRobotDFPlayerMini myDFPlayer; |
Depois da declaração dos objetos, configuramos os pinos para comunicação serial e declaração das variáveis utilizadas.
8 9 10 11 |
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX char command; int pausa = 0; |
Finalmente, entramos na função setup.
Configurando e inicializando os dispositivos – Função void setup
Nessa função faremos todas as configurações iniciais e que serão necessárias para o funcionamento do nosso projeto.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
void setup() { Serial.begin(9600); //INICIALIZA A SERIAL mySoftwareSerial.begin(9600); //Verifica se o modulo esta respondendo e se o //cartao SD foi encontrado Serial.println(); Serial.println(F("DFRobot DFPlayer Mini")); Serial.println(F("Inicializando o Modulo DFPlayer MP3.")); if (!myDFPlayer.begin(mySoftwareSerial)) { Serial.println(F("Nao inicializado")); Serial.println(F("1. Verifique as conexões do DFPlayer Mini.")); Serial.println(F("2. Insira um SD Card.")); while (true); } Serial.println(); Serial.println(F("Modulo DFPlayer Mini inicializado!")); //Definicoes iniciais myDFPlayer.setTimeOut(500); myDFPlayer.volume(20); //Volume 5 myDFPlayer.EQ(0); //Equalizacao normal if(!apds.begin()) { //Se o sensor não for inicializado, faca Serial.println("Falha ao inicializar o dispositivo. Verifique as conexoes!"); //Imprime o texto no monitor serial } else { Serial.println("Dispositivo inicializado!"); //IMPRIME O TEXTO NO MONITOR SERIAL } //Habilita o modo de deteccao de gesto quando o sensor detectar algo proximo apds.enableProximity(true); apds.enableGesture(true); } |
Primeiramente, inicializamos as comunicações seriais e enviamos a mensagem de verificação de funcionamento do módulo DFPlayer Mini para o monitor serial. A porção de código é apresentada a seguir.
15 16 17 18 19 20 21 22 |
Serial.begin(9600); //INICIALIZA A SERIAL mySoftwareSerial.begin(9600); //Verifica se o modulo esta respondendo e se o //cartao SD foi encontrado Serial.println(); Serial.println(F("DFRobot DFPlayer Mini")); Serial.println(F("Inicializando o Modulo DFPlayer MP3.")); |
Após isso, realizamos a verificação de inicialização do módulo df player mini com arduino. Caso não seja inicializado corretamente, ele apresentará a mensagem “Nao inicializado” e apresentará outra mensagem para verificar as conexões do módulo e reiniciar o df player mini com arduino.
24 25 26 27 28 29 30 |
if (!myDFPlayer.begin(mySoftwareSerial)) { Serial.println(F("Nao inicializado:")); Serial.println(F("1. Verifique as conexões do DFPlayer Mini.")); Serial.println(F("2. Insira um SD Card.")); while (true); } |
Caso esteja tudo correto, o módulo será inicializado e apresentará a mensagem “Modulo DFPlayer Mini inicializado!”. Após isso, o módulo será configurado com volume igual a 5 e sistema com equalização normal.
32 33 34 35 36 37 38 |
Serial.println(); Serial.println(F("Modulo DFPlayer Mini inicializado!")); //Definicoes iniciais myDFPlayer.setTimeOut(500); myDFPlayer.volume(20); //Volume 5 myDFPlayer.EQ(0); //Equalizacao normal |
Depois disso, temos a inicialização do sensor de gestos APDS9960. A primeira condição é utilizada para verificar se o sensor foi inicializado corretamente. Caso ocorra algum problema, o fluxo de código entrará na condição e apresentará a mensagem “Falha ao iniciar o dispositivo. Verifique as conexões!”. Caso contrário, será apresentada a mensagem “Dispositivo inicializado!”.
Por fim, temos a configuração de funcionamento do sensor de gestos quando ele detectar algo próximo. A porção de código é apresentada a seguir.
49 50 51 |
//Habilita o modo de deteccao de gesto quando o sensor detectar algo proximo apds.enableProximity(true); apds.enableGesture(true); |
Em seguida, entraremos na função void loop.
A lógica principal na função void loop
Nessa função será implementado o processo de leitura do sensor de gestos. O sensor de gestos é o módulo de cor roxa, que é apresentado na figura abaixo.
A seguir, temos o código completo, que foi implementado na função void loop.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
void loop() { uint8_t gesture = apds.readGesture(); //Realiza a leitura do gesto //Aumenta o Volume if(gesture == APDS9960_UP) { myDFPlayer.volumeUp(); Serial.print("Volume atual:"); Serial.println(myDFPlayer.readVolume()); } //Retorna para a musica anterior if(gesture == APDS9960_LEFT) { myDFPlayer.previous(); Serial.println("Anterior:"); Serial.print("Trilha atual:"); Serial.println(myDFPlayer.readCurrentFileNumber()-1); } //Avança para a proxima musica if(gesture == APDS9960_RIGHT) { myDFPlayer.next(); Serial.println("Proxima:"); Serial.print("Current track:"); Serial.println(myDFPlayer.readCurrentFileNumber()+1); } //Diminui volume if(gesture == APDS9960_DOWN) { myDFPlayer.volumeDown(); Serial.print("Volume atual:"); Serial.println(myDFPlayer.readVolume()); } } |
A primeira coisa que você deve fazer na função void loop é realizar a leitura do gesto realizado pelo usuário. De acordo com o gesto será retornado um valor para a variável gesture.
57 |
uint8_t gesture = apds.readGesture(); //Realiza a leitura do gesto |
Após realizar a leitura você deve verificar qual foi o gesto realizado pelo seu usuário. Isso é realizado através das 4 condições de teste que foram implementadas no código.
A primeira condição verifica se o gesto foi um movimento para cima. Caso seja verdade, o fluxo de código entrará na condição e aumentará o volume. A porção de código é apresentada abaixo.
59 60 61 62 63 64 65 |
//Aumenta o Volume if(gesture == APDS9960_UP) { myDFPlayer.volumeUp(); Serial.print("Volume atual"); Serial.println(myDFPlayer.readVolume()); } |
A segunda condição verifica se o gesto realizado foi um movimento para a esquerda. Caso seja verdadeiro, será executada a seguinte porção de código apresentada a seguir e o programa voltará para a faixa musical anterior.
67 68 69 70 71 72 73 74 |
//Retorna para a musica anterior if(gesture == APDS9960_LEFT) { myDFPlayer.previous(); Serial.println("Anterior:"); Serial.print("Trilha atual:"); Serial.println(myDFPlayer.readCurrentFileNumber()-1); } |
Finalmente, temos as duas últimas condições. Uma verificará se o gesto é um movimento para a direita (avançar para a próxima trilha sonora) e a outra verificará se o movimento é para baixo (Reduzir volume musical). A porção de código é apresentada a seguir.
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
//Avança para a proxima musica if(gesture == APDS9960_RIGHT) { myDFPlayer.next(); Serial.println("Proxima:"); Serial.print("Trilha atual:"); Serial.println(myDFPlayer.readCurrentFileNumber()+1); } //Diminui volume if(gesture == APDS9960_DOWN) { myDFPlayer.volumeDown(); Serial.print("Volume atual:"); Serial.println(myDFPlayer.readVolume()); } |
Agora, você aprenderá o processo para armazenar os arquivos MP3 no seu SD Card.
Processo de armazenamento das músicas no SD Card
O processo de armazenamento precisa seguir uma organização dos arquivos, para que as músicas/sons sejam executados normalmente. A primeira coisa que você deve fazer é criar uma pasta e colocar cada música dentro dela.
Em seguida, enumere as faixas da forma como está sendo apresentado na figura abaixo. Cada música deve ter um número e deve iniciar a contagem a partir do valor 01.
Dessa forma, sempre que o botão para avançar ou retroceder for pressionado, será feito o avanço ou retorno com base nos números das músicas da pasta.
Após isso, insira o cartão no módulo DFPlayer Mini e alimente o seu projeto com a fonte de alimentação. Pronto! Divirta-se com uma boa música.
Conclusão
Por meio do Sensor de Gestos APDS9960 Controlando o MP3 Arduino sem Contato é possível compreender o funcionamento de controle de volume e faixas musicais. Por meio dessa aplicação, você pode desenvolver, por exemplo, uma caixa musical com Arduino para que o usuário não tenha contato com botões físicos e utilize uma interface de controle mais simples.
Além disso, como sugestão, você pode desenvolver vários tipos de projetos interessantes. Entre eles, você pode desenvolver um sistema de voz para auxiliar um usuário a manipular as funções de um sistema de uma determinada máquina. Isso é comum em máquinas de bancos e máquinas de acesso a estacionamentos de shoppings.