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:

Postar um comentário

Que a estrada se abra à sua frente,
Que o vento sopre levemente em suas costas,
Que o sol brilhe morno e suave em sua face,
Que a chuva caia de mansinho em seus campos,
E, até que nos encontremos, de novo, que Deus lhe guarde nas palmas de suas mãos!


Obrigado pelo seu comentário.

Curso Planejamento Estratégico para Empreendedores - SEBRAE

Certificado de conclusão do curso Planejamento Estratégico para Empreendedores - SEBRAE. Lucas Tiago Rodrigues de Freitas -- // -- D...