Ang ideya dito ay upang bumuo ng isang naisusuot na virtual na gitara na kinokontrol na may dalawang kamay na halos tulad ng paglalaro ng Air Guitar. Ito ay nilikha at prototipiko sa loob ng dalawang linggo na proyekto sa
Ang layunin ay upang makuha ang pakiramdam ng paglalaro ng isang tunay na gitara. Ang AIRduino Guitar ay gawa sa isang glove at isang stick.Ang glove ay ginagamit upang itakda ang tono at ang stick upang ma-trigger ang tunog.
Upang maisagawa ang gayong panlilinlang, gumamit kami ng accelerometer at isang ultra-sonik na sensor (tingnan ang Hakbang 1 para sa paglalarawan ng konsepto).
Tingnan ang video demo upang makakuha ng isang mas tumpak na ideya kung paano ito gumagana, at magtrabaho upang bumuo ng iyong sarili!
Ang AIRduino Team:
David Fournier, Jean-Louis Giordano, Monireh Sanaei, Maziar Shelbaf at Gustav Sohtell.
Mga Kagamitan:
Hakbang 1: Paglalarawan ng Konsepto
Ang Air Guitar ay dapat magtrabaho bilang isang right-handed guitar.
Ang gitara controller ay hinati sa dalawang bahagi, kaliwa-kamay controller at kanang magsusupil.
Sa pamamagitan ng controller ng kaliwang kamay ang manlalaro ay maaaring yumuko ang kanyang mga daliri at pindutin ang glove upang baguhin ang pitch ng tono.
Ang controller ng kanang kamay ay kinakatawan ng isang stick na kailangang maugisin upang mai-trigger ang tunog ng air-guitar.
Ang manlalaro ay maaari ring baguhin ang distansya sa pagitan ng kanang kamay at kaliwang kamay upang itayo ang mga tono, na tumutulad sa iba't ibang mga frets sa leeg ng gitara.
Upang magsagawa ng gayong mga trick, ang pangunahing mga sangkap ay isang accelerometer upang "pakiramdam" ang stick shake, isang na-hack na ultra-sonic sensor upang masukat ang distansya sa pagitan ng kanang kamay at ng stick, at konduktibong tela upang maitayo ang glove.
Lahat sa lahat, ito ay isang medyo madali upang bumuo ng laruan. Ang tanging nakakalito bahagi ay ang ultra-sonik sensor hack na nangangailangan ng ilang kahusayan ng isip. Kakailanganin mo ang ilang mga pangunahing kaalaman sa electronic upang maunawaan ang mga tagubilin, at upang malaman kung ano ang iyong ginawa mali kapag ikaw ay may problema sa isang bagay at ang gitara ay hindi gumagana sa dulo. Nariyan na kami doon. :-)
Hakbang 2: Listahan ng Shopping
Narito ang isang listahan ng kung ano ang kailangan mo upang bumuo ng iyong sariling AIRduino Gitara:
1. Mga Wires: sa kasamaang-palad marami para sa bersyon ng prototype na ito. Sila ay ginagamit upang ikabit ang dalawang guwantes at ang mga bahagi ng Arduino. Huwag mag-atubiling mapabuti ang bahaging ito ng disenyo sa pamamagitan ng paggawa ng ito wireless!
2. Accelerometer: ginamit sa stick sa iyong kanang kamay upang makita ang pag-alog. Gumamit kami ng tatlong-axis accellerometer, ngunit ang isang isang axis ay sapat
3. Ultrasonic sensor: ginagamit upang masukat ang distansya sa pagitan ng parehong mga kamay ng manlalaro, ginamit namin ang Parallax # 28015
4. Conductive and Stretch fabric: upang itayo ang glove,
5. Arduino: ang core ng Guitar na humahawak ng lahat. Gumagana ang isang Arduino Diecimila.
6. Potentiometers: upang ayusin ang ilang mga setting, Ang isang potensyomiter na may isang max ng anumang bagay mula sa 1KOhm-1MOhm ay ok.
7. Hot matunaw pangkola: isang maginhawang paraan upang hawakan ang mga bagay na sama-sama,
8. 3.5 mm female jack: ginamit para sa audio output,
9. Classic electronic bagay: Resistors (10k), kapasitor (10uF), LEDs at ilang uri ng power supply para sa arduino. (Ang isang baterya 9V ay maayos).
Hakbang 3: Schematics
Narito ang mga electronic schematics para sa AIRduino Guitar.
Tulad ng makikita mo, ito ay madaling maunawaan at samakatuwid ay upang bumuo.
Tingnan ang larawan kung gusto mo ng isang ideya kung aling bahagi ang napupunta kung saan. Tulad ng iyong malamang na maunawaan, ito ay hindi upang masukat sa anumang paraan. Ang mga cable ay mas mahaba kaysa sa ipinapakita sa eskematiko.
Maaari mo ring napansin na ang emitter ng ultra-sonic sensor ay nasa stick at ang receiver ay nasa kaliwang kamay. Iyon ay ang nakakalito bahagi na nabanggit ko mas maaga: Kailangan mong hindi pa nababahala ang ultra-sonic emitter mula sa ultra-sonic sensor unit upang paghiwalayin ito mula sa sensor board.
Higit pa tungkol sa mga iyon sa mga susunod na hakbang. Ngayon ay magtrabaho tayo!
Hakbang 4: Pagbuo ng Glove
Ang glove ay naglalaman ng isang ultra-sonic receiver at apat na mga pindutan. Ayan yun!
Ang ultra-sonic receiver ay matatagpuan sa itim na kahon na makikita sa ilan sa mga larawan sa ibaba.
Ang glove ay may isang malaking lugar na kung saan ay konektado lamang sa lupa sa Arduino board. Kapag ang isang daliri ay pinindot laban sa palm isang koneksyon sa pagitan ng kondaktibo tela sa daliri at ang palm ay nilikha.
Nasa ibaba ang larawan ng dalawang magkaibang modelo ng glove. Ang isa ay may mga detachable na daliri, na nagpapahintulot sa parehong mga manlalaro na may napakaliit at napakalaking kamay. Ang iba pang modelo ay natahi sa isang karaniwang glove. Gusto ko inirerekomenda ang ikalawang bersyon, mas madali itong bumuo, at mas madaling maipasok.
Hakbang 5: Code
Narito ang kinakailangan ng Arduino code:
Ang real-time na bahagi ng henerasyon ng tunog ay kinuha mula sa mahusay na tutorial na ito.
------------------------------------------------------
// Isang array na naglalaman ng waveform
// ng isang tunog ng gitara
char waveform =
{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};
// Ginagamit namin ang waveform na ito upang baguhin ang
/ / dami ng 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};
// Isang array na ginamit bilang isang buffer upang maiwasan
/ maling pagkakamali sa oras
/ measurements
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;
// Ang mga overflow value para sa 2 octaves
int frequencies = {39, 42, 44, 47,
50, 52, 56, 59, 63, 66, 70, 74, 79,
84, 89, 94, 100, 105, 112, 118, 126,
133, 141, 149};
// Initial pitch
int pitch = 160;
/ / Initial volume at acceleration
// parameter
int lastAcc = 0;
float volume = 0;
// audio playback sa pin 3
byte speakerpin = 3;
// variable ng variable para sa posisyon sa
/ / waveform
pabagu-bago ng isip byte waveindex = 0
pabagu-bago ng isip byte currentvalue = 0;
// Pin na ginamit para sa ultra-sonik sensor
const int pingPin = 7;
// Pins para sa potentiometers
const int sustainPin = 1;
const int sensitivityPin = 2;
// Pins para sa bawat daliri ng kaliwa
// kamay
const int finger1 = 9;
const int finger2 = 10;
const int finger3 = 11;
const int finger4 = 12;
int fingerValue = 0;
mahabang tagal, pulgada, cm;
walang bisa setup () {
pinMode (3, Output); / Speaker sa pin 3
pinMode (finger1, INPUT);
pinMode (finger2, INPUT);
pinMode (finger3, INPUT);
pinMode (finger4, INPUT);
/**************************
PWM audio configuration
****************************/
/ / Itakda ang Timer2 upang mabilis na PWM mode
/ / (daluyan ng dalas ng PWM)
bitSet (TCCR2A, WGM21);
bitSet (TCCR2B, CS20);
bitClear (TCCR2B, CS21);
bitClear (TCCR2B, CS22);
/ / paganahin ang mga interrupts na nagrerehistro
/ / ay naitakda
sei ();
/*************************
Pagsasaayos ng pag-abala ng timer 1
*************************/
/ / huwag paganahin ang mga interrupts habang
/ / registers ay naka-configure
cli ();
/ * Normal na pagpapatakbo ng port, pin na nakakulong
mula sa operasyon ng timer (breaking pwm) * /
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
/ * Mode 4, CTC sa TOP na itinakda ng rehistro
OCR1A. Binibigyang-daan sa amin na magtakda ng variable timing para sa
ang pag-abala sa pamamagitan ng pagsulat ng mga bagong halaga sa
OCR1A. * /
bitClear (TCCR1A, WGM10);
bitClear (TCCR1A, WGM11);
bitSet (TCCR1B, WGM12);
bitClear (TCCR1B, WGM13);
/ * itakda ang prescaler ng orasan sa / 8. * /
bitClear (TCCR1B, CS10);
bitSet (TCCR1B, CS11);
bitClear (TCCR1B, CS12);
/ * Huwag paganahin ang Force Output Ihambing para sa
Mga Channel A at B. * /
bitClear (TCCR1C, FOC1A);
bitClear (TCCR1C, FOC1B);
/ * Pinasimulan ang Ihambing ang Output
Magparehistro A sa 160 upang itakda ang
paunang itayo * /
OCR1A = 160;
// huwag paganahin ang pag-capture ng pag-input
bitClear (TIMSK1, ICIE1);
/ / Huwag paganahin ang Output
/ Paghambingin ang B Pagtutugma ng Pagkagambala
bitClear (TIMSK1, OCIE1B);
/ / Paganahin ang Output
/ Paghambingin ang Isang Pareha sa Pag-ikot
bitSet (TIMSK1, OCIE1A);
/ / Huwag paganahin ang Overflow Interrupt
bitClear (TIMSK1, TOIE1);
/ / paganahin ang interrupts ngayon na
/ / registers ay naitakda
sei ();
}
/ // Timer overflow handler
ISR (TIMER1_COMPA_vect) {
/ * timer1 ISR. Sa bawat oras na ito
ay tinatawag na nagtatakda ito ng speakerpin sa
susunod na halaga sa waveform . Dalas
Ang modulasyon ay ginagawa sa pamamagitan ng pagpapalit ng
timing sa pagitan ng sunud-sunod na mga tawag ng
ang function na ito, hal. para sa isang 1KHz tone,
itakda ang timing upang ito ay tumatakbo
sa pamamagitan ng waveform 1000 beses
isang segundo. * /
// i-reset ang waveindex kung naabot nito
// ang dulo ng array
kung (waveindex> 102) {
waveindex = 0;
}
/ / Itakda ang halaga ng output
kung (dami> 0.03) {
analogWrite (speakerpin,
waveformVolume waveindex);
}
waveindex ++;
/ / I-update ang pitch
OCR1A = pitch;
}
walang bisa loop ()
{
// Alisin ang mga interput, magpadala ng ping
// mensahe at maghintay para sa sagot.
cli ();
pinMode (pingPin, Output);
digitalWrite (pingPin, mababa);
delayMicroseconds (2);
digitalWrite (pingPin, HIGH);
delayMicroseconds (5);
digitalWrite (pingPin, mababa);
tagal = pulseIn (pingPin, HIGH, 2000);
sei ();
/ convert ang oras sa isang distansya
// sa mga sentimetro
// at mag-imbak sa buffer
distance_buffer distance_index ++
% distance_length = tagal / 20;
/ Hanapin sa buffer ang pinakamaikling
// layo na sinusukat
cm = 16000;
para sa (int i = 0; i <distance_length; i ++) {
cm = min (cm, distance_buffer i);
}
/ / Suriin kung aling mga daliri ang pinindot
fingerValue = 5;
kung (! digitalRead (finger4)) {
fingerValue = 4;
}
kung (! digitalRead (finger3)) {
fingerValue = 3;
}
kung (! digitalRead (finger2)) {
fingerValue = 2;
}
kung (! digitalRead (finger1)) {
fingerValue = 1;
}
/ / I-update ang nagpapanatili at
// mga halaga ng sensitivity
float sustain =
mapa (analogRead (sustainPin), 0,
1024, 101, 130) / 100.0;
int sensitivity =
mapa (analogRead (sensitivityPin),
0, 1024, 100, 200);
/ / I-update ang volume
dami = volume / sustain;
kung (volume <0) {
dami = 0;
}
/ / Suriin ang accelerometer
int acc = analogRead (0);
int accDiff = lastAcc - acc;
// I-update ang halaga ng dami
kung (accDiff> 5 * (200 - sensitivity)) {
dami + = (float)
pow (accDiff,
sensitivity / 100.0) / 50000;
}
lastAcc = acc;
/ / Suriin na dami ay hindi mas mataas kaysa sa 1
kung (volume> .95) {
dami = .95;
}
/ / I-update ang lakas ng tunog sa waveform
para sa (int i = 0; i <= 102; i ++) {
waveformVolume i =
((waveform i - 127) * volume) + 127;
}
/ / Itakda ang pitch ayon sa distansya
// sa pagitan ng dalawang kamay at ang
/ / / daliri pinindot
kung (cm <102 && cm> 0) {
kung (cm> 30) {
pitch = frequency 7 +
(((cm - 30) / 24) * 4 + fingerValue - 1);
} else {
pitch = mapa (cm, 0, 30, 39, 79);
}
} else {
pitch = frequency 7 +
(((102 - 30) / 24) * 4 + fingerValue - 1);
}
// Pagkaantala upang maiwasan ang mga nagba-bounce signal
pagkaantala (50);
}
------------------------------------------------------