



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;
// ===== 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);
}
#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);
}
}
|
O artigo apresenta o desenvolvimento de um theremin digital didático baseado em Arduino, utilizando sensor ultrassônico para controle gestual da altura sonora, integrando conceitos fundamentais de eletrônica embarcada, programação e teoria musical básica.
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200