Kurs esp32/esp8266 | #7 – Touch sensor

esp_kurs7

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.


Kurs esp32 i esp8266 – spis treści