segunda-feira, junho 04, 2018

Franzininho: Efeitos Sonoros

Retomando os projetos com o Franzininho, vamos construir um dispositivo que toca diferentes sons conforme o botão apertado, semelhante a alguns livros infantis.


As ideias deste projeto podem ser usadas para outras aplicações que precisem emitir sons conforme a indicação de comandos ou sensores ou que necessitem vários botões.

Para implementar este projeto vamos ter que examinar três coisas:

  • Um módulo MP3, que será comandado pelo Franzininho e gerará os sons
  • A implementação de comunicação serial assíncrona no Franzininho, para comandar o módulo MP3
  • A ligação de vários botões no Franzininho, que possui poucas entradas e saídas digitais.
Módulo MP3 - DFPlayer Mini

Este módulo, da DFRobot, é facilmente encontrado por preços razoáveis, permite ligar diretamente um alto falante e pode ser comandado via comunicação assíncrona.

Como é comum neste módulos chineses, dá um certo trabalho achar informações.Os detalhes ficam para um post futuro, mas a documentação oficial está aqui, este blog tem informações mais precisas, inclusive um link para o datasheet. A biblioteca para Arduino do fabricante está no github. Como de costume, vou implementar uma biblioteca simplificada ao invés de usar a oficial, para me obrigar a entender o funcionamento.

De forma resumida, os comandos para o módulo são enviados a 9600bps (formato 8N1). Cada comando é enviado em um pacote com 10 bytes:
  • byte inicial: 0x7E
  • versão: 0xFF
  • tamanho: 0x06
  • comando: ver no documento
  • feedback: 0 (sem), 1 (com)
  • byte mais significativo do parâmetro (ver no documento)
  • byte menos significativo do parâmetro (ver no documento)
  • byte mais significativo do checksum
  • byte menos significativo do checksum
  • byte final: 0xEF
O checkum é o negativo da soma (em 16 bits) dos bytes da versão até o parâmetro (inclusive).

Existem três formas de selecionar o arquivo a ser tocado. Na minha implementação, os arquivos precisam estar em um diretório chamado mp3 e ter nomes no formato 0001.mp3 a 2999.mp3.

Comunicação Serial no Franzininho

Um dos poucos pontos fracos do ATtiny85 é a ausência de uma UART. A comunicação serial assíncrona precisa ser feita "na raça", o que requer loops razoavelmente precisos e "segura" a CPU durante a transmissão e recepção. O projeto Arduino inclui a biblioteca SoftwareSerial; existe também a biblioteca SoftSerial com algumas vantagens para o ATtiny85.

Para simplificar um pouco as coisas, decidi fazer a comunicação somente do Franzininho para o módulo MP3, ignorando as respostas do módulo. A detecção de fim da execução do som é feita através do sinal Busy do módulo.

Ligação de Vários Botões

A forma mais simples de ligar botões é ligando um em cada entrada digital. Para aumentar a quantidade de botões, ainda usando e/s digital, podemos montar uma matriz de botões usando M saídas e N entradas para ligar M x N botões.

Para ligar vários botões usando apenas um pino podemos usar uma entrada analógica, ligando resistores diferentes em serie com cada botão, de forma a obter tensões diferentes para cada um (e para cada combinação no caso de mais de um botão ser apertado simultaneamente). O módulo MP3 pode utilizar este esquema e foi a minha inspiração inicial. Esta ideia pode ser usada também com uma matriz de teclas, veja aqui.

São necessários alguns cuidados devido às oscilações na leitura das tensões. No meu código eu:
  • Uso a média de quatro leituras
  • Ignoro pequenas variações
  • Aguardo a leitura ficar estável por um certo tempo
Circuito

Implementando as ideias acima, cheguei ao seguinte circuito:


Software

O software completo pode ser encontrado no meu github. Uma visão geral do seu funcionamento:
  • EfeitosSonoros: é o módulo principal. setup() inicia os vários módulos; loop() espera uma tecla ser pressionada, dispara o som correspondente e aguarda o seu termino.
  • TecAnalogico: implementa o teclado. O teste do teclado consiste em ler a tensão e, conforme o valor lido, determinar a tecla pressionada.
  • MP3: implementa um controle mínimo do módulo MP3. A iniciação configura o módulo, o método toca dispara a execução de um som e o método espera aguarda o módulo indicar o fim da execução.
  • MiniSerial: é uma simplificação de SoftSerial para implementar somente transmissão
Para usar o software é preciso colocar no módulo MP3 um cartão micro SD com seis arquivos de nome 0001.mp3 a 0006.mp3 no diretório mp3.

2 comentários:

Mateus Danieli disse...

Projeto muito interessante, parabéns! A matriz de botões funciona bem com essa implementação debouncing?

Daniel Quadros disse...

Nos meus testes a versão final funcionou sem falhas.