Mini Sintetizador com DAC usando Arduino Nano R4 - MakerHero
Mini Sintetizador com DAC usando Arduino Nano R4

Mini Sintetizador com DAC usando Arduino Nano R4 Deixe um comentário

Se você já trabalhou com Arduino em projetos de áudio, provavelmente se deparou com uma limitação clássica: a maioria das placas não consegue gerar um sinal analógico de verdade. A saída disponível é PWM, e embora dê para contornar com filtros, o resultado nunca é lá essas coisas.

O Arduino Nano R4 muda esse cenário. Ele conta com um DAC (Conversor Digital-Analógico) nativo de 12 bits, capaz de gerar sinais analógicos reais, com muito mais fidelidade e sem os ruídos típicos do PWM. E é exatamente isso que vamos explorar neste projeto.

Vamos construir um sintetizador com Arduino Nano R4: um pequeno instrumento eletrônico capaz de gerar ondas senoidais, quadradas e dente-de-serra, com frequência controlada por potenciômetro e troca de forma de onda por botão. Simples, funcional e com som de verdade.  

um sintetizador com Arduino Nano R4

Ao longo do tutorial você vai entender como o DAC funciona na prática, ver duas abordagens diferentes de implementação e sair com um projeto de áudio com Arduino que pode ser a base para criações muito mais elaboradas.

Pronto para transformar sua placa em um instrumento? Vamos lá!

Por que usar DAC para áudio?

Um sinal de áudio é, essencialmente, um sinal analógico – pode assumir qualquer nível dentro de uma faixa. Muitos microcontroladores não são capazes de gerar diretamente um sinal analógico.

sinal analógico

Uma solução comum é simular um sinal analógico usando um sinal PWM (Pulse Width Modulation). Um sinal PWM muda constantemente entre dois níveis fixos; a relação entre os tempos que permanece em cada nível altera o nível médio do sinal.

Saiba mais em: O que é PWM? Aprenda a usar o sinal PWM com Arduino.

sinal PWM

Para gerar um sinal de áudio, o sinal PWM passa por um filtro passa-baixas, composto por um resistor e um capacitor:

filtro passa-baixas

Saiba mais em: Filtro passa baixa vs passa alta: entenda as diferenças

Embora esta solução seja bastante simples e possa ser usada com qualquer microcontrolador que suporte PWM, o resultado é um sinal de baixa fidelidade.

Utilizando-se um DAC (Digital to Analog Converter), é possível gerar um sinal com maior fidelidade.

O que é DAC e como ele funciona?

Um DAC é um conversor digital analógico – ele converte um valor digital em uma tensão.

A precisão do sinal gerado depende do número de bits no valor digital, da faixa de tensão gerada, e da linearidade do conversor. Por exemplo, um DAC de 8 bits ideal, que converta um número de 0 a 255 em uma tensão de 0 a 5V, terá uma precisão de 5V/255 = 0,02 mV (aproximadamente).

Embora a saída do DAC não seja plenamente analógica, ela pode ter um número grande de níveis (2 elevado ao número de bits na entrada)

DACs são usados atualmente nos sistemas mais comuns de áudio, onde o sinal de áudio é transmitido ou armazenado de forma digital. Por exemplo, em CDs, DVDs, streaming e placas de som.

DAC no Arduino Uno R4 e Nano R4

O microcontrolador RA4M1 usado nos Arduino Uno R4 e no Arduino Nano R4 possui o recurso DAC interno. Este DAC é de 12 bits, o que dá uma precisão muito grande.

O ambiente Arduino inclui uma função analogWrite(). Originalmente este função gerava sinais PWM, porém ela utiliza o recurso DAC quando a placa os disponibiliza e o pino especificado é um dos pinos suportados pelo DAC.

No Uno R4 e Nano R4 um único pino é suportado: A0. A resolução padrão do analogWrite() é 8 bits, porém ela pode ser aumentada para 12 bits através da chamada analogWriteResolution(12); é também possível usar uma resolução de 10 bits.

DAC no Arduino Uno R4 e Nano R4

Maior resolução resulta em uma onda mais fiel

A faixa de saída do DAC destas placas é de +0.35 V a +4.5 V. Reparar que não é possível gerar tensões negativas ou mesmo 0V. O resultado é que se você gerar uma onda senoidal, por exemplo, ela estará deslocada para cima do zero (tecnicamente dizemos que o sinal tem um componente DC). Um capacitor em série na saída do DAC absorve esta componente, deixando a média do sinal nos 0V.

Sintetizador com Arduino Nano R4: Materiais necessários

Neste projeto vamos gerar um mini sintetizador de sons, usando um Arduino Nano R4. A frequência será determinada por um potenciômetro ligado a uma entrada analógica e a forma do sinal (senoidal, quadrada ou dente-de-serra) será selecionada por botões..

Um módulo amplificador (usando o integrado LM386) será usado para a ligação de um alto-falante.

Abaixo estão os componentes utilizados no projeto:

Sintetizador com Arduino Nano R4: Esquemático

Sintetizador com Arduino Nano R4: Esquemático

Preparação da IDE Arduino para uso do Nano R4

Siga os seguintes passos antes de conectar a placa ao micro:

  1. Abra o Gerenciador de Placas
  2. Digite “Nano R4” no filtro
  3. Clique no botão Install no item “Arduino Uno R4 Boards”

Preparação da IDE Arduino para uso do Nano R4

Aguarde o final da instalação (pode demorar um pouco e pedir confirmação para instalar os drivers) e conecte a placa.

Abra a seleção de placa e porta e escolha “Select other board and port…”. Digite “nano r4” na caixa de seleção, selecione a opção “Arduino Nano R4”, selecione a porta que foi associada à placa e clique em Ok.

Select other board and port

Sintetizador com Arduino Nano R4: Código (primeira versão)

Nesta primeira versão vamos usar o analogWrite() para definir a tensão em cada trecho da nossa saída.

No setup() iniciamos os vários pinos que vamos usar:

  • Os pinos x,y e z são configurados como entradas com pull-up. Neles estão ligados os três botões. Quando um botão está solto, o pull-up faz com que a leitura resulte em nível alto. Quando o botão é apertado o pino é ligado à terra; a leitura resultará em  nível baixo.
  • O pino A5 será usado como entrada analógica para leitura do potenciômetro e não necessita de iniciação.
  • O pino A0 será usado como saída analógica; na iniciação configuramos a resolução que será usada.

Ainda no setup, pré-calculamos as tensões para geração das ondas senoidais e dente-de-serra. A amplitude máxima é restrita a 1,0V (ver o define AMPLITUDE) para ficar mais adequada ao módulo amplificador.

O loop() precisa cuidar de três coisas:

  • A tensão no pino A5 (determinada pelo potenciômetro) é lida e usada para determinar a frequência do sinal que será usado. Vamos gerar frequências de 100 Hz a 4 KHz.
  • O estado dos botões é lido e comparado com o anterior. A função correspondente é acionada quando um botão é solto.
  • Por último é gerado um ciclo completo do sinal de saída, conforme o tipo e frequência selecionados.

Sintetizador com Arduino Nano R4: Testando o sinal no osciloscópio

Podemos observar a onda gerada conectando um osciloscópio entre os pinos DAC e terra. Gire o potenciômetro para o extremo de máxima frequência e aperte o botão de onda quadrada.

Selecione acoplamento AC no osciloscópio para centrar a onda no 0V ou DC para ver as tensões reais. Ajuste o eixo vertical para 0,5V por divisão e o horizontal para 50μs por divisão. Ajuste o nível de trigger se necessário. Ou, se o seu osciloscópio tiver este recurso, use o ajuste automático.

Testando o sinal no osciloscópio

O sinal gerado apresenta alguns problemas, veja o próximo item

Limitações da primeira versão

Um problema da forma como o sinal é gerado é que entre cada ciclo temos um pequeno período com a saída em nível zero enquanto o potenciômetro e os botões são amostrados. Durante a geração do sinal o processador fica preso nesta tarefa, a velocidade do analog_write também limita a frequência máxima que pode ser gerada (o define OVERHEAD tenta compensar isso)..

Um outro problema é uma falha na implementação atual do analog_write nos modelos R4: a cada analog_write a tensão de saída assume momentaneamente um valor alto, o que pode ser visto na figura anterior.

Sintetizador com Arduino Nano R4: Código (segunda versão)

Para obter um melhor desempenho do DAC, o ambiente Arduino disponibiliza a biblioteca analogWave junto com o suporte aos modelos R4. Ela utiliza o recurso de DMA, no qual dados na memória são movidos diretamente ao periférico DAC, sem interferência direta do processador.

Com esta biblioteca conseguimos gerar sinais de melhor qualidade e com frequência mais alta. Entretanto ela tem algumas limitações (pelo menos no momento):

  • A forma da onda é escolhida na iniciação e não pode ser alterada durante a execução do programa.
  • O uso do DMA interfere na comunicação USB. Para carregar um novo sketch é necessário um procedimento especial.

 

Após executar este programa, a porta serial não estará mais disponível na USB. Para carregar um programa no Nano R4 siga os seguintes passos:

  • Pressione duas vezes o botão de Reset, com intervalo de menos de 0,5 segundo.
  • O LED laranja passará a pulsar, ficando continuamente mais forte e mais fraco
  • Na IDE Arduino aparecerá uma nova opção de porta serial (no Windows aparece algo como “2-9”). Selecione esta porta.
  • Dispare a carga do programa

A onda gerada é bem melhor do que obtivemos com o analogWrite:

Sintetizador com Arduino Nano R4: Código

Operação e Demonstração

A operação do projeto é bastante simples:

  • Pressione um dos botões para escolher a forma de onda
  • Gire o potenciômetro para mudar a frequência
  • Se necessário, use uma chave de fenda para girar o trimpot no módulo amplificador e ajustar o volume

Na primeira versão, você pode interromper a geração de som apertando uma segunda vez o botão de seleção da forma de onda e alterar a forma de onda a qualquer momento apertando um dos outros botões.

Na segunda versão, para interromper a geração de som e selecionar uma outra forma de onda é necessário apertar primeiro o botão de Reset no Arduino Nano R4.

O vídeo abaixo mostra a operação (estou usando a segunda versão do código).

Conclusão

O recurso de DAC do Arduino Nano R4 é bastante poderoso, apesar de algumas limitações na versão atual do suporte na IDE Arduino.

Você tem algum projeto em mente que pode usar o recurso do DAC? Conte para nós nos comentários.

Faça seu comentário

Acesse sua conta e participe