Съдържание:

Неблокиращ сензор за жестове APDS9960 Реализация: 5 стъпки
Неблокиращ сензор за жестове APDS9960 Реализация: 5 стъпки

Видео: Неблокиращ сензор за жестове APDS9960 Реализация: 5 стъпки

Видео: Неблокиращ сензор за жестове APDS9960 Реализация: 5 стъпки
Видео: Набор Ардуино для начинающих 📟 с Алиэкспресс. Обзор набора модулей Arduino Unoдля обучения 2024, Юли
Anonim
Неблокираща реализация на сензор за жестове APDS9960
Неблокираща реализация на сензор за жестове APDS9960
Неблокираща реализация на сензор за жестове APDS9960
Неблокираща реализация на сензор за жестове APDS9960
Неблокираща реализация на сензор за жестове APDS9960
Неблокираща реализация на сензор за жестове APDS9960

Преамбюл

Тази инструкция описва как да създадете незаблокираща реализация на сензора за жестове APDS9960 с помощта на SparkFun_APDS-9960_Sensor_Arduino_Library.

Въведение

Значи вероятно се питате какво не блокира? Или дори блокиране по този въпрос?

По-важното е защо е важно да не блокирате нищо, нали?

Добре, така че когато микропроцесор изпълнява програма, той последователно изпълнява редове от код и по този начин прави извиквания и връща от функциите в реда, в който сте ги написали.

Блокиращо повикване е просто извикване към всякакъв вид функционалност, която причинява спиране на изпълнението, което означава извикване на функция, при което обаждащият се няма да възобнови изпълнението, докато извиканата функция не приключи изпълнението.

И така, защо това е важно?

В случай, че сте написали някакъв код, който трябва редовно да изпълнява много функции последователно, като например четене на температура, четене на бутон и актуализиране на дисплея, ако кодът за актуализиране на дисплея е блокиращо повикване, системата ви няма да реагира натискане на бутоните и промени в температурата, тъй като процесорът ще прекарва цялото си време в изчакване дисплея да се актуализира и да не чете състоянието на бутона или последната температура.

От моя страна искам да създам MQTT през Wi -Fi съвместимо IoT настолно устройство, което чете както локални, така и отдалечени стойности на температура/влажност, нива на околната светлина, барометрично налягане, следи времето, показва всички тези параметри на LCD, регистрира в usD карта в реално време, четене на входове с бутони, запис на изходни светодиоди и наблюдение на жестове за управление на нещата в моята IoT инфраструктура и всичко това да се контролира от ESP8266-12.

За съжаление единствените два източника на библиотека APDS9960, които успях да намеря, бяха библиотеките SparkFun и AdaFruit, и двете от които бяха извлечени от кода на приложението от Avago (производителя на ADPS9960) и притежават повикване, наречено ‘readGesture’, което съдържа известно време (1) {}; цикъл, който, когато се използва в горния проект, кара ESP8266-12E да се нулира, когато сензорът ADPS9960 стане наситен (т.е. когато обект остава в непосредствена близост или има друг източник на IR, осветяващ сензора).

В резултат на това, за да разреша това поведение, избрах да преместя обработката на жестовете към втори процесор, при което ESP8266-12E стана главен микроконтролер, а тази система подчинена, както е показано на Pics 1 & 2 по-горе, диаграми System Overview и System Composition съответно. Снимка 3 показва прототипната схема.

За да огранича промените, които трябваше да направя в съществуващия си код, аз също написах клас/библиотека на обвивка с въображение, наречен „APDS9960_NonBlocking“.

Следва подробно обяснение на неблокиращото решение.

Какви части ми трябват?

Ако искате да конструирате решението I2C, което работи с библиотеката APDS9960_NonBlocking, ще ви трябват следните части.

  1. 1 от ATMega328P тук
  2. 1 от PCF8574P тук
  3. 6 от 10K резистори тук
  4. 4 от 1K резистори тук
  5. 1 от 1N914 диод тук
  6. 1 от PN2222 NPN транзистор тук
  7. 1 от 16MHz кристал тук
  8. 2 от 0,1uF кондензатори тук
  9. 1 от 1000uF електролитен кондензатор тук
  10. 1 от 10uF електролитен кондензатор тук
  11. 2 от 22pF кондензатори тук

Ако искате да прочетете изхода на сензора за жестове през паралелния интерфейс, тогава можете да пуснете PCF8574P и три изключени 10K резистора.

Какъв софтуер ми трябва?

Arduino IDE 1.6.9

Какви умения са ми необходими?

За да настроите системата, използвайте изходния код (предоставен) и създайте необходимата схема, ще ви трябва следното;

  • Минимално разбиране на електрониката,
  • Познаване на Arduino и неговата IDE,
  • Разбиране за това как да програмирате вграден Arduino (вижте инструкции „Програмиране на ATTiny85, ATTiny84 и ATMega328P: Arduino като ISP“)
  • Малко търпение.

Обхванати теми

  • Кратък преглед на веригата
  • Кратък преглед на софтуера
  • Тестване на APDS9960 Gesture Sensing Device
  • Заключение
  • Препратки

Стъпка 1: Преглед на веригата

Преглед на веригата
Преглед на веригата

Веригата е разделена на две секции;

  • Първият е последователното преобразуване I2C в паралелно, осъществено чрез резистори R8 … 10 и IC1. Тук R8… R10 задават I2C адреса за 8 -битовия I/O разширителен чип 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“и изчиства данните на порт В. На снимка 5 по-горе е показан екран, взет от логически анализатор по време на пълен цикъл на откриване/четене.

Преглед на кода

Снимка 1 по -горе описва как софтуерът в U1 вграденият подчинен Arduino Uno функционира, заедно със снимка 2 как взаимодействат двете задачи на заден план/преден план. Снимка 3 е кодов сегмент, описващ как да използвате APDS9960_NonBlockinglibrary. Снимка 4 дава картиране между цифровите пинове на Arduino Uno и действителните хардуерни пинове на ATMega328P.

След нулиране вграденият подчинен микроконтролер инициализира APDS9960, което позволява откриването на жестове да задейства своя INT изход и конфигурира неговия I/O, като прикрепя рутинната услуга за прекъсване (ISR) „GESTURE_CLEAR ()“, за да прекъсне вектора INT0 (цифров извод 2, хардуерен IC пин 4), конфигурирайки го за спусък на падащ ръб. Това формира входа nGestureClear от главното устройство.

Изходният щифт за прекъсване „INT“от APDS9960 е свързан към цифров пин 4, хардуерен IC пин 6, който е конфигуриран като вход към U1.

Сигналната линия „nGestureAvailable“на цифров пин 7, хардуерен IC пин 13 е конфигурирана като изход и зададена висока, неактивна (отхвърлена).

И накрая, битове на порт B 0… 3 съответно се конфигурират като изходи и се задават ниски. Те образуват хапката с данни, която представлява различните открити типове жестове; Няма = 0x0, грешка = 0xF, нагоре = 0x1, надолу = 0x2, наляво = 0x3, надясно = 0x4, близо = 0x5 и далече = 0x6.

Планира се фоновата задача „Loop“, която непрекъснато анкетира APDS9960 Interrupt output INT чрез четене на Digital Pin 4. Когато INT изходът от APDS9960 стане активен на ниско ниво, което показва, че сензорът е задействан, микроконтролерът се опитва да интерпретира всеки жест, като извика „readGesture () 'with it while (1) {}; безкраен цикъл.

Ако е открит валиден жест, тази стойност се записва в Порт B, изходът „nGestureAvailable“се потвърждава и се задава логическият семафор „bGestureAvailable“, предотвратявайки регистрирането на допълнителни жестове.

След като капитанът открие активния изход „nGestureAvailable“, той чете тази нова стойност и пулсира „nGestureClear“активно ниско. Този падащ ръб задейства планирането на задачата на преден план „ISR GESTURE_CLEAR ()“, която спира изпълнението на фоновата задача „Цикъл“, изчистване на порт B, семафор „bGestureAvailable“и „nGestureAvailable“изход.

Задачата на преден план „GESTURE_CLEAR ()“вече е спряна и фоновата задача „Цикъл“е преназначена. Вече могат да се усетят допълнителни жестове от APDS9960.

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

Забележка: Префиксът 'n' означава активен нисък или утвърден като в 'nGestureAvailable'

Стъпка 3: Тестване на неблокиращото устройство за разпознаване на жестове APDS9960

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

Преамбюл

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

Ако обаче искате да използвате действителен Arduino Uno, тогава ще трябва да изместите нивата на I2C линиите към U1. Вижте следното Instructable, където съм приложил полезен набор от слайдове (I2C_LCD_With_Arduino), който дава много практически съвети за използването на I2C.

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

Снимки 1 и 2 по -горе показват как да настроите и програмирате системата за I2C интерфейса. Първо ще трябва да изтеглите и инсталирате библиотеката APDS9960_NonBlocking. тук

Паралелно тестване на интерфейс

Снимки 3 и 4 описват същото за интерфейса Parallel

Стъпка 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

Препоръчано: