Az ötlet az, hogy egy olyan hordható virtuális gitárt építsünk, amelyet két kézzel kell kezelni, mint az Air Guitar játék. Létrehozták és prototípusosították egy két hetes projekt alatt
A cél az, hogy valódi gitárjátékot érzünk. Az AIRduino gitár egy kesztyűből és egy botból készül.A kesztyűt arra használják, hogy beállítsa a hangot és a botot a hang elindításához.
Az ilyen trükk elvégzéséhez gyorsulásmérőt és ultrahangos érzékelőt használtunk (lásd az 1. lépést a koncepció leírásához).
Vessen egy pillantást a videó bemutatóra, hogy pontosabb képet kapjon arról, hogyan működik, és dolgozzon a saját munkájához!
Az AIRduino csapat:
David Fournier, Jean-Louis Giordano, Monireh Sanaei, Maziar Shelbaf és Gustav Sohtell.
kellékek:
1. lépés: Koncepció leírása
Az Air Guitarnak jobbkezes gitárként kell működnie.
A gitárvezérlő két részre van osztva, a bal oldali vezérlő és a jobb oldali vezérlő.
A bal oldali vezérlővel a játékos elhajolhatja az ujjait, és nyomja meg a kesztyűt, hogy megváltoztassa a hangszínt.
A jobb oldali vezérlőt egy olyan bot képviseli, amelyet meg kell rázni, hogy a levegő-gitár hangját kiváltja.
A játékos a jobb és a bal kéz közötti távolságot is megváltoztathatja annak érdekében, hogy a hangokat a gitár nyakon lévő különböző fretekkel szimulálja.
Az ilyen trükkök elvégzéséhez a fő összetevők egy gyorsulásmérő, amely „megérzi” a rúdrázkódtatást, egy hackelt ultrahangos érzékelőt a jobb és a pálca közötti távolság mérésére, valamint a vezető anyagot a kesztyű felépítésére.
Mindent összevetve, egy meglehetősen könnyű építeni játék. Az egyetlen trükkös rész lenne az ultra-hang érzékelő hack, amely bizonyos ügyességet igényel. Szükséged lesz néhány alapvető elektronikus készségre, hogy megértsd az utasításokat, és hogy megtudd, mit csináltál rosszul, amikor valamit elrontottál, és a gitár nem működik a végén. Ott voltunk. :-)
2. lépés: Bevásárlólista
Itt van egy lista a saját AIRduino gitár létrehozásához:
1. Vezetékek: sajnos sok ez a prototípus verzió. A két kesztyűt és az Arduino alkatrészeket összekapcsolták. Nyugodtan javíthatja a design ezen részét, hogy vezeték nélküli legyen!
2. Gyorsulásmérő: a jobb kezedben lévő rúdban a rázás észlelésére használatos. Háromtengelyes akkordométert használtunk, de egy tengely elég
3. Ultrahangos érzékelő: a játékos két keze közötti távolság mérésére használtunk, a Parallaxet # 28015 használtuk
4. Vezetőképes és rugalmas anyag: a kesztyű felépítése
5. Arduino: a gitár magja, amely mindent kezel. An Arduino Diecimila jól működik.
6. Potenciométerek: néhány beállítás beállításához, egy potenciométer, melynek max.
7. Forró olvasztó ragasztó: egy kényelmes mód a dolgok együtt tartására,
8. 3,5 mm-es női csatlakozó: audio kimenethez használható,
9. Klasszikus elektronikus cucc: ellenállások (10k), kondenzátor (10uF), LED-ek és valamilyen tápegység az arduino számára. (A 9V-os akkumulátor csak finom).
3. lépés: Sémák
Íme az AIRduino gitár elektronikus vázlata.
Amint láthatod, elég könnyen megérthetõ, ezért építeni is.
Nézd meg a képet, ha azt akarod, hogy egy alkotóelem melyik komponensre megy. Ahogy valószínűleg megérted, ez semmiképpen sem méretezhető. A kábelek sokkal hosszabbak, mint az ábrán láthatóak.
Azt is észrevehette, hogy az ultrahangos érzékelő sugárzója a pálcán van, és a vevő a bal oldalon van. Ez az a trükkös rész, amit korábban említettem: Az ultrahang-kibocsátót le kell bontani az ultrahangos érzékelőegységből, hogy elkülönítse azt az érzékelőtáblától.
További információ a későbbi lépésekben. Most menjünk dolgozni!
4. lépés: A kesztyű építése
A kesztyű egy ultrahang-vevővel és négy gombbal rendelkezik. Ez az!
Az ultrahang-vevő a fekete dobozban látható, az alábbi képeken látható.
A kesztyűnek van egy nagy területe, amely éppen a földre van csatlakoztatva az Arduino táblán. Amikor ujját nyomják a tenyérre, akkor létrejön a kapcsolat az elektromos vezetőképességű szövet és a tenyér között.
Az alábbiakban két különböző kesztyű-modell képe látható. Az egyiknek levehető ujja van, ami mindkét játékosnak nagyon kicsi és nagyon nagy kezekkel rendelkezik. A másik modell egy hagyományos kesztyűre van varrva. A második verziót ajánlom, könnyebb felépíteni és könnyebb felhelyezni.
5. lépés: Kód
Itt van az Arduino kód szükséges:
A valós idejű hanggenerációs rész ebből a nagyszerű bemutatóból származik.
------------------------------------------------------
// A hullámformát tartalmazó tömb
// gitárhang
char hullámforma =
{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};
// Ezt a hullámformát használjuk a változáshoz
// a kimenet mennyisége
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};
// Egy tömb, amelyet pufferként használunk, hogy elkerüljük
// hibás pontos távolság
// mérések
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;
// 2 oktáv túlfolyási értéke
int frekvenciák = {39, 42, 44, 47,
50, 52, 56, 59, 63, 66, 70, 74, 79,
84, 89, 94, 100, 105, 112, 118, 126,
133, 141, 149};
// Kezdeti pálya
int pitch = 160;
// Kezdeti kötet és gyorsulás
// paraméter
int lastAcc = 0;
float térfogat = 0;
// hang lejátszása a 3. tűnél
byte speakerpin = 3;
// index változó a pozícióhoz
// hullámforma
illékony byte-hullámindex = 0
volatilis byte aktuális értéke = 0;
// Az ultrahangos érzékelőhöz használt csap
const int pingPin = 7;
// A potenciométerek csapjai
const int jätkusuutPin = 1;
const int sensitivityPin = 2;
// A bal oldali ujjhoz tartozó csapok
// kéz
const int finger1 = 9;
const int finger2 = 10;
const int finger3 = 11;
const int finger4 = 12;
int fingerValue = 0;
hosszú időtartamú, hüvelyk, cm;
érvénytelen beállítás () {
pinMode (3, kimenetet); // 3. hangszóró
pinMode (finger1, bemenet);
pinMode (finger2, bemenet);
pinMode (finger3, bemenet);
pinMode (finger4, bemenet);
/**************************
PWM hangkonfiguráció
****************************/
// állítsa be az időzítőt 2 gyors PWM módba
// (megduplázza a PWM frekvenciát)
bitSet (TCCR2A, WGM21);
bitSet (TCCR2B, CS20);
bitClear (TCCR2B, CS21);
bitClear (TCCR2B, CS22);
// engedélyezze a megszakításokat most, amikor regisztrál
// beállítva
sei ();
/*************************
Az 1. időzítő megszakítja a konfigurációt
*************************/
// tiltsa le a megszakításokat
// A regiszterek konfigurálva vannak
cli ();
/ * Normál port működés, csapok leválasztva
az időzítő működéséből (pwm törése) * /
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
/ * 4. mód, CTC a TOP beállítással
OCR1A. Lehetővé teszi változó időzítés beállítását
a megszakítást az új értékek írásával
OCR1A. * /
bitClear (TCCR1A, WGM10);
bitClear (TCCR1A, WGM11);
bitSet (TCCR1B, WGM12);
bitClear (TCCR1B, WGM13);
/ * állítsa az óra prescaler / 8 értékét. * /
bitClear (TCCR1B, CS10);
bitSet (TCCR1B, CS11);
bitClear (TCCR1B, CS12);
/ * A Force Output összehasonlítása
A és B csatornák. * /
bitClear (TCCR1C, FOC1A);
bitClear (TCCR1C, FOC1B);
/ * A kimenet összehasonlítása
Regisztráljon A-t 160-ra a beállításhoz
kezdeti pálya * /
OCR1A = 160;
// bemeneti rögzítési megszakítás letiltása
bitClear (TIMSK1, ICIE1);
// kimenet letiltása
// Összehasonlítás B Match Interrupt
bitClear (TIMSK1, OCIE1B);
// a kimenet engedélyezése
// Összehasonlít egy meccsmegszakítást
bitSet (TIMSK1, OCIE1A);
// tiltsa le a túlcsordulás megszakítását
bitClear (TIMSK1, TOIE1);
// engedélyezze a megszakításokat most
// regiszterek lettek beállítva
sei ();
}
// Időzítő túlcsorduláskezelő
ISR (TIMER1_COMPA_vect) {
/ * időzítő1 ISR. Minden alkalommal
az úgynevezett, hogy a hangszórót a
következő érték a hullámformában . Frekvencia
a moduláció a
az egymást követő hívások közötti időzítés
ez a funkció, pl. 1KHz-es hangra
állítsa be az időzítést úgy, hogy fut
hullámformán keresztül 1000-szer
egy második. * /
// állítsa vissza a hullámindexet, ha elérte
// a tömb vége
ha (waveindex> 102) {
hullámindex = 0;
}
// Állítsa be a kimeneti értéket
ha (térfogat> 0,03) {
analogWrite (speakerpin,
waveformVolume waveindex);
}
waveindex ++;
// Frissítse a pályát
OCR1A = pálya;
}
érvénytelen hurok ()
{
// Távolítsa el az interputeket, küldjön egy pinget
// üzenet és várjon a válaszra.
cli ();
pinMode (pingPin, OUTPUT);
digitalWrite (pingPin, LOW);
delayMicroseconds (2);
digitalWrite (pingPin, HIGH);
delayMicroseconds (5);
digitalWrite (pingPin, LOW);
időtartam = pulzus (pingPin, HIGH, 2000);
sei ();
// az időt egy távolságra konvertálja
// centiméterben
// és tárolja pufferben
distance_buffer distance_index ++
% distance_length = időtartam / 20;
// Keresse meg a legrövidebb pufferben
// mért távolság
cm = 16000;
a (int i = 0; i <distance_length; i ++) {
cm = min (cm, távolság_puffer i);
}
// Ellenőrizze, hogy melyik ujja van megnyomva
fingerValue = 5;
if (! digitalRead (finger4)) {
fingerValue = 4;
}
if (! digitalRead (finger3)) {
fingerValue = 3;
}
if (! digitalRead (finger2)) {
fingerValue = 2;
}
if (! digitalRead (finger1)) {
fingerValue = 1;
}
// Frissítse a fenntartást és
// érzékenységi értékek
float fenntartása =
térkép (analogRead (fenntartóPin), 0,
1024, 101, 130) / 100.0;
int érzékenység =
Térkép (analogRead (sensitivityPin)
0, 1024, 100, 200);
// A kötet frissítése
térfogat = térfogat / tartás;
ha (<0) {
térfogat = 0;
}
// Ellenőrizze a gyorsulásmérőt
int acc = analóg (0);
int accDiff = lastAcc - acc;
// A hangerő frissítése
ha (accDiff> 5 * (200 - érzékenység)) {
hangerő + = (úszó)
pow (accDiff,
érzékenység / 100,0) / 50000;
}
lastAcc = acc;
// Ellenőrizze, hogy a térfogat nem nagyobb-e, mint 1
ha (kötet> .95) {
térfogat = .95;
}
// Frissítse a hangerőt a hullámformában
(int i = 0; i <= 102; i ++) {
waveformVolume i =
((hullámforma i - 127) * térfogat) + 127;
}
// Állítsa be a távolságot
// a két kéz és a
// megnyomott ujjak
ha (cm <102 && cm> 0) {
ha (cm> 30) {
pitch = frekvenciák 7 +
(((cm - 30) / 24) * 4 + fingerValue - 1);
}más{
pitch = map (cm, 0, 30, 39, 79);
}
}más{
pitch = frekvenciák 7 +
(((102 - 30) / 24) * 4 + fingerValue - 1);
}
// Késleltetés a pattogó jelek elkerülésére
késleltetés (50);
}
------------------------------------------------------