Ta część kursu dotyczy tylko mikrokontrolera esp32.
Touch sensor | esp-idf
W esp32 został zaimplementowany moduł czujnika dotyku, który dostępny jest na 10-ciu pinach GPIO. Jest to niewątpliwie rzadkość w mikrokontrolerach, a taki moduł jest czymś bardzo ciekawym. Działa on na takiej samej zasadzie jak pojemnościowe wyświetlacze dotykowe i w tej części kursu zaprezentuje jego użycie, bez wchodzenia w szczegóły teoretyczne.
Strona w dokumentacji: touch sensor
Czujnik dotyku esp32 – obsługa
Na wstępie trzeba zaimportować bibliotekę:
#include "driver/touch_sensor.h"
Najprostsza inicjalizacja modułu składa się z dwóch następujących poleceń…
touch_pad_init(); touch_pad_config(4,0);
Pierwsza funkcja włącza moduł czujnika dotyku, a druga służy do jego podstawowej konfiguracji. Tej drugiej przekazujemy dwa argumenty – numer czujnika (0-9), oraz liczbę stanowiącą próg (treshold) wyzwalający przerwanie. Na razie wartość treshold, po prostu ustawmy na 0.
Pobierać wartość z czujnika można z pomocą trzech funkcji: touch_pad_read(), touch_pad_read_raw_data(), oraz touch_pad_read_filtered(). Im wszystkim przekazujemy dwa argumeny – numer czujnika, i wskaźnik do zmiennej (uint16_t) gdzie zapisany zostanie pomiar.
Te dwie kolejne funkcje, zadziałają jedynie gdy przed ich wywołaniem, wywołamy dodatkowo funkcję touch_pad_filter_start(period). Da to lepszy wynik jeżeli w przypadku funkcji touch_pad_read() występuję jakieś zakłócenia/oldchylenia.
Utworzę więc takie zadanie i funkcji głównej je uruchomię:
static void czujnik_dotyku(void *args) { while(1) { uint16_t data; vTaskDelay(500 / portTICK_RATE_MS); touch_pad_read(4, &data); printf("%d\n", data); } } // Utworzenia zadania xTaskCreate(czujnik_dotyku, "czujnik_dotyku", 1024, NULL, 1, NULL);
Teraz, do pinu, na którym znajduje się wybrany czujnik podłącz przewód połączeniowy i otwórz podgląd portu szeregowego. Powinieneś zauważyć, że ten wysyła jakąś wartość, ta się zmieni gdy dotkniesz dłonią przewodu. Jasno chyba widać co tutaj się właściwie dzieje. Przewód możesz połączyć z dowolnym metalowym przedmiotem, i wtedy dotyknięcie tego przedmiotu będzie oddziaływało na czujnik. Możesz przewód przylutować, lub zwyczajnie użyć taśmy izolacyjnej.
esp32 Touch sensor – przerwania
Touch sensor w esp32 ma możliwość wywoływania przerwańm gdy wartość odczytu osiągnie konkretną wartość. Teraz to wykorzystamy by utworzyć coś w rodzaju „dotykowego” przycisku.
Na samym początku musimy wrócić się do… początku, czyli inicjalizacji modułu. W funkcji touch_pad_config(4, treshold), drugim argumentem jest warość treshold, czyli próg przy którym będzie występowało przerwanie. Wybadaj jaka wartość występuje, gdy dotykasz czujnika i wstaw ją w te miejsce. W moim przypadku poniżej wartości 125 będzie odpowiednio.
Poniżej utworzyłem obsługę przerwania, oraz dodałem trzy polecenia do części inicjalizacyjnej modułu.
static void przerwanie(void *args) { ets_printf("MCINM.pl"); } // Inizjalizacja w głównej funkcji touch_pad_init(); touch_pad_config(4,125); touch_pad_trigger_mode(TOUCH_TRIGGER_BELOW); touch_pad_isr_register(przerwanie, NULL); // przypisanie obsługi przerwania touch_pad_intr_enable(); // Włączenie przerwań
Funkcji touch_pad_trigger_mode, możesz podać makrodefinicje TOUCH_TRIGGER_BELOW, lub TOUCH_TRIGGER_ABOVE – zależnie czy wyzwalać przerwanie ma pojawienie się odczytu poniżej, czy powyżej podanego przez nas treshold.
By przerwania pochodzące z czujnika dotyku działały, i tak gdzieś w programie musimy wywoływać funkcję touch_pad_read(). Zostawmy w programie więc zadanie „czujnik_dotyku”. Możemy z niego po prostu usunąć printf, oraz ewentualnie zmienić wartość delay’a.
Podsumowanie
Czujnik dotyku to ciekawe peryferium, które może się przydać w niektórych projektach. Myślę, że ten tekst powinien dobrze ilustrować obsługę tegoż modułu. Pominąłem kwestie kalibracji, oraz optymalizacji pomiarów gdyż uznałem to za niezbyt konieczne. W razie problemów zajrzyj do dokumentacji środowiska esp-idf.