Ideja je, da se zgradi virtualna kitara, ki jo je mogoče nositi in jo je treba nadzorovati z dvema rokama, kot je igranje Air Guitar. Ustvarjen je bil in prototipiran v dveh tednih pri projektu
Cilj je dobiti občutek igranja prave kitare. Kitara AIRduino je narejena iz ene rokavice in ene palice.Rokavica se uporablja za nastavitev tona in palice za sprožitev zvoka.
Za izvedbo takšnega trika smo uporabili merilnik pospeška in ultrazvočni senzor (za opis koncepta glejte 1. korak).
Oglejte si video demo, da dobite natančnejšo predstavo o tem, kako deluje, in se lotite dela, da boste lahko zgradili svoje!
Ekipa AIRduino:
David Fournier, Jean-Louis Giordano, Monireh Sanaei, Maziar Shelbaf in Gustav Sohtell.
Dobave:
1. korak: Opis koncepta
Air Guitar naj bi delal kot desna roka kitare.
Upravljalnik kitare je razdeljen na dva dela, levi kontroler in desni krmilnik.
Z levim krmilnikom lahko igralec upogne prste in pritisne na rokavico, da spremeni višino tona.
Desni krmilnik je predstavljen s palico, ki jo je treba pretresti, da sproži zvok zračne kitare.
Igralec lahko spremeni tudi razdaljo med desno in levo roko, da poskrbi za ton, ki simulira različne prečke na vratu kitare.
Za izvedbo takšnih trikov so glavne komponente akcelerometer za "občutek" tresenja palice, kratek ultrazvočni senzor za merjenje razdalje med desno roko in palico ter prevodno tkanino za izdelavo rokavice.
Skratka, to je dokaj lahka igračka. Edini zapleten del bi bil ultra-sonic senzor hack, ki zahteva nekaj spretnosti. Potrebovali boste nekaj osnovnih elektronskih veščin, da boste razumeli navodila, in da boste izvedeli, kaj ste narobe storili, ko ste nekaj zmešali in kitaro na koncu ne deluje. Bili smo tam. :-)
2. korak: Seznam za nakupovanje
Tukaj je seznam tistega, kar potrebujete za izdelavo lastne kitare AIRduino:
1. Žice: žal je veliko za to prototipno različico. Uporabljeni so bili za povezavo obeh rokavic in delov Arduino skupaj. Prosto izboljšajte ta del oblikovanja tako, da ga naredite brezžično!
2. Merilnik pospeška: uporablja se v palici v desni roki za zaznavanje tresenja. Uporabili smo triosni merilnik hitrosti, vendar je dovolj ena os
3. Ultrasonic sensor: uporablja se za merjenje razdalje med obema rokama igralca, smo uporabili Parallax # 28015
4. prevodna in raztegljiva tkanina: za izdelavo rokavice,
5. Arduino: jedro kitare, ki obravnava vse. Arduino Diecimila je v redu.
6. Potenciometri: za nastavitev nekaterih nastavitev je potenciometer z maks. Ničim od 1KOhm-1MOhm v redu.
7. Lepilo za vroče taljenje: priročen način za držanje stvari skupaj,
8. 3,5 mm ženski priključek: uporablja se za avdio izhod,
9. Klasične elektronske stvari: upori (10k), kondenzator (10uF), LED diode in neka vrsta napajalnika za arduino. (Baterija 9V je v redu).
3. korak: Sheme
Tu so elektronske sheme za kitaro AIRduino.
Kot lahko vidite, je zelo enostavno razumeti in zato tudi graditi.
Oglejte si sliko, če želite, da idejo, katera komponenta gre kam. Kot verjetno razumete, se to nikakor ne spreminja. Kabli so veliko daljši, kot je prikazano na shemi.
Morda ste opazili, da je oddajnik ultrazvočnega senzorja na palici in sprejemnik na levi roki. To je težaven del, ki sem ga omenil prej: ultrazvočni oddajnik iz ultrazvočne senzorske enote morate odpakirati, da ga ločimo od plošče senzorja.
Več o tem v kasnejših korakih. Zdaj pa na delo!
Korak 4: Gradimo rokavico
Rokavice vsebujejo en ultrazvočni sprejemnik in štiri gumbe. To je to!
Ultrazvočni sprejemnik se nahaja v črni škatli, ki je vidna na nekaterih spodnjih slikah.
Rokavica ima eno veliko površino, ki je pravkar povezana z zemljo na Arduino plošči. Ko se prst pritisne na dlan, se ustvari povezava med prevodno tkanino na prstu in dlanjo.
Spodaj je slika dveh različnih modelov rokavic. Eden ima snemljive prste, ki omogočajo igralcem zelo majhne in zelo velike roke. Drugi model je prišit na standardno rokavico. Priporočam drugo različico, lažje jo je zgraditi in jo lažje obleči.
Korak 5: Koda
Potrebna je koda Arduino:
Delovanje generacije zvoka v realnem času je vzeto iz te odlične vadnice.
------------------------------------------------------
// Niz, ki vsebuje valovno obliko
Zvok kitare
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};
// To valovno obliko uporabljamo za spremembo
// obseg izhoda
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};
// Niz, ki se uporablja kot vmesni pomnilnik, ki ga je treba preprečiti
// napačna natančna razdalja
meritve
nepodpisan 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;
// Vrednosti za prelivanje za 2 oktavi
frekvence 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};
// Začetni korak
int pitch = 160;
// Začetna prostornina in pospešek
// parameter
int lastAcc = 0;
plavajoči volumen = 0;
// predvajanje zvoka na pin 3
bajtni zvočnik = 3;
// spremenljivka indeksa za položaj v
// valovna oblika
volatile byte waveindex = 0
volatile byte currentvalue = 0;
// Pin, ki se uporablja za ultrazvočni senzor
const int pingPin = 7;
// Pins za potenciometre
const int sustainPin = 1;
const int sensitivityPin = 2;
// Pins za vsak prst na levi
// roka
const int finger1 = 9;
const int finger2 = 10;
const int finger3 = 11;
const int finger4 = 12;
int fingerValue = 0;
dolgo trajanje, cm, cm;
void setup () {
pinMode (3, IZHOD); // Zvočnik na nožici 3
pinMode (prst1, INPUT);
pinMode (prst2, INPUT);
pinMode (prst3, INPUT);
pinMode (prst4, INPUT);
/**************************
Zvočna konfiguracija PWM
****************************/
// nastavite Timer2 v hitri način PWM
// (podvoji frekvenco PWM)
bitSet (TCCR2A, WGM21);
bitSet (TCCR2B, CS20);
bitClear (TCCR2B, CS21);
bitClear (TCCR2B, CS22);
// omogoči prekinitve, ki se zdaj registrirajo
// so bile nastavljene
sei ();
/*************************
Timer 1 prekine konfiguracijo
*************************/
/ / onemogoči prekinitve
// registri so konfigurirani
cli ();
/ * Normalno delovanje vrat, nožice odklopljene
od delovanja časovnika (lomljenje pwm) * /
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
/ * Mode 4, CTC s TOP nastavljeno z registrom
OCR1A. Omogoča, da nastavimo časovno spremenljivko za
prekine s pisanjem novih vrednosti
OCR1A. * /
bitClear (TCCR1A, WGM10);
bitClear (TCCR1A, WGM11);
bitSet (TCCR1B, WGM12);
bitClear (TCCR1B, WGM13);
/ * nastavite predalcevalnik ur na / 8. * /
bitClear (TCCR1B, CS10);
bitSet (TCCR1B, CS11);
bitClear (TCCR1B, CS12);
/ * Onemogoči Force Output Primerjaj za
Kanali A in B. * /
bitClear (TCCR1C, FOC1A);
bitClear (TCCR1C, FOC1B);
/ * Inicializira izhodno primerjavo
Registrirajte A pri 160 za nastavitev
začetno parcelo * /
OCR1A = 160;
// onemogoči prekinitev vnosa vnosa
bitClear (TIMSK1, ICIE1);
// onemogoči izhod
// Primerjaj prekinitve prekinitve
bitClear (TIMSK1, OCIE1B);
// omogoči izhod
// Primerjaj prekinitve prekinitve
bitSet (TIMSK1, OCIE1A);
// onemogoči prekinitev prekoračitve
bitClear (TIMSK1, TOIE1);
// zdaj omogoči prekinitve
// so bili nastavljeni registri
sei ();
}
// Upravljalec prelivanja časovnika
ISR (TIMER1_COMPA_vect) {
/ * timer1 ISR. Vsakič
se imenuje, da nastavi speakerpin na
naslednja vrednost v obliki valov . Pogostost
modulacija se izvede s spremembo
časovno zaporedje med zaporednimi klici
to funkcijo, npr. za ton 1KHz,
nastavite čas, da se bo zagnal
skozi valovno obliko 1000-krat
sekundo. * /
// ponastavi waveindex, če je dosegel
// konec matrike
če (waveindex> 102) {
valovni indeks = 0;
}
// Nastavi izhodno vrednost
če (obseg> 0.03) {
analogWrite (zvočnik,
waveformVolume waveindex);
}
waveindex ++;
// Posodobi igrišče
OCR1A = korak;
}
void loop ()
{
// Izključite vmesnike, pošljite ping
// sporočilo in počakajte na odgovor.
cli ();
pinMode (pingPin, IZHOD);
digitalWrite (pingPin, LOW);
zakasnitev mikroskopov (2);
digitalWrite (pingPin, HIGH);
zakasnitev mikroskopov (5);
digitalWrite (pingPin, LOW);
trajanje = impulz (pingPin, HIGH, 2000);
sei ();
// pretvarjanje časa v razdaljo
v centimetrih
// in shranite v medpomnilnik
distance_buffer distance_index ++
% distance_length = trajanje / 20;
// Najdi v medpomnilniku najkrajši
// izmerjena razdalja
cm = 16000;
za (int i = 0; i <razdalja_dolžina; i ++) {
cm = min (cm, razdalja_povzetek i);
}
// Preverite, kateri prsti so pritisnjeni
fingerValue = 5;
if (! digitalRead (finger4)) {
fingerValue = 4;
}
if (! digitalRead (finger3)) {
fingerValue = 3;
}
if (! digitalRead (finger2)) {
fingerValue = 2;
}
if (! digitalRead (finger1)) {
fingerValue = 1;
}
// Posodobitev vzdrževanja in
// vrednosti občutljivosti
float support =
mapa (analognaRead (sustainPin), 0,
1024, 101, 130) / 100.0;
int občutljivost =
zemljevid (analogRead (sensitivityPin),
0, 1024, 100, 200);
// Posodobite glasnost
prostornina = volumen / vzdrževanje;
če (obseg <0) {
volumen = 0;
}
// Preverite merilnik pospeška
int acc = analogRead (0);
int accDiff = lastAcc - acc;
// Posodobi vrednost glasnosti
if (accDiff> 5 * (200 - občutljivost)) {
volume + = (float)
pow (accDiff,
občutljivost / 100.0) / 50000;
}
lastAcc = acc;
// Preverite, da količina ni višja od 1
if (obseg> .95) {
volumen = .95;
}
// Posodobitev glasnosti v valovni obliki
za (int i = 0; i <= 102; i ++) {
waveformVolume i =
((valna oblika i - 127) * volumen + 127;
}
// Nastavite smer glede na razdaljo
// med obema rokama in
// prsti pritisnjeni
če (cm <102 && cm> 0) {
če (cm> 30) {
korak = frekvence 7 +
(((cm - 30) / 24) * 4 + prst - 1);
} else {
pitch = map (cm, 0, 30, 39, 79);
}
} else {
korak = frekvence 7 +
(((102 - 30) / 24) * 4 + prst - 1);
}
// Zakasnitev, da se izognete odbijanju signalov
zamuda (50);
}
------------------------------------------------------