- Необходимые компоненты
- Введение в цифровой бесконтактный RGB-датчик и датчик жестов APDS-9960
- Принципиальная электрическая схема
- Программирование Arduino для распознавания жестов и цвета
Сегодня большинство телефонов имеют функцию управления жестами, позволяющую открывать или закрывать любое приложение, запускать музыку, принимать участие в звонках и т. Д. Это очень удобная функция для экономии времени, а также управление любым устройством с помощью жестов. Ранее мы использовали акселерометр для создания робота, управляемого жестами, и воздушной мыши, управляемой жестами. Но сегодня мы учимся сопрягать датчик жестов APDS9960 с Arduino. Этот датчик также имеет датчик RGB для определения цветов, который также будет использоваться в этом руководстве. Таким образом, вам не нужно использовать отдельные датчики для определения жестов и цвета, хотя доступен специальный датчик для определения цвета - датчик цвета TCS3200, который мы уже использовали с Arduino для создания машины для сортировки цветов.
Необходимые компоненты
- Arduino UNO
- APDS9960 RGB и датчик жестов
- ЖК-дисплей 16x2
- DPDT переключатель
- 100 кОм и резистор 10 кОм
- Соединительные кабели
Введение в цифровой бесконтактный 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 подключаются к контактам A4 и A5 Arduino соответственно. Как было сказано ранее, рабочее напряжение датчика составляет 3,3 В, поэтому VCC и GND APDS9960 подключены к 3,3 В и GND Arduino. Вывод прерывания (INT) APDS9960 подключен к выводу D2 Arduino.
Для ЖК-дисплея контакты данных (D4-D7) подключены к цифровым контактам D6-D3 Arduino, а контакты RS и EN подключены к D6 и D7 Arduino. V0 ЖК-дисплея подключен к потенциометру, а потенциометр 100K используется для управления яркостью ЖК-дисплея. Для кнопок DPDT мы использовали всего 3 контакта. Второй вывод подключается к выводу D7 Arduino для ввода, а два других подключаются к GND и VCC, за которыми следует резистор 10 кОм.
Программирование Arduino для распознавания жестов и цвета
Часть программирования проста и легка, а полная программа с демонстрационным видео дана в конце этого руководства.
Для начала нам нужно установить библиотеку от Sparkfun. Чтобы установить эту библиотеку, перейдите в Sketch-> Include Library-> Manage Libraries.
Теперь в строке поиска введите «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 red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
В функции настройки первая строка предназначена для получения значения от кнопки (низкий / высокий), а вторая и третья строки определяют прерывание и вывод кнопки в качестве ввода. apds.init () инициализирует датчик APDS9960, а lcd.begin (16,2) инициализирует ЖК-дисплей.
пустая настройка () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, ВВОД); apds.init (); lcd.begin (16, 2); }
В петлевой функции первая строка получает значение от кнопки и сохраняет его в buttonState переменного, определенное ранее. Теперь в следующих строках мы проверяем значения с кнопки, если она высокая, мы включаем датчик освещенности, а если она низкая, то инициализируем датчик жестов.
AttachInterrupt () является функция используется для внешнего прерывания, которое в этом случае прерывание датчика. Первый аргумент в этой функции - номер прерывания. В Arduino UNO есть два цифровых контакта прерывания - 2 и 3, обозначенные INT.0 и INT.1. И мы подключили его к контакту 2, так что мы написали 0 там. Второй аргумент вызывает функцию interruptRoutine (), которая определена позже. Последний аргумент - ПАДЕНИЕ, так что он запускает прерывание, когда вывод переходит с высокого на низкий. Узнайте больше о прерываниях 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 { если (красный_свет> зеленый_свет) { если (красный_свет> синий_свет) { lcd.print ("Красный"); задержка (1000); lcd.clear (); } ……. ………..
В следующих строках снова проверьте наличие штифта кнопки, и если он низкий, обработайте датчик жестов. Затем проверьте isr_flag, и если он равен 1, то вызывается функция detachInterrupt () . Эта функция используется для отключения прерывания. Следующая строка вызывает handleGesture (), который определяется позже функцией. В следующих следующих строках задайте isr_flag равным нулю и присоедините прерывание.
иначе, если (buttonState == LOW) { если (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, ПАДЕНИЕ); } }
Далее идет функция interruptRoutine () . Эта функция используется для изменения значения переменной isr_flag на 1, чтобы можно было инициализировать службу прерывания.
void interruptRoutine (). { isr_flag = 1; }
Функция handleGesture () определяется в следующей части. Эта функция сначала проверяет наличие датчика жестов. Если он доступен, он считывает значения жестов и проверяет, какой это жест (ВВЕРХ, ВНИЗ, ВПРАВО, ВЛЕВО, ДАЛЕКО, РЯДОМ), и выводит соответствующие значения на ЖК-дисплей.
void handleGesture () { if (apds.isGestureAvailable ()) { переключатель (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); задержка (1000); lcd.clear (); сломать; case DIR_DOWN: lcd.print («ВНИЗ»); задержка (1000); lcd.clear (); сломать; case DIR_LEFT: lcd.print ("LEFT"); задержка (1000); lcd.clear (); сломать; case DIR_RIGHT: lcd.print ("ПРАВО"); задержка (1000); lcd.clear (); сломать; case DIR_NEAR: lcd.print ("NEAR"); задержка (1000); lcd.clear (); сломать; case DIR_FAR: lcd.print («ДАЛЬНИЙ»); задержка (1000); lcd.clear (); сломать; по умолчанию: lcd.print («НЕТ»); задержка (1000); lcd.clear (); } } }
Наконец, загрузите код в Arduino и дождитесь инициализации датчика. Теперь, когда кнопка выключена, это означает, что она находится в режиме жестов. Так что попробуйте двигать руками влево, вправо, вверх и вниз. Для дальнего жеста держите руку на расстоянии 2-4 дюйма от сенсора в течение 2-3 секунд и уберите ее. И рядом с жестом держать руку далеко от датчика затем принять его вблизи и удалить его.
Теперь включите кнопку, чтобы перевести ее в режим определения цвета и поочередно снимайте красные, синие и зеленые объекты рядом с датчиком. Он напечатает цвет объекта.