UCL
LUCAS
TIAGO RODRIGUES DE FREITAS
PROJETO INTERDISCIPLINAR DE ENGENHARIA
2: programando Arduíno com sensor ultrassom para enviar notas musicais MIDI
LUCAS
TIAGO RODRIGUES DE FREITAS
PROJETO INTERDISCIPLINAR DE ENGENHARIA
2: programando Arduíno com sensor ultrassom para enviar notas musicais MIDI
Trabalho apresentado à disciplina Projeto Interdisciplinar de Engenharia
II, como requisito parcial para obtenção de nota.
SUMÁRIO
1 PROGRAMANDO ARDUÍNO COM SENSOR
ULTRASSOM PARA ENVIAR NOTAS MUSICAIS MIDI
Para a disciplina Projeto Interdisciplinar de Engenharia II (UCL - Serra
- ES), foi requisitado fazer um instrumento musical utilizando Arduíno.
Optei por fazer uma "Sanfona Ultrassônica", com dois sensores
Ultrassom HCSR04. Utilizei um Arduíno MEGA 2560. Também fiz um Trombone
Eletrônico, utilizando sensor ultrassom.
1.1 MEDIÇÃO DAS DISTÂNCIAS
Comecei a pesquisar em vários sites sobre como medir a distância usando
Arduíno e sensores ultrassom. Consegui informações relevantes no post
"HC-SR04 com Arduíno: Colocando o ultrassom para funcionar", do
seguinte blog: http://blog.repeatdomiau.com.br/miadas/arduino-com-ultrassom-hcsr04.
Enfim, cheguei ao seguinte código para medir as distâncias utilizando os
dois sensores ultrassom:
1.1.1
Código Arduíno para medir as
distâncias usando dois sensores ultrassom (entre aspas - retirar
as aspas se for utilizar)
"
#define echoPin1 13 //Pino 13 recebe o pulso do echo
#define trigPin1 12 //Pino 12 envia o pulso para gerar o echo
#define echoPin2 9 //Pino 9 recebe o pulso do echo
#define trigPin2 8 //Pino 8 envia o pulso para gerar o echo
void setup()
{
Serial.begin(9600); //inicia a porta serial
pinMode(echoPin1, INPUT); // define o pino 13 como entrada
(recebe)
pinMode(trigPin1, OUTPUT); // define o pino 12 como saida
(envia)
pinMode(echoPin2, INPUT); // define o pino 9 como entrada
(recebe)
pinMode(trigPin2, OUTPUT); // define o pino 8 como saida
(envia)
}
void loop()
{
//seta o pino 12 com um pulso baixo "LOW" ou desligado
ou ainda 0
digitalWrite(trigPin1, LOW);
//delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 12 com pulso alto "HIGH" ou ligado ou
ainda 1
digitalWrite(trigPin1, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 12 com pulso baixo novamente
digitalWrite(trigPin1, LOW);
//pulseIn lê o tempo entre a chamada e o pino entrar em high
long duration1 = pulseIn(echoPin1,HIGH);
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem
dobrado
//porque é o tempo de ida e volta do ultrassom
long distancia1 = duration1 /29 / 2 ;
Serial.print("Distancia sensor 1 em CM: ");
Serial.println(distancia1);
delay(1000); //espera 1 segundo para fazer a leitura novamente
//seta o pino 8 com um pulso baixo "LOW" ou desligado
ou ainda 0
digitalWrite(trigPin2, LOW);
//delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 8 com pulso alto "HIGH" ou ligado ou
ainda 1
digitalWrite(trigPin2, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 8 com pulso baixo novamente
digitalWrite(trigPin2, LOW);
//pulseIn lê o tempo entre a chamada e o pino entrar em high
long duration2 = pulseIn(echoPin2,HIGH);
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem
dobrado
//porque é o tempo de ida e volta do ultrassom
long distancia2 = duration2 /29 / 2 ;
Serial.print("Distancia sensor 2 em CM: ");
Serial.println(distancia2);
delay(1000); //espera 1 segundo para fazer a leitura novamente
}
"
1.1.2 Explicação sobre o código Arduíno
Os sensores ultrassom HCSR04 tem quatro conexões: 5V, GND, Trigger e
ECHO. As conexões 5V e GND são para alimentação de energia. A conexão Trigger
(gatilho) é para a emissão do sinal ultrassom. A conexão ECHO detecta o sinal
ultrassom após ser refletido em alguma superfície.
Como o sinal vai e volta, é necessário dividir a distância por dois. Os
demais ajustes para chegar à distância em centímetros estão descritos no código
acima.
O código acima utilizou a porta serial 9600 e os valores de medições
podem ser visualizados utilizando-se o "Monitor Serial" do Arduíno
(Arduíno - Ferramentas - Monitor Serial // ou pressionando Ctrl + Shift + M).
Para a medição das distâncias, é necessário utilizar o programa do
Arduíno (gratuito, disponível em https://www.arduino.cc/), o Arduíno (placa -
utilizei o Arduíno MEGA 2560), o cabo USB que vem com o Arduíno, os dois
sensores ultrassom e o computador. A função "Monitor Serial" do
programa do Arduíno mostra as distâncias em cm (conforme o código acima).
1.2
EMITINDO AS NOTAS MIDI COM UM SENSOR ULTRASSOM
Com as medições prontas, resolvi inserir a emissão de notas musicais
MIDI conforme as distâncias medidas pelos sensores ultrassom. Voltei a estudar vários
sites. Aqui vão alguns links para ajudar quem queira fazer um instrumento
musical (encontrei de baterias, xilofones, instrumentos para música
eletrônica):
- Xilofone
com sensores de pressão (piezo): http://www.instructables.com/id/Arduino-Xylophone/
- Outro
xilofone com sensores de pressão (piezo): http://www.instructables.com/id/Arduino-Uno-Xylophone/
- Musical
MIDI shoes: http://www.instructables.com/id/Musical-MIDI-Shoes/
- Tambores
MIDI com Arduíno: http://www.instructables.com/id/MIDI-Arduino-Drums/
- Projeto
Mini Bateria Eletrônica: http://labdegaragem.com/profiles/blog/show?id=6223006%3ABlogPost%3A150112&commentId=6223006%3AComment%3A195737
- O
que é MIDI: http://www.instructables.com/id/What-is-MIDI/
- Fazendo
a saída de MIDI usando um Arduíno: https://itp.nyu.edu/physcomp/labs/labs-serial-communication/lab-midi-output-using-an-arduino/
- Programa
MIDI-OX para monitorar o sinal MIDI: http://www.midiox.com/
- Explicação
sobre o MIDI-OX: http://www.musitec.com.br/revistas/?c=66
- Enviando
sinais MIDI: http://forum.arduino.cc/index.php?topic=84651.0
- Vários
vídeos e anotações minhas: http://lucastrfreitas.blogspot.com.br/search/label/Projeto%20Interdisciplinar%20de%20Engenharia%20II
Analisando tudo, foram necessários os seguintes programas para o som
sair:
- Programa
do Arduíno (para escrever o código a ser gravado no Arduíno):
- LoopMIDI
(é um "cabo virtual" para conexões MIDI):
- Hairless
(faz uma ponte para aparelhos que usam a conexão SERIAL - é um Serial
Bridge):
- MIDI-OX
(monitoramento das notas MIDI):
- VMPK
MIDI Piano Keyboard (execução das notas MIDI)
- Reaper
(execução das notas MIDI)
- Kontakt
5 (execução das notas MIDI)
Uma nota importante é que a porta Serial para usar o Hairless usa o
número 115200. Gastei muito tempo tentando fazer as notas MIDI saírem usando
outros números de portas e não consegui. É possível trocar o número Baud rate
(115200) no Hairless: Hairless >> File >> Preferences >> Baud
rate.
Olhando os códigos que encontrei, consegui fazer o som funcionar com
várias notas utilizando o código abaixo. Utilizei as notas de 68 a 91, para uma
distância de 50 cm. Coloquei a nota 68 para os primeiros 2 cm. A cada 2 cm a
mais de distância do ultrassom, a nota aumenta em 1 número. Utilizei a função
"if" e "else if" para delimitar as distâncias. Caso alguém
queira tentar, acredito que seja possível fazer a variação de notas conforme a
distância utilizando a função "for".
A próxima seção apresenta o código que funcionou para um sensor
Ultrassom. O som do instrumento musical pode ser escolhido no programa que
executa as notas MIDI (como o VMPK MIDI piano Keyboard, por exemplo).
1.2.1
Código Arduíno que funcionou com
um sensor ultrassom (entre aspas - retirar as aspas se for utilizar)
"
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo
const byte noteOffCommand = 0;
const byte noteOnCommand = 1;
byte channel = 0; // Channel 1 (0-15 selects channel 1-16)
//byte pitchByte = 69; // A4 = Middle A = 440 Hz (Piano keyboard
runs from 21/A0 to 108/C8)
//byte velocityByte = 127; // Medium Velocity/Volume (value from 0
to 127)
void setup()
{
Serial.begin(115200); //inicia a porta serial 115200
para o HairLess
pinMode(echoPin, INPUT); // define o pino 13 como entrada
(recebe)
pinMode(trigPin, OUTPUT); // define o pino 12 como saida
(envia)
}
void loop()
{
//seta o pino 12 com um pulso baixo "LOW" ou desligado
ou ainda 0
digitalWrite(trigPin, LOW);
// delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 12 com pulso alto "HIGH" ou ligado ou
ainda 1
digitalWrite(trigPin, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 12 com pulso baixo novamente
digitalWrite(trigPin, LOW);
//pulseInt lê o tempo entre a chamada e o pino entrar em high
long duration = pulseIn(echoPin,HIGH);
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem
dobrado
//porque é o tempo de ida e volta do ultrassom
long distancia = duration /29 / 2 ;
if (distancia >= 50){
delay(1000); // Tempo de espera duration
}
else if (distancia <= 2){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(68));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(68));
Serial.write(byte(0));
}
else if ((distancia > 2) && (distancia <= 4)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(69));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(69));
Serial.write(byte(0));
}
else if ((distancia > 4) && (distancia <= 6)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(70));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(70));
Serial.write(byte(0));
}
else if ((distancia > 6) && (distancia <= 8)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(71));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(71));
Serial.write(byte(0));
}
else if ((distancia > 8) && (distancia <= 10)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(72));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(72));
Serial.write(byte(0));
}
else if ((distancia > 12) && (distancia < 14)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(73));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(73));
Serial.write(byte(0));
}
else if ((distancia > 14) && (distancia <= 16)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(74));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(74));
Serial.write(byte(0));
}
else if ((distancia > 16) && (distancia <= 18)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(75));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(75));
Serial.write(byte(0));
}
else if ((distancia > 18) && (distancia <= 20)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(76));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(76));
Serial.write(byte(0));
}
else if ((distancia > 20) && (distancia <= 22)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(77));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(77));
Serial.write(byte(0));
}
else if ((distancia > 22) && (distancia <= 24)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(78));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(78));
Serial.write(byte(0));
}
else if ((distancia > 24) && (distancia <= 26)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(79));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(79));
Serial.write(byte(0));
}
else if ((distancia > 26) && (distancia <= 28)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(80));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(80));
Serial.write(byte(0));
}
else if ((distancia > 28) && (distancia <= 30)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(81));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(81));
Serial.write(byte(0));
}
else if ((distancia > 30) && (distancia <= 32)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(82));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(82));
Serial.write(byte(0));
}
else if ((distancia > 32) && (distancia <= 34)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(83));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(83));
Serial.write(byte(0));
}
else if ((distancia > 34) && (distancia <= 36)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(84));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(84));
Serial.write(byte(0));
}
else if ((distancia > 36) && (distancia <= 38)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(85));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(85));
Serial.write(byte(0));
}
else if ((distancia > 38) && (distancia <= 40)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(86));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(86));
Serial.write(byte(0));
}
else if ((distancia > 40) && (distancia <= 42)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(87));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(87));
Serial.write(byte(0));
}
else if ((distancia > 42) && (distancia <= 44)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(88));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(88));
Serial.write(byte(0));
}
else if ((distancia > 44) && (distancia <= 46)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(89));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(89));
Serial.write(byte(0));
}
else if ((distancia > 46) && (distancia <= 48)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(90));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(90));
Serial.write(byte(0));
}
else if ((distancia > 48) && (distancia < 50)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(91));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(91));
Serial.write(byte(0));
}
//delay(200); //espera 200 milissegundos para fazer a leitura novamente
}
"
1.3
EMITINDO AS NOTAS MIDI COM DOIS SENSORES ULTRASSOM
Após fazer as notas MIDI funcionarem com um sensor ultrassom, consegui
colocar os dois sensores ultrassom para funcionar. No código abaixo está um
sensor relacionado com o canal 1 e o outro com o canal 2, ou seja, podem ser
ligados dois tipos de sons instrumentos musicais, um em cada canal.
Para o primeiro sensor, as notas variam de 68 a 91. Para o segundo
sensor, as notas variam de 68 a 45.
Travei a distância máxima de cada sensor ultrassom em 50 cm para a
emissão de notas.
Conforme a necessidade de cada projeto, o código poderá ser alterado.
1.3.1 Código Arduíno que funcionou com
dois sensores ultrassom (entre aspas - retirar as aspas se for utilizar)
"
#define echoPin2 9 //Pino 9 recebe o pulso do echo
#define trigPin2 8 //Pino 8 envia o pulso para gerar o echo
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo
const byte noteOffCommand = 0;
const byte noteOnCommand = 1;
byte channel = 0; // Channel 1 (0-15 selects channel 1-16)
byte channel2 = 1; // Channel 2 (0-15 selects channel 1-16)
//byte pitchByte = 69; // A4 = Middle A = 440 Hz (Piano keyboard
runs from 21/A0 to 108/C8)
//byte velocityByte = 127; // Medium Velocity/Volume (value from 0
to 127)
void setup()
{
Serial.begin(115200); //inicia a porta serial 115200
para o HairLess
pinMode(echoPin, INPUT); // define o pino 13 como entrada
(recebe)
pinMode(trigPin, OUTPUT); // define o pino 12 como saida
(envia)
pinMode(echoPin2, INPUT); // define o pino 9 como entrada
(recebe)
pinMode(trigPin2, OUTPUT); // define o pino 8 como saida
(envia)
}
void loop()
{
// -- ULTRASSOM SENSOR 1 -- Medição --
//seta o pino 12 com um pulso baixo "LOW" ou desligado
ou ainda 0
digitalWrite(trigPin, LOW);
// delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 12 com pulso alto "HIGH" ou ligado ou
ainda 1
digitalWrite(trigPin, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 12 com pulso baixo novamente
digitalWrite(trigPin, LOW);
//pulseInt lê o tempo entre a chamada e o pino entrar em high
long duration = pulseIn(echoPin,HIGH);
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem
dobrado
//porque é o tempo de ida e volta do ultrassom
long distancia = duration /29 / 2 ;
// -- NOTAS MIDI -- ULTRASSOM SENSOR 1 --
if (distancia >= 50){
delay(300); // Tempo de espera 300 milissegundos
}
else if (distancia <= 2){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(68));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(68));
Serial.write(byte(0));
}
else if ((distancia > 2) && (distancia <= 4)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(69));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(69));
Serial.write(byte(0));
}
else if ((distancia > 4) && (distancia <= 6)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(70));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(70));
Serial.write(byte(0));
}
else if ((distancia > 6) && (distancia <= 8)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(71));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(71));
Serial.write(byte(0));
}
else if ((distancia > 8) && (distancia <= 10)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(72));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(72));
Serial.write(byte(0));
}
else if ((distancia > 12) && (distancia < 14)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(73));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(73));
Serial.write(byte(0));
}
else if ((distancia > 14) && (distancia <= 16)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(74));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(74));
Serial.write(byte(0));
}
else if ((distancia > 16) && (distancia <= 18)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(75));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(75));
Serial.write(byte(0));
}
else if ((distancia > 18) && (distancia <= 20)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(76));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(76));
Serial.write(byte(0));
}
else if ((distancia > 20) && (distancia <= 22)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(77));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(77));
Serial.write(byte(0));
}
else if ((distancia > 22) && (distancia <= 24)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(78));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(78));
Serial.write(byte(0));
}
else if ((distancia > 24) && (distancia <= 26)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(79));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(79));
Serial.write(byte(0));
}
else if ((distancia > 26) && (distancia <= 28)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(80));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(80));
Serial.write(byte(0));
}
else if ((distancia > 28) && (distancia <= 30)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(81));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(81));
Serial.write(byte(0));
}
else if ((distancia > 30) && (distancia <= 32)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(82));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(82));
Serial.write(byte(0));
}
else if ((distancia > 32) && (distancia <= 34)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(83));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(83));
Serial.write(byte(0));
}
else if ((distancia > 34) && (distancia <= 36)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(84));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(84));
Serial.write(byte(0));
}
else if ((distancia > 36) && (distancia <= 38)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(85));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(85));
Serial.write(byte(0));
}
else if ((distancia > 38) && (distancia <= 40)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(86));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(86));
Serial.write(byte(0));
}
else if ((distancia > 40) && (distancia <= 42)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(87));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(87));
Serial.write(byte(0));
}
else if ((distancia > 42) && (distancia <= 44)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(88));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(88));
Serial.write(byte(0));
}
else if ((distancia > 44) && (distancia <= 46)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(89));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(89));
Serial.write(byte(0));
}
else if ((distancia > 46) && (distancia <= 48)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(90));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(90));
Serial.write(byte(0));
}
else if ((distancia > 48) && (distancia < 50)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(91));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(91));
Serial.write(byte(0));
}
// -- ULTRASSOM SENSOR 2 -- Medição --
//seta o pino 8 com um pulso baixo "LOW" ou desligado
ou ainda 0
digitalWrite(trigPin2, LOW);
//delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 8 com pulso alto "HIGH" ou ligado ou ainda
1
digitalWrite(trigPin2, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 8 com pulso baixo novamente
digitalWrite(trigPin2, LOW);
//pulseIn lê o tempo entre a chamada e o pino entrar em high
long duration2 = pulseIn(echoPin2,HIGH);
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem
dobrado
//porque é o tempo de ida e volta do ultrassom
long distancia2 = duration2 /29 / 2 ;
// -- NOTAS MIDI -- ULTRASSOM SENSOR 2 --
if (distancia2 >= 50){
delay(300); // Tempo de espera 300 milissegundos
}
else if (distancia2 <= 2){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(68));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(68));
Serial.write(byte(0));
}
else if ((distancia2 > 2) && (distancia2 <= 4)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(67));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(67));
Serial.write(byte(0));
}
else if ((distancia2 > 4) && (distancia2 <= 6)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(66));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(66));
Serial.write(byte(0));
}
else if ((distancia2 > 6) && (distancia2 <= 8)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(65));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(65));
Serial.write(byte(0));
}
else if ((distancia2 > 8) && (distancia2 <= 10)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(64));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(64));
Serial.write(byte(0));
}
else if ((distancia2 > 12) && (distancia2 < 14)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(63));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(63));
Serial.write(byte(0));
}
else if ((distancia2 > 14) && (distancia2 <= 16)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(62));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(62));
Serial.write(byte(0));
}
else if ((distancia2 > 16) && (distancia2 <= 18)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(61));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(61));
Serial.write(byte(0));
}
else if ((distancia2 > 18) && (distancia2 <= 20)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(60));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(60));
Serial.write(byte(0));
}
else if ((distancia2 > 20) && (distancia2 <= 22)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(59));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(59));
Serial.write(byte(0));
}
else if ((distancia2 > 22) && (distancia2 <= 24)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(58));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(58));
Serial.write(byte(0));
}
else if ((distancia2 > 24) && (distancia2 <= 26)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(57));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(57));
Serial.write(byte(0));
}
else if ((distancia2 > 26) && (distancia2 <= 28)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(56));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(56));
Serial.write(byte(0));
}
else if ((distancia2 > 28) && (distancia2 <= 30)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(55));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(55));
Serial.write(byte(0));
}
else if ((distancia2 > 30) && (distancia2 <= 32)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(54));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(54));
Serial.write(byte(0));
}
else if ((distancia2 > 32) && (distancia2 <= 34)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(53));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(53));
Serial.write(byte(0));
}
else if ((distancia2 > 34) && (distancia2 <= 36)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(52));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(52));
Serial.write(byte(0));
}
else if ((distancia2 > 36) && (distancia2 <= 38)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(51));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(51));
Serial.write(byte(0));
}
else if ((distancia2 > 38) && (distancia2 <= 40)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(50));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(50));
Serial.write(byte(0));
}
else if ((distancia2 > 40) && (distancia2 <= 42)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(49));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(49));
Serial.write(byte(0));
}
else if ((distancia2 > 42) && (distancia2 <= 44)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(48));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(48));
Serial.write(byte(0));
}
else if ((distancia2 > 44) && (distancia2 <= 46)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(47));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(47));
Serial.write(byte(0));
}
else if ((distancia2 > 46) && (distancia2 <= 48)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(46));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(46));
Serial.write(byte(0));
}
else if ((distancia2 > 48) && (distancia2 < 50)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(45));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(45));
Serial.write(byte(0));
}
//delay(200); //espera 200 milissegundos para fazer a leitura novamente
}
"
1.4
EMITINDO AS NOTAS MIDI COM DOIS SENSORES ULTRASSOM: CÓDIGO
RESUMIDO
Uma outra lógica mais curta do que utilizar várias funções
"if" e "else if" pode ser feita se atrelarmos a variação de
distância com a formação da nota. Abaixo segue um código mais curto seguindo a
ideia. Cada sensor está relacionado com um canal de emissão de notas MIDI: um
sensor com o canal 1 e o outro com o canal 2.
1.4.1 Código Arduíno mais
curto que funcionou com dois sensores ultrassom (entre aspas - retirar as aspas
se for utilizar)
"
#define echoPin2 9 //Pino 9 recebe o pulso do echo
#define trigPin2 8 //Pino 8 envia o pulso para gerar o echo
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo
const byte noteOffCommand = 0;
const byte noteOnCommand = 1;
byte channel = 0; // Channel 1 (0-15 selects channel 1-16)
byte channel2 = 1; // Channel 2 (0-15 selects channel 1-16)
//byte pitchByte = 69; // A4 = Middle A = 440 Hz (Piano keyboard
runs from 21/A0 to 108/C8)
//byte velocityByte = 127; // Medium Velocity/Volume (value from 0
to 127)
void setup()
{
Serial.begin(115200); //inicia a porta serial 115200
para o HairLess
pinMode(echoPin, INPUT); // define o pino 13 como entrada
(recebe)
pinMode(trigPin, OUTPUT); // define o pino 12 como saida
(envia)
pinMode(echoPin2, INPUT); // define o pino 9 como entrada
(recebe)
pinMode(trigPin2, OUTPUT); // define o pino 8 como saida
(envia)
}
void loop()
{
// -- ULTRASSOM SENSOR 1 -- Medição --
//seta o pino 12 com um pulso baixo "LOW" ou desligado
ou ainda 0
digitalWrite(trigPin, LOW);
// delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 12 com pulso alto "HIGH" ou ligado ou
ainda 1
digitalWrite(trigPin, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 12 com pulso baixo novamente
digitalWrite(trigPin, LOW);
//pulseInt lê o tempo entre a chamada e o pino entrar em high
long duration = pulseIn(echoPin,HIGH);
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem
dobrado
//porque é o tempo de ida e volta do ultrassom
long distancia = duration /29 / 2 ;
// -- ULTRASSOM SENSOR 2 -- Medição --
//seta o pino 8 com um pulso baixo "LOW" ou desligado
ou ainda 0
digitalWrite(trigPin2, LOW);
//delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 8 com pulso alto "HIGH" ou ligado ou
ainda 1
digitalWrite(trigPin2, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 8 com pulso baixo novamente
digitalWrite(trigPin2, LOW);
//pulseIn lê o tempo entre a chamada e o pino entrar em high
long duration2 = pulseIn(echoPin2,HIGH);
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem
dobrado
//porque é o tempo de ida e volta do ultrassom
long distancia2 = duration2 /29 / 2 ;
// -- NOTAS MIDI -- ULTRASSOM SENSOR 1 --
if (distancia >= 50){
delay(300); // Tempo de espera 300 milissegundos
}
else {
int nota = distancia + 68;
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota)); //
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota));
Serial.write(byte(0));
}
// -- NOTAS MIDI -- ULTRASSOM SENSOR 2 --
if (distancia2 >= 50){
delay(300); // Tempo de espera 300 milissegundos
}
else {
int nota2 = 68 - distancia2;
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel2)));
Serial.write(byte(nota2));
Serial.write(byte(127));
delay(300); // Note duration
Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel2)));
Serial.write(byte(nota2));
Serial.write(byte(0));
}
}
//delay(200); //espera 200 milissegundos para fazer a leitura novamente
"
2
TROMBONE ELETRÔNICO
O código utilizado para construir o trombone eletrônico utilizou o mesmo
sistema de medição com o sensor ultrassom e emissão das notas MIDI. Porém, foi
acrescentado um botão para acionamento do equipamento. Assim, o equipamento só
emite notas se o botão estiver pressionado.
“
// Definindo os pinos Echo (recepção do ultrassom) e Trigger (gatilho,
disparo do ultrassom)
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo
#define botaoacionador 2 //Pino 2 envia o sinal do botão acionador do
trombone
// Liga e desliga as notas midi
const byte noteOffCommand = 0;
const byte noteOnCommand = 1;
// Tempo de duração das notas (em milissegundos)
int tempodasnotas = 90;
// Tempo de intervalo entre as notas (em milissegundos)
int tempoentrenotas = 30;
// Tempo de espera se a distância for maior que 50cm (em milissegundos)
int tempodeespera = 30;
// Interruptor de Acionamento do Trombone
int acionador = 0; // variável para ler o estado do botão acionador do
trombone
// Notas midi
int nota1 = 36; // Nota C (Dó)
int nota2 = 38; // Nota D (Ré)
int nota3 = 40; // Nota E (Mi)
int nota4 = 41; // Nota F (Fá)
int nota5 = 43; // Nota G (Sol)
int nota6 = 45; // Nota A (Lá)
int nota7 = 47; // Nota B (Si)
int nota8 = 48; // Nota C (Dó)
int nota9 = 50; // Nota D (Ré)
int nota10 = 52; // Nota E (Mi)
//fim das notas midi
//variável para armazenar a nota a executar
int notaaexecutar = 0;
//variável para armazenar a nota anteriormente tocada
int notaanterior = 1;
//variável para armazenar a distancia anteriormente medida
int distanciaanterior = 0;
//variável para armazenar o estado do botão (0 para desligado e 1 para
ligado)
int botao = 0;
// variável que informa se o botão foi acionado agora (1) ou não (0)
int botaoacionadoagora = 2;
// variável distancia limite de 50cm atingida (1) ou não atingida (0)
int distancialimite = 2;
// variável informa que a distancia permanece além do limite de 50cm (1)
ou não (0)
int zonafora = 2;
// variável informa que a distancia saiu da zona fora do limite de 50cm
agora (1) ou não (0)
int saiudazonaforaagora = 2;
byte channel = 0; // Channel
1 (0-15 selects channel 1-16)
//byte pitchByte = 69; // A4 =
Middle A = 440 Hz (Piano keyboard runs from 21/A0 to 108/C8)
//byte velocityByte = 127; //
Medium Velocity/Volume (value from 0 to 127)
// Configuração do Setup
void setup()
{
Serial.begin(115200); //inicia
a porta serial (115200 para o HairLess, pode ser modificada no Hairless)
pinMode(echoPin, INPUT); //
define o pino 13 como entrada (recebe)
pinMode(trigPin, OUTPUT); //
define o pino 12 como saida (envia)
pinMode(botaoacionador, INPUT);
// define o botão acionador como entrada (recebe)
}
// Inicia o loop de verificações de distâncias e emissão de notas
midi
void loop()
{
// Configurando o botão de acionamento
acionador = digitalRead(botaoacionador); // Lê o valor de entrada do
botão (HIGH ou LOW)
if (acionador == HIGH) { // verifica se a entrada é HIGH (interruptor
livre)
// Se o botão estava pressionado, ele vai desarmar a nota tocada
anteriormente
if (botao == 1) {
// estado da variável
botão passa para desligado
botao = 0;
// reseta a variável
distanciaanterior
distanciaanterior = 0;
if (notaaexecutar != 0 && zonafora == 0){
// desliga a nota MIDI
"notaaexecutar" executada anteriormente quando o botão estava
apertado
Serial.write(0x80 +
(noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(notaaexecutar));
Serial.write(byte(0));
}
}
if (botao == 0) {
delay(1); // espera 1
milissegundo
}
} else {
if (botao == 0){
// variável botao grava que o botao está pressionado
botao = 1;
// variável que informa se o botão foi acionado agora (1)
botaoacionadoagora = 1;
}
// Realizando a medida com o ultrassom
//seta o pino 12 com um pulso
baixo "LOW" ou desligado ou ainda 0
digitalWrite(trigPin,
LOW);
// delay de 2
microssegundos
delayMicroseconds(2);
//seta o pino 12 com pulso alto
"HIGH" ou ligado ou ainda 1
digitalWrite(trigPin,
HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 12 com pulso baixo
novamente
digitalWrite(trigPin,
LOW);
//pulseInt lê o tempo entre a
chamada e o pino entrar em high
long duration =
pulseIn(echoPin,HIGH);
//Esse calculo é baseado em s =
v . t, lembrando que o tempo vem dobrado
//porque é o tempo de ida e
volta do ultrassom
long distancia = duration /29
/ 2 ;
// se a distância medida pelo ultrassom permanecer constante, a nota
MIDI continua a ser executada
if (distanciaanterior == distancia){
// Tempo de espera para checar a
distância até o ultrassom novamente
delay(tempodeespera);
}
// se a distância medida pelo ultrassom variar, a nota MIDI a ser
executada muda
else {
// Se a distancia medida for menor que 50cm
if (distancia < 50){
// Se a distancia anterior estava fora do limite de 50cm
if (zonafora == 1){
// variável informa que
a distancia não está fora do limite de 50cm
zonafora = 0;
// variável
distancialimite indica que a distancia de 50cm não foi atingida (0)
distancialimite = 0;
// variável informa que
a distancia saiu da zona fora do limite de 50cm (1)
saiudazonaforaagora =
1;
}
if (zonafora == 2);{
// variável informa que
a distancia não está fora do limite de 50cm
zonafora = 0;
}
}
// Se a distancia medida for maior que 50cm
if (distancia > 50){ // distância máxima de captação limitada em 50cm
// variável distancia limite
de 50cm atingida
distancialimite = 1;
}
// Se a distancia limite de 50cm for atingida (1)
if (distancialimite == 1){
if (zonafora == 0 || zonafora
==2){
// variável informa que
a distancia está fora do limite de 50cm (1)
zonafora = 1;
if (notaanterior != 1){
// desliga a nota MIDI
"notaanterior" executada anteriormente quando o botão estava apertado
Serial.write(0x80 +
(noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(notaanterior));
Serial.write(byte(0));
}
}
}
// a variável notaaexecutar recebe um novo valor conforme a distancia
medida pelo ultrassom
if (distancia <= 5){
notaaexecutar = nota1; // a variável notaaexecutar recebe o valor da
variável nota1
}
else if ((distancia > 5) && (distancia <= 10)){
notaaexecutar = nota2; // a variável notaaexecutar recebe o valor da
variável nota2
}
else if ((distancia > 10) && (distancia <= 15)){
notaaexecutar = nota3; // a variável notaaexecutar recebe o valor da
variável nota3
}
else if ((distancia > 15) && (distancia <= 20)){
notaaexecutar = nota4; // a variável notaaexecutar recebe o valor da
variável nota4
}
else if ((distancia > 20) && (distancia <= 25)){
notaaexecutar = nota5; // a variável notaaexecutar recebe o valor da
variável nota5
}
else if ((distancia > 25) && (distancia < 30)){
notaaexecutar = nota6; // a variável notaaexecutar recebe o valor da
variável nota6
}
else if ((distancia > 30) && (distancia <= 35)){
notaaexecutar = nota7; // a variável notaaexecutar recebe o valor da
variável nota7
}
else if ((distancia > 35) && (distancia <= 40)){
notaaexecutar = nota8; // a variável notaaexecutar recebe o valor da
variável nota8
}
else if ((distancia > 40) && (distancia <= 45)){
notaaexecutar = nota9; // a variável notaaexecutar recebe o valor da
variável nota9
}
else if ((distancia > 45) && (distancia <= 50)){
notaaexecutar = nota10; // a variável notaaexecutar recebe o valor da
variável nota10
}
// Se o botão foi acionado agora
if (botaoacionadoagora == 1
&& zonafora != 1) {
// Toca a nota MIDI correspondente à distância
medida pelo ultrassom
Serial.write(0x80 +
(noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(notaaexecutar));
Serial.write(byte(127));
// Tempo de espera para checar
a distância até o ultrassom novamente
delay(tempoentrenotas);
// a variável distancia
anterior receber o valor da distancia medida após a execução da nota MIDI
distanciaanterior = distancia;
// a variável notaanterior
receber o valor da nota MIDI executada
notaanterior = notaaexecutar;
// variável
botaoacionadoagora informa que o botão já foi acionado (0)
botaoacionadoagora = 0;
}
// Se a distancia medida saiu da zona fora do limite de 50cm agora (1)
else if (saiudazonaforaagora == 1) {
// Toca a nota MIDI correspondente à distância
medida pelo ultrassom
Serial.write(0x80 +
(noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(notaaexecutar));
Serial.write(byte(127));
// Tempo de espera para checar
a distância até o ultrassom novamente
delay(tempoentrenotas);
// a variável distancia
anterior receber o valor da distancia medida após a execução da nota MIDI
distanciaanterior = distancia;
// a variável notaanterior
receber o valor da nota MIDI executada
notaanterior = notaaexecutar;
// variável
botaoacionadoagora informa que o botão já foi acionado (0)
saiudazonaforaagora =
0;
}
// Se a nota a ser executada for igual à nota midi anterior
else if (notaaexecutar == notaanterior || notaaexecutar == 0) {
// Tempo de espera para checar
a distância até o ultrassom novamente
delay(tempodeespera);
}
// Se a nota a ser executada for diferente da nota MIDI anteriormente
executada
else {
// Se a variável notaanterior for diferente de 1, desliga a nota
anteriormente tocada
if (notaanterior != 1){
// desliga a nota MIDI
"notaanterior" executada anteriormente quando o botão estava apertado
Serial.write(0x80 +
(noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(notaanterior));
Serial.write(byte(0));
}
// Toca a nota MIDI
correspondente à distância medida pelo ultrassom
Serial.write(0x80 +
(noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(notaaexecutar));
Serial.write(byte(127));
// Tempo de espera para checar
a distância até o ultrassom novamente
delay(tempoentrenotas);
// a variável distancia
anterior receber o valor da distancia medida após a execução da nota MIDI
distanciaanterior = distancia;
// a variável notaanterior
receber o valor da nota MIDI executada
notaanterior = notaaexecutar;
}
}
}
//final do programa
}”
A Fig. 1 mostra o esquema de conexões. O esquema foi feito utilizando-se
o programa Fritzing.
Figura 1: Esquema de conexão feito no Fritzing. |
A Fig. 2 mostra a montagem do circuito do trombone eletrônico.
Figura 2: Montagem do circuito do trombone eletrônico utilizando um protoboard. |
A Fig. 3 mostra o diagrama de funcionamento do trombone eletrônico.
Figura 3: Diagrama de funcionamento do trombone eletrônico. |
A Fig. 4 e a Fig. 5 mostram o trombone eletrônico montado, com vara móvel,
botão de acionamento e circuitos eletrônicos.
Figura 4: Trombone eletrônico montado (vara esticada). |
Figura 5: Trombone eletrônico montado (vara recolhida). |
A Fig. 6 e a Fig. 7 mostram como o sensor ultrassom e o circuito eletrônico
foram fixados no trombone eletrônico.
Figura 6: Fixação do sensor ultrassom e do circuito eletrônico (vista completa). |
Figura 7: Fixação do sensor ultrassom e do circuito eletrônico (vista aproximada). |
Nenhum comentário:
Postar um comentário