Devreler

Arduino, Aka AIRduino Gitarı ile Hava Gitarı Nasıl Yapılır: 5 Adım

GİTAR DERSİ 1 - 10dk'da GİTAR NASIL ÇALINIR ?

GİTAR DERSİ 1 - 10dk'da GİTAR NASIL ÇALINIR ?

İçindekiler:

Anonim

  • Buradaki fikir, Air Guitar'ı oynamak gibi iki elle kontrol edilebilecek giyilebilir bir sanal gitar inşa etmektir. 'Da iki haftalık bir proje sırasında oluşturuldu ve prototiplendi. ChalmersÜniversite (İsveç) bir Fiziksel Bilgi İşlem sınıfı için.

    Amaç, gerçek bir gitar çalma hissini elde etmektir. AIRduino Gitar bir eldiven ve bir çubuktan yapılmıştır.Eldiven sesi ayarlamak için tonu ve çubuğu ayarlamak için kullanılır.

    Böyle bir numara yapmak için, bir ivmeölçer ve bir ultra-sonik sensör kullandık (kavram açıklaması için Adım 1'e bakınız).

    Nasıl çalıştığı hakkında daha kesin bir fikir edinmek için video demosuna bir göz atın ve kendinizinkini oluşturmak için çalışmaya başlayın!


    AIRduino Takımı:

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

    Gereçler:

    1. Adım: Kavram Açıklaması

    Hava Gitarının sağ elini kullanan bir gitar olması gerekiyordu.
    Gitar kontrol cihazı, sol kontrol cihazı ve sağ kontrol cihazı olmak üzere iki kısma ayrılmıştır.
    Sol el kumandası ile oyuncu parmaklarını bükebilir ve tonun perdesini değiştirmek için eldiveni basabilir.
    Sağ kontrolör, hava gitarının sesini tetiklemek için çalkalanması gereken bir çubukla temsil edilir.
    Oyuncu, gitar boynundaki farklı perdeleri simüle ederek tonları değiştirmek için sağ ve sol el arasındaki mesafeyi de değiştirebilir.
    Bu gibi hileleri gerçekleştirmek için ana bileşenler, çubuk titremesini "hissetmek" için bir ivmeölçer, sağ el ve çubuk arasındaki mesafeyi ölçmek için hack edilmiş bir sonik-son sensör ve eldiveni oluşturmak için iletken kumaştır.
    Sonuç olarak, oyuncak yapmak oldukça kolaydır. Tek zor kısım, biraz el becerisi gerektiren ultra-sonik sensör kesmesi olacak. Talimatları anlamak ve ayrıca bir şeyi karıştırdığınızda ve gitar sonunda çalışmadığında ne yanlış yaptığınızı öğrenmek için bazı temel elektronik becerilere ihtiyacınız olacak. Biz oradaydık. :-)

    Adım 2: Alışveriş Listesi

    İşte kendi AIRduino Gitarınızı oluşturmak için ihtiyaç duyduğunuz şeylerin bir listesi:
    1. Teller: Ne yazık ki bu prototip sürümü için çok fazla. İki eldiveni ve Arduino parçalarını birbirine bağlamak için kullanılmışlardır. Tasarımın bu bölümünü kablosuz hale getirmekten çekinmeyin!
    2. İvmeölçer: Sağ elinizdeki çubukta sallanmayı tespit etmek için kullanılır. Üç eksenli bir ivmeölçer kullandık, ancak bir eksen yeterli.
    3. Ultrasonik sensör: oyuncunun iki eliyle arasındaki mesafeyi ölçmek için kullanılır, Paralaks # 28015 kullanılır
    4. İletken ve Streç kumaş: eldiveni inşa etmek,
    5. Arduino: Her şeyin üstesinden gelen Gitarın çekirdeği. Bir Arduino Diecimila iyi çalışıyor.
    6. Potansiyometreler: bazı ayarları yapmak için, 1KOhm-1MOhm'dan maksimum herhangi bir değere sahip bir potansiyometre tamamdır.
    7. Sıcak tutkal: Bir şeyleri bir arada tutmak için uygun bir yol
    8. 3,5 mm dişi jak: ses çıkışı için kullanılır,
    9. Klasik elektronik malzeme: Dirençler (10k), kapasitör (10uF), LED'ler ve arduino için bir çeşit güç kaynağı. (Bir 9V pil sadece iyi).

    Adım 3: Şemalar

    İşte AIRduino Gitarının elektronik şemaları.
    Gördüğünüz gibi, anlamak ve bu nedenle de inşa etmek oldukça kolaydır.
    Hangi bileşenin nereye gittiğine dair bir fikir istiyorsanız, resme bakın. Muhtemelen anladığınız gibi, bu hiçbir şekilde ölçeklenemez. Kablolar şematikte gösterilenden çok daha uzundur.
    Ayrıca, sonik sonik sensörün vericisinin çubukta ve alıcının sol tarafta olduğunu fark etmiş olabilirsiniz. Bu daha önce bahsettiğim en zor kısım: Ultra sonik yayıcıyı, sonik sonik sensör ünitesinden, sensör kartından ayırmak için çözmelisiniz.
    Daha sonraki adımlarda bu konuda daha fazla. Şimdi işe koyulalım!

    4. Adım: Eldiveni İnşa Etmek

    Eldiven bir adet ultra-sonik alıcı ve dört düğme içeriyor. Bu kadar!
    Ultra-sonik alıcı, aşağıdaki resimlerden bazılarında görülen kara kutuya yerleştirilmiştir.
    Eldivenin, Arduino panelindeki toprağa yeni bağlı olan geniş bir alanı vardır. Bir parmak avuç içine bastırıldığında, parmak üzerindeki iletken kumaş ile avuç arasında bir bağlantı oluşturulur.
    Aşağıda iki farklı eldiven modelinin resmi bulunmaktadır. Birinin çıkarılabilir parmakları vardır, bu her iki oyuncunun da çok küçük ve çok büyük ellere sahip olmasını sağlar. Diğer model standart bir eldivenin üzerine dikilir. İkinci versiyonu tavsiye ederim, daha kolay ve daha kolay.

    5. Adım: Kod

    Gereken Arduino kodu:
    Gerçek zamanlı ses üretme kısmı bu harika eğiticiden alınmıştır.
    ------------------------------------------------------
    // Dalga formunu içeren bir dizi
    // gitar sesinden
    char dalga biçimi =
    {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};
    // Bu dalga biçimini değiştirmek için kullanıyoruz.
    // çıktının hacmi
    char dalga biçimiVolume =
    {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};
    // Sakınmak için tampon olarak kullanılan bir dizi
    // hatalı dakik mesafe
    // ölçümler
    işaretsiz 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 uzaklık_index = 0;
    // 2 oktav için taşma değerleri
    int frekansları = {39, 42, 44, 47,
    50, 52, 56, 59, 63, 66, 70, 74, 79,
    84, 89, 94, 100, 105, 112, 118, 126,
    133, 141, 149};
    // İlk adım
    int aralığı = 160;
    // İlk hacim ve ivme
    // parametre
    int lastAcc = 0;
    şamandıra hacmi = 0;
    // pin 3'te ses çalma
    bayt hoparlörü = 3;
    // içinde pozisyon için index değişkeni
    // dalga
    uçucu byte waveindex = 0
    geçici bayt akımı değeri = 0;
    // Ultra-sonik sensör için kullanılan pin
    const int pingPin = 7;
    // Potansiyometreler için iğneler
    const int permanPin = 1;
    const int duyarlılığıPin = 2;
    // Soldaki her parmak için iğneler
    // el
    const int finger1 = 9;
    const int finger2 = 10;
    const int finger3 = 11;
    const int finger4 = 12;
    int fingerValue = 0;
    uzun süre, inç, cm;
    geçersiz kurulum () {
    pinMode (3, ÇIKIŞ); // Pin 3 üzerindeki hoparlör
    pinMode (finger1, GİRİŞ);
    pinMode (finger2, GİRİŞ);
    pinMode (finger3, GİRİŞ);
    pinMode (finger4, GİRİŞ);

    /**************************
    PWM ses yapılandırması
    ****************************/
    // Timer2'yi hızlı PWM moduna ayarlayın
    // (PWM frekansını iki katına çıkarır)
    bitSet (TCCR2A, WGM21);
    bitSet (TCCR2B, CS20);
    bitClear (TCCR2B, CS21);
    bitClear (TCCR2B, CS22);
    // şimdi kaydettiren kesintileri etkinleştir
    // ayarlanmıştır
    sei ();

    /*************************
    Zamanlayıcı 1 kesme yapılandırması
    *************************/
    // iken kesintileri devre dışı bırak
    // kayıtlar yapılandırılmıştır
    cli ();
    / * Normal port işlemi, pimlerin bağlantısı kesildi
    zamanlayıcı işleminden (pwm kırılması) * /
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    / * Mod 4, CTC TOP ile kayıt tarafından ayarlandı
    OCR1A. İçin değişken zamanlaması ayarlamamıza izin verir
    için yeni değerler yazarak kesinti
    OCR1A. * /
    bitClear (TCCR1A, WGM10);
    bitClear (TCCR1A, WGM11);
    bitSet (TCCR1B, WGM12);
    bitClear (TCCR1B, WGM13);
    / * saat ön ayarlayıcısını / 8 olarak ayarlayın. * /
    bitClear (TCCR1B, CS10);
    bitSet (TCCR1B, CS11);
    bitClear (TCCR1B, CS12);
    / * Güç Çıktısını Devre Dışı Bırak
    Kanal A ve B. * /
    bitClear (TCCR1C, FOC1A);
    bitClear (TCCR1C, FOC1B);
    / * Çıktı Karşılaştırmasını Başlatır
    Ayarlamak için 160’a A’yı kaydedin.
    ilk adım * /
    OCR1A = 160;
    // giriş yakalama kesmesini devre dışı bırak
    bitClear (TIMSK1, ICIE1);
    // Çıkışı devre dışı bırak
    // Karşılaştırma B Maç Kesintisi
    bitClear (TIMSK1, OCIE1B);
    // Çıktıyı etkinleştir
    // Bir Maç Kesmesini Karşılaştır
    bitSet (TIMSK1, OCIE1A);
    // Taşma Kesme'yi devre dışı bırak
    bitClear (TIMSK1, TOIE1);
    // şimdi kesmeyi etkinleştir
    // kayıtlar ayarlandı
    sei ();
    }
    // Zamanlayıcı taşma işleyicisi
    ISR (TIMER1_COMPA_vect) {
    / * zamanlayıcı1 ISR. Her zaman
    konuşmacıya
    dalga formundaki bir sonraki değer . Sıklık
    modülasyon değiştirilerek yapılır
    art arda gelen aramalar arasındaki zamanlama
    bu işlev, ör. 1KHz ton için
    zamanlamayı çalışacak şekilde ayarlayın
    dalga formu ile 1000 kez
    bir saniye. * /
    // ulaştıysa waveindex'i sıfırla
    // dizinin sonu
    eğer (waveindex> 102) {
    waveindex = 0;
    }
    // Çıktı değerini ayarlayın
    eğer (cilt> 0.03) {
    analogWrite (speakerpin,
    waveformVolume waveindex);
    }
    waveindex ++;
    // Sahayı güncelle
    OCR1A = adım;
    }

    geçersiz döngü ()
    {
    // Girişimleri etkisiz hale getir, bir ping gönder
    // mesaj ve cevabını bekle.
    cli ();
    pinMode (pingPin, OUTPUT);
    digitalWrite (pingPin, LOW);
    delayMicroseconds (2);
    digitalWrite (pingPin, HIGH);
    delayMicroseconds (5);
    digitalWrite (pingPin, LOW);
    süre = pulseIn (pingPin, HIGH, 2000);
    sei ();
    // zamanı bir mesafeye çevir
    // santimetre cinsinden
    // ve tamponda sakla
    distance_buffer distance_index ++
    % distance_length = süre / 20;
    // Tamponda en kısa bul
    // ölçülen mesafe
    cm = 16000;
    (int i = 0; i <distance_length; i ++) {
    cm = dak (cm, mesafe tampon i);
    }
    // Hangi parmaklara basıldığını kontrol et
    fingerValue = 5;
    if (! digitalRead (finger4)) {
    fingerValue = 4;
    }
    if (! digitalRead (finger3)) {
    fingerValue = 3;
    }
    if (! digitalRead (finger2)) {
    fingerValue = 2;
    }
    if (! digitalRead (finger1)) {
    fingerValue = 1;
    }
    // Sürdürmeyi güncelle ve
    // hassasiyet değerleri
    şamandıra sürekliliği =
    harita (analogOkulu (sürdürülebilirPin), 0,
    1024, 101, 130) / 100.0;
    int duyarlılık =
    harita (analogRead (sensitivityPin),
    0, 1024, 100, 200);
    // Sesi güncelle
    hacim = hacim / sürdürme;
    eğer (cilt <0) {
    hacim = 0;
    }

    // Akselerometreyi kontrol et
    int acc = analog Okuma (0);
    int accDiff = lastAcc - acc;
    // Ses değerini güncelle
    eğer (accDiff> 5 * (200 - duyarlılık)) {
    hacim + = (şamandıra)
    pow (accDiff,
    duyarlılık / 100.0) / 50000;
    }
    lastAcc = acc;
    // Birimin 1'den yüksek olmadığını kontrol edin
    eğer (birim> .95) {
    hacim = .95;
    }
    // Dalga formundaki ses seviyesini güncelleyin
    (int i = 0; i <= 102; i ++) {
    waveformVolume i =
    ((dalga biçimi i - 127) * hacim) + 127;
    }
    // Pitch'i mesafeye göre ayarla
    // iki el ile
    // parmak basıldı
    eğer (cm <102 ve& cm> 0) {
    eğer (cm> 30) {
    Pitch = frekansları 7 +
    (((cm - 30) / 24) * 4 + parmakDeğeri - 1);
    }Başka{
    perde = harita (cm, 0, 30, 39, 79);
    }
    }Başka{
    Pitch = frekansları 7 +
    (((102 - 30) / 24) * 4 + parmakDeğeri - 1);
    }
    // Zıplayan sinyalleri önlemek için gecikme
    gecikmesi (50);
    }
    ------------------------------------------------------