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.
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);
}
------------------------------------------------------