Segue um projeto de teclado ou piano usando o Arduino, que tem 2 características bem interessantes:
- Possibilidade de tocar 8 notas sendo elas, Dó, Ré, Mi, Fá, Sol, Lá, Sí e Dó novamente, podemos tocar as notas e ouvir o resultado em um buzzer, como no esquema do Fritzing ou ainda ligar em uma caixinha de som (prefiro essa opção pois o som é infinitamente melhor).
- Podemos tocar as notas, que serão automaticamente gravadas e depois usar um botão específico (ver figuras abaixo ou assista o vídeo) para ouvir o que tocamos, assim podemos corrigir ou acertar algum detalhe no que tocamos.
Assista ao pequeno vídeo que montamos com o piano funcionando para ter uma ideia do que é e quem sabe resolva montar o seu
Aproveite para seguir o nosso canal no youtube: http://youtube.com/SMEsergio assim você saberá sempre postarmos novidades
Aproveite para seguir o nosso canal no youtube: http://youtube.com/SMEsergio assim você saberá sempre postarmos novidades
Código fonte para usar no arduino
/*
Author: Kenny Z
License: Creative Commons Attribution Share-Alike
Description: A small keyboard that can play tones from
c7 to C8, with auto record, and a button for playback.
*/
#define SPK 13
#define PLAYBACK_BTN 12
#define BUFFERSIZE 160
int keys[] = {2,3,4,5,6,7,8,9};
int tones[] = {2093,1976,1760,1568,1397,1319,1175,1047}; // melhor tom
//int tones[] = {1047,1175,1319,1397,1568,1760,1976,2093};
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
//int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
int length = sizeof keys/sizeof *keys;
// for recording
int count = 0;
int recorder[BUFFERSIZE];
unsigned long interval[BUFFERSIZE];
unsigned long pauseInterval[BUFFERSIZE];
void setup() {
pinMode(SPK,OUTPUT);
pinMode(PLAYBACK_BTN,INPUT);
for(int i=0; i<length; i++){
pinMode(keys[i],INPUT);
}
}
void loop() {
unsigned long startTime;
static unsigned long pauseTime;
static int playback_btn=0;
int lastState = LOW;
// prevent buffer overflow
if(count>=BUFFERSIZE) count=0;
// playback button
if(digitalRead(PLAYBACK_BTN)==HIGH){
playback();
playback_btn=1;
}
// for each keyboard key
for(int i=0; i<length; i++){
//startTime = micros();
startTime = millis();
while(digitalRead(keys[i])==HIGH){
if(playback_btn){
// reset count after playback
playback_btn = 0;
count=0;
}
recorder[count]=i;
tone(SPK,tones[i]);
delay(200); // debounce
lastState=HIGH;
}
if(lastState==HIGH){
lastState=LOW;
noTone(SPK);
interval[count]=millis()-startTime;
if(count)
pauseInterval[count-1]=millis()-pauseTime;
pauseTime=millis();
count++;
}
}
}
void playback(){
int index, key;
for(int i=0; i<length; i++){
pinMode(keys[i],OUTPUT);
}
for(int i=0; i<count; i++){
index = recorder[i];
key = keys[index];
digitalWrite(key,HIGH);
tone(SPK,tones[index]);
delay(interval[i]);
digitalWrite(key,LOW);
noTone(SPK);
delay(pauseInterval[i]);
}
for(int i=0; i<length; i++){
pinMode(keys[i],INPUT);
}
}
Veja abaixo imagens do projeto montado na Protoboard:
Esperamos que tenham gostado!!!!