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