Ideja je da se izgradi virtualna gitara koja se može nositi i koja se kontrolira s dvije ruke poput igranja Air Guitar. Stvoren je i prototipiran tijekom dva tjedna projekta
Cilj je dobiti osjećaj sviranja prave gitare. Gitara AIRduino izrađena je od jedne rukavice i jednog štapa.Rukavica se koristi za podešavanje tona i palice za pokretanje zvuka.
Za izvođenje takvog trika koristili smo akcelerometar i ultrazvučni senzor (vidi korak 1 za opis koncepta).
Pogledajte video demo kako biste dobili precizniju predstavu o tome kako funkcionira i dođite na posao da biste sami napravili!
Tim AIRduino:
David Fournier, Jean-Louis Giordano, Monireh Sanaei, Maziar Shelbaf i Gustav Sohtell.
Pribor:
Korak 1: Opis koncepta
Zračna gitara bi trebala raditi kao desna ruka.
Kontrolor gitare podijeljen je na dva dijela, lijevi kontroler i desni upravljač.
Lijevim upravljačem igrač može saviti prste i pritisnuti rukavicu kako bi promijenio visinu tona.
Desni upravljač predstavljen je štapom koji se mora potresti kako bi se aktivirao zvuk zračne gitare.
Igrač također može promijeniti udaljenost između desne i lijeve ruke kako bi podigao tonove, simulirajući različite prečke na vratu gitare.
Za izvođenje takvih trikova, glavne komponente su akcelerometar kako bi se "osjetio" štap sticka, hakirani ultrazvučni senzor za mjerenje udaljenosti između desne ruke i štapa i provodne tkanine za izradu rukavice.
Sve u svemu, igračka je vrlo jednostavna za izgradnju. Jedini lukav dio bio bi ultrazvučni senzor hak koji zahtijeva određenu spretnost. Trebat će vam neke osnovne elektronske vještine kako biste razumjeli upute, kao i saznali što ste učinili krivo kada ste nešto zabrljali i gitara na kraju ne radi. Bili smo tamo. :-)
Korak 2: Popis za kupnju
Ovdje je popis onoga što vam je potrebno za izgradnju vlastite AIRduino gitare:
1. Žice: nažalost mnogo za ovu prototipnu verziju. Koriste se za povezivanje dviju rukavica i Arduino dijelova zajedno. Slobodno poboljšajte ovaj dio dizajna čineći ga bežičnim!
2. Akcelerometar: koristi se u štapiću u desnoj ruci za otkrivanje trešnje. Koristili smo troosni akcelerometar, ali je jedna osa dovoljna
3. Ultrazvučni senzor: koristi se za mjerenje udaljenosti između obje ruke igrača, koristili smo Parallax # 28015
4. Vodljiva i rastezljiva tkanina: za izradu rukavice,
5. Arduino: jezgra gitare koja obrađuje sve. Arduino Diecimila dobro radi.
6. Potenciometri: za podešavanje nekih postavki, Potenciometar s maksimumom od 1KOhm-1MOhm je u redu.
7. Vruće taljenje ljepila: prikladan način za držanje stvari zajedno,
8. 3.5 mm ženski priključak: koristi se za audio izlaz,
9. Klasične elektroničke stvari: Otpornici (10k), kondenzator (10uF), LED diode i neka vrsta napajanja za arduino. (9V baterija je sasvim u redu).
Korak 3: Shema
Ovdje su elektroničke sheme za AIRduino gitaru.
Kao što možete vidjeti, prilično je lako razumjeti i stoga i graditi.
Pogledajte sliku ako želite ideju o tome koja komponenta ide kamo. Kao što vjerojatno shvaćate, ovo nije za mjerenje na bilo koji način. Kabeli su mnogo dulji nego što je prikazano na shemi.
Također možete primijetiti da je odašiljač ultrazvučnog senzora na štapu, a prijemnik na lijevoj ruci. To je lukavi dio koji sam ranije spomenuo: morate odvojiti ultrazvučni odašiljač iz ultrazvučne senzorske jedinice kako biste je odvojili od ploče senzora.
Više o tome u kasnijim koracima. Idemo sada na posao!
Korak 4: Izgradnja rukavice
Rukavica sadrži jedan ultra-sonični prijemnik i četiri gumba. To je to!
Ultrazvučni prijemnik nalazi se u crnoj kutiji koja je vidljiva na nekim od donjih slika.
Rukavica ima jedno veliko područje koje je samo spojeno na tlo na Arduino ploči. Kada se prst pritisne na dlan, stvara se veza između vodljive tkanine na prstu i dlanu.
Ispod su slike dva različita modela rukavica. Jedan ima odvojive prste, što omogućuje oba igrača vrlo male i vrlo velike ruke. Drugi model je ušiven na standardnu rukavicu. Preporučio bih drugu verziju, lakše je izgraditi i lakše je obući.
Korak 5: Kod
Ovdje je potreban Arduino kod:
U stvarnom vremenu generacija zvuka dio je preuzet iz ove velike tutorial.
------------------------------------------------------
// Niz s valnim oblikom
// zvuka gitare
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};
// Ovaj valni oblik koristimo za promjenu
// volumen izlaza
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 koji se koristi kao međuspremnik za izbjegavanje
// pogrešna točna udaljenost
// mjerenja
nepotpisan 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;
// Vrijednosti preljeva za 2 oktave
int frekvencije = {39, 42, 44, 47,
50, 52, 56, 59, 63, 66, 70, 74, 79,
84, 89, 94, 100, 105, 112, 118, 126,
133, 141, 149};
// Inicijalni korak
int pitch = 160;
// Početni volumen i ubrzanje
// parametar
int lastAcc = 0;
float volume = 0;
// reprodukcija zvuka na pin 3
bajtni zvučnik = 3;
// indeksna varijabla za poziciju u
// valni oblik
volatile byte waveindex = 0
volatile byte currentvalue = 0;
// Pin se koristi za ultrazvučni senzor
const int pingPin = 7;
// Igle za potenciometre
const int sustainPin = 1;
const int sensitivityPin = 2;
// Igle za svaki prst lijevo
// ruka
const int finger1 = 9;
const int finger2 = 10;
const int finger3 = 11;
const int finger4 = 12;
int fingerValue = 0;
dugo trajanje, inča, cm;
void setup () {
pinMode (3 OUTPUT); // Zvučnik na pin 3
pinMode (finger1, INPUT);
pinMode (finger2, INPUT);
pinMode (finger3, INPUT);
pinMode (finger4, INPUT);
/**************************
PWM konfiguracija zvuka
****************************/
// postavite Timer2 u brz PWM način rada
// (udvostručuje PWM frekvenciju)
bitSet (TCCR2A, WGM21);
bitSet (TCCR2B, CS20);
bitClear (TCCR2B, CS21);
bitClear (TCCR2B, CS22);
/ / omogućuju prekide koji se registriraju
// postavljeni su
Sei ();
/*************************
Timer 1 prekida konfiguraciju
*************************/
/ / onemogućuje vrijeme prekida
// registri su konfigurirani
cli ();
/ * Normalan rad porta, pinovi su odspojeni
iz radnog vremena (pwm) * /
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
/ * Mode 4, CTC s TOP postavljenim registrom
OCR1A. Omogućuje nam da postavimo promjenjivo vrijeme za
prekida pisanjem novih vrijednosti
OCR1A. * /
bitClear (TCCR1A, WGM10);
bitClear (TCCR1A, WGM11);
bitSet (TCCR1B, WGM12);
bitClear (TCCR1B, WGM13);
/ * postavite satni pretvarač na / 8. * /
bitClear (TCCR1B, CS10);
bitSet (TCCR1B, CS11);
bitClear (TCCR1B, CS12);
/ * Onemogući Force Output Usporedi za
Kanali A i B. * /
bitClear (TCCR1C, FOC1A);
bitClear (TCCR1C, FOC1B);
/ * Pokreće usporedbu izlaza
Registrirajte A na 160 za postavljanje
početna visina * /
OCR1A = 160;
/ / onemogućiti prekid unosa za unos
bitClear (TIMSK1, ICIE1);
// onemogući izlaz
// Usporedi B prekid podudaranja
bitClear (TIMSK1, OCIE1B);
// omogući izlaz
// Usporedite prekid podudaranja
bitSet (TIMSK1, OCIE1A);
// onemogući prekid prelijevanja
bitClear (TIMSK1, TOIE1);
// sada omogućuju prekide
// postavljeni su registri
Sei ();
}
// Uređaj za preljev tajmera
ISR (TIMER1_COMPA_vect) {
/ * timer1 ISR. Svaki put
zove se postavlja speakerpin na
sljedeća vrijednost u obliku vala . Frekvencija
modulacija se vrši mijenjanjem
vremena između uzastopnih poziva
ovu funkciju, npr. za ton 1KHz,
postavite vrijeme tako da se pokreće
kroz valni oblik 1000 puta
drugi. * /
// resetiraj waveindex ako je dostigao
// kraj niza
ako (waveindex> 102) {
valni indeks = 0;
}
// Postavite izlaznu vrijednost
ako (volumen> 0.03) {
analogWrite (speakerpin,
waveformVolume waveindex);
}
waveindex ++;
// Ažurirajte visinu
OCR1A = smola;
}
nevažeća petlja ()
{
// Isključivanje interputa, slanje pinga
// poruku i pričekajte odgovor.
cli ();
pinMode (pingPin, IZLAZ);
digitalWrite (pingPin, LOW);
delayMicroseconds (2);
digitalWrite (pingPin, HIGH);
delayMicroseconds (5);
digitalWrite (pingPin, LOW);
trajanje = pulsin (pingPin, HIGH, 2000);
Sei ();
// pretvaranje vremena u daljinu
// u centimetrima
// i pohraniti u međuspremnik
distance_buffer distance_index ++
% distance_length = trajanje / 20;
// Pronađite u međuspremniku najkraće
// izmjerena udaljenost
cm = 16000;
za (int i = 0; i <distance_length; i ++) {
cm = min (cm, distance_buffer i);
}
// Provjerite koji prsti su pritisnuti
fingerValue = 5;
if (! digitalRead (finger4)) {
fingerValue = 4;
}
if (! digitalRead (finger3)) {
fingerValue = 3;
}
if (! digitalRead (finger2)) {
fingerValue = 2;
}
if (! digitalRead (finger1)) {
fingerValue = 1;
}
/ / Ažuriranje održavanja i
// vrijednosti osjetljivosti
float support =
karta (analognaRead (sustainPin), 0,
1024, 101, 130) / 100.0;
int sensitivity =
karta (analogRead (sensitivityPin),
0, 1024, 100, 200);
// Ažurirajte glasnoću
volumen = volumen / izdržljivost;
ako (volumen <0) {
volumen = 0;
}
// Provjerite akcelerometar
int acc = analogRead (0);
int accDiff = lastAcc - acc;
// Ažuriranje vrijednosti volumena
if (accDiff> 5 * (200 - osjetljivost)) {
volume + = (float)
ENT (accDiff,
osjetljivost / 100.0) / 50000;
}
lastAcc = acc;
// Provjerite da glasnoća nije veća od 1
if (volumen> .95) {
volumen = .95;
}
// Ažuriranje glasnoće u valnom obliku
za (int i = 0; i <= 102; i ++) {
waveformVolume i =
((oblik vala i - 127) * volumen + 127;
}
// Postavite visinu prema udaljenosti
// između dvije ruke i
// prsti pritisnuti
ako (cm <102 && cm> 0) {
ako (cm> 30) {
pitch = frekvencije 7 +
(((cm - 30) / 24) * 4 + prst - 1);
}drugo{
pitch = map (cm, 0, 30, 39, 79);
}
}drugo{
pitch = frekvencije 7 +
(((102 - 30) / 24) * 4 + prst - 1);
}
// Odgoda radi izbjegavanja odbijanja signala
kašnjenje (50);
}
------------------------------------------------------