Dragspel Master - en python/arduino musik synt (2 / 3 steg)
Steg 2: Konfigurera Arduino
Gränssnitt med accelerometern
Anslut accelerometern till arduino styrelsen. Om du använder ADXL335 ansluta stift märkt ST på analoga pin 0, Z till analoga stift 1, Y till analoga stift 2, X till analoga stift 3, GND till analog pinne 4 och VCC till analoga stift 5. Om du går vilse i någon plats, bara hänvisa till den
datablad. Datablad tenderar alltid att den täta sidan, men de är värda en nära scan.
Pin-ST är irrelevant för vårt projekt, X-Y-Z stiften utgång rådata, GND PIN-koden är marken (logiska låg eller 0 volt), VCC är nätaggregatet för accelerometern (logiska hög). Följande kod ställer detta in i arduino.
Definiera variabler används för att bearbeta raw accelerometer värden
int x, y, z, mag;
int xPrev, yPrev, zPrev;
Konstant för lågpassfilter
CONST double k = 0.8f;
Definiera stift för ADXL335
CONST int xPin = 1;
CONST int yPin = 2;
CONST int zPin = 3;
CONST int vcc = A5;
CONST int gnd = A4;
void setup() {
Standard överföringshastigheten
Serial.BEGIN(9600);
pinMode (vcc, produktionen);
digitalWrite (vcc, hög);
pinMode (gnd, produktionen);
digitalWrite (gnd, låg);
Initiera variabler
x = 0;
y = 0;
z = 0;
xPrev = 0;
yPrev = 0;
zPrev = 0;
}
Vi använder sedan funktionen analogRead(pin) , där "pin" är någon av 3 stift dvs xPin, yPin eller zPin definieras ovan för att läsa ett värde mellan 0-1024 som lär oss värdet av acceleration som läses.
Så låt oss börja läsa dessa värden!
Filtrering
Detta är egentligen ganska knepigt eftersom behandlingen acceleration från en (relativt) billig del av maskinvaran som ADXL335 är problematiskt. Typ av signal som du kommer att få från accelerometern kommer att vara fullspäckad med signal brus. Detta innebär att nya accelerometer värden är inte att lita, och så vi använder ett filter. I detta fall använder vi en Low Pass Filter
. Vi vill endast tillåta lågfrekventa signaler kan passera genom, värden som inte skiljer sig alltför mycket från tidigare behandlingarna. Obs: även med komplicerade filtrering, felmarginalen från en billig accelerationsmätare kommer att vara hög, så att integrera över tiden för att få hastighet och position från accelerometern kommer att förvärra felet - värdena vi får kommer inte vara exakt alls. Det finns också överväganden för drift bias kan göras, men för det är utanför omfånget för denna tutorial. Att göra känsla av bullriga data är ett fält till en egen! Så låt oss hålla det enkelt för nu.
Vi lägger detta till våra program loop():
void loop() {
Applicera en Low Pass Filter på den råa signalen
x = k * xPrev + (1-k)*(analogRead(xPin) - xAvg);
y = k * yPrev + (1-k)*(analogRead(yPin) - yAvg);
z = k * zPrev + (1-k)*(analogRead(zPin) - zAvg);
Beräkna omfattningen av kraften för detta särskilda genomförande
mag = (int) sqrt (x * x + y * y + z * z);
Uppdatera värden för nästa iteration
xPrev = x;
yPrev = y;
zPrev = z;
}
Vi definierade "k" ovanför setup(). Detta är en filtrering konstant. Känn dig fri att justera denna konstant men bo inom intervallet 0,5 < k < 1. Högre värden innebär vi lita nya värden ännu mindre, och så att de har mindre effekt på vår nästa iteration, detta är vad vi vill. Du kan också märka xAvg, yAvg och zAvg. Detta är från en kalibrera funktion, så låt oss diskutera detta nu.
Utan någon form av kalibrering kommer accelerometern vanligtvis spotta ut värden från mitt urval av 0-1024. Detta är inte till stor hjälp för oss eftersom vi vill den relativa ändringen i acceleration från vissa referenspunkt, den accelerometer startpositionen. Varje gång arduino startar upp, vi kör funktionen calibrate(). Det är absolut nödvändigt att arduino styrelsen vara ensam under tiden, alla trängdes av accelerometern kommer upprörd riktigheten av kalibrering.
Lägg till detta till slutet av arduino koden:
Funktion för att åter noll acceleremeter, fynd genomsnitt
void calibrate() {
int i;
xAvg = 0;
yAvg = 0;
zAvg = 0;
för (jag = 0; jag < calCount; i ++) {
Läste i den orena rådata sset
xAvg += analogRead(xPin);
yAvg += analogRead(yPin);
zAvg += analogRead(zPin);
}
Få genomsnittligt
xAvg = xAvg / calCount;
yAvg = yAvg / calCount;
zAvg = zAvg / calCount;
Delay(100);
}
I slutet av dagen är kalibreringen egentligen bara en enkel genomsnitt vi hamnar subtraheras från våra raw värderingar. Ingen fanciness här.
Strömmande rå Data tolkas
Slutföra koden: https://github.com/aehernandez/Accordion-Master/bl...