Оглавление:

Внедрение неблокирующего датчика жестов APDS9960: 5 шагов
Внедрение неблокирующего датчика жестов APDS9960: 5 шагов

Видео: Внедрение неблокирующего датчика жестов APDS9960: 5 шагов

Видео: Внедрение неблокирующего датчика жестов APDS9960: 5 шагов
Видео: Неблокирующий TCP сервер на java (NIO) 2024, Ноябрь
Anonim
Реализация неблокирующего датчика жестов APDS9960
Реализация неблокирующего датчика жестов APDS9960
Реализация неблокирующего датчика жестов APDS9960
Реализация неблокирующего датчика жестов APDS9960
Реализация неблокирующего датчика жестов APDS9960
Реализация неблокирующего датчика жестов APDS9960

Преамбула

В этом руководстве подробно описано, как создать неблокирующую реализацию датчика жестов APDS9960 с помощью SparkFun_APDS-9960_Sensor_Arduino_Library.

Вступление

Вы, наверное, спрашиваете себя, что такое неблокирование? Или даже блокировку в этом отношении?

Что еще более важно, почему важно, чтобы что-нибудь не блокировало правильно?

Итак, когда микропроцессор запускает программу, он последовательно выполняет строки кода и при этом вызывает и возвращает функции в соответствии с порядком, в котором вы их написали.

Блокирующий вызов - это просто вызов любой функции, которая вызывает остановку выполнения, то есть вызов функции, при котором вызывающий не возобновит выполнение, пока вызываемая функция не завершит выполнение.

Так почему это важно?

В случае, если вы написали некоторый код, который должен регулярно выполнять множество функций последовательно, таких как считывание температуры, чтение кнопки и обновление дисплея, если код для обновления дисплея является блокирующим вызовом, ваша система не будет реагировать на нажатие кнопки и изменение температуры, так как процессор будет проводить все свое время в ожидании обновления дисплея и не считывать состояние кнопки или последнюю температуру.

Со своей стороны, я хочу создать настольное IoT-устройство с поддержкой MQTT через Wi-Fi, которое считывает как локальные, так и удаленные значения температуры / влажности, уровни внешней освещенности, барометрическое давление, отслеживает время, отображает все эти параметры на ЖК-дисплее, ведет журнал в USB карта в реальном времени, считывание входов кнопок, запись на выходные светодиоды и жесты монитора для управления объектами в моей инфраструктуре IoT, и все это должно управляться ESP8266-12.

К сожалению, единственными двумя источниками библиотеки APDS9960, которые я смог найти, были библиотеки SparkFun и AdaFruit, обе взяты из кода приложения от Avago (производитель ADPS9960) и имеют вызов с именем «readGesture», который содержит while (1) {}; петля, которая при использовании в вышеупомянутом проекте приводит к сбросу ESP8266-12E всякий раз, когда датчик ADPS9960 становится насыщенным (например, когда объект остается в непосредственной близости или когда датчик освещается другим источником ИК-излучения).

Следовательно, чтобы решить эту проблему, я решил перенести обработку жестов на второй процессор, в результате чего ESP8266-12E стал главным микроконтроллером, а эта система - ведомым устройством, как показано на рисунках 1 и 2 выше, схемах обзора системы и состава системы соответственно.. На рис. 3 показан прототип схемы.

Чтобы ограничить изменения, которые мне нужно было внести в существующий код, я также написал класс-оболочку / библиотеку с творческим названием «APDS9960_NonBlocking».

Ниже приводится подробное объяснение неблокирующего решения.

Какие запчасти мне нужны?

Если вы хотите создать решение I2C, которое работает с библиотекой APDS9960_NonBlocking, вам потребуются следующие части.

  1. 1 на ATMega328P здесь
  2. 1 от PCF8574P здесь
  3. 6 резисторов 10 кОм здесь
  4. 4 резистора 1 кОм здесь
  5. 1 шт. Диод 1N914 здесь
  6. 1 транзистор PN2222 NPN здесь
  7. 1 кристалл 16 МГц здесь
  8. 2 конденсатора 0,1 мкФ здесь
  9. 1 электролитический конденсатор емкостью 1000 мкФ здесь
  10. 1 электролитический конденсатор емкостью 10 мкФ здесь
  11. 2 конденсатора 22 пФ здесь

Если вы хотите считывать выходные данные датчика жестов через параллельный интерфейс, вы можете отказаться от PCF8574P и трех резисторов по 10 кОм.

Какое программное обеспечение мне нужно?

IDE Arduino 1.6.9

Какие навыки мне нужны?

Для настройки системы используйте исходный код (прилагается) и создайте необходимую схему, вам понадобится следующее;

  • Минимальное владение электроникой,
  • Знание Arduino и его IDE,
  • Понимание того, как программировать встроенный Arduino (см. Инструкции «Программирование ATTiny85, ATTiny84 и ATMega328P: Arduino как ISP»)
  • Немного терпения.

Темы охватывали

  • Краткий обзор схемы
  • Краткий обзор программы
  • Тестирование устройства распознавания жестов APDS9960
  • Заключение
  • использованная литература

Шаг 1: Обзор схемы

Обзор схемы
Обзор схемы

Схема разделена на две части;

  • Первый - это преобразование последовательного I2C в параллельное, осуществляемое через резисторы R8… 10 и IC1. Здесь R8… R10 устанавливает адрес I2C для 8-битной микросхемы расширения ввода / вывода IC1 и NXP PCF8574A. Допустимые диапазоны адресов для этого устройства: 0x38… 0x3F соответственно. В представленном примере программного обеспечения I2C "I2C_APDS9960_TEST.ino" необходимо изменить #define GESTURE_SENSOR_I2C_ADDRESS для соответствия этому диапазону адресов.
  • Все остальные компоненты образуют встроенный подчиненный Arduino Uno и выполняют следующие функции:

    • R1, T1, R2 и D1 обеспечивают вход сброса ведомого устройства. Здесь активный импульс высокого уровня на IC1 - P7 заставит U1 сброситься.
    • R3, R4 - токоограничивающие резисторы для программирования линий TX / RX встроенного устройства.
    • C5 и R7 позволяют Arduino IDE автоматически программировать U1 с помощью импульса на линии DTR подключенного устройства FTDI.
    • R5 и R6 - это подтягивающие резисторы I2C для APDS9960, при этом C6 обеспечивает развязку местной шины питания.
    • U1, C1, C2 и Q1 образуют встроенный Arduino Uno и его часы соответственно.
    • Наконец, C3 и C4 обеспечивают местную развязку шины питания для U1.

Шаг 2: Обзор программного обеспечения

Обзор программного обеспечения
Обзор программного обеспечения
Обзор программного обеспечения
Обзор программного обеспечения
Обзор программного обеспечения
Обзор программного обеспечения

Преамбула

Для успешной компиляции этого исходного кода вам потребуются следующие дополнительные библиотеки для программирования встроенного Arduino Uno U1;

SparkFun_APDS9960.h

  • Автор: Стив Куинн
  • Назначение: это разветвленная версия датчика SparkFun APDS9960, созданная на основе jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. В него внесено несколько модификаций, помогающих с отладкой, и есть десенсибилизированный детектор для уменьшения ложного срабатывания.
  • Источник:

APDS9960_NonBlocking.h

  • Автор: Стив Куинн
  • Цель: предоставляет чистый интерфейс для встраивания этой неблокирующей реализации датчика жестов APDS9960 в ваш код Arduino.
  • От:

См. Следующие инструкции по программированию встроенного микроконтроллера Arduino Uno (ATMega328P), если вы не знаете, как этого добиться;

ПРОГРАММИРОВАНИЕ ATTINY85, ATTINY84 И ATMEGA328P: ARDUINO КАК ISP

Функциональный обзор

Встроенный подчиненный микроконтроллер ATMega328P опрашивает линию INT от ADPS9960. Когда эта линия становится низкой, микроконтроллер считывает регистры ADPS9960 и определяет, был ли обнаружен действительный жест. Если допустимый жест был обнаружен, код для этого жеста 0x0… 0x6, 0xF помещается в порт B, и для nGestureAvailable устанавливается низкий уровень.

Когда ведущее устройство видит, что «nGestureAvailable» активен, оно считывает значение на порте B, а затем временно генерирует низкий уровень «nGestureClear», чтобы подтвердить получение данных.

Затем ведомое устройство сбрасывает высокий уровень nGestureAvailable и очищает данные в порту B. На рис. 5 выше показан снимок экрана, сделанный логическим анализатором во время полного цикла обнаружения / чтения.

Обзор кода

На рис. 1 выше показано, как работает программное обеспечение в U1, встроенном подчиненном устройстве Arduino Uno, а на рис. 2 - как взаимодействуют две задачи фоновый / передний план. Рис 3 - это фрагмент кода, описывающий, как использовать APDS9960_NonBlockinglibrary. На рис. 4 показано сопоставление цифровых выводов Arduino Uno и реальных аппаратных выводов ATMega328P.

После сброса встроенный подчиненный микроконтроллер инициализирует APDS9960, позволяя обнаружению жестов запускать его выход INT и настраивает его ввод / вывод, присоединяя процедуру обслуживания прерывания (ISR) 'GESTURE_CLEAR ()' к вектору прерывания INT0 (цифровой вывод 2, вывод 4 аппаратной ИС), настроив его для триггера по спадающему фронту. Это формирует ввод nGestureClear от ведущего устройства.

Вывод прерывания «INT» APDS9960 подключен к цифровому выводу 4, вывод 6 аппаратной IC, который сконфигурирован как вход для U1.

Линия сигнала nGestureAvailable на цифровом выводе 7, вывод 13 аппаратной ИС настроена как выход и установлена на высокий уровень, неактивна (отключена).

Наконец, биты 0… 3 порта B соответственно конфигурируются как выходы и устанавливаются в низкий уровень. Они формируют полубайт данных, который представляет различные обнаруженные типы жестов; Нет = 0x0, Error = 0xF, Up = 0x1, Down = 0x2, Left = 0x3, Right = 0x4, Near = 0x5 и Far = 0x6.

Планируется фоновая задача «Loop», которая непрерывно опрашивает выход прерывания APDS9960 через считывание цифрового вывода 4. Когда выход INT APDS9960 становится активным низким уровнем, указывающим на срабатывание датчика, микроконтроллер пытается интерпретировать любой жест, вызывая «readGesture () 'с ним while (1) {}; бесконечный цикл.

Если допустимый жест был обнаружен, это значение записывается в порт B, утверждается вывод «nGestureAvailable» и устанавливается логический семафор «bGestureAvailable», предотвращая регистрацию любых дальнейших жестов.

Как только мастер обнаруживает активный выход nGestureAvailable, он считывает это новое значение и генерирует низкий активный уровень nGestureClear. Этот задний фронт запускает задачу переднего плана ISR GESTURE_CLEAR (), которая будет запланирована, приостанавливая выполнение фоновой задачи Loop, очищая порт B, семафор bGestureAvailable и вывод nGestureAvailable.

Задача переднего плана «GESTURE_CLEAR ()» теперь приостановлена, а фоновая задача «Цикл» переназначена. Теперь можно уловить дальнейшие жесты APDS9960.

Таким образом, используя запускаемые прерыванием задачи переднего плана / фона, потенциальный бесконечный цикл в readGesture () ведомого устройства не повлияет на работу ведущего устройства и не будет препятствовать работе ведомого устройства. Это составляет основу очень простой операционной системы реального времени (RTOS).

Примечание: префикс 'n' означает активный низкий уровень или утверждается, как в 'nGestureAvailable'.

Шаг 3. Тестирование неблокирующего устройства распознавания жестов APDS9960

Тестирование неблокирующего устройства распознавания жестов APDS9960
Тестирование неблокирующего устройства распознавания жестов APDS9960
Тестирование неблокирующего устройства распознавания жестов APDS9960
Тестирование неблокирующего устройства распознавания жестов APDS9960
Тестирование неблокирующего устройства распознавания жестов APDS9960
Тестирование неблокирующего устройства распознавания жестов APDS9960
Тестирование неблокирующего устройства распознавания жестов APDS9960
Тестирование неблокирующего устройства распознавания жестов APDS9960

Преамбула

Несмотря на то, что модуль APDS9960 поставляется с напряжением + 5В, он использует встроенный регулятор + 3v3, что означает, что его линии I2C соответствуют + 3v3, а не + 5v. Вот почему я решил использовать Arduino Due, совместимый с + 3v3, в качестве тестового микроконтроллера, чтобы избежать необходимости в переключателях уровня.

Однако, если вы хотите использовать настоящую Arduino Uno, вам нужно будет сместить линии I2C на U1. См. Следующую инструкцию, в которой я приложил полезный набор слайдов (I2C_LCD_With_Arduino), который дает множество практических советов по использованию I2C.

Тестирование интерфейса I2C

На рисунках 1 и 2 выше показано, как настроить и запрограммировать систему для интерфейса I2C. Сначала вам нужно будет загрузить и установить библиотеку APDS9960_NonBlocking. здесь

Тестирование параллельного интерфейса

На рисунках 3 и 4 показано то же самое для параллельного интерфейса.

Шаг 4: Заключение

Заключение
Заключение

Общий

Код работает хорошо и быстро распознает жесты без ложных срабатываний. Он работает уже несколько недель как подчиненное устройство в моем следующем проекте. Я пробовал много разных режимов отказа (как и любознательный домашний маги Куинн), которые ранее приводили к сбросу ESP8266-12 без отрицательного эффекта.

Возможные улучшения

  • Очевидное. Перепишите библиотеку датчика жестов APDS9960, чтобы она не блокировала.

    На самом деле я действительно связывался с Broadcom, который направил меня к местному дистрибьютору, который сразу же проигнорировал мою просьбу о поддержке. Думаю, я просто не SparkFun или AdaFruit. Так что, вероятно, придется немного подождать

  • Перенесите код на подчиненный микроконтроллер меньшего размера. Использование ATMega328P для одной задачи - это немного излишне. Хотя я изначально смотрел на ATTiny84, я не стал использовать его, так как чувствовал, что скомпилированный размер кода соответствует границе. С дополнительными накладными расходами, связанными с необходимостью изменения библиотеки APDS9960 для работы с другой библиотекой I2C.

Шаг 5: ссылки

Требуется для программирования встроенного arduino (ATMega328P - U1)

SparkFun_APDS9960.h

  • Автор: Стив Куинн
  • Назначение: это разветвленная версия датчика SparkFun APDS9960, созданная на основе jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Он имеет несколько модификаций, помогающих с отладкой, и имеет десенсибилизированный детектор для уменьшения ложного срабатывания.
  • Источник:

Требуется для встраивания этой неблокирующей функции в ваш код Arduino и предоставления рабочих примеров

APDS9960_NonBlocking.h

  • Автор: Стив Куинн
  • Цель: предоставляет чистый интерфейс для встраивания этой неблокирующей реализации датчика жестов APDS9960 в ваш код Arduino.
  • От:

Операционная система реального времени

https://en.wikipedia.org/wiki/Real-time_operating_system

APDS9960 Лист данных

https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf

Рекомендуемые: