Vezja

Kako zgraditi Air Guitar z Arduino, Aka AIRUINO kitara: 5 korakov

«Матрёшка Z» — 20 электронных устройств на Arduino Uno. Железки Амперки

«Матрёшка Z» — 20 электронных устройств на Arduino Uno. Железки Амперки

Kazalo:

Anonim

  • Ideja je, da se zgradi virtualna kitara, ki jo je mogoče nositi in jo je treba nadzorovati z dvema rokama, kot je igranje Air Guitar. Ustvarjen je bil in prototipiran v dveh tednih pri projektu ChalmersUniverza (Švedska) za razred fizičnega računalništva.

    Cilj je dobiti občutek igranja prave kitare. Kitara AIRduino je narejena iz ene rokavice in ene palice.Rokavica se uporablja za nastavitev tona in palice za sprožitev zvoka.

    Za izvedbo takšnega trika smo uporabili merilnik pospeška in ultrazvočni senzor (za opis koncepta glejte 1. korak).

    Oglejte si video demo, da dobite natančnejšo predstavo o tem, kako deluje, in se lotite dela, da boste lahko zgradili svoje!


    Ekipa AIRduino:

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

    Dobave:

    1. korak: Opis koncepta

    Air Guitar naj bi delal kot desna roka kitare.
    Upravljalnik kitare je razdeljen na dva dela, levi kontroler in desni krmilnik.
    Z levim krmilnikom lahko igralec upogne prste in pritisne na rokavico, da spremeni višino tona.
    Desni krmilnik je predstavljen s palico, ki jo je treba pretresti, da sproži zvok zračne kitare.
    Igralec lahko spremeni tudi razdaljo med desno in levo roko, da poskrbi za ton, ki simulira različne prečke na vratu kitare.
    Za izvedbo takšnih trikov so glavne komponente akcelerometer za "občutek" tresenja palice, kratek ultrazvočni senzor za merjenje razdalje med desno roko in palico ter prevodno tkanino za izdelavo rokavice.
    Skratka, to je dokaj lahka igračka. Edini zapleten del bi bil ultra-sonic senzor hack, ki zahteva nekaj spretnosti. Potrebovali boste nekaj osnovnih elektronskih veščin, da boste razumeli navodila, in da boste izvedeli, kaj ste narobe storili, ko ste nekaj zmešali in kitaro na koncu ne deluje. Bili smo tam. :-)

    2. korak: Seznam za nakupovanje

    Tukaj je seznam tistega, kar potrebujete za izdelavo lastne kitare AIRduino:
    1. Žice: žal je veliko za to prototipno različico. Uporabljeni so bili za povezavo obeh rokavic in delov Arduino skupaj. Prosto izboljšajte ta del oblikovanja tako, da ga naredite brezžično!
    2. Merilnik pospeška: uporablja se v palici v desni roki za zaznavanje tresenja. Uporabili smo triosni merilnik hitrosti, vendar je dovolj ena os
    3. Ultrasonic sensor: uporablja se za merjenje razdalje med obema rokama igralca, smo uporabili Parallax # 28015
    4. prevodna in raztegljiva tkanina: za izdelavo rokavice,
    5. Arduino: jedro kitare, ki obravnava vse. Arduino Diecimila je v redu.
    6. Potenciometri: za nastavitev nekaterih nastavitev je potenciometer z maks. Ničim od 1KOhm-1MOhm v redu.
    7. Lepilo za vroče taljenje: priročen način za držanje stvari skupaj,
    8. 3,5 mm ženski priključek: uporablja se za avdio izhod,
    9. Klasične elektronske stvari: upori (10k), kondenzator (10uF), LED diode in neka vrsta napajalnika za arduino. (Baterija 9V je v redu).

    3. korak: Sheme

    Tu so elektronske sheme za kitaro AIRduino.
    Kot lahko vidite, je zelo enostavno razumeti in zato tudi graditi.
    Oglejte si sliko, če želite, da idejo, katera komponenta gre kam. Kot verjetno razumete, se to nikakor ne spreminja. Kabli so veliko daljši, kot je prikazano na shemi.
    Morda ste opazili, da je oddajnik ultrazvočnega senzorja na palici in sprejemnik na levi roki. To je težaven del, ki sem ga omenil prej: ultrazvočni oddajnik iz ultrazvočne senzorske enote morate odpakirati, da ga ločimo od plošče senzorja.
    Več o tem v kasnejših korakih. Zdaj pa na delo!

    Korak 4: Gradimo rokavico

    Rokavice vsebujejo en ultrazvočni sprejemnik in štiri gumbe. To je to!
    Ultrazvočni sprejemnik se nahaja v črni škatli, ki je vidna na nekaterih spodnjih slikah.
    Rokavica ima eno veliko površino, ki je pravkar povezana z zemljo na Arduino plošči. Ko se prst pritisne na dlan, se ustvari povezava med prevodno tkanino na prstu in dlanjo.
    Spodaj je slika dveh različnih modelov rokavic. Eden ima snemljive prste, ki omogočajo igralcem zelo majhne in zelo velike roke. Drugi model je prišit na standardno rokavico. Priporočam drugo različico, lažje jo je zgraditi in jo lažje obleči.

    Korak 5: Koda

    Potrebna je koda Arduino:
    Delovanje generacije zvoka v realnem času je vzeto iz te odlične vadnice.
    ------------------------------------------------------
    // Niz, ki vsebuje valovno obliko
    Zvok kitare
    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};
    // To valovno obliko uporabljamo za spremembo
    // obseg izhoda
    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, ki se uporablja kot vmesni pomnilnik, ki ga je treba preprečiti
    // napačna natančna razdalja
    meritve
    nepodpisan 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;
    // Vrednosti za prelivanje za 2 oktavi
    frekvence int = {39, 42, 44, 47,
    50, 52, 56, 59, 63, 66, 70, 74, 79,
    84, 89, 94, 100, 105, 112, 118, 126,
    133, 141, 149};
    // Začetni korak
    int pitch = 160;
    // Začetna prostornina in pospešek
    // parameter
    int lastAcc = 0;
    plavajoči volumen = 0;
    // predvajanje zvoka na pin 3
    bajtni zvočnik = 3;
    // spremenljivka indeksa za položaj v
    // valovna oblika
    volatile byte waveindex = 0
    volatile byte currentvalue = 0;
    // Pin, ki se uporablja za ultrazvočni senzor
    const int pingPin = 7;
    // Pins za potenciometre
    const int sustainPin = 1;
    const int sensitivityPin = 2;
    // Pins za vsak prst na levi
    // roka
    const int finger1 = 9;
    const int finger2 = 10;
    const int finger3 = 11;
    const int finger4 = 12;
    int fingerValue = 0;
    dolgo trajanje, cm, cm;
    void setup () {
    pinMode (3, IZHOD); // Zvočnik na nožici 3
    pinMode (prst1, INPUT);
    pinMode (prst2, INPUT);
    pinMode (prst3, INPUT);
    pinMode (prst4, INPUT);

    /**************************
    Zvočna konfiguracija PWM
    ****************************/
    // nastavite Timer2 v hitri način PWM
    // (podvoji frekvenco PWM)
    bitSet (TCCR2A, WGM21);
    bitSet (TCCR2B, CS20);
    bitClear (TCCR2B, CS21);
    bitClear (TCCR2B, CS22);
    // omogoči prekinitve, ki se zdaj registrirajo
    // so bile nastavljene
    sei ();

    /*************************
    Timer 1 prekine konfiguracijo
    *************************/
    / / onemogoči prekinitve
    // registri so konfigurirani
    cli ();
    / * Normalno delovanje vrat, nožice odklopljene
    od delovanja časovnika (lomljenje pwm) * /
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    / * Mode 4, CTC s TOP nastavljeno z registrom
    OCR1A. Omogoča, da nastavimo časovno spremenljivko za
    prekine s pisanjem novih vrednosti
    OCR1A. * /
    bitClear (TCCR1A, WGM10);
    bitClear (TCCR1A, WGM11);
    bitSet (TCCR1B, WGM12);
    bitClear (TCCR1B, WGM13);
    / * nastavite predalcevalnik ur na / 8. * /
    bitClear (TCCR1B, CS10);
    bitSet (TCCR1B, CS11);
    bitClear (TCCR1B, CS12);
    / * Onemogoči Force Output Primerjaj za
    Kanali A in B. * /
    bitClear (TCCR1C, FOC1A);
    bitClear (TCCR1C, FOC1B);
    / * Inicializira izhodno primerjavo
    Registrirajte A pri 160 za nastavitev
    začetno parcelo * /
    OCR1A = 160;
    // onemogoči prekinitev vnosa vnosa
    bitClear (TIMSK1, ICIE1);
    // onemogoči izhod
    // Primerjaj prekinitve prekinitve
    bitClear (TIMSK1, OCIE1B);
    // omogoči izhod
    // Primerjaj prekinitve prekinitve
    bitSet (TIMSK1, OCIE1A);
    // onemogoči prekinitev prekoračitve
    bitClear (TIMSK1, TOIE1);
    // zdaj omogoči prekinitve
    // so bili nastavljeni registri
    sei ();
    }
    // Upravljalec prelivanja časovnika
    ISR (TIMER1_COMPA_vect) {
    / * timer1 ISR. Vsakič
    se imenuje, da nastavi speakerpin na
    naslednja vrednost v obliki valov . Pogostost
    modulacija se izvede s spremembo
    časovno zaporedje med zaporednimi klici
    to funkcijo, npr. za ton 1KHz,
    nastavite čas, da se bo zagnal
    skozi valovno obliko 1000-krat
    sekundo. * /
    // ponastavi waveindex, če je dosegel
    // konec matrike
    če (waveindex> 102) {
    valovni indeks = 0;
    }
    // Nastavi izhodno vrednost
    če (obseg> 0.03) {
    analogWrite (zvočnik,
    waveformVolume waveindex);
    }
    waveindex ++;
    // Posodobi igrišče
    OCR1A = korak;
    }

    void loop ()
    {
    // Izključite vmesnike, pošljite ping
    // sporočilo in počakajte na odgovor.
    cli ();
    pinMode (pingPin, IZHOD);
    digitalWrite (pingPin, LOW);
    zakasnitev mikroskopov (2);
    digitalWrite (pingPin, HIGH);
    zakasnitev mikroskopov (5);
    digitalWrite (pingPin, LOW);
    trajanje = impulz (pingPin, HIGH, 2000);
    sei ();
    // pretvarjanje časa v razdaljo
    v centimetrih
    // in shranite v medpomnilnik
    distance_buffer distance_index ++
    % distance_length = trajanje / 20;
    // Najdi v medpomnilniku najkrajši
    // izmerjena razdalja
    cm = 16000;
    za (int i = 0; i <razdalja_dolžina; i ++) {
    cm = min (cm, razdalja_povzetek i);
    }
    // Preverite, kateri prsti so pritisnjeni
    fingerValue = 5;
    if (! digitalRead (finger4)) {
    fingerValue = 4;
    }
    if (! digitalRead (finger3)) {
    fingerValue = 3;
    }
    if (! digitalRead (finger2)) {
    fingerValue = 2;
    }
    if (! digitalRead (finger1)) {
    fingerValue = 1;
    }
    // Posodobitev vzdrževanja in
    // vrednosti občutljivosti
    float support =
    mapa (analognaRead (sustainPin), 0,
    1024, 101, 130) / 100.0;
    int občutljivost =
    zemljevid (analogRead (sensitivityPin),
    0, 1024, 100, 200);
    // Posodobite glasnost
    prostornina = volumen / vzdrževanje;
    če (obseg <0) {
    volumen = 0;
    }

    // Preverite merilnik pospeška
    int acc = analogRead (0);
    int accDiff = lastAcc - acc;
    // Posodobi vrednost glasnosti
    if (accDiff> 5 * (200 - občutljivost)) {
    volume + = (float)
    pow (accDiff,
    občutljivost / 100.0) / 50000;
    }
    lastAcc = acc;
    // Preverite, da količina ni višja od 1
    if (obseg> .95) {
    volumen = .95;
    }
    // Posodobitev glasnosti v valovni obliki
    za (int i = 0; i <= 102; i ++) {
    waveformVolume i =
    ((valna oblika i - 127) * volumen + 127;
    }
    // Nastavite smer glede na razdaljo
    // med obema rokama in
    // prsti pritisnjeni
    če (cm <102 && cm> 0) {
    če (cm> 30) {
    korak = frekvence 7 +
    (((cm - 30) / 24) * 4 + prst - 1);
    } else {
    pitch = map (cm, 0, 30, 39, 79);
    }
    } else {
    korak = frekvence 7 +
    (((102 - 30) / 24) * 4 + prst - 1);
    }
    // Zakasnitev, da se izognete odbijanju signalov
    zamuda (50);
    }
    ------------------------------------------------------