Krugovi

Kako izgraditi zračnu gitaru s Arduinom, Aka gitara AIRduino: 5 koraka

VAVAN - Вредная привычка (разбор на гитаре, аккорды)

VAVAN - Вредная привычка (разбор на гитаре, аккорды)

Sadržaj:

Anonim

  • Ideja je da se izgradi virtualna gitara koja se može nositi i koja se kontrolira s dvije ruke poput igranja Air Guitar. Stvoren je i prototipiran tijekom dva tjedna projekta ChalmersSveučilište (Švedska) za klasu fizičkog računalstva.

    Cilj je dobiti osjećaj sviranja prave gitare. Gitara AIRduino izrađena je od jedne rukavice i jednog štapa.Rukavica se koristi za podešavanje tona i palice za pokretanje zvuka.

    Za izvođenje takvog trika koristili smo akcelerometar i ultrazvučni senzor (vidi korak 1 za opis koncepta).

    Pogledajte video demo kako biste dobili precizniju predstavu o tome kako funkcionira i dođite na posao da biste sami napravili!


    Tim AIRduino:

    David Fournier, Jean-Louis Giordano, Monireh Sanaei, Maziar Shelbaf i Gustav Sohtell.

    Pribor:

    Korak 1: Opis koncepta

    Zračna gitara bi trebala raditi kao desna ruka.
    Kontrolor gitare podijeljen je na dva dijela, lijevi kontroler i desni upravljač.
    Lijevim upravljačem igrač može saviti prste i pritisnuti rukavicu kako bi promijenio visinu tona.
    Desni upravljač predstavljen je štapom koji se mora potresti kako bi se aktivirao zvuk zračne gitare.
    Igrač također može promijeniti udaljenost između desne i lijeve ruke kako bi podigao tonove, simulirajući različite prečke na vratu gitare.
    Za izvođenje takvih trikova, glavne komponente su akcelerometar kako bi se "osjetio" štap sticka, hakirani ultrazvučni senzor za mjerenje udaljenosti između desne ruke i štapa i provodne tkanine za izradu rukavice.
    Sve u svemu, igračka je vrlo jednostavna za izgradnju. Jedini lukav dio bio bi ultrazvučni senzor hak koji zahtijeva određenu spretnost. Trebat će vam neke osnovne elektronske vještine kako biste razumjeli upute, kao i saznali što ste učinili krivo kada ste nešto zabrljali i gitara na kraju ne radi. Bili smo tamo. :-)

    Korak 2: Popis za kupnju

    Ovdje je popis onoga što vam je potrebno za izgradnju vlastite AIRduino gitare:
    1. Žice: nažalost mnogo za ovu prototipnu verziju. Koriste se za povezivanje dviju rukavica i Arduino dijelova zajedno. Slobodno poboljšajte ovaj dio dizajna čineći ga bežičnim!
    2. Akcelerometar: koristi se u štapiću u desnoj ruci za otkrivanje trešnje. Koristili smo troosni akcelerometar, ali je jedna osa dovoljna
    3. Ultrazvučni senzor: koristi se za mjerenje udaljenosti između obje ruke igrača, koristili smo Parallax # 28015
    4. Vodljiva i rastezljiva tkanina: za izradu rukavice,
    5. Arduino: jezgra gitare koja obrađuje sve. Arduino Diecimila dobro radi.
    6. Potenciometri: za podešavanje nekih postavki, Potenciometar s maksimumom od 1KOhm-1MOhm je u redu.
    7. Vruće taljenje ljepila: prikladan način za držanje stvari zajedno,
    8. 3.5 mm ženski priključak: koristi se za audio izlaz,
    9. Klasične elektroničke stvari: Otpornici (10k), kondenzator (10uF), LED diode i neka vrsta napajanja za arduino. (9V baterija je sasvim u redu).

    Korak 3: Shema

    Ovdje su elektroničke sheme za AIRduino gitaru.
    Kao što možete vidjeti, prilično je lako razumjeti i stoga i graditi.
    Pogledajte sliku ako želite ideju o tome koja komponenta ide kamo. Kao što vjerojatno shvaćate, ovo nije za mjerenje na bilo koji način. Kabeli su mnogo dulji nego što je prikazano na shemi.
    Također možete primijetiti da je odašiljač ultrazvučnog senzora na štapu, a prijemnik na lijevoj ruci. To je lukavi dio koji sam ranije spomenuo: morate odvojiti ultrazvučni odašiljač iz ultrazvučne senzorske jedinice kako biste je odvojili od ploče senzora.
    Više o tome u kasnijim koracima. Idemo sada na posao!

    Korak 4: Izgradnja rukavice

    Rukavica sadrži jedan ultra-sonični prijemnik i četiri gumba. To je to!
    Ultrazvučni prijemnik nalazi se u crnoj kutiji koja je vidljiva na nekim od donjih slika.
    Rukavica ima jedno veliko područje koje je samo spojeno na tlo na Arduino ploči. Kada se prst pritisne na dlan, stvara se veza između vodljive tkanine na prstu i dlanu.
    Ispod su slike dva različita modela rukavica. Jedan ima odvojive prste, što omogućuje oba igrača vrlo male i vrlo velike ruke. Drugi model je ušiven na standardnu ​​rukavicu. Preporučio bih drugu verziju, lakše je izgraditi i lakše je obući.

    Korak 5: Kod

    Ovdje je potreban Arduino kod:
    U stvarnom vremenu generacija zvuka dio je preuzet iz ove velike tutorial.
    ------------------------------------------------------
    // Niz s valnim oblikom
    // zvuka gitare
    char waveform =
    {125, 148, 171, 194, 209, 230, 252, 255,
    253, 244, 235, 223, 207, 184, 169, 167,
    163, 158, 146, 131, 126, 129, 134, 127,
    105, 80, 58, 51,38, 22, 12, 2, 10, 35,
    58, 75, 89, 103, 120, 141, 150, 148, 145,
    144, 140, 129, 116, 105, 95, 86, 75, 72,
    73, 76, 88, 103, 117, 121, 120, 115, 120,
    143, 159, 162, 156, 155, 163, 184, 202,
    214, 215, 211, 213, 212, 205, 196, 182,
    162, 142, 118, 99, 84, 68, 54, 40, 28,
    19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
    49, 59, 65, 75, 92, 110};
    // Ovaj valni oblik koristimo za promjenu
    // volumen izlaza
    char waveformVolume =
    {125, 148, 171, 194, 209, 230, 252, 255,
    253, 244, 235, 223, 207, 184, 169, 167,
    163, 158, 146, 131, 126, 129, 134, 127,
    105, 80, 58, 51,38, 22, 12, 2, 10, 35,
    58, 75, 89, 103, 120, 141, 150, 148, 145,
    144, 140, 129, 116, 105, 95, 86, 75, 72,
    73, 76, 88, 103, 117, 121, 120, 115, 120,
    143, 159, 162, 156, 155, 163, 184, 202,
    214, 215, 211, 213, 212, 205, 196, 182,
    162, 142, 118, 99, 84, 68, 54, 40, 28,
    19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
    49, 59, 65, 75, 92, 110};
    // Niz koji se koristi kao međuspremnik za izbjegavanje
    // pogrešna točna udaljenost
    // mjerenja
    nepotpisan int distance_buffer = {16000,
    16000, 16000, 16000, 16000, 16000, 16000,
    16000, 16000, 16000, 16000, 16000, 16000,
    16000, 16000, 16000};
    const int distance_length = 3;
    int distance_index = 0;
    // Vrijednosti preljeva za 2 oktave
    int frekvencije = {39, 42, 44, 47,
    50, 52, 56, 59, 63, 66, 70, 74, 79,
    84, 89, 94, 100, 105, 112, 118, 126,
    133, 141, 149};
    // Inicijalni korak
    int pitch = 160;
    // Početni volumen i ubrzanje
    // parametar
    int lastAcc = 0;
    float volume = 0;
    // reprodukcija zvuka na pin 3
    bajtni zvučnik = 3;
    // indeksna varijabla za poziciju u
    // valni oblik
    volatile byte waveindex = 0
    volatile byte currentvalue = 0;
    // Pin se koristi za ultrazvučni senzor
    const int pingPin = 7;
    // Igle za potenciometre
    const int sustainPin = 1;
    const int sensitivityPin = 2;
    // Igle za svaki prst lijevo
    // ruka
    const int finger1 = 9;
    const int finger2 = 10;
    const int finger3 = 11;
    const int finger4 = 12;
    int fingerValue = 0;
    dugo trajanje, inča, cm;
    void setup () {
    pinMode (3 OUTPUT); // Zvučnik na pin 3
    pinMode (finger1, INPUT);
    pinMode (finger2, INPUT);
    pinMode (finger3, INPUT);
    pinMode (finger4, INPUT);

    /**************************
    PWM konfiguracija zvuka
    ****************************/
    // postavite Timer2 u brz PWM način rada
    // (udvostručuje PWM frekvenciju)
    bitSet (TCCR2A, WGM21);
    bitSet (TCCR2B, CS20);
    bitClear (TCCR2B, CS21);
    bitClear (TCCR2B, CS22);
    / / omogućuju prekide koji se registriraju
    // postavljeni su
    Sei ();

    /*************************
    Timer 1 prekida konfiguraciju
    *************************/
    / / onemogućuje vrijeme prekida
    // registri su konfigurirani
    cli ();
    / * Normalan rad porta, pinovi su odspojeni
    iz radnog vremena (pwm) * /
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    / * Mode 4, CTC s TOP postavljenim registrom
    OCR1A. Omogućuje nam da postavimo promjenjivo vrijeme za
    prekida pisanjem novih vrijednosti
    OCR1A. * /
    bitClear (TCCR1A, WGM10);
    bitClear (TCCR1A, WGM11);
    bitSet (TCCR1B, WGM12);
    bitClear (TCCR1B, WGM13);
    / * postavite satni pretvarač na / 8. * /
    bitClear (TCCR1B, CS10);
    bitSet (TCCR1B, CS11);
    bitClear (TCCR1B, CS12);
    / * Onemogući Force Output Usporedi za
    Kanali A i B. * /
    bitClear (TCCR1C, FOC1A);
    bitClear (TCCR1C, FOC1B);
    / * Pokreće usporedbu izlaza
    Registrirajte A na 160 za postavljanje
    početna visina * /
    OCR1A = 160;
    / / onemogućiti prekid unosa za unos
    bitClear (TIMSK1, ICIE1);
    // onemogući izlaz
    // Usporedi B prekid podudaranja
    bitClear (TIMSK1, OCIE1B);
    // omogući izlaz
    // Usporedite prekid podudaranja
    bitSet (TIMSK1, OCIE1A);
    // onemogući prekid prelijevanja
    bitClear (TIMSK1, TOIE1);
    // sada omogućuju prekide
    // postavljeni su registri
    Sei ();
    }
    // Uređaj za preljev tajmera
    ISR (TIMER1_COMPA_vect) {
    / * timer1 ISR. Svaki put
    zove se postavlja speakerpin na
    sljedeća vrijednost u obliku vala . Frekvencija
    modulacija se vrši mijenjanjem
    vremena između uzastopnih poziva
    ovu funkciju, npr. za ton 1KHz,
    postavite vrijeme tako da se pokreće
    kroz valni oblik 1000 puta
    drugi. * /
    // resetiraj waveindex ako je dostigao
    // kraj niza
    ako (waveindex> 102) {
    valni indeks = 0;
    }
    // Postavite izlaznu vrijednost
    ako (volumen> 0.03) {
    analogWrite (speakerpin,
    waveformVolume waveindex);
    }
    waveindex ++;
    // Ažurirajte visinu
    OCR1A = smola;
    }

    nevažeća petlja ()
    {
    // Isključivanje interputa, slanje pinga
    // poruku i pričekajte odgovor.
    cli ();
    pinMode (pingPin, IZLAZ);
    digitalWrite (pingPin, LOW);
    delayMicroseconds (2);
    digitalWrite (pingPin, HIGH);
    delayMicroseconds (5);
    digitalWrite (pingPin, LOW);
    trajanje = pulsin (pingPin, HIGH, 2000);
    Sei ();
    // pretvaranje vremena u daljinu
    // u centimetrima
    // i pohraniti u međuspremnik
    distance_buffer distance_index ++
    % distance_length = trajanje / 20;
    // Pronađite u međuspremniku najkraće
    // izmjerena udaljenost
    cm = 16000;
    za (int i = 0; i <distance_length; i ++) {
    cm = min (cm, distance_buffer i);
    }
    // Provjerite koji prsti su pritisnuti
    fingerValue = 5;
    if (! digitalRead (finger4)) {
    fingerValue = 4;
    }
    if (! digitalRead (finger3)) {
    fingerValue = 3;
    }
    if (! digitalRead (finger2)) {
    fingerValue = 2;
    }
    if (! digitalRead (finger1)) {
    fingerValue = 1;
    }
    / / Ažuriranje održavanja i
    // vrijednosti osjetljivosti
    float support =
    karta (analognaRead (sustainPin), 0,
    1024, 101, 130) / 100.0;
    int sensitivity =
    karta (analogRead (sensitivityPin),
    0, 1024, 100, 200);
    // Ažurirajte glasnoću
    volumen = volumen / izdržljivost;
    ako (volumen <0) {
    volumen = 0;
    }

    // Provjerite akcelerometar
    int acc = analogRead (0);
    int accDiff = lastAcc - acc;
    // Ažuriranje vrijednosti volumena
    if (accDiff> 5 * (200 - osjetljivost)) {
    volume + = (float)
    ENT (accDiff,
    osjetljivost / 100.0) / 50000;
    }
    lastAcc = acc;
    // Provjerite da glasnoća nije veća od 1
    if (volumen> .95) {
    volumen = .95;
    }
    // Ažuriranje glasnoće u valnom obliku
    za (int i = 0; i <= 102; i ++) {
    waveformVolume i =
    ((oblik vala i - 127) * volumen + 127;
    }
    // Postavite visinu prema udaljenosti
    // između dvije ruke i
    // prsti pritisnuti
    ako (cm <102 && cm> 0) {
    ako (cm> 30) {
    pitch = frekvencije 7 +
    (((cm - 30) / 24) * 4 + prst - 1);
    }drugo{
    pitch = map (cm, 0, 30, 39, 79);
    }
    }drugo{
    pitch = frekvencije 7 +
    (((102 - 30) / 24) * 4 + prst - 1);
    }
    // Odgoda radi izbjegavanja odbijanja signala
    kašnjenje (50);
    }
    ------------------------------------------------------