SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Pojemnościowy czujnik dotykowy MPR121

MPR121 jest pojemnościowym czujnikiem dotykowym drugiej generacji, będący kontynuacją wcześniejszej serii MPR03x firmy Freescale. Oferuje większą liczbę 12 elektrod oraz zdolność sprzętowej konfiguracji adresu na szynie I2C. MPR121 posiada także rozszerzony system filtrowania, który pozwala uniknąć efektu "migotania przycisków", o którym wspomniałem w jednym z wcześniejszych artykułów. 

Nowością jest także symulowana 13 elektroda, która jest użyteczna w przypadku konfiguracji układu do obsługi paneli dotykowych. Pozwala na detekcję zbliżenia obiektu, co umożlwia nam zwiększenie czułości obszaru dotykowego. Co ciekawe, aż 8 elektrod może pełnić rolę sterownika LED (max. 12mA na linię) lub interfejsu GPIO.

Układ jest zasilany napięciem od 1.71V do 3.6V pobierając zaledwie 29μA w 16ms odstępach pomiarowych. Znajduje zastosowanie w przełącznikach dotykowych, a także panelach dotykowych o różnych konfiguracjach. MPR121 posiada także obsługę przerwania IRQ, za pomocą którego można zasygnalizować zmianę statusu na elektrodach. Zakres pomiarowy pojemności względem elektrod mieści się w zakresie od   10pF do 2000pF z rozdzielczością 0.01pF.

Typowa aplikacja układu

Pełna dokumentacja techniczna: https://www.jarzebski.pl/datasheets/MPR121.pdf

Na rynku dostępnych jest kilka gotowych modułów dla Arduino wykorzystujących układ MPR121 -  jednak jeśli szukamy kompleksowego rozwiązania dostarczającego nie tylko sam moduł, ale również specjalnie przygotowane panele dotykowe, warto zwrócić uwagę na produkt DFRobot Capacitive Touch Kit, który jest dostępny w ofercie sklepu ArduinoSolutions.

W zestawie znajdziemy moduł sterujący dostosowany do pracy z napięciem 5V, klawiaturę numeryczną, okrągłą tarczę numeryczną oraz panel dotykowy. Do zestawu dołączone jest również niezbędne okablowanie.

Bibliotekę do obsługi DFRobot Capacitive Touch Kit można pobrać z adresu: https://www.jarzebski.pl/arduino/MPR121/MPR121-1.0.zip. Bibliotekę należy oczywiście rozpakować do katalogu libraries w naszym szkicowniku.

 

Podłączenie modułu

Podłączenie jest banalnie proste. Moduł sterujący łączymy z wybranym panelem dotykowym (żólta taśma), natomiast z drugiej strony podpinamy zasilanie, masę oraz linie sterujące I2C. Podłączenie IRQ do wejścia cyfrowego nie jest wymagane, jeśl nie zamierzamy korzystać z obsługi przerwań.

Obsługa klawiatury numerycznej

Jako przykład posłuży nam prosty zamek szyfrowy. Ponieważ dłuższe przetrzymanie palca na danym przycisku powoduje pobieranie tego samego kodu, będziemy zapamiętywać ostatni odczyt  i porównywać go z aktualnym. Jeśli wartości będą od siebie różne, odczytany znak zostanie dopisany do naszego sprawdzanego kodu. Ten prosty zabieg pozwoli na uniknięcie tak zwanego efektu "sklejania przycisków". Gwiazdka posłuży nam do wyczyszczenia buforu, natomiast kratka do sprawdzenia wpisanego szyfru.

  1. #include <Wire.h>
  2. #include <mpr121.h>
  3.  
  4. int przycisk = 0;     // Kod dotknietego przycisku
  5. int ostatni = 0;      // Kod ostatniego przycisku
  6.  
  7. String kod;           // Wpisany kod
  8. String wzor = "1981"; // Wzor kodu
  9.  
  10. void setup()
  11. {
  12.   // Inicjalizacja portu szeregowego
  13.   Serial.begin(19200);
  14.  
  15.   // Inicjalizacja i2c
  16.   Wire.begin();
  17.  
  18.   // Inicjalizacja MPR121
  19.   CapaTouch.begin();
  20.  
  21.   Serial.println("Wprowadz kod dostepu");
  22. }
  23.  
  24. void loop()
  25. {
  26.   // Pobranie kodu dotknietego przycisku
  27.   przycisk = CapaTouch.keyPad();
  28.  
  29.   // Jesli dotknieto przycisk i nie jest taki sam jak ostatnio
  30.   // Sprawdzanie ostatniego przycisku zapobiega sklejaniu
  31.   if ((przycisk != -1) and (przycisk != ostatni))
  32.   {
  33.     switch (przycisk)
  34.     {
  35.       // * czysci wpisany kod
  36.       case 11:
  37.         kod = "";
  38.         Serial.println("*CLEAR");
  39.         break;
  40.  
  41.       // # sprawdza wpisany kod
  42.       case 12:
  43.         Serial.println("#ENTER");
  44.         if (kod == wzor)
  45.         {
  46.           Serial.println("KOD PRAWIDLOWY");
  47.         } else
  48.         {
  49.           Serial.println("KOD NIEPRAWIDLOWY");
  50.         }
  51.         kod = "";
  52.         break;
  53.  
  54.       // Dodaje cyfre do kodu
  55.       default:
  56.         Serial.print(przycisk);
  57.         kod += String(przycisk);
  58.     }
  59.   }
  60.  
  61.   // Zapamietanie ostatniego przycisku
  62.   ostatni = przycisk;
  63.  
  64.   // Zaczekaj 50 ms
  65.   delay(50);
  66. }

Wynik działania programu:

Analogicznie obsługujemy okrągły panel dotykowy, biorąc jedynie pod uwagę odmienne zmapowanie stref dotykowych.

Obsługa Touchpada

Drugim modułem jest panel dotykowy, który pozwala odczytać współrzędne dotyku w polu 9x13 punktów. Program będzie wyglądał następująco:

  1. #include <Wire.h>
  2. #include <mpr121.h>
  3.  
  4. void setup()
  5. {
  6.   // Inicjalizacja portu szeregowego
  7.   Serial.begin(19200);
  8.  
  9.   // Inicjalizacja i2c
  10.   Wire.begin();
  11.  
  12.   // Inicjalizacja MPR121
  13.   CapaTouch.begin();
  14. }
  15.  
  16. void loop()
  17. {
  18.   // Pobranie wspolrzednych dotyku
  19.   int X = CapaTouch.getX();
  20.   int Y = CapaTouch.getY();
  21.  
  22.   // Dopuszczalne zakresy X = 1-9, Y = 1-13
  23.   if ((X >= 1) and (X <= 9) and (Y >= 1) and (Y <= 13))
  24.   {
  25.       Serial.print("X=");
  26.       Serial.print(X);
  27.       Serial.print(" Y=");
  28.       Serial.println(Y);
  29.   }
  30.  
  31.   // Opoznienie 100ms
  32.   delay(100);
  33. }

Wynik działania programu

Podsumowanie

Zestaw DFRobot Capacitive Touch Kit jest jednym z najciekawszych modułów pozwalających na wykorzystanie w projektach elementów dotykowych. Oparcie go o nowoczesny układ MPR121 pozwala zapomnieć o przykrych niedogodnościach, takich jak przedwczesne wykrycie dotyku z bliskiej odległości, kiedy tak naprawdę nie dotknięto elementu. Jeśli chodzi o filtrowanie debouncingu (migotanie przycisków) - podczas długich testów nie doświadczyłem nic podobnego. Bardzo cieszą tutaj gotowe panele dotykowe, które od razu można wykorzystać w naszych projektach, nie bawiąc się w tworzenie chociażby własnej klawiatury. MPR121 w domyślnych ustawieniach radzi sobie z wykryciem dotyku przez arkusz papieru o grubości 0.48mm. Oprócz wszystkich zalet jakie posiada MPR121, nie sposób nie zauważyć możliwości wykorzystania wolnych elektrod jako sterownika LED.


Moduł przetestowany dzięki uprzejmości sklepu
ArduinoSolutions.

Reklama