Accelerométer


Ebben a cikkben az ADXL335 típusú, 3-tengelyes MEMS gyorsulásmérő modullal fogunk kapcsolást készíteni. A gyorsulásmérőnk alacsony fogyasztású, 3,3V-os az Arduinohoz jól illeszthető, analóg kimenettel ellátott modul.

Az ADXL335 +/- 3G-t mér X, Y és Z tengelyen. Főleg nagy felbontású statikus gyorsulások
mérésére alkalmas. Használható tilt, ütés vagy rázkódás érzékelőként.

Az ADXL326 +/- 16G mérhető vele mind a három tengelyen. Dinamikus gyorsulások
mérésére nagy teljesítményű szárazföldi és légi járműveknél, valamint ütközés érzékelőként.

Az ADXL377 +/- 200G X, Y, Z tengelyen. Extrém dinamikus gyorsítások mérésére alkalmas,
pl.: rakéta kísérleteknél, nagy erejű ütközéseknél alkalmazzák.

Az accelerometereknél az erőhatásnak megfelelő feszültség érték jelenik meg az analóg
kimeneteken. A 0G-nél középértéken van a kimenet feszültség szintje ez 1.65V, max pozitiv
gyorsulásnál max feszültség érték ez 3.3V, max negatív gyorsulásnál min feszültség
érték 0V-ot mérhetünk.
Persze a gyártás során eltérések lehetnek ezért lehetséges szélesebb tartomány mérése vagy
éppen a nullapont eltolódása. Ezeket mindig szoftveres kalibrálással kompenzáljuk.

Először is készítsük elő a gyorsulásmérőnket, forraszunk rá egy 7 kivezetéses tüskesort
hogy illeszteni tudjuk a próbapanelünkhöz. Aztán jöhet a vezetékelés:

Gnd – Gnd-hez
VIN – 5V arduino
Xout – A0 analóg input
Yout – A1 analóg input
Zout – A2 analóg input
3Vo – Aref arduino (referencia feszültség beállítására)



Kalibrálásról néhány szót:
A pontos méréseket igénylő felhasználás eseten muszáj a gyorsulásmérőnket pontosan
kalibrálnunk, ehhez kézenfekvően a gravitációs erőt használhatjuk ami aránylag stabilan adja
a megfelelő értéket. Mind a három tengelyen külön külön el kell végezni a kalibrálást.
Építsük meg a kalibráló kapcsolást:


Indítsuk el a sketchet:
Nyissuk ki a soros monitort , fektessük a próbapanelt az érzékelővel sík felületre, majd
tartsuk lenyomva a gombot mindaddig míg meg nem jelenik a „Calibrate” felírat a soros
monitoron, ez kalibrálja a legkisebb értéket a Z tengelyen. Állítsuk a próbapanelt az érzékelővel
az első élére és nyomjuk meg a gombot, ez lesz az Y tengely max. értéke, a szemközti élére
állítva az Y tengely min. értékét kapjuk. A másik két él az X tengely min. illetve max. értéke.
A próbapanelt fejtetőre fordítva kapjuk a Z tengely max. értékét.


Miután kalibráltunk megkapjuk a nyers tengelyekhez tartozó min-max analóg értéket 1G-n,
ezeket átlagolva kapjuk meg a tengelyekhez tartozó null pontot.


const int xInput = A0;
const int yInput = A1;
const int zInput = A2;
const int buttonPin = 2;

// középérték beállítása mind a három tengelyen(512)
int xRawMin = 512;
int xRawMax = 512;

int yRawMin = 512;
int yRawMax = 512;

int zRawMin = 512;
int zRawMax = 512;

// több minta vételezése a zaj kiszürése véget
const int sampleSize = 10;

void setup()
{
analogReference(EXTERNAL);
Serial.begin(9600);
}

void loop()
{
int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);

if (digitalRead(buttonPin) == LOW)//ha nincs lenyomva a nyomógomb akkor autókalibrálás
{
AutoCalibrate(xRaw, yRaw, zRaw);
}
else
{
Serial.print("Raw Ranges: X: ");
Serial.print(xRawMin);
Serial.print("-");
Serial.print(xRawMax);

Serial.print(", Y: ");
Serial.print(yRawMin);
Serial.print("-");
Serial.print(yRawMax);

Serial.print(", Z: ");
Serial.print(zRawMin);
Serial.print("-");
Serial.print(zRawMax);
Serial.println();
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);

// átkonvertálja az értékeket milli G-re
long xScaled = map(xRaw, xRawMin, xRawMax, -1000, 1000);
long yScaled = map(yRaw, yRawMin, yRawMax, -1000, 1000);
long zScaled = map(zRaw, zRawMin, zRawMax, -1000, 1000);

// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;

Serial.print(" :: ");
Serial.print(xAccel);
Serial.print("G, ");
Serial.print(yAccel);
Serial.print("G, ");
Serial.print(zAccel);
Serial.println("G");

delay(500);
}
}

//
// beolvassa a mintákat és átlagolja azokat
//
int ReadAxis(int axisPin)
{
long reading = 0;
analogRead(axisPin);
delay(1);
for (int i = 0; i < sampleSize; i++)
{
reading += analogRead(axisPin);
}
return reading/sampleSize;
}

//
// olvassa be a szélső értékeket minden tengelyen
//
void AutoCalibrate(int xRaw, int yRaw, int zRaw)//autocalibráte függvény
{
Serial.println("Calibrate");
if (xRaw < xRawMin)
{
xRawMin = xRaw;
}
if (xRaw > xRawMax)
{
xRawMax = xRaw;
}

if (yRaw < yRawMin)
{
yRawMin = yRaw;
}
if (yRaw > yRawMax)
{
yRawMax = yRaw;
}

if (zRaw < zRawMin)
{
zRawMin = zRaw;
}
if (zRaw > zRawMax)
{
zRawMax = zRaw;
}
}

A projekt  Bill Earl munkája és a következő oldalon megtalálható:  https://learn.adafruit.com/adafruit-analog-accelerometer-breakouts?view=all

Ennyit a kalibrálásról, a további felhasználáshoz sok sikert.