Arduino akcelerometr s obvodem ADXL335 je kompletní modul, který umožňuje snímat pohyb v osách X, Y a Z. Obvod ADXL335 zajišťuje veškeré měření a nám pak stačí na analogovém výstupu pro každou osu měřit měnící se napětí a přepočíst jej na natočení ve stupních. Co se týká citlivosti obvodu, v tomto případě je nastavena výrobcem pevně na hodnotu ±3g. Mezi další vlastnosti tohoto akcelerometru patří nízká spotřeba, která je 350 µA, nebo napájecí napětí v rozmezí 1,8 až 3,6 V.
Pro úspěšné propojení akcelerometru ADXL335 s Arduino deskou stačí zapojit pět propojovacích pinů. Propojíme VCC s +3V3 Arduina, X-OUT s pinem A0, Y-OUT s pinem A1, Z-OUT s pinem A2 a GND se zemí Arduina. Pro OUT piny je možné využít také ostatní analogové piny, ale je nutné tuto volbu provést také v programu.
První ukázkový kód slouží pro zjištění minimálních a maximálních hodnot pro jednotlivé osy akcelerometru. Vzhledem k faktu, že každý obvod ADXL335 může udávat na svém výstupu odlišné údaje, je vhodné před dalším použitím zjistit spodní a horní hranice pro všechny osy právě pomocí tohoto kódu. Na začátku kódu se nachází nastavení propojovacích pinů a vytvoření proměnných pro ukládání naměřených výsledků pro minima a maxima společně s proměnnou pro přehlednější tisk údajů po sériové lince. Podprogram setup obsahuje nastavení komunikace po sériové lince. Nekonečná smyčka loop vždy na svém začátku načte údaje ze všech os a poté proběhne porovnání pro minima a maxima pro všechny osy. Pokud je nalezeno alespoň jedno nové minimum či maximum, je zároveň nastavena proměnná tisk na jedničku a díky tomu se pak na konci programu vypíší aktuální minima a maxima pro všechny osy. Na konci smyčky se pak nachází pouze pauza pro stabilizaci měření analogových hodnot.
// Zjištění minimálních a maximálních hodnot // pro akcelerometr ADXL335 // nastavení propojovacích pinů modulu #define pinX A0 #define pinY A1 #define pinZ A2 // vytvoření proměnných pro ukládání výsledků int minimumX=500; int maximumX=200; int minimumY=500; int maximumY=200; int minimumZ=500; int maximumZ=200; // pomocná proměnná pro přehlednější tisk int tisk = 0; void setup() { // komunikace přes sériovou linku rychlostí 9600 baud Serial.begin(9600); } void loop() { // načtení analogových hodnot pro osy x, y, z int osaX = analogRead(pinX); int osaY = analogRead(pinY); int osaZ = analogRead(pinZ); // porovnání aktuální měřené hodnoty s uloženou, // v případě nového maxima uložení do proměnné // a nastavení proměnné pro tisk if (osaX > maximumX) { maximumX = osaX; tisk = 1; } // porovnání aktuální měřené hodnoty s uloženou, // v případě nového minima uložení do proměnné // a nastavení proměnné pro tisk if (osaX < minimumX) { minimumX = osaX; tisk = 1; } // obdobně pro další osy if (osaY > maximumY) { maximumY = osaY; tisk = 1; } if (osaY < minimumY) { minimumY = osaY; tisk = 1; } if (osaZ > maximumZ) { maximumZ = osaZ; tisk = 1; } if (osaZ < minimumZ) { minimumZ = osaZ; tisk = 1; } // pokud bylo nalezeno alespoň jedno nové minimum // nebo maximum, vytiskneme údaje po sériové lince if (tisk == 1) { Serial.print("|| X: "); Serial.print(minimumX); Serial.print(" | "); Serial.print(maximumX); Serial.print(" || Y: "); Serial.print(minimumY); Serial.print(" | "); Serial.print(maximumY); Serial.print(" || Z: "); Serial.print(minimumZ); Serial.print(" | "); Serial.println(maximumZ); tisk = 0; } // pauza pro stabilizaci měřených výsledků delay(10); }
Po nahrání prvního programu do Arduino desky s připojeným akcelerometrem pak stačí vyzkoušet všechny krajní hodnoty, tedy otáčet s akcelerometrem ve všech osách do té doby, dokud dostáváme nová data. Pokud pak otáčíme s akcelerometrem, ale už nedostáváme nové výsledky, nalezli jsme minima a maxima našeho akcelerometru ADXL335 a tyto údaje pak použijeme v druhém programu. Zde je uvedena ukázka výpisu:
|| X: 346 | 347 || Y: 346 | 347 || Z: 419 | 420 || X: 347 | 347 || Y: 347 | 347 || Z: 419 | 419 || X: 347 | 347 || Y: 347 | 347 || Z: 419 | 430 ... || X: 251 | 448 || Y: 246 | 435 || Z: 283 | 435 || X: 214 | 448 || Y: 234 | 450 || Z: 268 | 489
Druhý ukázkový kód už obsahuje funkce pro vytištění reálných hodnot os X, Y a Z. Na jeho začátku se opět nachází nastavení propojovacích pinů a vytvoření proměnných s hodnotami, které jsme naměřili pomocí prvního programu. Podprogram setup obsahuje pouze nastavení komunikace po sériové lince. Nekonečná smyčka loop v tomto případě obsahuje na začátku vytvoření proměnných pro uložení souřadnic všech os a dále for smyčku s 10 běhy, která vykoná následující kód. Na začátku smyčky načteme do proměnných analogové hodnoty všech os a tyto poté nejprve přepočteme na hodnotu úhlu v radiánech a následně pomocí funkce atan2 na úhly ve stupních. Po přepočtu ještě následuje pauza 50 milisekund, díky které jedno měření (10 opakování) trvá celkem půl vteřiny. Po desátém běhu for smyčky pak už jen naměřené hodnoty pro jednotlivé osy vydělíme deseti, aby jsme dostali průměr z provedených 10 měření a vytiskneme tyto informace po sériové lince.
// Akcelerometr ADXL335 // nastavení propojovacích pinů modulu #define pinX A0 #define pinY A1 #define pinZ A2 // minimální a maximální hodnoty pro všechny osy // z prvního programu int minHodnotaX = 214; int maxHodnotaX = 448; int minHodnotaY = 234; int maxHodnotaY = 450; int minHodnotaZ = 268; int maxHodnotaZ = 489; void setup() { // komunikace přes sériovou linku rychlostí 9600 baud Serial.begin(9600); } void loop() { // proměnné pro uložení souřadnic všech os double x; double y; double z; // for smyčka pro zprůměrování 10 měření for (int i=0;i<10;i++) { // načtení analogových hodnot pro osy x, y, z int nactiX = analogRead(pinX); int nactiY = analogRead(pinY); int nactiZ = analogRead(pinZ); // přepočet naměřených hodnot na úhel v radiánech // s využitím zjištěných minimálních a maximálních hodnot int uhelX = map(nactiX, minHodnotaX, maxHodnotaX, -90, 90); int uhelY = map(nactiY, minHodnotaY, maxHodnotaY, -90, 90); int uhelZ = map(nactiZ, minHodnotaZ, maxHodnotaZ, -90, 90); // přepočet úhlů v radiánech na stupně a uložení do proměnných x += RAD_TO_DEG * (atan2(-uhelY, -uhelZ) + PI); y += RAD_TO_DEG * (atan2(-uhelX, -uhelZ) + PI); z += RAD_TO_DEG * (atan2(-uhelY, -uhelX) + PI); // pauza pro stabilizaci měřených výsledků delay(50); } // vydělení naměřených výsledků 10 (for smyčka od 0 do 9) x = x/10; y = y/10; z = z/10; // vytištění informací o souřadnicích po sériové lince Serial.print("Souradnice x: "); Serial.print(x); Serial.print(" | y: "); Serial.print(y); Serial.print(" | z: "); Serial.println(z); }
Po nahrání druhého programu do Arduino desky dostaneme například tento výpis:
Souradnice x: 3.53 | y: 20.48 | z: 9.39 Souradnice x: 4.90 | y: 21.15 | z: 11.90 Souradnice x: 73.89 | y: 19.91 | z: 77.12 Souradnice x: 314.57 | y: 32.75 | z: 302.50 Souradnice x: 282.06 | y: 56.03 | z: 287.27
Arduino akcelerometr ADXL335 je šikovný měřící modul, který lze jednoduše zapojit a přímo měřit jeho výstupy. Lze ho tedy vhodně využít v projektech, kde potřebujeme vědět o úhlu natočení různých zařízení či jejich pohybu obecně. Velkou výhodou je také jeho nízká cena či velikost modulu.
Seznam použitých komponent:
http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
http://dratek.cz/arduino/1260-akcelerometr-adxl335-3-osy-analogovy-vystup-1459970843.html