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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  1. 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).

  2. 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”.

  3. 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.

  4. 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:

  1. Szkic programu Arduino: LAB4_code_template.zip

Literatura:

  1. Sensor bezdotykowy: https://www.arduino.cc/reference/en/libraries/capacitivesensor/

  2. Opóźnienie: https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay

  3. Algorytm bisekcji: https://bookdown.org/rdpeng/advstatcomp/bisection-algorithm.html

  4. SG90 – datasheet

  5. ATmega328P – datasheet