- Integrantes:
Bruno Bueno Nicoleti 0040961623022
Matheus de Oliveira Rosa 0040961413028
Wladislau de Sousa Pontes Júnior 0040961413040

- Arduino UNO

- Despianito

- Criação de um instrumento musical a partir de um microcontrolador, usando um teclado e um sensor piezoelétrico, no caso um teclado.

- Arduino UNO.
- Teclado membrana 4x4.
- Sensor Piezoelétrico.

Metodologia:
- Através da programação do teclado 4x4, associar as teclas a notas musicais.

Desenvolvimento:
- Primeira dificuldade, de configuração do teclado houve um problema com o uso do pino 1, pois o mesmo é reservado e não permitia o correto funcionamento de todas as teclas do teclado.
- Segunda dificuldade, os sensores piezoelétricos são muito frágeis e se danificam com muita facilidade.
- Terceira dificuldade, como o teclado membrana é muito resistente ao toque, é muito difícil de tocar uma musica com o mesmo, sendo assim optamos pelo uso de um teclado mecânico, porém o mesmo estava com mal contato nas soldas, o que impossibilitava o uso.
- Quarta dificuldade, utilização de um sistema de som estéreo, porém por uma limitação do dispositivo não foi possível.

Código Fonte:

#define col 4
#define row 4
 
// constantes do audio.
const int c = 261;
const int d = 294;
const int e = 329;
const int f = 349;
const int g = 391;
const int gS = 415;
const int a = 440;
const int aS = 455;
const int b = 466;
const int cH = 523;
const int cSH = 554;
const int dH = 587;
const int dSH = 622;
const int eH = 659;
const int fH = 698;
const int fSH = 740;
const int gH = 784;
const int gSH = 830;
const int aH = 880;
int counter = 0;
 
// constantes do teclado.
const int buzzerPin = 8;
 
int rows[row] = {2,3,4,5};
int cols[col] = {9,10,11,12};
 
char combo[5] = {'D','D','D','6','1'};
int pos = 0;
 
char teclado[row][col] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
 
int ton[row][col] = {
  {261,277,293,375},
  {311,329,349,475},
  {370,392,415,575},
  {440,466,494,523}
};
 
// inicializador
void setup() {
  // put your setup code here, to run once:
  for (int i=0;i<row;i++) {
    pinMode(rows[i], OUTPUT);
    digitalWrite(rows[i], HIGH);
  }
 
  for (int i=0;i<col;i++)
    pinMode(cols[i], INPUT_PULLUP);
 
  pinMode(buzzerPin, OUTPUT);
 
  Serial.begin(9600);
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
  scan();
}
 
// leitura das telcas.
void scan()
{
  for (int i=0;i<row;i++) {
    digitalWrite(rows[i], LOW);
    for (int j=0;j<col;j++) {
      if (digitalRead(cols[j]) == LOW) {
 
        // gerenciador de combo.
        switch (pos) {
          case 0:
            if (combo[0] == teclado[i][j])
              pos = 1;
            else
              pos = 0;
            break;
          case 1:
            if (combo[1] == teclado[i][j])
              pos = 2;
            else
              pos = 0;
            break;
          case 2:
            if (combo[2] == teclado[i][j])
              pos = 3;
            else
              pos = 0;
            break;
          case 3:
            if (combo[3] == teclado[i][j])
              pos = 4;
            else
              pos = 0;
            break;
          case 4:
            if (combo[4] == teclado[i][j]) {
              //reiniciando o contador de notas.
              pos = 0;
              //Play first section
              firstSection();
 
              //Play second section
              secondSection();
 
              //Variant 1
              beep(f, 250);
              beep(gS, 500);
              beep(f, 350);
              beep(a, 125);
              beep(cH, 500);
              beep(a, 375);
              beep(cH, 125);
              beep(eH, 650);
 
              delay(500);
 
              //Repeat second section
              secondSection();
 
              //Variant 2
              beep(f, 250);
              beep(gS, 500);
              beep(f, 375);
              beep(cH, 125);
              beep(a, 500);
              beep(f, 375);
              beep(cH, 125);
              beep(a, 650);
 
              delay(650);
            }
            else
              pos = 0;
            break;
          default:
            pos = 0;
            break;
        }
 
        //tecla(i,j);
        tons(i,j);
        while (digitalRead(cols[j]) == LOW) {}
        //digitalWrite(rows[i], HIGH);
      }
    }
    digitalWrite(rows[i], HIGH);
  }
  //delay(120);
}
 
void tecla(int x, int y)
{
  Serial.println(teclado[x][y]);
}
 
// notas musicais.
void tons(int x, int y)
{
  tone(buzzerPin, ton[x][y]);
  delay(250);
  noTone(buzzerPin);
}
 
// beep conf.
void beep(int note, int duration)
{
  //Play tone on buzzerPin
  tone(buzzerPin, note, duration);
  delay(duration);
  //Stop tone on buzzerPin
  noTone(buzzerPin);
 
  delay(50);
 
  //Increment counter
  counter++;
}
 
void firstSection()
{
  beep(a, 500);
  beep(a, 500);
  beep(a, 500);
  beep(f, 350);
  beep(cH, 150);
  beep(a, 500);
  beep(f, 350);
  beep(cH, 150);
  beep(a, 650);
 
  delay(500);
 
  beep(eH, 500);
  beep(eH, 500);
  beep(eH, 500);
  beep(fH, 350);
  beep(cH, 150);
  beep(gS, 500);
  beep(f, 350);
  beep(cH, 150);
  beep(a, 650);
 
  delay(500);
}
 
void secondSection()
{
  beep(aH, 500);
  beep(a, 300);
  beep(a, 150);
  beep(aH, 500);
  beep(gSH, 325);
  beep(gH, 175);
  beep(fSH, 125);
  beep(fH, 125);
  beep(fSH, 250);
 
  delay(325);
 
  beep(aS, 250);
  beep(dSH, 500);
  beep(dH, 325);
  beep(cSH, 175);
  beep(cH, 125);
  beep(b, 125);
  beep(cH, 250);
 
  delay(350);
}


Resultados:
Obtivemos um teclado funcional que também conta com um modo automático (DDD61).

#define col 4#define row 4
constantes do audio.
const int c = 261;const int d = 294;const int e = 329;const int f = 349;const int g = 391;const int gS = 415;const int a = 440;const int aS = 455;const int b = 466;const int cH = 523;const int cSH = 554;const int dH = 587;const int dSH = 622;const int eH = 659;const int fH = 698;const int fSH = 740;const int gH = 784;const int gSH = 830;const int aH = 880;int counter = 0;
constantes do teclado.
const int buzzerPin = 8;
int rows[row] = {2,3,4,5};int cols[col] = {9,10,11,12};
char combo[5] = {'D','D','D','6','1'};int pos = 0;
char teclado[row][col] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}};
int ton[row][col] = {{261,277,293,375},{311,329,349,475},{370,392,415,575},{440,466,494,523}};
inicializadorvoid setup() {

put your setup code here, to run once:
for (int i=0;i<row;i++) {pinMode(rows[i], OUTPUT);digitalWrite(rows[i], HIGH);}
for (int i=0;i<col;i++)pinMode(cols[i], INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
}
void loop() { put your main code here, to run repeatedly:scan();}


leitura das telcas.
void scan(){for (int i=0;i<row;i++) {digitalWrite(rows[i], LOW);for (int j=0;j<col;j++) {if (digitalRead(cols[j]) == LOW) {
gerenciador de combo.switch (pos) {case 0:if (combo[0] == teclado[i][j])pos = 1;elsepos = 0;break;case 1:if (combo[1] == teclado[i][j])pos = 2;elsepos = 0;break;case 2:if (combo[2] == teclado[i][j])pos = 3;elsepos = 0;break;case 3:if (combo[3] == teclado[i][j])pos = 4;elsepos = 0;break;case 4:if (combo[4] == teclado[i][j]) {

reiniciando o contador de notas.
pos = 0;Play first sectionfirstSection();
Play second section
secondSection();
Variant 1beep(f, 250);beep(gS, 500);beep(f, 350);beep(a, 125);beep(cH, 500);beep(a, 375);beep(cH, 125);beep(eH, 650);
delay(500);
Repeat second section
secondSection();

Variant 2beep(f, 250);beep(gS, 500);beep(f, 375);beep(cH, 125);beep(a, 500);beep(f, 375);beep(cH, 125);beep(a, 650);
delay(650);}elsepos = 0;break;default:pos = 0;break;}
tecla(i,j);
tons(i,j);while (digitalRead(cols[j]) == LOW) {}digitalWrite(rows[i], HIGH); }}digitalWrite(rows[i], HIGH);}

delay(120);
}
void tecla(int x, int y){Serial.println(teclado[x][y]);}
notas musicais.void tons(int x, int y){tone(buzzerPin, ton[x][y]);delay(250);noTone(buzzerPin);}


beep conf.
void beep(int note, int duration){Play tone on buzzerPintone(buzzerPin, note, duration);delay(duration);

Stop tone on buzzerPin
noTone(buzzerPin);

delay(50);

//Increment countercounter++;}
void firstSection(){beep(a, 500);beep(a, 500);beep(a, 500);beep(f, 350);beep(cH, 150);beep(a, 500);beep(f, 350);beep(cH, 150);beep(a, 650);

delay(500);

beep(eH, 500);beep(eH, 500);beep(eH, 500);beep(fH, 350);beep(cH, 150);beep(gS, 500);beep(f, 350);beep(cH, 150);beep(a, 650);

delay(500);}

void secondSection(){beep(aH, 500);beep(a, 300);beep(a, 150);beep(aH, 500);beep(gSH, 325);beep(gH, 175);beep(fSH, 125);beep(fH, 125);beep(fSH, 250);

delay(325);

beep(aS, 250);beep(dSH, 500);beep(dH, 325);beep(cSH, 175);beep(cH, 125);beep(b, 125);beep(cH, 250);

delay(350);}