- Wymagane komponenty
- Wprowadzenie do cyfrowego czujnika zbliżeniowego RGB i gestów APDS-9960
- Schemat obwodu
- Programowanie Arduino do wykrywania gestów i kolorów
Obecnie większość telefonów jest wyposażona w funkcję sterowania gestami, która umożliwia otwieranie lub zamykanie dowolnej aplikacji, włączanie muzyki, odbieranie połączeń itp. Jest to bardzo przydatna funkcja, która pozwala zaoszczędzić czas, a także fajnie wygląda sterowanie dowolnym urządzeniem za pomocą gestów. Wcześniej używaliśmy akcelerometru do budowy robota sterowanego gestami i myszy powietrznej sterowanej gestami. Ale dzisiaj uczymy się łączyć czujnik gestów APDS9960 z Arduino. Ten czujnik ma również czujnik RGB do wykrywania kolorów, który będzie również używany w tym samouczku. Nie musisz więc używać oddzielnych czujników do wykrywania gestów i kolorów, chociaż dostępny jest dedykowany czujnik do wykrywania kolorów - czujnik koloru TCS3200, którego użyliśmy już z Arduino do zbudowania maszyny do sortowania kolorów.
Wymagane komponenty
- Arduino UNO
- APDS9960 RGB i czujnik gestów
- Wyświetlacz LCD 16x2
- Przełącznik DPDT
- Potencjometr 100K i rezystor 10K
- Kable rozruchowe
Wprowadzenie do cyfrowego czujnika zbliżeniowego RGB i gestów APDS-9960
APDS9960 to czujnik wielofunkcyjny. Potrafi wykrywać gesty, światło otoczenia i wartości RGB w świetle. Ten czujnik może być również używany jako czujnik zbliżeniowy i jest używany głównie w smartfonach, aby wyłączyć ekran dotykowy podczas rozmowy.
Ten czujnik składa się z czterech fotodiod. Te fotodiody wykrywają odbitą energię IR, która jest transmitowana przez wbudowaną diodę LED. Więc za każdym razem, gdy wykonywany jest jakikolwiek gest, energia podczerwieni zostaje zablokowana i odbija się z powrotem do czujnika, teraz czujnik wykrywa informacje (kierunek, prędkość) o geście i przekształca je w informacje cyfrowe. Ten czujnik może być używany do pomiaru odległości przeszkody poprzez wykrywanie odbitego światła podczerwonego. Posiada filtry blokujące UV i IR do wykrywania kolorów RGB i generuje 16-bitowe dane dla każdego koloru.
Schemat pinów czujnika APDS-9960 pokazano poniżej. Czujnik ten pracuje na protokole komunikacyjnym I 2 C. Pobiera prąd 1µA i jest zasilany napięciem 3,3V, więc uważaj i nie podłączaj go do pinu 5V. Pin INT jest tutaj pinem przerwania, który jest używany do sterowania komunikacją I 2 C. A pin VL jest opcjonalnym pinem zasilania dla wbudowanej diody LED, jeśli zworka PS nie jest podłączona. Jeśli zworka PS jest zamknięta to wystarczy zasilić pin VCC, będzie on zasilał zarówno moduł jak i diodę IR.
Schemat obwodu
Połączenia dla APDS960 z Arduino są bardzo proste. Użyjemy przycisku DPDT, aby przełączać się między dwoma trybami wykrywania RGB i wykrywania gestów. Po pierwsze, piny komunikacyjne I2C SDA i SCL APDS9960 są podłączone odpowiednio do pinów A4 i A5 Arduino. Jak wspomniano wcześniej, napięcie robocze czujnika wynosi 3,3 V, więc VCC i GND APDS9960 są podłączone do 3,3 V i GND Arduino. Pin przerwania (INT) APDS9960 jest połączony z pinem D2 Arduino.
W przypadku LCD piny danych (D4-D7) są połączone z pinami cyfrowymi D6-D3 Arduino, a piny RS i EN są połączone z D6 i D7 Arduino. V0 wyświetlacza LCD jest podłączone do potencjometru, a potencjometr 100K służy do sterowania jasnością wyświetlacza LCD. Do przycisków DPDT użyliśmy tylko 3 pinów. Drugi pin jest podłączony do pinu D7 Arduino dla wejścia, a pozostałe dwa są podłączone do GND i VCC, po których następuje rezystor 10K.
Programowanie Arduino do wykrywania gestów i kolorów
Część programistyczna jest prosta i łatwa, a kompletny program z filmem demonstracyjnym znajduje się na końcu tego samouczka.
Najpierw musimy zainstalować bibliotekę stworzoną przez Sparkfun. Aby zainstalować tę bibliotekę, przejdź do Sketch-> Include Library-> Manage Libraries.
Teraz w pasku wyszukiwania wpisz „Sparkfun APDS9960” i kliknij przycisk instalacji, gdy zobaczysz bibliotekę.
Jesteśmy gotowi do drogi. Zacznijmy.
Więc najpierw musimy dołączyć wszystkie wymagane pliki nagłówkowe. Pierwszy plik nagłówkowy LiquidCrystal.h jest używany do funkcji LCD. Drugi plik nagłówkowy Wire.h jest używany do komunikacji I 2 C, a ostatni SparkFun_APDS996.h jest używany do czujnika APDS9960.
#zawierać
Teraz w kolejnych wierszach zdefiniowaliśmy piny dla przycisku i wyświetlacza LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
W następnej części zdefiniowaliśmy makro dla pinu przerwania, który jest podłączony do cyfrowego pinu 2 i jedną zmienną buttonState dla bieżącego stanu przycisku i isr_flag dla procedury obsługi przerwań.
# zdefiniować APDS9960_INT 2 int buttonState; int isr_flag = 0;
Następnie tworzony jest obiekt dla SparkFun_APDS9960, dzięki czemu możemy uzyskać dostęp do ruchów gestów i pobrać wartości RGB.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
W funkcji konfiguracji pierwsza linia służy do pobrania wartości z przycisku (niski / wysoki), a druga i trzecia linia definiuje przerwanie i pin przycisku jako wejście. apds.init () inicjalizuje czujnik APDS9960, a lcd.begin (16,2) inicjalizuje LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
W funkcji pętli pierwsza linia pobiera wartości z przycisku i przechowuje je w zdefiniowanej wcześniej zmiennej buttonState . Teraz w kolejnych wierszach sprawdzamy wartości z przycisku, jeśli jest wysoki to włączamy czujnik światła, a jeśli jest niski to inicjalizujemy czujnik gestów.
AttachInterrupt () jest funkcją, stosowane do przerwania zewnętrzne, które w tym przypadku jest przerwanie czujnika. Pierwszym argumentem tej funkcji jest numer przerwania. W Arduino UNO znajdują się dwa piny cyfrowe przerwania - 2 i 3 oznaczone jako INT.0 i INT.1. Podłączyliśmy go do pinu 2, więc zapisaliśmy tam 0. Drugi argument wywołuje funkcję breakingRoutine (), która jest zdefiniowana później. Ostatnim argumentem jest FALLING, aby wywołać przerwanie, gdy pin przejdzie od wysokiego do niskiego. Dowiedz się więcej o przerwaniach Arduino tutaj.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
W następnej części sprawdzamy przypięcie przycisku. Jeśli jest wysoki, rozpocznij proces dla czujnika RGB. Następnie sprawdź, czy czujnik światła odczytuje wartości, czy nie. Jeśli nie jest w stanie odczytać wartości, w takim przypadku wydrukuj „ Błąd odczytu wartości światła”. A jeśli może odczytać wartości, porównaj wartości trzech kolorów i która z nich jest najwyższa, wydrukuj ten kolor na wyświetlaczu LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print („Błąd odczytu wartości światła”); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); opóźnienie (1000); lcd.clear (); } ……. ………..
W następnych wierszach ponownie sprawdź pin przycisku, a jeśli jest niski , wykonaj proces czujnika gestów. Następnie sprawdź isr_flag i jeśli wynosi 1, wywoływana jest funkcja detachInterrupt () . Ta funkcja służy do wyłączania przerwania. Następna linia wywołuje funkcję handleGesture (), która jest zdefiniowana później. W następnych wierszach zdefiniuj isr_flag na zero i dołącz przerwanie.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, breakingRoutine, FALLING); } }
Następna to funkcja breakingRoutine () . Ta funkcja służy do włączania zmiennej isr_flag 1, aby można było zainicjować usługę przerwania.
void breakingRoutine (). { isr_flag = 1; }
Funkcja handleGesture () jest zdefiniowana w następnej części. Ta funkcja najpierw sprawdza dostępność czujnika gestów. Jeśli jest dostępny, odczytuje wartości gestów i sprawdza, który to jest (GÓRA, DÓŁ, PRAWO, LEWO, DALEKO, BLISKO) i drukuje odpowiednie wartości na wyświetlaczu LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); opóźnienie (1000); lcd.clear (); przerwa; sprawa DIR_DOWN: lcd.print ("DOWN"); opóźnienie (1000); lcd.clear (); przerwa; sprawa DIR_LEFT: lcd.print ("LEFT"); opóźnienie (1000); lcd.clear (); przerwa; sprawa DIR_RIGHT: lcd.print ("RIGHT"); opóźnienie (1000); lcd.clear (); przerwa; case DIR_NEAR: lcd.print ("NEAR"); opóźnienie (1000); lcd.clear (); przerwa; sprawa DIR_FAR: lcd.print ("FAR"); opóźnienie (1000); lcd.clear (); przerwa; domyślnie: lcd.print ("NONE"); opóźnienie (1000); lcd.clear (); } } }
Na koniec prześlij kod do Arduino i poczekaj na zainicjowanie czujnika. Teraz, gdy przycisk jest wyłączony, oznacza to, że jest w trybie gestów. Spróbuj więc poruszać rękami w lewo, w prawo, w górę, w dół. Aby wykonać gest z daleka , trzymaj rękę w odległości 2-4 cali od czujnika przez 2-3 sekundy i zdejmij ją. Aby wykonać gest bliski, trzymaj rękę z dala od czujnika, a następnie zbliż ją i zdejmij.
Teraz włącz przycisk, aby przełączyć go w tryb wykrywania koloru i podejmij czerwone, niebieskie i zielone obiekty jeden po drugim w pobliżu czujnika. Drukuje kolor obiektu.