La idea és construir una guitarra virtual que es pugui utilitzar amb dues mans, com si fos Air Air. Ha estat creat i prototipat durant un projecte de dues setmanes a
L'objectiu és aconseguir la sensació de tocar una guitarra real. La guitarra AIRduino està feta amb un guant i un pal.El guant s'utilitza per establir el to i el pal per activar el so.
Per realitzar aquest truc, hem utilitzat un acceleròmetre i un sensor ultra-sònic (vegeu el pas 1 per a la descripció del concepte).
Fes un cop d'ull a la demostració de vídeo per obtenir una idea més precisa de com funciona, i treballar per construir el seu propi compte!
L'equip d'AIRduino:
David Fournier, Jean-Louis Giordano, Monireh Sanaei, Maziar Shelbaf i Gustav Sohtell.
Subministraments:
Pas 1: Descripció del concepte
La guitarra Air es suposa que funciona com a guitarra per a dretes.
El controlador de guitarra es divideix en dues parts, controlador de la mà esquerra i controlador de la dreta.
Amb el controlador esquerre, el jugador pot inclinar els dits i prémer el guant per canviar el to del to.
El controlador de la dreta està representat per un pal que ha de ser sacsejat per activar el so de la guitarra aèria.
El jugador també pot canviar la distància entre la mà dreta i la mà esquerra per tal de llançar els tons, simulant els diferents trasts del coll de la guitarra.
Per realitzar aquest tipus de trucs, els components principals són un acceleròmetre per "sentir" el batut, un sensor ultra-sonor piratejat per mesurar la distància entre la mà dreta i el pal i el teixit conductor per construir el guant.
En definitiva, és una joguina bastant fàcil de construir. L'única part complicada seria el hack del sensor ultra-sònic que requereix certa destresa. Necessitareu algunes habilitats electròniques bàsiques per entendre les instruccions i també per esbrinar el que heu fet malament quan heu fet malbé alguna cosa i, finalment, la guitarra no funciona. Hem estat allà. :-)
Pas 2: Llista de compres
Aquí teniu una llista del que necessiteu per construir la vostra pròpia guitarra AIRduino:
1. Fils: per desgràcia molt per a aquesta versió de prototip. S'han utilitzat per connectar els dos guants i les peces Arduino. Siéntase lliure de millorar aquesta part del disseny fent-lo sense fils!
2. Acceleròmetre: s'utilitza en el pal de la mà dreta per detectar el tremolor. Hem utilitzat un accelerador de tres eixos, però n'hi ha prou amb un eix
3. Sensor d'ultrasons: s'utilitza per mesurar la distància entre les dues mans del jugador, hem utilitzat Parallax # 28015
4. Teixit conductor i elàstic: per construir el guant,
5. Arduino: el nucli de la guitarra que maneja tot. Un Arduino Diecimila funciona bé.
6. Potenciòmetres: per ajustar alguns paràmetres, un potenciòmetre amb una quantitat màxima de 1KOhm-1MOhm està bé.
7. Cola calenta: una manera convenient de mantenir les coses junts,
8. Jack femella de 3,5 mm: utilitzat per a la sortida d’àudio,
9. Material electrònic clàssic: resistències (10 k), condensador (10uF), LED i algun tipus d'alimentació per a l'arduino. (Una bateria de 9 V està bé).
Pas 3: Esquemes
Aquí teniu els esquemes electrònics de la guitarra AIRduino.
Com podeu veure, és bastant fàcil d'entendre i, per tant, de construir.
Mireu la imatge si voleu una idea de quin component hi ha. Com és probable que ho entengueu, això no s’ha d’escalfar de cap manera. Els cables són molt més llargs del que es mostra en l'esquema.
Potser també us heu adonat que l’emissor del sensor ultra-sònic està en el pal i el receptor a la mà esquerra. Aquesta és la part complicada que he esmentat anteriorment: heu de desoldar l'emissor ultra-sònic de la unitat de sensor ultra-sònica per separar-la de la placa del sensor.
Més informació sobre això en passos posteriors. Ara anem a treballar!
Pas 4: Construint el guant
El guant conté un receptor ultra-sònic i quatre botons. Això és!
El receptor ultra-sònic es troba a la caixa negra visible en algunes de les imatges següents.
El guant té una àrea àmplia que està connectada a terra a la pissarra Arduino. Quan es prem un dit contra la palma es crea una connexió entre el teixit conductor al dit i el palmell.
A continuació es mostra la imatge de dos models de guants diferents. Un té dits desmuntables, que permeten als dos jugadors tenir mans molt petites i molt grans. L’altre model s’adapta a un guant estàndard. Recomanaria la segona versió, és més fàcil de construir i més fàcil de posar.
Pas 5: Codi
Aquí hi ha el codi Arduino necessari:
La part de generació de so en temps real es pren d’aquest gran tutorial.
------------------------------------------------------
// Una matriu que conté la forma d'ona
// d'un so de guitarra
forma d'ona 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};
// Utilitzem aquesta forma d’ona per canviar la
// volum de la sortida
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};
// Una matriu usada com a buffer per evitar
// distància puntual errònia
// mesures
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;
// Els valors de desbordament de 2 octaves
int freqüències = {39, 42, 44, 47,
50, 52, 56, 59, 63, 66, 70, 74, 79,
84, 89, 94, 100, 105, 112, 118, 126,
133, 141, 149};
// To inicial
int pitch = 160;
// Volum i acceleració inicial
// paràmetre
int lastAcc = 0;
volum de flotació = 0;
// reproducció d’àudio al pin 3
bypass speakerpin = 3;
// variable d’índex per a la seva posició
// forma d’ona
byte volàtil waveindex = 0
valor actual de volat de byte = 0;
// Pin usat per al sensor ultra-sònic
const int pingPin = 7;
// Pins per als potenciòmetres
const int sustainPin = 1;
const int sensitivityPin = 2;
// Pins per a cada dit de l'esquerra
// mà
const int finger1 = 9;
const int finger2 = 10;
const int finger3 = 11;
const int finger4 = 12;
int fingerValue = 0;
llarga durada, polzades, cm;
void setup () {
PINMode (3, OUTPUT); // Altaveu al pin 3
PINMode (finger1, INPUT);
PINMode (finger2, INPUT);
PINMode (finger3, INPUT);
PINMode (finger4, INPUT);
/**************************
Configuració d'àudio PWM
****************************/
// configureu el temporitzador2 en mode ràpid PWM
// (duplica la freqüència de PWM)
bitSet (TCCR2A, WGM21);
bitSet (TCCR2B, CS20);
BitClear (TCCR2B, CS21);
BitClear (TCCR2B, CS22);
// permeten les interrupcions ara que es registren
// s’han establert
sei ();
/*************************
Configuració de la interrupció del temporitzador 1.
*************************/
// inhabilita les interrupcions mentre es fa
// es configuren registres
cli ();
/ * Operació de port normal, pins desconnectats
a partir de l’operació del temporitzador (trencament de pwm) * /
BitClear (TCCR1A, COM1A1);
BitClear (TCCR1A, COM1A1);
BitClear (TCCR1A, COM1A1);
BitClear (TCCR1A, COM1A1);
/ * Mode 4, CTC amb TOP establert per registre
OCR1A. Ens permet establir el temps variable per a
l’interrupció escrivint nous valors a
OCR1A. * /
BitClear (TCCR1A, WGM10);
BitClear (TCCR1A, WGM11);
bitSet (TCCR1B, WGM12);
BitClear (TCCR1B, WGM13);
/ * configureu el prescaler del rellotge a / 8. * /
BitClear (TCCR1B, CS10);
bitSet (TCCR1B, CS11);
BitClear (TCCR1B, CS12);
/ * Desactiva la comparació de sortida de força per
Canals A i B. * /
BitClear (TCCR1C, FOC1A);
BitClear (TCCR1C, FOC1B);
/ * Inicialitza la comparació de la sortida
Registre A a 160 per configurar el valor
llançament inicial * /
OCR1A = 160;
// inhabilita la captura d’entrada
BitClear (TIMSK1, ICIE1);
// inhabilita la sortida
// Compareu B Match Interrupt
BitClear (TIMSK1, OCIE1B);
// habilita la sortida
// Compara una interrupció de partit
bitSet (TIMSK1, OCIE1A);
// inhabilita la interrupció de desbordament
BitClear (TIMSK1, TOIE1);
// permet activar les interrupcions ara mateix
// s’han establert registres
sei ();
}
// Gestor de desbordament de temporitzador
ISR (TIMER1_COMPA_vect) {
/ * timer1 ISR. Cada vegada que ho fa
es diu que estableix l’altaveu al
següent valor en forma d'ona . Freqüència
La modulació es fa canviant la
temporització entre trucades successives de
aquesta funció, p. ex. per a un to d'1 KHz
estableix la sincronització perquè funcioni
a través de la forma d’ona 1000 vegades
un segon. * /
// restablir waveindex si ha arribat
// el final de la matriu
if (waveindex> 102) {
waveindex = 0;
}
// Establiu el valor de sortida
si (volum> 0,03) {
analògic escriure (orador,
waveformVolume waveindex);
}
waveindex ++;
// Actualitzar el to
OCR1A = to;
}
bucle buit ()
{
// Desactiva les entrades, envieu un ping
// missatge i espera la resposta.
cli ();
PINMode (pingPin, OUTPUT);
digitalWrite (pingPin, LOW);
retardMicrosegons (2);
digitalWrite (pingPin, HIGH);
retardMicrosegons (5);
digitalWrite (pingPin, LOW);
duration = pulseIn (pingPin, HIGH, 2000);
sei ();
// converteix el temps en una distància
// en centímetres
// i emmagatzemar en buffer
distance_buffer distance_index ++
% distance_length = duration / 20;
// Cerca al buffer el més curt
// distància mesurada
cm = 16000;
per (int i = 0; i <distància_longura; i ++) {
cm = min (cm, distància_buffer i);
}
// Comproveu quins dits es premen
fingerValue = 5;
si (! digitalRead (finger4)) {
fingerValue = 4;
}
si (! digitalRead (finger3)) {
fingerValue = 3;
}
si (! digitalRead (finger2)) {
fingerValue = 2;
}
si (! digitalRead (finger1)) {
fingerValue = 1;
}
// Actualitza el manteniment i el
// valors de sensibilitat
float sustain =
mapa (analògicRead (sustainPin), 0,
1024, 101, 130) / 100.0;
int sensitivity =
mapa (analògic (sensibilitatPinada),
0, 1024, 100, 200);
// Actualitza el volum
volum = volum / sosteniment;
si (volum <0) {
volum = 0;
}
// Comproveu l’acceleròmetre
int acc = analogRead (0);
int accDiff = lastAcc - acc;
// Actualitzeu el valor del volum
si (accDiff> 5 * (200 - sensibilité)) {
volum + = (flotant)
pow (accDiff,
sensibilitat / 100.0) / 50000;
}
lastAcc = acc;
// Comproveu que el volum no sigui superior a 1
si (volum> .95) {
volum = .95;
}
// Actualitza el volum de la forma d'ona
per (int i = 0; i <= 102; i ++) {
waveformVolume i =
((forma d'ona i - 127) * volum) + 127;
}
// Establiu el to segons la distància
// entre les dues mans i el
// premsos dits
si (cm <102 && cm> 0) {
si (cm> 30) {
pitch = freqüències 7 +
(((cm - 30) / 24) * 4 + fingerValue - 1);
} else {
pitch = mapa (cm, 0, 30, 39, 79);
}
} else {
pitch = freqüències 7 +
(((102 - 30) / 24) * 4 + fingerValue - 1);
}
// Retard per evitar els senyals de rebot
retard (50);
}
------------------------------------------------------