Circuits

Com construir una guitarra aèria amb Arduino, Aka la guitarra AIRduino: 5 passos

Como HACER una GUITARRA ACÚSTICA paso a paso vídeo 1

Como HACER una GUITARRA ACÚSTICA paso a paso vídeo 1

Taula de continguts:

Anonim

  • 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 ChalmersUniversitat (Suècia) per a una classe de computació física.

    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);
    }
    ------------------------------------------------------