Arduino — wykrywamy dotyk z modułem MPR121
Od dłuższego czasu tworzę przeróżne projekty z wykorzystaniem układów Atmega, Attiny gotowych płytek Arduino oraz popularnych Raspberry Pi czy Banana PRO nie tylko hobbistycznie ale również komercyjnie. Tworzyłem dla klientów sterowniki węzłów ciepłowniczych z wykorzystaniem Raspberry Pi z komunikacją RS485 jak również inteligentne słupy oświetleniowe. Ostatni projekt dla muzeum wymagał zrobienia dotykowych paneli po dotknięciu których miały reagować i wykonywać pewne rzeczy. Tak przy okazji tego zlecenia zainteresowałem się biblioteką CapacitiveSensor czyli pojemnościowym sensorem mówiąc po polsku. Lecz nie do końca ta biblioteka rozwiązała mój problem, dlatego poszukałem dalej i zainteresowałem się układem MPR121.
Jako, że w moim przypadku z panelami dla muzeum biblioteka CapacitiveSensor nie spełniła do końca moich jak i klienta oczekiwań poszukałem gotowych modułów dotykowych i tak po poszukiwaniach w sklepie Botland.com.pl znalazłem ciekawe moduły oparte na układzie MPR121. Skontaktowałem się ze sklepem i udało mi się otrzymać 4 takie moduły do testów. Oprócz tego poprosiłem również o moduł mp3 DFplayer aby można było po reakcji na dotknięcie odegrać jakieś dźwięki.
Moduł MPR121 produkcji Adafruit dostarczane są z zestawem goldpinów, które można samemu przylutować.Jest to dobre rozwiązanie bo przy niektórych projektach dobrze jest przylutować bezpośrednio kabelki dzięki czemu moduł nie ma większej wysokości. Moduł komunikuje się za pomocą protokołu I2C i może być zasilany jak również pracuje z napięciem 3.3V (domyślnie)oraz 5V dzięki wbudowanemu konwerterowi napięcia co umożliwia nam pracę z nim zarówno na Arduino jak i Raspberry Pi.
- VIN - Napięcie zasilania od 3 V do 5V
- GND - Masa układu
- SCL - Linia zegarowa magistrali I2C
- SDA -Linia danych magistrali I2C
- ADDR - Zmiana adresu magistrali I2C
- IRQ - wyjście przerwań
- 3Vo - dodatkowe wyjście 3V
Do dyspozycji mamy 12 pinów odczytujących dotyk za pomocą wyliczania oporności dotykanego elementu. Za pomocą pinu ADDR możemy ustawić 4 różne adresy urządzenia co daje nam możliwość użycia 4 takich modułów MPR121 co daje nam łącznie 48 możliwości odczytów.
- ADDR niepodłączone: 0x5A
- ADDR podłączone do 3V: 0x5B
- ADDR podłączone do SDA: 0x5C
- ADDR podłączone do SCL: 0x5D
Na module mamy też dodatkowe złącze GND oraz wyjście 3V dzięki czemu możemy podłączyć do niego kolejny moduł lub inne urządzenie. Moduł ma małe zapotrzebowanie na energię i zużywa maksymalnie wg specyfikacji 29 µA.
Jako, że jest to moduł od znanego producenta Adafruit to został przez ich pracowników przygotowany przewodnik użytkownika wraz z biblioteką w serwisie GitHub dla użytkowników Arduino i Raspberry Pi. My dzisiaj zajmiemy się obsługą modułu za pomocą Arduino.
Biblioteka do obsługi modułu jest dostępna w domyślnym repozytorium bibliotek w Arduino IDE 1.6+ wybierając odpowiednio Szkic>Dołącz bibliotekę>Zarządzaj bibliotekami... i wpisując w oknie wyszukiwarki mpr121 a następnie naciskamy przycisk instaluj. Po poprawnym zainstalowaniu biblioteki możemy podłączyć moduł do naszego Arduino. Ja wykorzystam Arduino UNO i stworzymy prosty układ z samego modułu MPR121 i kabelkami. Wykorzystamy do tego gotowy przykład dla tej biblioteki aby zaprezentować działanie układu.
Schemat podłączenia modułu do Arduino jest prosty bo wystarczą nam tylko 4 kabelki. 2 kabelki zasilania i 2 kabelki do komunikacji I2C. Oczywiście wlutuje dostarczone goldpiny do modułów aby łatwiej wszystko podłączyć.
Poniżej przedstawiam podłączenie modułu do Arduino UNO. Uno posiada złącza I2C na pinach A4 (SDA) i A5 (SCL). Niektóre moduły Arduino UNO głownie nieoryginalne posiadają wyprowadzone złącza I2C dodatkowo.
Do złącz 0‑11 na module MPR121 możemy podłączyć nawet zwykłe kabelki lub nawet jakieś płytki lub folie aluminiowe (cokolwiek co przewodzi prąd).
W Arduino IDE otwieramy przykład biblioteki mpr121 Pliki>Przykłady>Adafruit MPR121>MPR121test
Sam kod nie jest długi i przedstawię wam go pokrótce poniżej bez zbędnych komentarzy. Jedyne co zmodyfikowałem to zakomentowałem funkcje return abyśmy mogli zobaczyć jakie dostajemy wartości przy odczytach pinów (debugowanie).
#include <Wire.h> #include "Adafruit_MPR121.h" Adafruit_MPR121 cap = Adafruit_MPR121(); uint16_t lasttouched = 0; uint16_t currtouched = 0; void setup() { while (!Serial); Serial.begin(9600); Serial.println("Adafruit MPR121 Capacitive Touch sensor test"); //inicjacja połączenia modułu mpr121 pod adresem 0x5A if (!cap.begin(0x5A)) { Serial.println("MPR121 not found, check wiring?"); while (1); } Serial.println("MPR121 found!"); } void loop() { // odczytanie stanów pinów currtouched = cap.touched(); for (uint8_t i=0; i<12; i++) { // Porównujemy stanprzeszły i obecny // następnie sprawdzamy czy się wartości zmniejszyly if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) { Serial.print(i); Serial.println(" touched"); } // Porównujemy san obecny i przeszły // następnie sprawdzamy czy się wartości zwiekszyły if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) { Serial.print(i); Serial.println(" released"); } } //przypisywanie obecnych stanów do ostatnich lasttouched = currtouched; //return; // Informacje debugowania Serial.print("\t\t\t\t\t\t\t\t\t\t\t\t\t 0x"); Serial.println(cap.touched(), HEX); Serial.print("Filt: "); for (uint8_t i=0; i<12; i++) { Serial.print(cap.filteredData(i)); Serial.print("\t"); } Serial.println(); Serial.print("Base: "); for (uint8_t i=0; i<12; i++) { Serial.print(cap.baselineData(i)); Serial.print("\t"); } Serial.println(); // put a delay so it isn't overwhelming delay(100); }
Wynik powyższego kodu można zobaczyć na poniższym nagraniu wideo
Program można modyfikować wg naszego uznania i dawać polecenia naszemu Arduino aby wykonywał różne reakcje na dotknięcia panelów jak również na jego puszczanie.
W następnym wpisie opiszę obsługę modułu MP3 DFPlayer, a w kolejnym zrobię i zaprezentuję ciekawe projekt z wykorzystaniem modułu MPR121 i MP3. Po prostu muzyka musi grać ;)
Bardzo dziękuje sklepowi botland.com.pl za dostarczenie modułów do testów.