This is an old revision of the document!


Trainer Pian

Introducere

Vreau sa implementez un trainer de pian, care sa arate asa:

https://www.youtube.com/watch?v=OF3Wbm6lZwQ&ab_channel=Luluetlolo.

O sa-mi aleg o melodie si cu ajutorul unor leduri programabile voi arata treptat ce nota trebuie apasata.

Am ales sa am 3 randuri de led-uri astfel incat sa fie intuitiva apasarea clapelor pe pian.

Scopul proiectului este sa ajute persoanele care invata sa cante la pian intr-un mod mai interactiv si colorat.

Exista cateva dificultati des intalnite de catre pianistii incepatori in studierea instrumentului, printre care se numara: varsta si complexitatea instrumentului. In consecinta, foarte multi dintre acestia renunta.

Consider ca proiectul are potential si poate deveni util, intrucat este o alternativa distractiva a cantatului la pian.

Descriere generală

Hardware Design

Lista de piese:

Componentă Cantitate
Arduino UNO 1
Banda de leduri programabile 1
Rezistenta 2
Fire de legatura 12
Bloc de alimentare 1
Buton 1

Schema electrica

Software Design

Mediu de dezvoltare: Arduino IDE

Descriere: Pentru programarea plăcii am instalat in Arduino IDE biblioteca Adafruit NeoPixel. Aceasta faciliteaza setarea benzii de leduri.

Am organizat led-urile sub forma urmatoare: verde - clapa alba, roșu - clapa neagră. Adica daca led-urile sunt de culoarea rosie trebuie apasata clapa neagra, iar daca led-urile sunt verzi, trebuie apasata clapa alba. Nota ce trebuie cântată în prezent (nota curentă) va lumina primul rând de led-uri, nota următoare pe al doilea și cea de a treia respectiv pe al treilea rând.

Cod Sursa

Cod Sursa

src.c
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define N_ROWS 3
#define N_COLS 28
#define DO 0
#define RE 2
#define MI 4
#define FA 6
#define SOL 8  
#define LA 10
#define SI_B 11
#define SI 12   
#define DO_2 14
#define RE_2 16
#define MI_B_2 17
#define MI_2 18
#define FA_2 20
#define FA_D_2 21
#define SOL_2 22    
#define N_LEDS (N_ROWS * N_COLS)
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);
 
int delays[N_ROWS];
 
void erase(){
  for(uint16_t i=0; i < strip.numPixels(); i++) { 
    strip.setPixelColor(i, 0); 
  }
}
 
void setup() {
  strip.begin();
  strip.setBrightness(125);
  erase();
  strip.show();
 
  for(int i = 0; i < N_ROWS; i++){
    delays[i] = 1000;  
  }
}
 
void check(){
  erase();
  for(int i = 0; i < strip.numPixels(); i++) { // Draw new pixel
    if(i > 0){
      strip.setPixelColor(i - 1, 0); 
    } else {
      strip.setPixelColor(N_LEDS - 1, 0);  
    }
    strip.setPixelColor(i, strip.Color(32,0,0)); 
 
    delay(100);
    strip.show();
  }
  erase();
}
 
int getInd(int i, int j){
  return i * N_COLS + (i%2 ? (N_COLS - j - 1) : j);
}
 
int lastNote = -1;
 
void play(uint32_t note){ 
  for(int i = 0; i < N_ROWS; i++){
    if(i < (N_ROWS - 1)){
      for(int j = 0; j < N_COLS; j++){
        strip.setPixelColor(getInd(i,j), strip.getPixelColor(getInd(i + 1,j)));
      } 
    } else {
      for(int j = 0; j < N_COLS; j++){
        if((note == j) || (note == j - 1)){
          strip.setPixelColor(getInd(i,j), strip.Color(note % 2 ? 255 : 0, note % 2 ? 0 : 255, 0));
        } else {
          strip.setPixelColor(getInd(i,j), strip.Color(0, 0, 0));
        }
      } 
    }
  }
  strip.show();
  delay(500);
}
 
void play(uint32_t note, int duration){ 
  for(int i = 0; i < duration; i++){
    play(note);  
  }
}
 
void part1(){
  play(SI);
  play(MI_2);
  play(SOL_2);
}
 
void part2(){
  play(FA_D_2);
  play(MI_2);
  play(SOL_2);
  play(MI_2);
}
 
void part3(){
  play(FA_2);
  play(MI_2);
  play(DO_2);
  play(RE_2);
}
 
void part4(){
  play(SI, 4);
}
 
void part5(){
  play(FA_D_2);
  play(MI_2);
  play(SI);  
  play(SI_B);
}
 
void part6(){
  play(LA, 4);
}
 
void part7(){
  play(LA);
  play(DO_2);
  play(MI_B_2);
}
 
void part8(){
  play(FA_D_2, 4);
}
 
void part9(){
  play(MI_2, 4);
}
 
void part10(){
  play(MI);
  play(SOL);
  play(RE_2);
}
 
void part11(){
  play(DO_2);
  play(SI);
  play(RE_2);
  play(DO_2);
}
 
void part12(){
  play(DO_2);
  play(SI);
  play(SI);
  play(MI_B_2);
}
 
void godfather(){
  part1();
  part2();
  part3();
  part4();
  part1();
  part2();
  part5();
  part6();
  part7();
  part8();
  part7();
  part9();
  part10();
  part11();
  part12();
  part9();
}
 
void loop() {
  check();
  godfather();
  check();
}

Rezultate Obţinute

Concluzii

Am reusit sa implementez cam tot ce mi-am propus. Am invatat multe lucruri interesante, precum biblioteca AdafruitNeoPixel.

Imi place ca am putut sa ne alegem noi tema proiectului. De asemenea, cred ca datorită accesibilității, actualității și conceptului interesant ce va simplifica studierea pianului, proiectul meu poate fi folosit atât de cei mici cât și de cei mari. M-am informat si exista studii care arata ca pianul poate fi folosit ca mijloc în tratamentul unor boli mintale și psihice:

https://ro.approby.com/cum-terapia-muzicala-poate-beneficia-de-bolnavii-de-boala-alzheimer/

https://ultrapsihologie.ro/2015/10/20/terapia-prin-muzica-pentru-copii-cu-sindromul-down-2/

https://www.divahair.ro/mama_si_copilul/pianul-prietenul-copiilor-cu-autism

Viitoarele îmbunătățiri:

1. Transmiterea melodiei de la calculator prin USB (folosind un format de tipul Midi).

2. Mărirea înălțimei și lățimei prototipului.

3. Atașarea unui microfon.

Jurnal

1. 27 aprilie - Alegere proiect.

2. 3 mai - Adaugare schema bloc.

3. 10 mai - Adaugare schema electrica.

4. 17 mai - Implementare hardware și software.

5. 24 mai - Rezultate, concluzii, jurnal, bibliografie.

Bibliografie/Resurse

pm/prj2022/abirlica/trainer_piano.1653820474.txt.gz · Last modified: 2022/05/29 13:34 by maria.timbur
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0