Circuits

Paano Gumawa ng isang Air Guitar Sa Arduino, Aka ang AIRduino Gitara: 5 Hakbang

AIRduino Guitar

AIRduino Guitar

Talaan ng mga Nilalaman:

Anonim

  • Ang ideya dito ay upang bumuo ng isang naisusuot na virtual na gitara na kinokontrol na may dalawang kamay na halos tulad ng paglalaro ng Air Guitar. Ito ay nilikha at prototipiko sa loob ng dalawang linggo na proyekto sa ChalmersUniversity (Sweden) para sa isang klase ng Physical Computing.

    Ang layunin ay upang makuha ang pakiramdam ng paglalaro ng isang tunay na gitara. Ang AIRduino Guitar ay gawa sa isang glove at isang stick.Ang glove ay ginagamit upang itakda ang tono at ang stick upang ma-trigger ang tunog.

    Upang maisagawa ang gayong panlilinlang, gumamit kami ng accelerometer at isang ultra-sonik na sensor (tingnan ang Hakbang 1 para sa paglalarawan ng konsepto).

    Tingnan ang video demo upang makakuha ng isang mas tumpak na ideya kung paano ito gumagana, at magtrabaho upang bumuo ng iyong sarili!


    Ang AIRduino Team:

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

    Mga Kagamitan:

    Hakbang 1: Paglalarawan ng Konsepto

    Ang Air Guitar ay dapat magtrabaho bilang isang right-handed guitar.
    Ang gitara controller ay hinati sa dalawang bahagi, kaliwa-kamay controller at kanang magsusupil.
    Sa pamamagitan ng controller ng kaliwang kamay ang manlalaro ay maaaring yumuko ang kanyang mga daliri at pindutin ang glove upang baguhin ang pitch ng tono.
    Ang controller ng kanang kamay ay kinakatawan ng isang stick na kailangang maugisin upang mai-trigger ang tunog ng air-guitar.
    Ang manlalaro ay maaari ring baguhin ang distansya sa pagitan ng kanang kamay at kaliwang kamay upang itayo ang mga tono, na tumutulad sa iba't ibang mga frets sa leeg ng gitara.
    Upang magsagawa ng gayong mga trick, ang pangunahing mga sangkap ay isang accelerometer upang "pakiramdam" ang stick shake, isang na-hack na ultra-sonic sensor upang masukat ang distansya sa pagitan ng kanang kamay at ng stick, at konduktibong tela upang maitayo ang glove.
    Lahat sa lahat, ito ay isang medyo madali upang bumuo ng laruan. Ang tanging nakakalito bahagi ay ang ultra-sonik sensor hack na nangangailangan ng ilang kahusayan ng isip. Kakailanganin mo ang ilang mga pangunahing kaalaman sa electronic upang maunawaan ang mga tagubilin, at upang malaman kung ano ang iyong ginawa mali kapag ikaw ay may problema sa isang bagay at ang gitara ay hindi gumagana sa dulo. Nariyan na kami doon. :-)

    Hakbang 2: Listahan ng Shopping

    Narito ang isang listahan ng kung ano ang kailangan mo upang bumuo ng iyong sariling AIRduino Gitara:
    1. Mga Wires: sa kasamaang-palad marami para sa bersyon ng prototype na ito. Sila ay ginagamit upang ikabit ang dalawang guwantes at ang mga bahagi ng Arduino. Huwag mag-atubiling mapabuti ang bahaging ito ng disenyo sa pamamagitan ng paggawa ng ito wireless!
    2. Accelerometer: ginamit sa stick sa iyong kanang kamay upang makita ang pag-alog. Gumamit kami ng tatlong-axis accellerometer, ngunit ang isang isang axis ay sapat
    3. Ultrasonic sensor: ginagamit upang masukat ang distansya sa pagitan ng parehong mga kamay ng manlalaro, ginamit namin ang Parallax # 28015
    4. Conductive and Stretch fabric: upang itayo ang glove,
    5. Arduino: ang core ng Guitar na humahawak ng lahat. Gumagana ang isang Arduino Diecimila.
    6. Potentiometers: upang ayusin ang ilang mga setting, Ang isang potensyomiter na may isang max ng anumang bagay mula sa 1KOhm-1MOhm ay ok.
    7. Hot matunaw pangkola: isang maginhawang paraan upang hawakan ang mga bagay na sama-sama,
    8. 3.5 mm female jack: ginamit para sa audio output,
    9. Classic electronic bagay: Resistors (10k), kapasitor (10uF), LEDs at ilang uri ng power supply para sa arduino. (Ang isang baterya 9V ay maayos).

    Hakbang 3: Schematics

    Narito ang mga electronic schematics para sa AIRduino Guitar.
    Tulad ng makikita mo, ito ay madaling maunawaan at samakatuwid ay upang bumuo.
    Tingnan ang larawan kung gusto mo ng isang ideya kung aling bahagi ang napupunta kung saan. Tulad ng iyong malamang na maunawaan, ito ay hindi upang masukat sa anumang paraan. Ang mga cable ay mas mahaba kaysa sa ipinapakita sa eskematiko.
    Maaari mo ring napansin na ang emitter ng ultra-sonic sensor ay nasa stick at ang receiver ay nasa kaliwang kamay. Iyon ay ang nakakalito bahagi na nabanggit ko mas maaga: Kailangan mong hindi pa nababahala ang ultra-sonic emitter mula sa ultra-sonic sensor unit upang paghiwalayin ito mula sa sensor board.
    Higit pa tungkol sa mga iyon sa mga susunod na hakbang. Ngayon ay magtrabaho tayo!

    Hakbang 4: Pagbuo ng Glove

    Ang glove ay naglalaman ng isang ultra-sonic receiver at apat na mga pindutan. Ayan yun!
    Ang ultra-sonic receiver ay matatagpuan sa itim na kahon na makikita sa ilan sa mga larawan sa ibaba.
    Ang glove ay may isang malaking lugar na kung saan ay konektado lamang sa lupa sa Arduino board. Kapag ang isang daliri ay pinindot laban sa palm isang koneksyon sa pagitan ng kondaktibo tela sa daliri at ang palm ay nilikha.
    Nasa ibaba ang larawan ng dalawang magkaibang modelo ng glove. Ang isa ay may mga detachable na daliri, na nagpapahintulot sa parehong mga manlalaro na may napakaliit at napakalaking kamay. Ang iba pang modelo ay natahi sa isang karaniwang glove. Gusto ko inirerekomenda ang ikalawang bersyon, mas madali itong bumuo, at mas madaling maipasok.

    Hakbang 5: Code

    Narito ang kinakailangan ng Arduino code:
    Ang real-time na bahagi ng henerasyon ng tunog ay kinuha mula sa mahusay na tutorial na ito.
    ------------------------------------------------------
    // Isang array na naglalaman ng waveform
    // ng isang tunog ng gitara
    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};
    // Ginagamit namin ang waveform na ito upang baguhin ang
    / / dami ng output
    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};
    // Isang array na ginamit bilang isang buffer upang maiwasan
    / maling pagkakamali sa oras
    / measurements
    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;
    // Ang mga overflow value para sa 2 octaves
    int frequencies = {39, 42, 44, 47,
    50, 52, 56, 59, 63, 66, 70, 74, 79,
    84, 89, 94, 100, 105, 112, 118, 126,
    133, 141, 149};
    // Initial pitch
    int pitch = 160;
    / / Initial volume at acceleration
    // parameter
    int lastAcc = 0;
    float volume = 0;
    // audio playback sa pin 3
    byte speakerpin = 3;
    // variable ng variable para sa posisyon sa
    / / waveform
    pabagu-bago ng isip byte waveindex = 0
    pabagu-bago ng isip byte currentvalue = 0;
    // Pin na ginamit para sa ultra-sonik sensor
    const int pingPin = 7;
    // Pins para sa potentiometers
    const int sustainPin = 1;
    const int sensitivityPin = 2;
    // Pins para sa bawat daliri ng kaliwa
    // kamay
    const int finger1 = 9;
    const int finger2 = 10;
    const int finger3 = 11;
    const int finger4 = 12;
    int fingerValue = 0;
    mahabang tagal, pulgada, cm;
    walang bisa setup () {
    pinMode (3, Output); / Speaker sa pin 3
    pinMode (finger1, INPUT);
    pinMode (finger2, INPUT);
    pinMode (finger3, INPUT);
    pinMode (finger4, INPUT);

    /**************************
    PWM audio configuration
    ****************************/
    / / Itakda ang Timer2 upang mabilis na PWM mode
    / / (daluyan ng dalas ng PWM)
    bitSet (TCCR2A, WGM21);
    bitSet (TCCR2B, CS20);
    bitClear (TCCR2B, CS21);
    bitClear (TCCR2B, CS22);
    / / paganahin ang mga interrupts na nagrerehistro
    / / ay naitakda
    sei ();

    /*************************
    Pagsasaayos ng pag-abala ng timer 1
    *************************/
    / / huwag paganahin ang mga interrupts habang
    / / registers ay naka-configure
    cli ();
    / * Normal na pagpapatakbo ng port, pin na nakakulong
    mula sa operasyon ng timer (breaking pwm) * /
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    / * Mode 4, CTC sa TOP na itinakda ng rehistro
    OCR1A. Binibigyang-daan sa amin na magtakda ng variable timing para sa
    ang pag-abala sa pamamagitan ng pagsulat ng mga bagong halaga sa
    OCR1A. * /
    bitClear (TCCR1A, WGM10);
    bitClear (TCCR1A, WGM11);
    bitSet (TCCR1B, WGM12);
    bitClear (TCCR1B, WGM13);
    / * itakda ang prescaler ng orasan sa / 8. * /
    bitClear (TCCR1B, CS10);
    bitSet (TCCR1B, CS11);
    bitClear (TCCR1B, CS12);
    / * Huwag paganahin ang Force Output Ihambing para sa
    Mga Channel A at B. * /
    bitClear (TCCR1C, FOC1A);
    bitClear (TCCR1C, FOC1B);
    / * Pinasimulan ang Ihambing ang Output
    Magparehistro A sa 160 upang itakda ang
    paunang itayo * /
    OCR1A = 160;
    // huwag paganahin ang pag-capture ng pag-input
    bitClear (TIMSK1, ICIE1);
    / / Huwag paganahin ang Output
    / Paghambingin ang B Pagtutugma ng Pagkagambala
    bitClear (TIMSK1, OCIE1B);
    / / Paganahin ang Output
    / Paghambingin ang Isang Pareha sa Pag-ikot
    bitSet (TIMSK1, OCIE1A);
    / / Huwag paganahin ang Overflow Interrupt
    bitClear (TIMSK1, TOIE1);
    / / paganahin ang interrupts ngayon na
    / / registers ay naitakda
    sei ();
    }
    / // Timer overflow handler
    ISR (TIMER1_COMPA_vect) {
    / * timer1 ISR. Sa bawat oras na ito
    ay tinatawag na nagtatakda ito ng speakerpin sa
    susunod na halaga sa waveform . Dalas
    Ang modulasyon ay ginagawa sa pamamagitan ng pagpapalit ng
    timing sa pagitan ng sunud-sunod na mga tawag ng
    ang function na ito, hal. para sa isang 1KHz tone,
    itakda ang timing upang ito ay tumatakbo
    sa pamamagitan ng waveform 1000 beses
    isang segundo. * /
    // i-reset ang waveindex kung naabot nito
    // ang dulo ng array
    kung (waveindex> 102) {
    waveindex = 0;
    }
    / / Itakda ang halaga ng output
    kung (dami> 0.03) {
    analogWrite (speakerpin,
    waveformVolume waveindex);
    }
    waveindex ++;
    / / I-update ang pitch
    OCR1A = pitch;
    }

    walang bisa loop ()
    {
    // Alisin ang mga interput, magpadala ng ping
    // mensahe at maghintay para sa sagot.
    cli ();
    pinMode (pingPin, Output);
    digitalWrite (pingPin, mababa);
    delayMicroseconds (2);
    digitalWrite (pingPin, HIGH);
    delayMicroseconds (5);
    digitalWrite (pingPin, mababa);
    tagal = pulseIn (pingPin, HIGH, 2000);
    sei ();
    / convert ang oras sa isang distansya
    // sa mga sentimetro
    // at mag-imbak sa buffer
    distance_buffer distance_index ++
    % distance_length = tagal / 20;
    / Hanapin sa buffer ang pinakamaikling
    // layo na sinusukat
    cm = 16000;
    para sa (int i = 0; i <distance_length; i ++) {
    cm = min (cm, distance_buffer i);
    }
    / / Suriin kung aling mga daliri ang pinindot
    fingerValue = 5;
    kung (! digitalRead (finger4)) {
    fingerValue = 4;
    }
    kung (! digitalRead (finger3)) {
    fingerValue = 3;
    }
    kung (! digitalRead (finger2)) {
    fingerValue = 2;
    }
    kung (! digitalRead (finger1)) {
    fingerValue = 1;
    }
    / / I-update ang nagpapanatili at
    // mga halaga ng sensitivity
    float sustain =
    mapa (analogRead (sustainPin), 0,
    1024, 101, 130) / 100.0;
    int sensitivity =
    mapa (analogRead (sensitivityPin),
    0, 1024, 100, 200);
    / / I-update ang volume
    dami = volume / sustain;
    kung (volume <0) {
    dami = 0;
    }

    / / Suriin ang accelerometer
    int acc = analogRead (0);
    int accDiff = lastAcc - acc;
    // I-update ang halaga ng dami
    kung (accDiff> 5 * (200 - sensitivity)) {
    dami + = (float)
    pow (accDiff,
    sensitivity / 100.0) / 50000;
    }
    lastAcc = acc;
    / / Suriin na dami ay hindi mas mataas kaysa sa 1
    kung (volume> .95) {
    dami = .95;
    }
    / / I-update ang lakas ng tunog sa waveform
    para sa (int i = 0; i <= 102; i ++) {
    waveformVolume i =
    ((waveform i - 127) * volume) + 127;
    }
    / / Itakda ang pitch ayon sa distansya
    // sa pagitan ng dalawang kamay at ang
    / / / daliri pinindot
    kung (cm <102 && cm> 0) {
    kung (cm> 30) {
    pitch = frequency 7 +
    (((cm - 30) / 24) * 4 + fingerValue - 1);
    } else {
    pitch = mapa (cm, 0, 30, 39, 79);
    }
    } else {
    pitch = frequency 7 +
    (((102 - 30) / 24) * 4 + fingerValue - 1);
    }
    // Pagkaantala upang maiwasan ang mga nagba-bounce signal
    pagkaantala (50);
    }
    ------------------------------------------------------