Sirkuit

Cara Membangun Gitar Udara Dengan Arduino, Aka Gitar AIRduino: 5 Langkah

AIRduino Guitar

AIRduino Guitar

Daftar Isi:

Anonim

  • Idenya di sini adalah untuk membangun gitar virtual yang dapat dikenakan yang harus dikontrol dengan dua tangan seperti bermain Air Guitar. Ini telah dibuat dan ditiru selama proyek dua minggu di ChalmersUniversitas (Swedia) untuk kelas Komputasi Fisik.

    Tujuannya adalah untuk mendapatkan perasaan bermain gitar sungguhan. Gitar AIRduino terbuat dari satu sarung tangan dan satu tongkat.Sarung tangan digunakan untuk mengatur nada dan tongkat untuk memicu suara.

    Untuk melakukan trik seperti itu, kami menggunakan accelerometer dan sensor ultra-sonik (lihat Langkah 1 untuk deskripsi konsep).

    Lihatlah demo video untuk mendapatkan ide yang lebih tepat tentang cara kerjanya, dan mulai bekerja untuk membuat sendiri!


    Tim AIRduino:

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

    Persediaan:

    Langkah 1: Deskripsi Konsep

    Gitar Air seharusnya bekerja sebagai gitar tangan kanan.
    Pengontrol gitar dibagi menjadi dua bagian, pengontrol kiri dan pengontrol kanan.
    Dengan pengontrol sebelah kiri, pemain dapat menekuk jari-jarinya dan menekan sarung tangan untuk mengubah nada nada.
    Kontroler kanan diwakili oleh tongkat yang harus diguncang untuk memicu suara gitar udara.
    Pemain juga dapat mengubah jarak antara tangan kanan dan tangan kiri untuk melempar nada, mensimulasikan fret yang berbeda pada leher gitar.
    Untuk melakukan trik seperti itu, komponen utamanya adalah accelerometer untuk "merasakan" guncangan tongkat, sensor ultra sonik yang diretas untuk mengukur jarak antara tangan kanan dan tongkat, dan kain konduktif untuk membuat sarung tangan.
    Secara keseluruhan, ini adalah mainan yang cukup mudah dibuat. Satu-satunya bagian yang sulit adalah retas sensor ultra-sonik yang membutuhkan ketangkasan. Anda akan memerlukan beberapa keterampilan elektronik dasar untuk memahami instruksi, dan juga untuk mengetahui apa yang Anda lakukan salah ketika Anda mengacaukan sesuatu dan gitar pada akhirnya tidak berfungsi. Kami sudah ada di sana. :-)

    Langkah 2: Daftar Belanja

    Berikut adalah daftar yang Anda butuhkan untuk membangun Gitar AIRduino Anda sendiri:
    1. Kabel: sayangnya banyak untuk versi prototipe ini. Mereka telah digunakan untuk menghubungkan dua sarung tangan dan bagian Arduino bersama. Jangan ragu untuk memperbaiki bagian desain ini dengan menjadikannya nirkabel!
    2. Accelerometer: digunakan pada tongkat di tangan kanan Anda untuk mendeteksi getaran. Kami menggunakan akselerometer tiga sumbu, tetapi satu sumbu sudah cukup
    3. Sensor ultrasonik: digunakan untuk mengukur jarak antara kedua tangan pemain, kami menggunakan Parallax # 28015
    4. Konduktif dan kain Stretch: untuk membangun sarung tangan,
    5. Arduino: inti dari Gitar yang menangani segalanya. Arduino Diecimila berfungsi dengan baik.
    6. Potensiometer: untuk menyesuaikan beberapa pengaturan, Potensiometer dengan maksimal apa pun dari 1KOhm-1MOhm ok.
    7. Lem panas meleleh: cara yang nyaman untuk menyatukan semuanya,
    8. 3.5 mm jack perempuan: digunakan untuk output audio,
    9. Barang elektronik klasik: Resistor (10k), kapasitor (10uF), LED, dan beberapa jenis catu daya untuk Arduino. (Baterai 9V baik-baik saja).

    Langkah 3: Skema

    Berikut adalah skema elektronik untuk Gitar AIRduino.
    Seperti yang Anda lihat, sangat mudah dipahami dan karenanya juga dibangun.
    Lihat gambar jika Anda ingin tahu komponen mana yang digunakan. Seperti yang mungkin Anda pahami, ini bukan skala apa pun. Kabel lebih panjang dari yang ditunjukkan dalam skema.
    Anda mungkin juga memperhatikan bahwa penghasil sensor ultra-sonik ada pada tongkat dan penerima ada di sebelah kiri. Itu adalah bagian rumit yang telah saya sebutkan sebelumnya: Anda harus melepaskan solder ultra-sonic dari unit sensor ultra-sonik untuk memisahkannya dari papan sensor.
    Lebih lanjut tentang itu di langkah selanjutnya. Sekarang mari kita mulai bekerja!

    Langkah 4: Membangun Sarung Tangan

    Sarung tangan berisi satu penerima ultra-sonik dan empat tombol. Itu dia!
    Penerima ultra-sonik terletak di kotak hitam yang terlihat pada beberapa gambar di bawah ini.
    Sarung tangan memiliki satu area besar yang hanya terhubung ke tanah di papan Arduino. Ketika jari ditekan ke telapak tangan, sambungan antara kain konduktif pada jari dan telapak dibuat.
    Di bawah ini adalah gambar dari dua model sarung tangan yang berbeda. Seseorang memiliki jari yang dapat dilepas, yang memungkinkan kedua pemain dengan tangan yang sangat kecil dan sangat besar. Model lainnya dijahitkan ke sarung tangan standar. Saya akan merekomendasikan versi kedua, lebih mudah untuk dibuat, dan lebih mudah untuk dipakai.

    Langkah 5: Kode

    Berikut adalah kode Arduino yang diperlukan:
    Bagian pembuatan suara waktu nyata diambil dari tutorial hebat ini.
    ------------------------------------------------------
    // Array yang berisi bentuk gelombang
    // dari suara 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 gelombang ini untuk mengubah
    // volume 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};
    // Array yang digunakan sebagai buffer untuk menghindari
    // jarak waktu yang salah
    // 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 overflow 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};
    // Pitch awal
    int pitch = 160;
    // Volume awal dan akselerasi
    // parameter
    int lastAcc = 0;
    volume mengambang = 0;
    // pemutaran audio pada pin 3
    byte speakerpin = 3;
    // variabel indeks untuk posisi dalam
    // gelombang
    waveindex byte volatile = 0
    nilai byte saat volatil = 0;
    // Pin digunakan untuk sensor ultra-sonik
    const int pingPin = 7;
    // Pin untuk potensiometer
    const int SustainPin = 1;
    sensitivitas int p = 2;
    // Pin untuk setiap jari 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;
    pengaturan batal () {
    pinMode (3, OUTPUT); // Speaker pada pin 3
    pinMode (finger1, INPUT);
    pinMode (finger2, INPUT);
    pinMode (finger3, INPUT);
    pinMode (finger4, INPUT);

    /**************************
    Konfigurasi audio PWM
    ****************************/
    // atur Timer2 ke mode PWM cepat
    // (menggandakan frekuensi PWM)
    bitSet (TCCR2A, WGM21);
    bitSet (TCCR2B, CS20);
    bitClear (TCCR2B, CS21);
    bitClear (TCCR2B, CS22);
    // aktifkan interupsi sekarang yang mendaftar
    // telah diatur
    sei ();

    /*************************
    Timer 1 mengganggu konfigurasi
    *************************/
    // nonaktifkan interupsi sementara
    // register sudah dikonfigurasikan
    cli ();
    / * Operasi port normal, pin terputus
    dari operasi timer (melanggar PWM) * /
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    / * Mode 4, CTC dengan TOP diatur oleh register
    OCR1A. Mengizinkan kami mengatur waktu variabel untuk
    interupsi dengan menulis nilai baru ke
    OCR1A. * /
    bitClear (TCCR1A, WGM10);
    bitClear (TCCR1A, WGM11);
    bitSet (TCCR1B, WGM12);
    bitClear (TCCR1B, WGM13);
    / * atur prescaler jam ke / 8. * /
    bitClear (TCCR1B, CS10);
    bitSet (TCCR1B, CS11);
    bitClear (TCCR1B, CS12);
    / * Nonaktifkan Angkatan Output Bandingkan untuk
    Saluran A dan B. * /
    bitClear (TCCR1C, FOC1A);
    bitClear (TCCR1C, FOC1B);
    / * Menginisialisasi Pembandingan Output
    Daftarkan A pada 160 untuk mengatur
    nada awal * /
    OCR1A = 160;
    // nonaktifkan input capture interrupt
    bitClear (TIMSK1, ICIE1);
    // nonaktifkan Output
    // Bandingkan B Match Interrupt
    bitClear (TIMSK1, OCIE1B);
    // aktifkan Output
    // Bandingkan Interupsi Pertandingan
    bitSet (TIMSK1, OCIE1A);
    // nonaktifkan Overflow Interrupt
    bitClear (TIMSK1, TOIE1);
    // aktifkan interupsi sekarang
    // register telah disetel
    sei ();
    }
    // Handler pengatur waktu
    ISR (TIMER1_COMPA_vect) {
    / * timer1 ISR. Setiap saat itu
    disebut set speakerpin ke
    nilai selanjutnya dalam bentuk gelombang . Frekuensi
    modulasi dilakukan dengan mengubah
    waktu antara panggilan berturut-turut dari
    fungsi ini, mis. untuk nada 1KHz,
    atur waktunya agar berjalan
    melalui gelombang 1000 kali
    Sebentar. * /
    // reset waveindex jika sudah mencapai
    // akhir dari array
    if (waveindex> 102) {
    waveindex = 0;
    }
    // Tetapkan nilai output
    if (volume> 0,03) {
    analogWrite (speakerpin,
    waveformVolume waveindex);
    }
    waveindex ++;
    // Perbarui pitch
    OCR1A = pitch;
    }

    membatalkan loop ()
    {
    // Nonaktifkan interput, kirim ping
    // pesan dan tunggu jawabannya.
    cli ();
    pinMode (pingPin, OUTPUT);
    digitalWrite (pingPin, LOW);
    delayMicroseconds (2);
    digitalWrite (pingPin, HIGH);
    delayMicroseconds (5);
    digitalWrite (pingPin, LOW);
    durasi = pulseIn (pingPin, HIGH, 2000);
    sei ();
    // ubah waktu menjadi jarak
    // dalam sentimeter
    // dan simpan di buffer
    distance_buffer distance_index ++
    % distance_length = durasi / 20;
    // Cari di buffer 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;
    if (! digitalRead (finger4)) {
    fingerValue = 4;
    }
    if (! digitalRead (finger3)) {
    fingerValue = 3;
    }
    if (! digitalRead (finger2)) {
    fingerValue = 2;
    }
    if (! digitalRead (finger1)) {
    fingerValue = 1;
    }
    // Perbarui berkelanjutan dan
    // nilai sensitivitas
    float sustain =
    peta (analogRead (SustainPin), 0,
    1024, 101, 130) / 100.0;
    sensitivitas int =
    peta (analogRead (sensitivitasPin),
    0, 1024, 100, 200);
    // Perbarui volume
    volume = volume / pertahankan;
    if (volume <0) {
    volume = 0;
    }

    // Periksa accelerometer
    int acc = analogRead (0);
    int accDiff = lastAcc - acc;
    // Perbarui nilai volume
    if (accDiff> 5 * (200 - sensitivitas)) {
    volume + = (mengambang)
    pow (accDiff,
    sensitivitas / 100.0) / 50000;
    }
    lastAcc = acc;
    // Periksa bahwa volumenya tidak lebih tinggi dari 1
    if (volume> .95) {
    volume = 0,95;
    }
    // Perbarui volume dalam bentuk gelombang
    untuk (int i = 0; i <= 102; i ++) {
    waveformVolume i =
    ((bentuk gelombang i - 127) * volume) + 127;
    }
    // Atur pitch sesuai jarak
    // antara dua tangan dan
    // jari ditekan
    if (cm <102 && cm> 0) {
    if (cm> 30) {
    pitch = frekuensi 7 +
    (((cm - 30) / 24) * 4 + fingerValue - 1);
    }lain{
    pitch = peta (cm, 0, 30, 39, 79);
    }
    }lain{
    pitch = frekuensi 7 +
    (((102 - 30) / 24) * 4 + fingerValue - 1);
    }
    // Penundaan untuk menghindari sinyal memantul
    keterlambatan (50);
    }
    ------------------------------------------------------