- Необходими компоненти
- Въведение в APDS-9960 RGB и жестов сензор за цифрова близост
- Електрическа схема
- Програмиране на Arduino за сензори за жестове и цветове
Днес повечето телефони идват с функция за управление на жестове, за да отворите или затворите всяко приложение, да стартирате музика, да посещавате разговори и т.н. Това е много удобна функция за спестяване на време и изглежда страхотно да контролирате всяко устройство с жестове. Преди това използвахме акселерометър за изграждане на робот с контролиран жест и въздушна мишка с контролиран жест Но днес се научаваме да свързваме сензор за жестове APDS9960 с Arduino. Този сензор има и RGB сензор за откриване на цветове, който също ще бъде използван в този урок. Така че не е необходимо да използвате отделни сензори за разпознаване на жестове и цветове, въпреки че е наличен специален сензор за разпознаване на цветове - цветен сензор TCS3200, който вече използвахме с Arduino за изграждане на машина за сортиране на цветове.
Необходими компоненти
- Arduino UNO
- APDS9960 RGB и сензор за жестове
- 16x2 LCD
- DPDT превключвател
- 100K пот и 10K резистор
- Джъмперни кабели
Въведение в APDS-9960 RGB и жестов сензор за цифрова близост
APDS9960 е многофункционален сензор. Той може да открива жестове, околна светлина и RGB стойности в светлина. Този сензор може да се използва и като сензор за близост и се използва най-вече в смартфони, за да деактивира сензорния екран, докато присъства на разговор.
Този сензор се състои от четири фотодиода. Тези фотодиоди откриват отразената IR енергия, която се предава от бордовия светодиод. Така че всеки път, когато се извърши някакъв жест, тази ИЧ енергия се възпрепятства и отразява обратно към сензора, сега сензорът открива информацията (посока, скорост) за жеста и я преобразува в цифрова информация. Този сензор може да се използва за измерване на разстоянието на препятствие чрез откриване на отразена IR светлина. Той има UV и IR блокиращи филтри за усещане на RGB цветове и произвежда 16-битови данни за всеки цвят.
Извеждането на сензора APDS-9960 е показано по-долу. Този сензор работи на I 2 C комуникационен протокол. Той консумира 1µA ток и се захранва от 3.3V, така че бъдете внимателни и не го свързвайте с 5V щифт. Тук INT щифтът е прекъсващ щифт, който се използва за задвижване на комуникацията I 2 C. И VL щифтът е незадължителен захранващ щифт за вградения светодиод, ако PS джъмперът не е свързан. Ако PS джъмперът е затворен, трябва само да захранвате VCC щифт, той ще осигури захранване и на двата модула и на IR светодиода.
Електрическа схема
Връзките за APDS960 с Arduino са много прости. Ще използваме бутон DPDT, за да превключваме между двата режима RGB Sensing и Gesture Sensing. Първо, I2C комуникационните щифтове SDA и SCL на APDS9960 са свързани към Arduino пин A4 и A5 съответно. Както беше посочено по-рано, работното напрежение на сензора е 3.3v, така че VCC и GND на APDS9960 са свързани към 3.3V и GND на Arduino. Прекъсващият щифт (INT) на APDS9960 е свързан с D2 щифт на Arduino.
За LCD, щифтовете за данни (D4-D7) са свързани към цифрови щифтове D6-D3 на Arduino, а RS и EN пиновете са свързани към D6 и D7 на Arduino. V0 на LCD е свързан към пота и 100K пот се използва за контрол на яркостта на LCD. За бутоните DPDT сме използвали само 3 щифта. Вторият щифт е свързан към D7 щифт на Arduino за вход, а другите два са свързани към GND и VCC, последвани от 10K резистор.
Програмиране на Arduino за сензори за жестове и цветове
Програмиращата част е лесна и лесна, а пълната програма с демонстрационен видеоклип е дадена в края на този урок.
Първо трябва да инсталираме библиотека, направена от Sparkfun. За да инсталирате тази библиотека, отворете Скица-> Включване на библиотека-> Управление на библиотеки.
Сега в лентата за търсене напишете “Sparkfun APDS9960” и кликнете върху бутона за инсталиране, когато видите библиотеката.
И ние сме готови да тръгнем. Да започваме.
Така че първо трябва да включим всички необходими заглавни файлове. Първият заглавен файл LiquidCrystal.h се използва за LCD функции. Вторият заглавен файл Wire.h се използва за I 2 C комуникация, а последният SparkFun_APDS996.h се използва за APDS9960 сензор.
#include
Сега в следващите редове сме дефинирали щифтовете за бутон и 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);
В следващата част дефинирахме макрос за щифта за прекъсване, който е свързан на цифров щифт 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 red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
Във функцията за настройка , първият ред е да извлече стойността от бутона (нисък / висок), а вторият и третият ред определят прекъсването и щифта на бутона като вход. apds.init () инициализира сензора APDS9960, а lcd.begin (16,2) инициализира LCD.
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 Interrupts тук.
невалиден цикъл () { buttonState = digitalRead (buttonPin); ако (buttonState == HIGH) { apds.enableLightSensor (вярно); }
В следващата порция проверяваме за щифт на бутона. Ако е висока, стартирайте процеса за RGB сензор. След това проверете дали светлинният сензор отчита стойности или не. Ако не е в състояние да прочете стойностите, тогава в този случай отпечатайте „ Грешка при четене на светлинни стойности“. И ако тогава може да чете стойности, сравнете стойностите на трите цвята и кое от двете е най-високо, отпечатайте този цвят на LCD.
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 () е дефинирана в следващата част. Тази функция първо проверява за наличието на сензор за жестове. Ако е наличен, той чете стойностите на жеста и проверява кой жест е (НАГОРЕ, НАДОЛУ, НАДЯСНО, НАЛЯВО, ДАЛЕЧНО, НАБЛИЗНО) и отпечатва съответните стойности на LCD.
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 ("НАЛЯВО"); забавяне (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 секунди и я отстранете. А за близък жест дръжте ръката си далеч от сензора, след това я приближете и я махнете.
Сега включете бутона ВКЛЮЧЕН, за да го включите в режим на чувствителност на цветовете и вземете червени, сини и зелени предмети един по един близо до сензора. Той ще отпечата цвета на обекта.