segunda-feira, 16 de novembro de 2015

Programa Arduíno para controlar um ultrassom e enviar notas midi - pronto e bom

Programa Arduíno para controlar um ultrassom e enviar notas midi - pronto e bom

// 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

// Liga e desliga as notas midi
const byte noteOffCommand = 0;
const byte noteOnCommand = 1;

// Tempo de duração das notas (em milissegundos)
int tempodasnotas = 160;

// 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;

// 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

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)
}

// Inicia o loop de verificações de distâncias e emissão de notas midi
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){ // distância máxima de captação limitada em 50cm

delay(tempodeespera); // Tempo de espera para checar a distância até o ultrassom novamente

}
else if (distancia <= 5){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota1));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota1));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}
else if ((distancia > 5) && (distancia <= 10)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota2));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota2));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}
else if ((distancia > 10) && (distancia <= 15)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota3));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota3));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}
else if ((distancia > 15) && (distancia <= 20)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota4));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota4));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}
else if ((distancia > 20) && (distancia <= 25)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota5));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota5));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}
else if ((distancia > 25) && (distancia < 30)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota6));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota6));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}
else if ((distancia > 30) && (distancia <= 35)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota7));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota7));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}
else if ((distancia > 35) && (distancia <= 40)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota8));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota8));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}
else if ((distancia > 40) && (distancia <= 45)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota9));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota9));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}
else if ((distancia > 45) && (distancia <= 50)){
Serial.write(0x80 + (noteOnCommand << 4) + (byte(channel)));
Serial.write(byte(nota10));
Serial.write(byte(127));

delay(tempodasnotas); // Duração da nota

Serial.write(0x80 + (noteOffCommand << 4) + (byte(channel)));
Serial.write(byte(nota10));
Serial.write(byte(0));

delay(tempoentrenotas); // intervalo entre notas
}

//final do programa
}

Lucas T R Freitas

Nenhum comentário: