Stap 2: Het schema / de Code
------------------------------------------------------
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);
}
------------------------------------------------------