Áramkörök

Hogyan építsünk egy levegő gitárt Arduino-val, Aka az AIRduino gitárral: 5 lépés

Demjén Ferenc - Hogyan tudnék élni nélküled (HQ)

Demjén Ferenc - Hogyan tudnék élni nélküled (HQ)

Tartalomjegyzék:

Anonim

  • Az ötlet az, hogy egy olyan hordható virtuális gitárt építsünk, amelyet két kézzel kell kezelni, mint az Air Guitar játék. Létrehozták és prototípusosították egy két hetes projekt alatt ChalmersEgyetemi (Svédország) egy fizikai számítási osztályhoz.

    A cél az, hogy valódi gitárjátékot érzünk. Az AIRduino gitár egy kesztyűből és egy botból készül.A kesztyűt arra használják, hogy beállítsa a hangot és a botot a hang elindításához.

    Az ilyen trükk elvégzéséhez gyorsulásmérőt és ultrahangos érzékelőt használtunk (lásd az 1. lépést a koncepció leírásához).

    Vessen egy pillantást a videó bemutatóra, hogy pontosabb képet kapjon arról, hogyan működik, és dolgozzon a saját munkájához!


    Az AIRduino csapat:

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

    kellékek:

    1. lépés: Koncepció leírása

    Az Air Guitarnak jobbkezes gitárként kell működnie.
    A gitárvezérlő két részre van osztva, a bal oldali vezérlő és a jobb oldali vezérlő.
    A bal oldali vezérlővel a játékos elhajolhatja az ujjait, és nyomja meg a kesztyűt, hogy megváltoztassa a hangszínt.
    A jobb oldali vezérlőt egy olyan bot képviseli, amelyet meg kell rázni, hogy a levegő-gitár hangját kiváltja.
    A játékos a jobb és a bal kéz közötti távolságot is megváltoztathatja annak érdekében, hogy a hangokat a gitár nyakon lévő különböző fretekkel szimulálja.
    Az ilyen trükkök elvégzéséhez a fő összetevők egy gyorsulásmérő, amely „megérzi” a rúdrázkódtatást, egy hackelt ultrahangos érzékelőt a jobb és a pálca közötti távolság mérésére, valamint a vezető anyagot a kesztyű felépítésére.
    Mindent összevetve, egy meglehetősen könnyű építeni játék. Az egyetlen trükkös rész lenne az ultra-hang érzékelő hack, amely bizonyos ügyességet igényel. Szükséged lesz néhány alapvető elektronikus készségre, hogy megértsd az utasításokat, és hogy megtudd, mit csináltál rosszul, amikor valamit elrontottál, és a gitár nem működik a végén. Ott voltunk. :-)

    2. lépés: Bevásárlólista

    Itt van egy lista a saját AIRduino gitár létrehozásához:
    1. Vezetékek: sajnos sok ez a prototípus verzió. A két kesztyűt és az Arduino alkatrészeket összekapcsolták. Nyugodtan javíthatja a design ezen részét, hogy vezeték nélküli legyen!
    2. Gyorsulásmérő: a jobb kezedben lévő rúdban a rázás észlelésére használatos. Háromtengelyes akkordométert használtunk, de egy tengely elég
    3. Ultrahangos érzékelő: a játékos két keze közötti távolság mérésére használtunk, a Parallaxet # 28015 használtuk
    4. Vezetőképes és rugalmas anyag: a kesztyű felépítése
    5. Arduino: a gitár magja, amely mindent kezel. An Arduino Diecimila jól működik.
    6. Potenciométerek: néhány beállítás beállításához, egy potenciométer, melynek max.
    7. Forró olvasztó ragasztó: egy kényelmes mód a dolgok együtt tartására,
    8. 3,5 mm-es női csatlakozó: audio kimenethez használható,
    9. Klasszikus elektronikus cucc: ellenállások (10k), kondenzátor (10uF), LED-ek és valamilyen tápegység az arduino számára. (A 9V-os akkumulátor csak finom).

    3. lépés: Sémák

    Íme az AIRduino gitár elektronikus vázlata.
    Amint láthatod, elég könnyen megérthetõ, ezért építeni is.
    Nézd meg a képet, ha azt akarod, hogy egy alkotóelem melyik komponensre megy. Ahogy valószínűleg megérted, ez semmiképpen sem méretezhető. A kábelek sokkal hosszabbak, mint az ábrán láthatóak.
    Azt is észrevehette, hogy az ultrahangos érzékelő sugárzója a pálcán van, és a vevő a bal oldalon van. Ez az a trükkös rész, amit korábban említettem: Az ultrahang-kibocsátót le kell bontani az ultrahangos érzékelőegységből, hogy elkülönítse azt az érzékelőtáblától.
    További információ a későbbi lépésekben. Most menjünk dolgozni!

    4. lépés: A kesztyű építése

    A kesztyű egy ultrahang-vevővel és négy gombbal rendelkezik. Ez az!
    Az ultrahang-vevő a fekete dobozban látható, az alábbi képeken látható.
    A kesztyűnek van egy nagy területe, amely éppen a földre van csatlakoztatva az Arduino táblán. Amikor ujját nyomják a tenyérre, akkor létrejön a kapcsolat az elektromos vezetőképességű szövet és a tenyér között.
    Az alábbiakban két különböző kesztyű-modell képe látható. Az egyiknek levehető ujja van, ami mindkét játékosnak nagyon kicsi és nagyon nagy kezekkel rendelkezik. A másik modell egy hagyományos kesztyűre van varrva. A második verziót ajánlom, könnyebb felépíteni és könnyebb felhelyezni.

    5. lépés: Kód

    Itt van az Arduino kód szükséges:
    A valós idejű hanggenerációs rész ebből a nagyszerű bemutatóból származik.
    ------------------------------------------------------
    // A hullámformát tartalmazó tömb
    // gitárhang
    char hullámforma =
    {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};
    // Ezt a hullámformát használjuk a változáshoz
    // a kimenet mennyisége
    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};
    // Egy tömb, amelyet pufferként használunk, hogy elkerüljük
    // hibás pontos távolság
    // mérések
    unsigned 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;
    // 2 oktáv túlfolyási értéke
    int frekvenciák = {39, 42, 44, 47,
    50, 52, 56, 59, 63, 66, 70, 74, 79,
    84, 89, 94, 100, 105, 112, 118, 126,
    133, 141, 149};
    // Kezdeti pálya
    int pitch = 160;
    // Kezdeti kötet és gyorsulás
    // paraméter
    int lastAcc = 0;
    float térfogat = 0;
    // hang lejátszása a 3. tűnél
    byte speakerpin = 3;
    // index változó a pozícióhoz
    // hullámforma
    illékony byte-hullámindex = 0
    volatilis byte aktuális értéke = 0;
    // Az ultrahangos érzékelőhöz használt csap
    const int pingPin = 7;
    // A potenciométerek csapjai
    const int jätkusuutPin = 1;
    const int sensitivityPin = 2;
    // A bal oldali ujjhoz tartozó csapok
    // kéz
    const int finger1 = 9;
    const int finger2 = 10;
    const int finger3 = 11;
    const int finger4 = 12;
    int fingerValue = 0;
    hosszú időtartamú, hüvelyk, cm;
    érvénytelen beállítás () {
    pinMode (3, kimenetet); // 3. hangszóró
    pinMode (finger1, bemenet);
    pinMode (finger2, bemenet);
    pinMode (finger3, bemenet);
    pinMode (finger4, bemenet);

    /**************************
    PWM hangkonfiguráció
    ****************************/
    // állítsa be az időzítőt 2 gyors PWM módba
    // (megduplázza a PWM frekvenciát)
    bitSet (TCCR2A, WGM21);
    bitSet (TCCR2B, CS20);
    bitClear (TCCR2B, CS21);
    bitClear (TCCR2B, CS22);
    // engedélyezze a megszakításokat most, amikor regisztrál
    // beállítva
    sei ();

    /*************************
    Az 1. időzítő megszakítja a konfigurációt
    *************************/
    // tiltsa le a megszakításokat
    // A regiszterek konfigurálva vannak
    cli ();
    / * Normál port működés, csapok leválasztva
    az időzítő működéséből (pwm törése) * /
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    / * 4. mód, CTC a TOP beállítással
    OCR1A. Lehetővé teszi változó időzítés beállítását
    a megszakítást az új értékek írásával
    OCR1A. * /
    bitClear (TCCR1A, WGM10);
    bitClear (TCCR1A, WGM11);
    bitSet (TCCR1B, WGM12);
    bitClear (TCCR1B, WGM13);
    / * állítsa az óra prescaler / 8 értékét. * /
    bitClear (TCCR1B, CS10);
    bitSet (TCCR1B, CS11);
    bitClear (TCCR1B, CS12);
    / * A Force Output összehasonlítása
    A és B csatornák. * /
    bitClear (TCCR1C, FOC1A);
    bitClear (TCCR1C, FOC1B);
    / * A kimenet összehasonlítása
    Regisztráljon A-t 160-ra a beállításhoz
    kezdeti pálya * /
    OCR1A = 160;
    // bemeneti rögzítési megszakítás letiltása
    bitClear (TIMSK1, ICIE1);
    // kimenet letiltása
    // Összehasonlítás B Match Interrupt
    bitClear (TIMSK1, OCIE1B);
    // a kimenet engedélyezése
    // Összehasonlít egy meccsmegszakítást
    bitSet (TIMSK1, OCIE1A);
    // tiltsa le a túlcsordulás megszakítását
    bitClear (TIMSK1, TOIE1);
    // engedélyezze a megszakításokat most
    // regiszterek lettek beállítva
    sei ();
    }
    // Időzítő túlcsorduláskezelő
    ISR (TIMER1_COMPA_vect) {
    / * időzítő1 ISR. Minden alkalommal
    az úgynevezett, hogy a hangszórót a
    következő érték a hullámformában . Frekvencia
    a moduláció a
    az egymást követő hívások közötti időzítés
    ez a funkció, pl. 1KHz-es hangra
    állítsa be az időzítést úgy, hogy fut
    hullámformán keresztül 1000-szer
    egy második. * /
    // állítsa vissza a hullámindexet, ha elérte
    // a tömb vége
    ha (waveindex> 102) {
    hullámindex = 0;
    }
    // Állítsa be a kimeneti értéket
    ha (térfogat> 0,03) {
    analogWrite (speakerpin,
    waveformVolume waveindex);
    }
    waveindex ++;
    // Frissítse a pályát
    OCR1A = pálya;
    }

    érvénytelen hurok ()
    {
    // Távolítsa el az interputeket, küldjön egy pinget
    // üzenet és várjon a válaszra.
    cli ();
    pinMode (pingPin, OUTPUT);
    digitalWrite (pingPin, LOW);
    delayMicroseconds (2);
    digitalWrite (pingPin, HIGH);
    delayMicroseconds (5);
    digitalWrite (pingPin, LOW);
    időtartam = pulzus (pingPin, HIGH, 2000);
    sei ();
    // az időt egy távolságra konvertálja
    // centiméterben
    // és tárolja pufferben
    distance_buffer distance_index ++
    % distance_length = időtartam / 20;
    // Keresse meg a legrövidebb pufferben
    // mért távolság
    cm = 16000;
    a (int i = 0; i <distance_length; i ++) {
    cm = min (cm, távolság_puffer i);
    }
    // Ellenőrizze, hogy melyik ujja van megnyomva
    fingerValue = 5;
    if (! digitalRead (finger4)) {
    fingerValue = 4;
    }
    if (! digitalRead (finger3)) {
    fingerValue = 3;
    }
    if (! digitalRead (finger2)) {
    fingerValue = 2;
    }
    if (! digitalRead (finger1)) {
    fingerValue = 1;
    }
    // Frissítse a fenntartást és
    // érzékenységi értékek
    float fenntartása =
    térkép (analogRead (fenntartóPin), 0,
    1024, 101, 130) / 100.0;
    int érzékenység =
    Térkép (analogRead (sensitivityPin)
    0, 1024, 100, 200);
    // A kötet frissítése
    térfogat = térfogat / tartás;
    ha (<0) {
    térfogat = 0;
    }

    // Ellenőrizze a gyorsulásmérőt
    int acc = analóg (0);
    int accDiff = lastAcc - acc;
    // A hangerő frissítése
    ha (accDiff> 5 * (200 - érzékenység)) {
    hangerő + = (úszó)
    pow (accDiff,
    érzékenység / 100,0) / 50000;
    }
    lastAcc = acc;
    // Ellenőrizze, hogy a térfogat nem nagyobb-e, mint 1
    ha (kötet> .95) {
    térfogat = .95;
    }
    // Frissítse a hangerőt a hullámformában
    (int i = 0; i <= 102; i ++) {
    waveformVolume i =
    ((hullámforma i - 127) * térfogat) + 127;
    }
    // Állítsa be a távolságot
    // a két kéz és a
    // megnyomott ujjak
    ha (cm <102 && cm> 0) {
    ha (cm> 30) {
    pitch = frekvenciák 7 +
    (((cm - 30) / 24) * 4 + fingerValue - 1);
    }más{
    pitch = map (cm, 0, 30, 39, 79);
    }
    }más{
    pitch = frekvenciák 7 +
    (((102 - 30) / 24) * 4 + fingerValue - 1);
    }
    // Késleltetés a pattogó jelek elkerülésére
    késleltetés (50);
    }
    ------------------------------------------------------