- Необхідні компоненти
- Вступ до цифрового датчика близькості RGB та жестів APDS-9960
- Кругова діаграма
- Програмування Arduino для жестів та зондування кольорів
Сьогодні більшість телефонів оснащені функцією управління жестами, щоб відкривати або закривати будь-яку програму, запускати музику, відвідувати дзвінки тощо. Це дуже зручна функція для економії часу, а також керувати будь-якими пристроями за допомогою жестів. Раніше ми використовували акселерометр для створення робота, керованого жестами, та повітряної миші, керованої жестами. Але сьогодні ми вчимося взаємодіяти датчик жестів APDS9960 з Arduino. Цей датчик також має RGB-датчик для виявлення кольорів, який також буде використаний у цьому посібнику. Тому вам не потрібно використовувати окремі датчики для виявлення жестів та кольорів, хоча доступний спеціальний датчик для виявлення кольорів - кольоровий датчик TCS3200, який ми вже використовували з Arduino для створення машини для сортування кольорів.
Необхідні компоненти
- Arduino UNO
- APDS9960 RGB і датчик жестів
- РК-дисплей 16x2
- Перемикач DPDT
- 100K горщик і 10K резистор
- Кабелі-перемички
Вступ до цифрового датчика близькості RGB та жестів APDS-9960
APDS9960 - це багатофункціональний датчик. Він може виявляти жести, навколишнє освітлення та значення RGB у світлі. Цей датчик також може використовуватися як датчик наближення і в основному використовується в смартфонах, щоб вимкнути сенсорний екран під час відвідування дзвінка.
Цей датчик складається з чотирьох фотодіодів. Ці фотодіоди виявляють відбиту ІЧ-енергію, яка передається вбудованим світлодіодом. Отже, коли виконується будь-який жест, тоді ця ІЧ-енергія перешкоджає і відбивається назад до датчика, тепер датчик виявляє інформацію (напрямок, швидкість) про жест та перетворює його в цифрову інформацію. Цей датчик можна використовувати для вимірювання відстані перешкоди шляхом виявлення відбитого ІЧ-світла. Він має ультрафіолетові та ІЧ-блокуючі фільтри для зондування кольорів RGB і забезпечує 16-бітові дані для кожного кольору.
Висновок датчика APDS-9960 показаний нижче. Цей датчик працює за протоколом зв'язку I 2 C. Він споживає струм 1 мкА і живиться від 3,3 В, тому будьте обережні і не підключайте його штифтом 5 В. Тут контактом INT є вивід переривання, який використовується для керування I 2 C-зв'язком. А штир VL є необов’язковим штифтом живлення для вбудованого світлодіода, якщо перемичка PS не підключена. Якщо перемичка PS закрита, вам потрібно лише підключити штифт VCC, це забезпечить живлення як модуля, так і ІЧ-індикатора.
Кругова діаграма
Підключення APDS960 до Arduino дуже просте. Ми будемо використовувати кнопку DPDT для перемикання між двома режимами RGB Sensing та Gesture Sensing. По-перше, I2C-шпильки зв'язку SDA та SCL APDS9960 підключені до Arduino-контактів A4 та A5 відповідно. Як зазначалося раніше, робоча напруга датчика становить 3,3 в, тому VCC і GND APDS9960 підключені до 3,3 V і GND Arduino. Вивід переривання (INT) APDS9960 підключений до виводу D2 Arduino.
Для РК- виводів даних (D4-D7) підключені до цифрових виводів D6-D3 Arduino, а виводи RS і EN - D6 і D7 Arduino. V0 РК-дисплея підключений до горщика, а 100K - для управління яскравістю РК-дисплея. Для кнопок DPDT ми використали лише 3 штифти. Другий штифт підключений до штифта D7 Arduino для введення, а два інших підключені до GND і VCC, а потім резистор 10K.
Програмування Arduino для жестів та зондування кольорів
Частина програмування проста і легка, а повна програма з демонстраційним відео наведена в кінці цього посібника.
Спочатку нам потрібно встановити бібліотеку Sparkfun. Щоб встановити цю бібліотеку, перейдіть до Ескіз-> Включити бібліотеку-> Керувати бібліотеками.
Тепер у рядку пошуку введіть “Sparkfun APDS9960” і натисніть кнопку встановлення, коли побачите бібліотеку.
І ми готові піти. Давайте розпочнемо.
Отже, спочатку ми повинні включити всі необхідні файли заголовків. Перший файл заголовка LiquidCrystal.h використовується для функцій РК-дисплея. Другий файл заголовка Wire.h використовується для I 2 C зв'язку і останній SparkFun_APDS996.h використовується для датчика APDS9960.
#включати
У наступних рядках ми визначили шпильки для кнопки та РК-дисплея.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; Рідинний кристал LiquidCrystal (rs, en, d4, d5, d6, d7);
У наступній частині ми визначили макрос для виводу переривання, який підключений на цифровому виводі 2 та одну змінну buttonState для поточного стану кнопки та isr_flag для процедури переривання служби.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Далі створюється об’єкт для SparkFun_APDS9960, щоб ми могли отримати доступ до рухів жестів та отримати значення RGB.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t червоне світло = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
У функції налаштування перший рядок має отримати значення з кнопки (низький / високий), а другий і третій рядок визначають переривання та штифт кнопки як вхідні дані. apds.init () ініціалізує датчик APDS9960, а lcd.begin (16,2) ініціалізує РК-дисплей.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
У функції циклу перший рядок отримує значення з кнопки і зберігає їх у змінні buttonState, визначеній раніше. Тепер у наступних рядках ми перевіряємо значення з кнопки, якщо вона висока, ми вмикаємо датчик освітленості, а якщо вона низька, ініціалізуємо датчик жестів.
AttachInterrupt () є функція використовується для зовнішнього переривання, яке в цьому випадку переривання датчика. Першим аргументом у цій функції є номер переривання. В Arduino UNO є два цифрові висновки переривання - 2 та 3, позначені INT.0 та INT.1. І ми підключили його до штифта 2, тому написали там 0. Другий аргумент викликає функцію interruptRoutine (), яка визначена пізніше. Останній аргумент - FALLING, що спричинить переривання, коли штифт переходить від високого до низького. Дізнайтеся більше про переривання Arduino тут.
недійсний цикл () { buttonState = digitalRead (buttonPin); якщо (buttonState == HIGH) { apds.enableLightSensor (true); }
У наступній частині ми перевіряємо наявність штифта кнопки. Якщо він високий, запустіть процес для датчика RGB. Потім перевірте, чи зчитує датчик світла значення чи ні. Якщо він не може прочитати значення, то в такому випадку надрукуйте " Помилка читання значень світла". І якщо тоді він може зчитувати значення, порівняйте значення трьох кольорів, і що найбільше, надрукуйте цей колір на РК-дисплеї.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Помилка читання значень світла"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); затримка (1000); lcd.clear (); } ……. ………..
У наступних рядках ще раз перевірте наявність штифта кнопки, і якщо він низький, обробіть датчик жесту. Потім перевірте наявність isr_flag, і якщо воно дорівнює 1, тоді викликається функція detachInterrupt () . Ця функція використовується для вимкнення переривання. Наступний рядок викликає handleGesture (), який є функцією, визначеною пізніше. У наступних наступних рядках визначте isr_flag до нуля та приєднайте переривання.
інакше if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Наступним є функція interruptRoutine () . Ця функція використовується для перетворення змінної isr_flag 1, щоб послугу переривання можна було ініціалізувати.
void interruptRoutine (). { isr_flag = 1; }
Функція handleGesture () визначена в наступній частині. Ця функція спочатку перевіряє наявність датчика жестів. Якщо він доступний, він зчитує значення жестів і перевіряє, який це жест (ВГОРУ, ВНИЗ, ВПРАВО, ВЛІВО, ДАЛЬКИЙ, БЛИЗЬКИЙ) і друкує відповідні значення на РК-дисплеї.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); затримка (1000); lcd.clear (); перерву; справа DIR_DOWN: lcd.print ("DOWN"); затримка (1000); lcd.clear (); перерву; справа DIR_LEFT: lcd.print ("LEFT"); затримка (1000); lcd.clear (); перерву; справа DIR_RIGHT: lcd.print ("ПРАВО"); затримка (1000); lcd.clear (); перерву; справа DIR_NEAR: lcd.print ("NEAR"); затримка (1000); lcd.clear (); перерву; справа DIR_FAR: lcd.print ("FAR"); затримка (1000); lcd.clear (); перерву; за замовчуванням: lcd.print ("NONE"); затримка (1000); lcd.clear (); } } }
Нарешті, завантажте код в Arduino і почекайте, поки сенсор ініціалізується. Тепер, коли кнопку вимкнено, це означає, що вона перебуває в режимі жестів. Тож спробуйте рухати руками вліво, вправо, вгору, вниз. Для далекого жесту тримайте руку на відстані 2-4 дюйма від датчика протягом 2-3 секунд і виймайте її. А для ближнього жесту тримайте руку далеко від датчика, а потім візьміть її поруч і вийміть.
Тепер увімкніть кнопку, щоб перевести її в режим кольорового зондування, і візьміть червоні, сині та зелені предмети по одному поруч із датчиком. Він надрукує колір об’єкта.