Litar

Bagaimana Membina Guitar Air Dengan Arduino, Aka Gitar AIRduino: 5 Langkah

AIRduino Guitar

AIRduino Guitar

Isi kandungan:

Anonim

  • Idea di sini adalah untuk membina gitar maya yang boleh dipakai yang akan dikawal dengan dua tangan seperti bermain Guitar Air. Ia telah dicipta dan prototaip semasa projek dua minggu di ChalmersUniversiti (Sweden) untuk kelas Pengkomputeran Fizikal.

    Matlamatnya adalah untuk mendapatkan perasaan bermain gitar sebenar. Gitar AIRduino diperbuat daripada satu sarung tangan dan satu batang.Sarung tangan digunakan untuk menetapkan nada dan batang untuk mencetuskan bunyi.

    Untuk melakukan silap mata ini, kami menggunakan pecutan dan sensor ultra sonik (lihat Langkah 1 untuk penerangan konsep).

    Lihat demo video untuk mendapatkan idea yang lebih tepat tentang bagaimana ia berfungsi, dan dapatkan kerja untuk membina sendiri!


    Pasukan AIRduino:

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

    Bekalan:

    Langkah 1: Perihalan Konsep

    Gitar Air sepatutnya berfungsi sebagai gitar tangan kanan.
    Pengawal gitar dibahagikan kepada dua bahagian, pengawal sebelah kiri dan pengawal kanan.
    Dengan pengawal sebelah kiri pemain boleh menekuk jari-jarinya dan tekan sarung tangan untuk mengubah nada nada.
    Pengawal kanan diwakili oleh tongkat yang perlu digegarkan untuk mencetuskan bunyi gitar udara.
    Pemain juga boleh menukar jarak antara tangan kanan dan tangan kiri untuk melengkapkan nada, meniru frets yang berbeza pada leher gitar.
    Untuk melakukan trik itu, komponen utama adalah pecutan untuk "merasakan" goncang kayu, sensor ultra-sonik yang digodam untuk mengukur jarak antara tangan kanan dan tongkat, dan kain konduktif untuk membina sarung tangan.
    Semuanya, ia adalah mudah untuk membina mainan. Satu-satunya bahagian rumit adalah hack sensor ultra-sonik yang memerlukan ketangkasan. Anda akan memerlukan beberapa kemahiran elektronik asas untuk memahami arahan, dan juga untuk mengetahui apa yang anda lakukan salah apabila anda merosakkan sesuatu dan gitar tidak berfungsi pada akhirnya. Kami telah berada di sana. :-)

    Langkah 2: Senarai Beli-belah

    Berikut adalah senarai apa yang anda perlukan untuk membina gitar AIRduino anda sendiri:
    1. Wayar: malangnya banyak versi prototaip ini. Mereka telah digunakan untuk menyambung dua sarung tangan dan bahagian Arduino bersama-sama. Jangan ragu untuk memperbaiki bahagian reka bentuk ini dengan menjadikannya tanpa wayar!
    2. Accelerometer: digunakan di dalam tong di tangan kanan anda untuk mengesan gegaran. Kami menggunakan accellerometer tiga paksi, tetapi satu paksi cukup
    3. Sensor ultrasonik: digunakan untuk mengukur jarak antara kedua-dua tangan pemain, kami menggunakan Parallax # 28015
    4. Fabrik konduktif dan regangan: untuk membina sarung tangan,
    5. Arduino: inti Guitar yang mengendalikan segala-galanya. Arduino Diecimila berfungsi dengan baik.
    6. Potentiometers: untuk menyesuaikan beberapa tetapan, Potentiometer dengan max apa-apa dari 1KOhm-1MOhm adalah ok.
    7. Gam mencairkan panas: cara mudah untuk memegang benda bersama,
    8. jack wanita 3.5 mm: digunakan untuk output audio,
    9. Bahan elektronik klasik: Resistors (10k), kapasitor (10uF), LED dan beberapa jenis bekalan kuasa untuk arduino. (Bateri 9V baik sahaja).

    Langkah 3: Skema

    Berikut adalah skema elektronik untuk Gitar AIRduino.
    Seperti yang anda dapat lihat, ia cukup mudah difahami dan oleh itu juga untuk membina.
    Lihatlah imej jika anda menginginkan idea mengenai komponen mana yang akan berlaku. Seperti yang anda mungkin faham, ini tidak berskala dengan cara apapun. Kabel lebih lama daripada yang ditunjukkan dalam skema.
    Anda mungkin juga menyedari bahawa pemancar sensor ultra-sonik adalah pada kayu dan penerima berada di sebelah kiri. Itulah bahagian rumit yang saya sebutkan tadi: Anda mesti tidak melepaskan pemancar ultra sonik dari unit sensor ultra sonik untuk memisahkannya dari papan sensor.
    Lebih lanjut mengenai itu dalam langkah-langkah seterusnya. Sekarang mari kita bekerja!

    Langkah 4: Membangun Sarung Tangan

    Sarung tangan ini mengandungi satu penerima ultra sonik dan empat butang. Itu sahaja!
    Penerima ultra-sonik terletak di dalam kotak hitam yang kelihatan pada beberapa gambar di bawah.
    Sarung tangan mempunyai satu kawasan besar yang hanya tersambung ke tanah di papan Arduino. Apabila jari ditekan terhadap tapak tangan sambungan di antara kain konduktif di jari dan tapak tangan dibuat.
    Berikut adalah gambar dua model sarung tangan yang berlainan. Satu mempunyai jari boleh tanggal, yang membolehkan kedua-dua pemain mempunyai tangan yang sangat kecil dan sangat besar. Model lain dijahit terus ke sarung tangan standard. Saya akan mencadangkan versi kedua, lebih mudah untuk dibina, dan lebih mudah dipakai.

    Langkah 5: Kod

    Berikut adalah kod Arduino yang diperlukan:
    Bahagian generasi bunyi sebenar diambil dari tutorial hebat ini.
    ------------------------------------------------------
    // Arahan yang mengandungi bentuk gelombang
    / / dari bunyi gitar
    bentuk gelombang char =
    {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};
    // Kami menggunakan bentuk gelombang ini untuk menukar
    // volum keluaran
    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};
    // Arahan yang digunakan sebagai penimbal untuk dielakkan
    // jarak yang tidak tepat
    // pengukuran
    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;
    / / Nilai melimpah untuk 2 oktaf
    frekuensi 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};
    // Padang awal
    int lapangan = 160;
    // Jumlah dan percepatan awal
    // parameter
    int lastAcc = 0;
    volume terapung = 0;
    // Main semula audio pada pin 3
    byte speakerpin = 3;
    // variable variable untuk posisi dalam
    / / bentuk gelombang
    gelombang tidak menentu gelombangindex = 0
    volatile byte currentvalue = 0;
    // Pin yang digunakan untuk sensor ultra sonik
    const int pingPin = 7;
    // Pins untuk potensiometer
    const int sustainPin = 1;
    const int sensitivityPin = 2;
    // Pins untuk setiap jari di sebelah kiri
    // tangan
    const int finger1 = 9;
    const int finger2 = 10;
    const int finger3 = 11;
    const int finger4 = 12;
    int fingerValue = 0;
    durasi panjang, inci, cm;
    void setup () {
    pinMode (3, OUTPUT); // Speaker pada pin 3
    pinMode (finger1, INPUT);
    pinMode (finger2, INPUT);
    pinMode (finger3, INPUT);
    pinMode (finger4, INPUT);

    /**************************
    Konfigurasi audio PWM
    ****************************/
    / // set Timer2 untuk mod PWM cepat
    / / (kekerapan PWM ganda)
    bitSet (TCCR2A, WGM21);
    bitSet (TCCR2B, CS20);
    bitClear (TCCR2B, CS21);
    bitClear (TCCR2B, CS22);
    / / membolehkan interrupts sekarang yang mendaftar
    // telah ditetapkan
    sei ();

    /*************************
    Pemasa 1 menyegerakkan pemasa
    *************************/
    / / melumpuhkan gangguan semasa
    // daftar dikonfigurasikan
    cli ();
    / * Operasi pelabuhan biasa, pin diputuskan
    dari operasi pemasa (mematikan pwm) * /
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    / * Mode 4, CTC dengan TOP ditetapkan dengan mendaftar
    OCR1A. Membolehkan kita menetapkan masa pemboleh ubah untuk
    yang mengganggu dengan menulis nilai baru kepada
    OCR1A. * /
    bitClear (TCCR1A, WGM10);
    bitClear (TCCR1A, WGM11);
    bitSet (TCCR1B, WGM12);
    bitClear (TCCR1B, WGM13);
    / * tetapkan prescaler jam ke / 8. * /
    bitClear (TCCR1B, CS10);
    bitSet (TCCR1B, CS11);
    bitClear (TCCR1B, CS12);
    / * Lumpuhkan Paksaan Keluaran Bandingkan
    Saluran A dan B. * /
    bitClear (TCCR1C, FOC1A);
    bitClear (TCCR1C, FOC1B);
    / * Inisialisasi Keluaran Bandingkan
    Daftar A pada 160 untuk menetapkan
    padang awal * /
    OCR1A = 160;
    // menonaktifkan mengganggu input tangkapan
    bitClear (TIMSK1, ICIE1);
    // Matikan Output
    / / Bandingkan B Match Interrupt
    bitClear (TIMSK1, OCIE1B);
    // membolehkan Output
    / / / Compare a Interrupt Match
    bitSet (TIMSK1, OCIE1A);
    // melumpuhkan Interrupt Overflow
    bitClear (TIMSK1, TOIE1);
    // membolehkan gangguan ini sekarang
    // daftar telah ditetapkan
    sei ();
    }
    / // Pengendali limpahan pemasa
    ISR (TIMER1_COMPA_vect) {
    / * timer1 ISR. Setiap kali ia
    dipanggil ia menetapkan speakerpin kepada
    nilai seterusnya dalam bentuk gelombang . Kekerapan
    modulasi dilakukan dengan mengubah
    masa antara panggilan berturut-turut
    fungsi ini, cth. untuk nada 1KHz,
    tetapkan masa supaya ia berjalan
    melalui bentuk gelombang 1000 kali
    sesaat. * /
    // reset waveindex jika sudah mencapai
    // akhir array
    jika (waveindex> 102) {
    gelombangindex = 0;
    }
    / / Tetapkan nilai output
    jika (jumlah> 0.03) {
    analogWrite (speakerpin,
    waveformVolume waveindex);
    }
    gelombangindex ++;
    // Kemas kini padang
    OCR1A = padang;
    }

    kekosongan gelung ()
    {
    / // Menurunkan interput, hantar ping
    // mesej dan tunggu jawapannya.
    cli ();
    pinMode (pingPin, OUTPUT);
    digitalWrite (pingPin, LOW);
    delayMicroseconds (2);
    digitalWrite (pingPin, HIGH);
    delayMicroseconds (5);
    digitalWrite (pingPin, LOW);
    tempoh = pulseIn (pingPin, TINGGI, 2000);
    sei ();
    / Tukar masa ke jarak
    // dalam sentimeter
    // dan simpan di penampan
    distance_buffer distance_index ++
    % distance_length = tempoh / 20;
    / Cari di penampan yang terpendek
    // jarak diukur
    cm = 16000;
    untuk (int i = 0; i <distance_length; i ++) {
    cm = min (cm, distance_buffer i);
    }
    // Periksa jari mana yang ditekan
    fingerValue = 5;
    jika (! digitalRead (finger4)) {
    fingerValue = 4;
    }
    jika (! digitalRead (finger3)) {
    fingerValue = 3;
    }
    jika (! digitalRead (finger2)) {
    fingerValue = 2;
    }
    jika (! digitalRead (finger1)) {
    fingerValue = 1;
    }
    // Memperbaharui kemapanan dan
    // nilai sensitiviti
    float sustain =
    peta (analogRead (sustainPin), 0,
    1024, 101, 130) / 100.0;
    sensitiviti int =
    peta (analogRead (sensitivityPin),
    0, 1024, 100, 200);
    / / Kemas kini kelantangan
    jumlah = kelantangan / sokongan;
    jika (kelantangan <0) {
    jumlah = 0;
    }

    // Periksa pecutan
    int acc = analogRead (0);
    int accDiff = lastAcc - acc;
    / / Kemas kini nilai kelantangan
    jika (accDiff> 5 * (200 - kepekaan)) {
    jumlah + = (terapung)
    pow (accDiff,
    kepekaan / 100.0) / 50000;
    }
    lastAcc = acc;
    // Periksa jumlah yang tidak melebihi 1
    jika (jumlah> .95) {
    jumlah = .95;
    }
    // Memperbaharui kelantangan dalam bentuk gelombang
    untuk (int i = 0; i <= 102; i ++) {
    gelombangformVolume i =
    ((bentuk gelombang i - 127) * isipadu) + 127;
    }
    / / Tetapkan padang mengikut jarak
    // antara kedua tangan dan yang
    / // jari ditekan
    jika (cm <102 && cm> 0) {
    jika (cm> 30) {
    padang = frekuensi 7 +
    (((cm - 30) / 24) * 4 + fingerValue - 1);
    } else {
    pitch = peta (cm, 0, 30, 39, 79);
    }
    } else {
    padang = frekuensi 7 +
    (((102 - 30) / 24) * 4 + fingerValue - 1);
    }
    // Tunda untuk mengelakkan isyarat yang melantun
    kelewatan (50);
    }
    ------------------------------------------------------