Chcesz, aby Twój robot reagował na nagłe zmiany kierunku ruchu, wstrząsy i wychylenia od pionu? Przeraża Cię obsługa akcelerometrów opisywana w języku C? Zrób to w BASCOM-AVR! Zobacz, jakie to proste.

Spadek cen akcelerometrów wykonanych w technologii MEMS w ciągu ostatnich czterech lat sprawił, że mamy dziś z nimi do czynienia niemal na każdym kroku. Zaczęto je powszechnie stosować w wielu urządzeniach korzystających z detekcji i pomiaru ruchu, zmiany położenia lub wibracji. Najbardziej oczywiste dziedziny zastosowań to motoryzacja, fotografia (stabilizacja obrazu, wyświetlanie zdjęcia w orientacji zależnej od położenia urządzenia), kontrolery gier (Sony Playstation 3, Wii…), telefonia komórkowa oraz – ostatnimi czasy – także robotyka.

Układ LIS35DE to trójosiowy akcelerometr typu MEMS, produkowany przez firmę STMicroelectronics. Pozwala wykryć drgania oraz określić nachylenie urządzenia względem pola grawitacyjnego Ziemi. Do komunikacji z innymi układami wykorzystuje dwa interfejsy – SPI i I2C. Posiada obudowę typu (T)LGA-14 – kłopotliwą w montażu przy użyciu lutownic „kolbowych”. Na szczęście w sprzedaży pojawił się moduł KAmodMEMS2 dystrybuowany przez firmę Kamami.

Wymiary modułu akcelerometru kamodmems2 z układem LIS35DE, wyprowadzone złącza SPI i I2C

Wymiary modułu akcelerometru kamodmems2 z układem LIS35DE, wyprowadzone złącza SPI i I2C

Najważniejsze cechy:

  • napięcie zasilania 2.16V – 3.6V
  • pobór mocy <1mW
  • cyfrowy interfejs SPI/I2C
  • programowalne generatory przerwań
  • wykrywanie pojedynczego i podwójnego „kliknięcia”
  • wbudowany filtr górnoprzepustowy
  • odporność na wstrząsy 10000g

O ile obsługa tego typu urządzeń przy pomocy języka C jest wspierana przez wiele źródeł, o tyle użytkownicy języka Bascom mogą mieć problem z implementacją gotowych bibliotek oferowanych np. przez Kamami. Z tego powodu przygotowałem zestaw kodów źródłowych kompilujących się w środowisku BASCOM-AVR. Zostały one napisane i skomentowane tak, żeby ułatwić implementację potrzebnych rozwiązań we własnych programach. Skorzystałem z podstawowych funkcji układu LIS35DE, którymi jest pomiar przyspieszenia w każdej z trzech osi. Wartości owego przyspieszenia przypisywane są trzem, odpowiednio nazwanym zmiennym.

Do współpracy z KAmodMEMS2 zaprzągłem mikrokontroler AVR pracujący przy napięciu 3,3V – Atmega16L (pominąłem w ten sposób konieczność korzystania z konwerterów napięć). Widoczna na zdjęciach płytka uruchomieniowa ZL3AVR służy jedynie jako złącze wyświetlacza LCD (zintegrowane zasilanie i potencjometr kontrastu), nie jest więc konieczna do testowania podanego niżej przykładu.

Podłączenie KAMODMEMS2 do wyświetlacza LCD oraz atmega16l

Podłączenie KAMODMEMS2 do wyświetlacza LCD oraz atmega16l

Układ zasilam ze stabilizowanych 5V (w moim przypadku jest to zasilanie poprowadzone prosto z programatora USB) poprzez stabilizator LDO (low-dropout) LD1117VC33.
Podświetlenie LCD jest kwestią indywidualną i zależną od firmy. W moim przypadku konieczne było podłączenie jak na schemacie poniżej. Potencjometr kontrastu to 10kOhm, ale praktycznie każda zbliżona wartość wystarczy. Warto pomyśleć o dodatkowej filtracji w postaci kondensatorów między liniami VCC i GND, chociaż w przypadku zasilania z USB praktycznie nie jest to potrzebne. Schemat:

Podłączenie kamodmems2 do atmega16l i wyświetlacza lcd

Podłączenie kamodmems2 do atmega16l i wyświetlacza lcd

Program przedstawiony jest poniżej (wersja *.bas i skompilowana dla ATmega32L *.hex dostępna w załączniku):

Pobierz “Odczyty XYZ - kod źródłowy” odczyt_xyz.zip – Pobrano 795 razy – 2 KB

Efekt końcowy (wyświetlana jest tylko jedna oś – X, ze względu na mały wyświetlacz):

Widoczne w programie etykiety gosub „Odczytx”, „Odczyty”, oraz „Odczytz”, to najważniejsze etykiety obsługi akcelerometru, które służą do przypisania wartości przyspieszenia osi do odpowiednich zmiennych (X, Y, Z). Pamiętajmy, że po inicjalizacji I2C, musimy układ wybudzić przy pomocy etykiety „Akcelstart”.

Aby zaprezentować działanie akcelerometru w praktyce, postanowiłem zamieścić go na specjalnie przygotowanym robocie. Pomysł zastosowania nie jest może najtrafniejszy, ale ma szansę stać się inspiracją dla bardziej kreatywnych osób ;). W robocie wykorzystałem Atmega16L, mostek L293D oraz dwa przerobione mikroserwa HXT900. Widoczne podporowe kółko pochodzi z działu meblowego Leroy Merlin i kosztowało ok. 3zł.

Robot wyposażony w kamodmems2 oraz atmega16 - widok od spodu

Robot wyposażony w kamodmems2 oraz atmega16 – widok od spodu

Robot wyposażony w kamodmems2 oraz atmega16

Robot wyposażony w kamodmems2 oraz atmega16

Akcelerometr pełni w tym projekcie coś w rodzaju funkcji tempomatu – podczas stromego podjazdu, poprzez mikrokontroler, daje silnikom sygnał do bardziej wytężonej pracy (większe wypełnienie PWM na mostkach), a podczas zjazdu kompensuje trochę „ześlizgiwanie się” poprzez spowalnianie silników.

Schemat robota:

Schemat robota wyposażonego w akcelerometr kamodmems2 oraz avr atmega16

Schemat robota wyposażonego w akcelerometr kamodmems2 oraz avr atmega16

Program w BASCOM-AVR:

Pobierz “Robot - kod źródłowy” robot.zip – Pobrano 556 razy – 2 KB

Efekt końcowy:

Zalety układu:

  • cena (35,15zł),
  • wygodne wyprowadzenia dla interfejsów SPI i I2C,
  • małe rozmiary i waga,
  • przejrzysta dokumentacja i przykładowe kody źródłowe w C,

Wady:

  • praktycznie uniemożliwiony montaż modułu (brak otworów, jedynie gumowe nóżki) – choć można to tłumaczyć edukacyjnym charakterem urządzenia.

Pliki źródłowe (*.bas) wraz z plikami skompilowanymi (*.hex i *.bin do wyboru) dla obu przykładów:

Pobierz “Jak obsłużyć trójosiowy akcelerometr w BASCOM-AVR - gotowe pliki” Jak-obsłużyć-trójosiowy-akcelerometr-w-BASCOM-AVR.zip – Pobrano 122 razy – 10 KB

Ten plik (i wiele innych ciekawych rzeczy) jest też dostępny na moim koncie Chomikuj.pl: