Stap 2: Instellen van de Arduino
Interface met de versnellingsmeter
De versnellingsmeter verbinden met de arduino board. Als u van de ADXL335 gebruikmaakt verbinden de pin label ST op analoge pin 0, Z naar analoge pin 1, Y aan analoge pin 2 X analoge pin 3, GND aan analoge pin 4 en VCC naar analoge pin 5. Als je in elke plaats verdwalen, enkel verwijzen naar de
gegevensbladen. Gegevensbladen altijd de neiging naar de dichte kant, maar ze zijn de moeite waard een nauwe scan.
De pin-ST is niet relevant voor ons project, de X-Y-Z-pinnen uitvoer van de ruwe gegevens, de GND pin is de grond (logische laag of 0 volt), de VCC is de voeding voor de versnellingsmeter (logische hoog). De volgende code stelt dit in de arduino.
// Define variables to be used to process raw accelerometer values int x, y, z, mag; int xPrev, yPrev, zPrev; // Constant for Low Pass filter const double k = 0.8f; // Define pins for ADXL335 const int xPin = 1; const int yPin = 2; const int zPin = 3; const int vcc = A5; const int gnd = A4; void setup() { //Default baud rate Serial.begin(9600); pinMode(vcc, OUTPUT); digitalWrite(vcc, HIGH); pinMode(gnd, OUTPUT); digitalWrite(gnd, LOW); // Initialize variables x = 0; y = 0; z = 0; xPrev = 0; yPrev = 0; zPrev = 0; }
We gebruiken dan de analogRead(pin) -functie, waar 'pin' is een van de 3 pins d.w.z. xPin, yPin of zPin hierboven omschreven om te lezen een waarde tussen 0-1024 die vertelt ons de waarde van de versnelling wordt gelezen.
Dus laten we beginnen met het lezen van deze waarden!
Filteren
Dit is intrinsiek vrij lastig sinds het lezen van acceleratie uit een (relatief) goedkoop stuk van hardware zoals de ADXL335 problematisch is. Het soort signaal die you gonna krijgen van de versnellingsmeter is gonna worden doorzeefd met signaal ruis. Dit betekent dat nieuwe versnellingsmeter waarden zijn niet te vertrouwen, en zo we een filter gebruiken. In dit geval gebruiken we een Low Pass Filter
. Wij willen alleen laten laagfrequente signalen passeren, waarden die niet al te veel van voorgaande lezingen verschilt. Opmerking: zelfs met ingewikkelde filtering, de foutenmarge van een goedkope versnellingsmeter is gonna be hoog, dus na verloop van tijd te verkrijgen van snelheid en/of positie van de versnellingsmeter te integreren is gonna samengestelde deze fout - de waarden die we krijgen niet helemaal nauwkeurig zijn. Er zijn ook overwegingen voor drift vooringenomenheid kan worden gemaakt, maar dat is buiten het bereik van deze tutorial. Het maken van gevoel van luidruchtige gegevens is een veld tot eigen! Dus laten we houden het simpel voor nu.
We voegen dit in de loop van ons programma:
void loop() { // Apply a Low Pass Filter on the raw signal x = k*xPrev + (1-k)*(analogRead(xPin) - xAvg); y = k*yPrev + (1-k)*(analogRead(yPin) - yAvg); z = k*zPrev + (1-k)*(analogRead(zPin) - zAvg); // Calculate the magnitude of the force for this particular implementation mag = (int) sqrt(x*x + y*y + z*z); // Update values for next iteration xPrev = x; yPrev = y; zPrev = z; }
We gedefinieerd 'k' boven Setup. Dit is een filter-constante. Voel je vrij om deze constante tweak, maar blijf binnen het bereik 0,5 < k < 1. Hogere waarden betekent wij nieuwe waarden nog minder, en dus ze minder invloed op onze volgende iteratie hebben, dit is wat we willen. Mogelijk merkt u ook xAvg, yAvg en zAvg. Dit is van een functie kalibreren, dus laten we bespreken dat nu.
Zonder enige vorm van kalibratie zal de versnellingsmeter meestal waarden uit het middelste bereik van 0-1024 spugen. Dit is niet erg nuttig voor ons, omdat we de relatieve verandering in de versnelling van een referentiepunt, de startpositie van de versnellingsmeter willen. Everytime die de arduino opstart, lopen we de functie calibrate(). Het is absoluut noodzakelijk dat de arduino board worden gedurende de tijd rust gelaten, gedrang van de versnellingsmeter zal verstoren de nauwkeurigheid van de kalibratie.
Voeg dit toe aan het einde van de arduino-code:
// Function to re-zero the acceleremeter, finds an average void calibrate() { int i; xAvg = 0; yAvg = 0; zAvg = 0; for(i = 0; i < calCount; i++) { // Read in the raw unclean data sset xAvg += analogRead(xPin); yAvg += analogRead(yPin); zAvg += analogRead(zPin); } // Get the average xAvg = xAvg / calCount; yAvg = yAvg / calCount; zAvg = zAvg / calCount; delay(100); }
Aan het eind van de dag is de kalibratie eigenlijk gewoon een eenvoudig gemiddelde die we uiteindelijk af te trekken van onze raw waarden. Geen fanciness hier.
Streaming van ruwe Data moeten worden ontleed
Voltooien van code: https://github.com/aehernandez/Accordion-Master/bl...