sexta-feira, 20 de novembro de 2015

PROJETO INTERDISCIPLINAR DE ENGENHARIA 2: programando Arduíno com sensor ultrassom para enviar notas musicais MIDI

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):
Analisando tudo, foram necessários os seguintes programas para o som sair:

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: