Praca z czujnikiem pojemnościowym - Arduino
(opracował: dr hab. inż. Adrian Bekasiewicz, prof. PG)Cel:
Celem laboratorium jest praktyczne wykorzystanie bezdotykowego czujnika pojemnościowego przy wykorzystaniu modułu Arduino UNO [1]. Ze względu na zdalny charakter laboratorium, interakcja z czujnikiem jest emulowana przy użyciu przewodzącej płytki zamontowanej na wahadle sterowanym przez serwomechanizm.
Zasady realizacji zadań:
Laboratorium zostało podzielone na cztery ćwiczenia, o stopniowo rosnącym poziomie złożoności. Do zaliczenia laboratorium należy zrealizować przynajmniej dwa pierwsze ćwiczenia. Kolejność wykonywania zadań jest sekwencyjna – rozwiązanie danego ćwiczenia stanowi punkt początkowy do wykonania kolejnego. Schemat połączeń niezbędny do realizacji zadania przedstawiono na Rys. 1.
Zadania do realizacji:
-
Zaimportować bibliotekę obsługującą sensor bezdotykowy oraz wyświetlać odczytane przez sensor wartości przez port szeregowy. Uruchomić funkcję sterującą serwomechanizmem i zidentyfikować progi, poniżej/powyżej których przewodząca płytka jest w bliskiej/dalekiej odległości od czujnika.
-
Napisać program, który będzie zapalał środkową diodę LED, kiedy wahadło znajduje się nad czujnikiem pojemnościowym i gasił ją kiedy jest maksymalnie wychylone.
-
Napisać program, który będzie inkrementował licznik w momencie gdy wahadło znajduje się tuż nad czujnikiem pojemnościowym. Wyświetlać wartości licznika na diodach LED w postaci binarnej.
-
Napisać program, który będzie implementował algorytm bisekcji w celu automatycznego dostrojenia wartości progowych do inkrementowania licznika binarnego z poprzedniego ćwiczenia.
Opis zadań:
Serwomechanizm jest sterowany z wykorzystaniem funkcji rotServo(). Parametrem wejściowym funkcji jest opóźnienie pomiędzy kolejnymi wychyleniami wahadła w milisekundach (domyślnie 2000). Wyjściem funkcji jest wartość binarna wskazująca aktualne wychylenie wahadła (0 w przypadku wychylenia w lewą stronę oraz 1 przy wychyleniu w prawo). Opóźnienie pomiędzy kolejnymi zmianami położenia wahadła można zmieniać w zakresie 1000-5000 ms.
Nie dopuszcza się stosowania funkcji delay() do realizacji zadań opisanych poniżej ponieważ powoduje ona wstrzymanie pracy całego mikrokontrolera. Opóźnienia należy realizować z wykorzystaniem nieblokujących funkcji opóźniających [2].
Rys. 1. Stanowisko do zdalnej realizacji laboratoriów – schemat ideowy.
-
Obsługa sensora bezdotykowego sprowadza się do zainicjalizowania odpowiedniej biblioteki [1], inicjalizacji czujnika (ze szczególnym uwzględnieniem wyboru odpowiednich wyprowadzeń dla sygnału nadawanego/odbieranego), oraz ustalenia liczby próbek branych pod uwagę podczas odczytywania wartości przez czujnik. Do ustalenia odpowiednich wartości progowej można wykorzystać wykresy generowane przez serial plotter (Arduino IDE => Tools => Serial plotter).
-
Do realizacji zadania należy zaimplementować zatrzask, który będzie wyzwalany kiedy sygnał z czujnika przekroczy górną i dolną wartość progową (ze względu na duże szumy w odczytach czujnika, zakres „stanu nieustalonego” pomiędzy progiem górnym i dolnym jest stosunkowo duży). Do sterowania diodą konieczne jest ustalenie trybu odpowiedniego portu cyfrowego na wyjściowy oraz napisanie funkcji, która będzie opóźniała moment ponownego wyłączenie diody o czas pozwalający na zaobserwowanie jej „mrugnięcia”.
-
Wykonanie zadania sprowadza się do zaimplementowania w kodzie z Zadania 2 funkcji licznika binarnego oraz funkcji umożliwiającej sterowanie (włączanie/wyłączanie) trzema diodami LED.
-
Opracowany program powinien rejestrować zmiany sygnału z czujnika pojemnościowego oraz wykorzystać uzyskane wartości do automatycznego dostrajania wartości progowych w taki sposób aby licznik binarny inkrementował się przy każdorazowej zmianie położenia wahadła z jednej pozycji skrajnej na drugą.
Pliki:
-
Szkic programu Arduino: LAB4_code_template.zip
Literatura:
-
Sensor bezdotykowy: https://www.arduino.cc/reference/en/libraries/capacitivesensor/
-
Opóźnienie: https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay
-
Algorytm bisekcji: https://bookdown.org/rdpeng/advstatcomp/bisection-algorithm.html
-
SG90 – datasheet
-
ATmega328P – datasheet