Hoe het bouwen van een Air Guitar met Arduino, aka de AIRduino gitaar (5 / 5 stap)

Stap 5: Code

Hier is de code van de Arduino vereist:

De real-time geluid generatie deel is ontleend aan deze geweldige tutorial.

------------------------------------------------------
Een array met daarin de golfvorm
van het geluid van een gitaar
char golfvorm [] =
{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};

We gebruiken deze golfvorm te veranderen de
volume van de uitvoer
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};
Een array gebruikt als een buffer te vermijden
foutieve stipte afstand
metingen
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;

De waarden van de overloop voor 2 octaven
int frequenties [] = {39, 42, 44, 47,
50, 52, 56, 59, 63, 66, 70, 74, 79,
84, 89, 94, 100, 105, 112, 118, 126,
133, 141, 149};

Eerste pitch
int toonhoogte = 160;

Oorspronkelijke volume en versnelling
met de parameter
int lastAcc = 0;
zweven volume = 0;

afspelen van de audio op pin 3
byte speakerpin = 3;

index variabele voor positie in
golfvorm
vluchtige byte waveindex = 0
vluchtige byte currentvalue = 0;

PIN gebruikt voor ultra sonic sensor
Const int pingPin = 7;

Pinnen voor de potentiometers
Const int sustainPin = 1;
Const int sensitivityPin = 2;

Pinnen voor elke vinger van links
hand
Const int finger1 = 9;
Const int finger2 = 10;
Const int finger3 = 11;
Const int finger4 = 12;

int fingerValue = 0;

lange duur, inch, cm;

VOID Setup {}

pinMode(3,OUTPUT); Spreker op pin 3

pinMode(finger1,INPUT);
pinMode(finger2,INPUT);
pinMode(finger3,INPUT);
pinMode(finger4,INPUT);

/**************************
PWM audioconfiguratie
****************************/
Timer2 ingesteld op fast PWM-modus
(dubbel PWM frequentie)
bitSet (TCCR2A, WGM21);
bitSet (TCCR2B, CS20);
bitClear (TCCR2B, CS21);
bitClear (TCCR2B, CS22);

inschakelen interrupts nu die registreert
zijn ingesteld
Sei();

/*************************
Timer 1 interrupt configuratie
*************************/
uitschakelen onderbreekt tijdens het
registers zijn geconfigureerd
cli();

/ * Normale poort operatie, pinnen verbroken
van timer-operatie (breken pwm) * /
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);

/ * Mode 4, CTC met TOP ingesteld door registreren
OCR1A. Laat ons toe om de variabele timing voor instellen
de interrupt door het schrijven van nieuwe waarden te
OCR1A. */
bitClear (TCCR1A, WGM10);
bitClear (TCCR1A, WGM11);
bitSet (TCCR1B, WGM12);
bitClear (TCCR1B, WGM13);

/ * de klok prescaler ingesteld op /8.  */
bitClear (TCCR1B, CS10);
bitSet (TCCR1B, CS11);
bitClear (TCCR1B, CS12);

/ * Force Output vergelijken voor uitschakelen
Kanalen A en B. * /
bitClear (TCCR1C, FOC1A);
bitClear (TCCR1C, FOC1B);

/ * Initialiseert Output vergelijken
Registreren van A op 160 te stellen de
eerste worp * /
OCR1A = 160;

input capture onderbreken uitschakelen
bitClear (TIMSK1, ICIE1);
uitschakelen van de Output
Vergelijk B Match Interrupt
bitClear (TIMSK1, OCIE1B);
Uitvoer inschakelen
Vergelijk een Match-Interrupt
bitSet (TIMSK1, OCIE1A);
uitschakelen Overflow Interrupt
bitClear (TIMSK1, TOIE1);

inschakelen onderbreekt nu dat
registers zijn ingesteld
Sei();
}

Timer overloop handler
ISR(TIMER1_COMPA_vect) {}

/ * timer1 ISR.  Elke keer als het
heet het speakerpin wordt ingesteld op de
eerstvolgende waarde in golfvorm []. Frequentie
modulatie wordt gedaan door het veranderen van de
timing tussen opeenvolgende oproepen van
deze functie, bijvoorbeeld een Toon van 1KHz,
de timing instellen zodat deze wordt uitgevoerd
via golfvorm [] 1000 keer
een tweede. */

waveindex's resetten indien ze het heeft bereikt
het einde van de array

Als (waveindex > 102) {}
waveindex = 0;
}

Stel de waarde van de uitvoer
Als (volume > 0,03) {}
analogWrite (speakerpin,
waveformVolume[waveindex]);
}
waveindex ++;

Bijwerken van de toonhoogte
OCR1A = toonhoogte;
}

void loop
{
Deactiveer interputs, sturen een ping
bericht en wachten op het antwoord.
cli();
pinMode (pingPin, OUTPUT);
digitalWrite (pingPin, laag);
delayMicroseconds(2);
digitalWrite (pingPin, hoge);
delayMicroseconds(5);
digitalWrite (pingPin, laag);
duur = pulseIn (pingPin, hoog, 2000);
Sei();
de tijd omzetten in een afstand
in centimeter
en in buffer opslaan
distance_buffer [distance_index ++
% distance_length] = duur / 20;

In de buffer de kortste zoeken
afstand gemeten
cm = 16000;
for (int i = 0; ik < distance_length; i ++) {}
cm = min (cm, distance_buffer[i]);
}

Controleren welke vingers worden ingedrukt
fingerValue = 5;
if(!digitalRead(finger4)) {}
fingerValue = 4;
}
if(!digitalRead(finger3)) {}
fingerValue = 3;
}
if(!digitalRead(finger2)) {}
fingerValue = 2;
}
if(!digitalRead(finger1)) {}
fingerValue = 1;
}

Update de sustain en
gevoeligheid waarden
float ondersteunen =
map(analogRead(sustainPin), 0,
1024, 101, 130) / 100.0;
int gevoeligheid =
map(analogRead(sensitivityPin),
0, 1024, 100, 200);

Update van het volume
volume = volume / ondersteunen;
Als (volume < 0) {}
volume = 0;
}

De versnellingsmeter controleren
int acc = analogRead(0);
int accDiff = lastAcc - acc;

De volume-waarde bijwerken
Als (accDiff > 5 * (200 - gevoeligheid)) {}
volume += (float)
Pow (accDiff,
gevoeligheid / 100.0) / 50000;
}
lastAcc = acc;

Controleer of volume niet hoger dan 1
Als (volume >.95) {}
volume =. 95;
}

Update het volume in de golfvorm
for (int i = 0; ik < = 102; i ++) {}
waveformVolume [i] =
((golfvorm [i] - 127) * volume) + 127;
}

De toonhoogte instellen volgens de afstand
tussen de twee handen en de
vingers gedrukt
Als (cm < 102 & & cm > 0) {}
Als (cm > 30) {}
toonhoogte = frequenties [7 +
(((cm-30) / 24) * 4 + fingerValue - 1)];
} else {}
toonhoogte = kaart (cm, 0, 30, 39, 79);
}
} else {}
toonhoogte = frequenties [7 +
(((102-30)/24) * 4 + fingerValue - 1)];
}

Vertraging om te voorkomen stuiteren signalen
delay(50);
}

------------------------------------------------------

Gerelateerde Artikelen

Hoe het bouwen van een trein tafel met gat in Midden - eindigde in uren

Hoe het bouwen van een trein tafel met gat in Midden - eindigde in uren

dit is een trein tafel plan gemaakt voor al die enthousiaste trein-dirigenten in opleiding! Het is eenvoudig om te bouwen, neemt slechts een paar uur (plus verf drogen) en kost ongeveer $30 USD te bouwen.De oude kleuterschool van mijn zoon had een cu
Hoe het bouwen van een eenvoudige website met WordPress

Hoe het bouwen van een eenvoudige website met WordPress

In 2014, het bouwen van een eenvoudige website hoeft niet een codering vaardigheden of savvy computerkennis. Ja, terug in de dagen van mensen gebruikt om hand-code websites met HTML, CSS en zelfs Flash, maar tegenwoordig de website creatieproces is v
Hoe het bouwen van een pompoen-RACER met twee parallelle onafhankelijke assen

Hoe het bouwen van een pompoen-RACER met twee parallelle onafhankelijke assen

hier is een leuk ding om te doen deze Halloween, pompoen Racing. Voor onze race is het gebruik van een solide basis met daarop aangebracht wielen illegaal. Geen skateboards. Geen rollerskates. Geen Tonka vrachtwagens. De pompoen zelf moet de steun va
Hoe het bouwen van een Rainbow Loom met behulp van K'NEX

Hoe het bouwen van een Rainbow Loom met behulp van K'NEX

Mijn zusje houdt van haar Rainbow Loom, en het maken van armbanden en spullen op haar weefgetouw. Ze heeft een doos vol met gekleurde banden. Ik keek naar haar loom en het ziet er vrij eenvoudig, dus heb ik besloten om mijn eigen loom uit K'NEX stukk
Hoe het bouwen van een Robotic Hand met haptische Feedback

Hoe het bouwen van een Robotic Hand met haptische Feedback

voor wetenschap fair dit jaar, ik voelde me zoals het bouwen van iets in plaats van het doen van een experiment. Alles wat ik moest doen was Instructables rondkijken voor een idee van het project. Ik was geïnspireerd door njkl44 van robotic hand aang
Hoe het bouwen van een stijve spanningsbron met behulp van een volgeling van de emitter

Hoe het bouwen van een stijve spanningsbron met behulp van een volgeling van de emitter

dit instructable leert u hoe een grote spanningsbron met behulp van een paar weerstanden, een spanningsbron, en een transistor te maken. Alleen een minimale kennis van elektronica is vereist!Stap 1: motivatie In eenvoudige termen, kunnen we denken aa
Hoe het bouwen van een Awesome stoep met gerecycled hout voor slechts $50.00

Hoe het bouwen van een Awesome stoep met gerecycled hout voor slechts $50.00

Na het lezen van die titel u vraagt zich misschien af, waarom zou iemand maken een trottoir van hout? Nou, zijn er een paar zeer goede redenen om dat te doen.Een beetje geschiedenisMeer dan 25 jaar geleden mijn houten trottoir begon als een experimen
Hoe het bouwen van een UPS Truck met behulp van LEGO

Hoe het bouwen van een UPS Truck met behulp van LEGO

Ik ben dol op alle soorten auto's en vrachtwagens met LEGO bouwen. Dit is een leuke en gemakkelijke LEGO UPS Truck te bouwen. U moet een totaal van 39 LEGO stukjes (zie afbeelding hierboven). Het heeft een speciaal compartiment te voeren pakketten. D
Hoe het bouwen van een tuin Trellis met zitbank

Hoe het bouwen van een tuin Trellis met zitbank

wat maakt uw achtertuin speciaal? Als je geluk hebt, hebt u al een weelderig grasveld en een paar goed geplaatste struiken en bomen - en de tuin wordt elk jaar beter. Echter, als je echt voegen een aanraking van luxe en onderscheid aan uw achtertuin
Hoe het bouwen van een Aeroponics systeem met behulp van een Rubbermaid Tote

Hoe het bouwen van een Aeroponics systeem met behulp van een Rubbermaid Tote

In deze video zal ik laten zien u een doe-het-zelf areoponics systeem. Dit is een langere video maar het zal Toon die stap hoe maak je je eigen aeroponics systeem. Alle onderdelen zijn goedkoop en gemakkelijk te vinden op uw lokale home depot of Cana
PT. 1 hoe het bouwen van een wiel van de pottenbakkers met een loopband motor!

PT. 1 hoe het bouwen van een wiel van de pottenbakkers met een loopband motor!

Deze tutorial is pt 1.  de snelle versie van hoe het bouwen van een pottenbakkers wiel met behulp van onderdelen uit de stapel van schroot en delen van een loopband van $10.  Ik heb gezocht hoog en laag op het web naar informatie over dit onderwerp,
Hoe het bouwen van een goedkope werkbank voor houtbewerking met behulp van een mal van Kreg HD, met VIDEO tutorial

Hoe het bouwen van een goedkope werkbank voor houtbewerking met behulp van een mal van Kreg HD, met VIDEO tutorial

Gratis plannen zijn ook hierna beschikbaar in Imperial en Metric.Stap 1: Zie volledige Video Tutorial Video hier.Warren uit één hout Tools toont hoe het bouwen van een goedkope en makkelijke eiland houtbewerking werkbank met hond gaatjes, gewrichten
Hoe het bouwen van een eenvoudige water raket

Hoe het bouwen van een eenvoudige water raket

Welkom bij dit instructable!Voor een schoolproject of gewoon voor de lol, is bouwen en lanceren van uw eigen water rocket een uitdagende maar geweldige ervaring. In deze tutorial laten we u hoe te beginnen en hoe te bouwen van je eigen, eenvoudige wa
Scout Project: Hoe het bouwen van een Trebuchet

Scout Project: Hoe het bouwen van een Trebuchet

dus voor welke reden dan ook, de voorpagina van mijn Instructable is leeg... na mij schrijven (in mijn mening) een vrij koele opening... Damnation! Nou... laten we proberen dit weer hè?Nou... Welkom bij de tweede aflevering van mijn Scout projecten..