Projetos

Theremin Ultrassônico com Arduino

Eletrogate 27 de março de 2026

Introdução

O theremin é um dos instrumentos eletrônicos mais antigos da história e também um dos mais fascinantes. Seu funcionamento sem contato físico direto torna a experiência musical extremamente expressiva, desafiadora e visualmente impressionante.

Neste projeto, desenvolvemos uma versão didática e acessível de um theremin digital, utilizando Arduino e sensor ultrassônico, explorando conceitos fundamentais de programação embarcada, processamento sonoro e teoria musical aplicada.

A proposta central é criar um instrumento capaz de gerar notas musicais em tempo real, controladas exclusivamente pela posição da mão no espaço, medida por sensores de distância.


O Theremin


O theremin foi inventado em 1920 pelo físico russo Lev Termen (Leon Theremin), sendo o primeiro instrumento musical eletrônico da história. Seu funcionamento clássico baseia-se em um campo eletromagnético controlando a frequência (altura da nota) e outro controla o volume (amplitude), onde o músico interage com os campos elétricos usando apenas as mãos no ar.

Com a popularização dos microcontroladores e sensores de baixo custo, surgiram inúmeras releituras digitais do theremin, utilizando os mais variados tipos de sensores, como ultrassônicos, infravermelhos, capacitivos e até sistemas baseados em visão computacional.

Grande parte desses projetos apresenta interfaces interessantes e soluções engenhosas do ponto de vista eletrônico e computacional, oferecendo boa resposta espacial, estabilidade e criatividade na interação. No entanto, em praticamente todos os casos analisados, o foco principal está na exploração sonora livre, resultando em instrumentos mais próximos de controladores experimentais ou efeitos sonoros do que de instrumentos musicais propriamente ditos.

Isso ocorre principalmente pela ausência de um sistema musical preciso, capaz de relacionar de forma estável, previsível e musicalmente coerente os dados do sensor com um sistema de alturas bem definido, como o sistema temperado ocidental. Como consequência, torna-se difícil executar melodias reconhecíveis, escalas estruturadas ou repertório musical tradicional, limitando a aplicação do instrumento a contextos mais experimentais.

A motivação central deste projeto nasce justamente dessa lacuna: desenvolver um theremin digital capaz de dialogar diretamente com o sistema musical ocidental, permitindo a execução de melodias temperadas, escalas, exercícios técnicos e até repertório simples, sem abrir mão da expressividade característica do instrumento.


O Sensor Ultrassônico

O sensor ultrassônico HC-SR04 foi escolhido por sua simplicidade de uso, baixo custo, boa precisão e ampla disponibilidade de documentação, características que o tornam adequado para aplicações interativas em tempo real com microcontroladores da família Arduino.

Seu princípio de funcionamento baseia-se na emissão de um pulso ultrassônico de curta duração, que se propaga pelo ar, reflete em um obstáculo e retorna ao sensor sob a forma de eco. A partir da medição do intervalo de tempo entre a emissão e o recebimento desse pulso, o microcontrolador calcula a distância até o objeto refletor, considerando a velocidade de propagação do som no ar.

No circuito, o pino trigger é responsável por iniciar a emissão do pulso, enquanto o pino echo fornece um sinal digital cuja duração é proporcional ao tempo de percurso da onda sonora. Esses sinais são tratados por uma biblioteca dedicada, que encapsula o processo de medição e retorna diretamente o valor da distância em centímetros.

// ===== SENSOR =====
const byte triggerPin = 11;
const byte echoPin    = 10;
UltraSonicDistanceSensor distanceSensor(triggerPin, echoPin);
Durante a execução do programa, a leitura da distância é realizada continuamente dentro do loop principal. O valor retornado, originalmente em centímetros, é convertido para milímetros, facilitando o ajuste fino dos limites espaciais utilizados no mapeamento musical, permitindo transformar a posição da mão no espaço em um parâmetro numérico contínuo, diretamente associado a eventos sonoros.
// dentro do loop:
float distance = distanceSensor.measureDistanceCm() * 10;

Desenvolvimento

O desenvolvimento do projeto será apresentado a ótica da lógica de programação, descrevendo a organização algorítmica responsável pela leitura dos sensores, pelo mapeamento das distâncias, pela tomada de decisões e pela geração sonora, enquanto os critérios musicais que fundamentam essas escolhas, visando garantir coerência estrutural e estética aliadas à tocabilidade dentro de um sistema musical temperado serão discutidos no capítulo sobre Linguagem Musical.

Inicialmente, são definidos os pinos responsáveis pela saída de áudio, leitura do sensor e pela leitura dos botões de controle.

// ===== PINOS =====
const int buzzer_pin = 7;
const int button_pin = 9;
const int bemol_pin  = 8;

// ===== SENSOR =====
const byte triggerPin = 11;
const byte echoPin    = 10;
UltraSonicDistanceSensor distanceSensor(triggerPin, echoPin);
Em seguida, são declaradas e organizadas as frequências correspondentes às notas da escala temperada, organizadas em duas estruturas distintas, contendo respectivamente as alturas naturais e bemolizadas.
// ===== NOTAS =====
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784


const int notas_naturais[8] = {
  NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5,
  NOTE_D5, NOTE_E5, NOTE_FS5, NOTE_G5
};

const int notas_bemol[8] = {
  NOTE_FS4, NOTE_GS4, NOTE_AS4, NOTE_B4,
  NOTE_CS5, NOTE_DS5, NOTE_F5, NOTE_FS5
};
A leitura da posição da mão é realizada por meio de um sensor ultrassônico HC-SR04, responsável por medir a distância entre o sensor e a mão do intérprete.
O valor retornado é convertido para uma escala numérica proporcional à distância em milímetros e a cada iteração do loop principal, esta é comparada com faixas previamente definidas, correspondendo a regiões fixas no espaço.
if      (distance > 50  && distance < 100) index = 0;
else if (distance > 100 && distance < 150) index = 1;
else if (distance > 150 && distance < 200) index = 2;
else if (distance > 200 && distance < 250) index = 3;
else if (distance > 250 && distance < 300) index = 4;
else if (distance > 300 && distance < 350) index = 5;
else if (distance > 350 && distance < 400) index = 6;
else if (distance > 400 && distance < 450) index = 7;
Paralelamente, são realizadas as leituras dos dois botões responsáveis pelo controle dos acidentes e articulação das notas, a lógica adotada pressupõe que apenas um dos botões pode estar ativo por vez.
Uma vez satisfeitas essas condições, a frequência correspondente é selecionada diretamente a partir do vetor adequado e enviada ao gerador sonoro, caso nenhuma condição válida seja detectada o som é interrompido.
  int leitura = digitalRead(button_pin);
  int bemol   = digitalRead(bemol_pin);

  int natural = (leitura == 0);
  int flat    = (bemol   == 0);


if (index >= 0 && (natural ^ flat)) {   // XOR

  int nota = natural ? notas_naturais[index] : notas_bemol[index];

  tone(buzzer_pin, nota);
}
else {
  noTone(buzzer_pin);
}

Essa arquitetura lógica simples e modular permite um controle preciso das alturas musicais, ao mesmo tempo em que preserva uma resposta rápida e estável, características essenciais para a execução musical em tempo real.

 


Linguagem Musical

O mapeamento espacial das alturas partiu da análise da organização cromática e diatônica. A divisão do espaço físico correspondente a uma oitava em doze regiões, exigida pela escala cromática, resultaria em zonas muito estreitas, dificultando a precisão gestual e comprometendo a estabilidade da afinação. Diante disso, optou-se pelo mapeamento diatônico, que oferece maior resolução espacial, melhor controle entoacional e maior conforto performático.

Essa escolha, contudo, limita o uso direto dos acidentes, o que levou à implementação de um mecanismo específico de bemolização, permitindo o acesso às notas cromáticas sem prejuízo da tocabilidade. A partir dessa solução, foi introduzido um segundo controle, dedicado à articulação das notas naturais, viabilizando ataques precisos, controle de duração e a inserção de silêncios. Por fim, analisou-se a possibilidade de substituir ambos os botões por um segundo sensor, responsável por mapear três regiões espaciais — silêncio, notas naturais e notas bemolizadas — possibilitando uma execução integralmente gestual, sem contato físico, preservando a lógica de articulação e ampliando o potencial performático do instrumento.

A Figura a seguir apresenta o diagrama de mapeamento espacial das alturas, relacionando a distância da mão ao sensor ultrassônico com as notas produzidas, tanto para o acionamento das notas naturais quanto para as notas bemolizadas, de acordo com o estado dos respectivos controles.


Diagrama


Código

#include <HCSR04.h>

const int buzzer_pin = 7;
const int button_pin = 9;
const int bemol_pin  = 8;

// ===== NOTAS =====
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784

const int notas_naturais[8] = {
  NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5,
  NOTE_D5, NOTE_E5, NOTE_FS5, NOTE_G5
};

const int notas_bemol[8] = {
  NOTE_FS4, NOTE_GS4, NOTE_AS4, NOTE_B4,
  NOTE_CS5, NOTE_DS5, NOTE_F5, NOTE_FS5
};

// ===== SENSOR =====
const byte triggerPin = 11;
const byte echoPin    = 10;
UltraSonicDistanceSensor distanceSensor(triggerPin, echoPin);

void setup() {
  pinMode(buzzer_pin, OUTPUT);
  pinMode(button_pin, INPUT_PULLUP);
  pinMode(bemol_pin, INPUT_PULLUP);
}

void loop() {
  float distance = distanceSensor.measureDistanceCm() * 10;
  int leitura = digitalRead(button_pin);
  int bemol   = digitalRead(bemol_pin);

  int natural = (leitura == 0);
  int flat    = (bemol   == 0);

  int index = -1;

  if      (distance > 50  && distance < 100) index = 0;
  else if (distance > 100 && distance < 150) index = 1;
  else if (distance > 150 && distance < 200) index = 2;
  else if (distance > 200 && distance < 250) index = 3;
  else if (distance > 250 && distance < 300) index = 4;
  else if (distance > 300 && distance < 350) index = 5;
  else if (distance > 350 && distance < 400) index = 6;
  else if (distance > 400 && distance < 450) index = 7;


  // ---- lógica musical ----
  if (index >= 0 && (natural ^ flat)) {   // XOR

    int nota = natural ? notas_naturais[index] : notas_bemol[index];

    tone(buzzer_pin, nota);
  }
  else {
    noTone(buzzer_pin);
  }

}

 


Conclusão

Ao longo deste artigo, foi apresentado o desenvolvimento de um instrumento musical eletrônico de caráter gestual, inspirado no funcionamento do theremin, no qual a altura sonora e a articulação das notas são controladas a partir da posição das mãos no espaço. A proposta buscou integrar princípios musicais e soluções de programação embarcada, demonstrando como conceitos abstratos, como altura, articulação e cromatismo, podem ser traduzidos de forma objetiva em estruturas algorítmicas e sistemas físicos interativos.

A organização do sistema baseia-se em um mapeamento espacial diatônico, que favorece a precisão gestual, a estabilidade entoacional e o conforto performático, ao mesmo tempo em que mantém acesso às notas cromáticas por meio de mecanismos específicos de controle. Essa abordagem evidencia como decisões musicais influenciam diretamente a arquitetura do código e a concepção da interface, reforçando a importância de um desenvolvimento integrado entre linguagem musical e lógica computacional.

A estrutura modular do programa, aliada ao uso de sensores simples e componentes de baixo custo, torna o projeto facilmente adaptável a diferentes plataformas e contextos. Pequenas modificações nos parâmetros de mapeamento, nos sensores empregados ou nos métodos de geração sonora permitem explorar novas possibilidades expressivas, ampliando o escopo do instrumento para aplicações didáticas, performáticas e experimentais.

Dessa forma, o projeto ultrapassa a simples implementação técnica de um gerador de notas e se consolida como uma plataforma aberta para investigação da relação entre gesto, espaço e som, incentivando a exploração criativa e o aprofundamento na interseção entre música, tecnologia e performance.


Referências

ARDUINO. Arduino Language Reference – tone().

Documentação oficial da função tone(), utilizada para a geração de sinais sonoros no Arduino, servindo como base para a implementação do gerador de frequências do instrumento.

Disponível em: https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/

 

WOKWI. Arduino Simulator.

Ambiente de simulação utilizado para testes, prototipagem e validação da lógica de funcionamento do sistema.

Disponível em: https://wokwi.com/

 

MAXIM INTEGRATED. Ultrasonic Ranging Module HC-SR04 – Datasheet.

Ficha técnica do módulo HC-SR04, contendo especificações elétricas, temporais e operacionais.

Disponível em: https://components101.com/sites/default/files/component_datasheet/HCSR04%20Datasheet.pdf

 

WIKIPÉDIA. Theremin.

Enciclopédia colaborativa. Verbete sobre a história, o funcionamento e os princípios físicos do theremin, utilizado como referência conceitual para o desenvolvimento do instrumento gestual.

Disponível em: https://pt.wikipedia.org/wiki/Theremin


Sobre o Autor


Erwin de Mattos

 


Lista de Materiais

Eletrogate

27 de março de 2026

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Os comentários estão desativados.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Eletrogate Robô

Assine nossa newsletter e
receba  10% OFF  na sua
primeira compra!