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