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 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 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);
// dentro do loop: float distance = distanceSensor.measureDistanceCm() * 10;
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);
// ===== 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
};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;
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.
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.


#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);
}
}
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.
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
|
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.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!