Satura rādītājs:

Nebloķējošs APDS9960 žestu sensora ieviešana: 5 soļi
Nebloķējošs APDS9960 žestu sensora ieviešana: 5 soļi

Video: Nebloķējošs APDS9960 žestu sensora ieviešana: 5 soļi

Video: Nebloķējošs APDS9960 žestu sensora ieviešana: 5 soļi
Video: How to use Arduino Gesture Sensor with Arduino | APDS9960 Sensor with Arduino Gesture Control DIY 2024, Jūlijs
Anonim
Nebloķējoša APDS9960 žestu sensora ieviešana
Nebloķējoša APDS9960 žestu sensora ieviešana
Nebloķējoša APDS9960 žestu sensora ieviešana
Nebloķējoša APDS9960 žestu sensora ieviešana
Nebloķējoša APDS9960 žestu sensora ieviešana
Nebloķējoša APDS9960 žestu sensora ieviešana

Preambula

Šajā pamācībā ir sīki aprakstīts, kā izveidot APDS9960 žestu sensora nebloķētu ieviešanu, izmantojot SparkFun_APDS-9960_Sensor_Arduino_Library.

Ievads

Tātad jūs droši vien jautājat sev, kas ir nebloķējošs? Vai pat bloķēt šajā jautājumā?

Vēl svarīgāk ir tas, kāpēc ir svarīgi, lai nekas netiktu bloķēts?

Labi, tāpēc, kad mikroprocesors palaiž programmu, tas secīgi izpilda koda rindas un, to darot, veic zvanus uz funkcijām un atgriežas no tām saskaņā ar to rakstīšanas secību.

Bloķējošs zvans ir tikai zvans uz jebkāda veida funkcionalitāti, kas izraisa izpildes apturēšanu, kas nozīmē funkcijas izsaukumu, kurā zvanītājs neatjaunos izpildi, kamēr izsauktās funkcijas izpilde nebūs pabeigta.

Tātad, kāpēc tas ir svarīgi?

Gadījumā, ja esat uzrakstījis kādu kodu, kam regulāri jāveic daudzas funkcijas, piemēram, jānolasa temperatūra, jāizlasa poga un jāatjaunina displejs, ja displeja atjaunināšanas kods ir bloķējošs zvans, jūsu sistēma nereaģēs uz pogas nospiešana un temperatūras izmaiņas, jo procesors visu laiku pavadīs, gaidot displeja atjaunināšanu un nelasot pogas statusu vai jaunāko temperatūru.

No savas puses es vēlos izveidot MQTT, izmantojot WiFi spējīgu IoT darbvirsmas ierīci, kas nolasa gan vietējās, gan attālinātās temperatūras/mitruma vērtības, apkārtējās gaismas līmeņus, barometrisko spiedienu, seko līdzi laikam, parāda visus šos parametrus LCD ekrānā, reģistrējas uSD karti reāllaikā, lasiet pogu ievadi, rakstiet izejas gaismas diodēm un uzraugiet žestus, lai kontrolētu lietas manā IoT infrastruktūrā, un to visu jākontrolē ar ESP8266-12.

Diemžēl vienīgie divi APDS9960 bibliotēkas avoti, kurus es varēju atrast, bija SparkFun un AdaFruit bibliotēkas, kas abas tika izvilktas no lietojumprogrammas koda no Avago (ADPS9960 ražotājs) un kurām ir zvans ar nosaukumu “readGesture”, kas satur kādu laiku (1) {}; cilpa, kas, lietojot iepriekšminētajā projektā, izraisa ESP8266-12E atiestatīšanu ikreiz, kad ADPS9960 sensors kļūst piesātināts (ti, kad objekts paliek tuvumā vai ja sensoru apgaismo cits IR avots).

Līdz ar to, lai atrisinātu šo uzvedību, es izvēlējos pārvietot žestu apstrādi uz otru procesoru, ar kuru ESP8266-12E kļuva par galveno mikrokontrolleri un šī sistēma par vergu, kā parādīts 1. un 2. attēlā, attiecīgi sistēmas pārskata un sistēmas sastāva diagrammās. 3. attēlā parādīta prototipa shēma.

Lai ierobežotu izmaiņas, kas man jāveic esošajā kodā, es arī uzrakstīju iesaiņojuma klasi/bibliotēku ar izdomātu nosaukumu “APDS9960_NonBlocking”.

Tālāk ir sniegts detalizēts nebloķējošā risinājuma skaidrojums.

Kādas daļas man vajag?

Ja vēlaties izveidot I2C risinājumu, kas darbojas ar bibliotēku APDS9960_NonBlocking, jums būs nepieciešamas šādas daļas.

  1. 1 atlaide no ATMega328P šeit
  2. 1 atlaide PCF8574P šeit
  3. Šeit ir 6 off 10K rezistori
  4. Šeit ir izslēgti 4K 1K rezistori
  5. 1 off 1N914 Diode here
  6. 1 off PN2222 NPN tranzistors šeit
  7. 1 izslēgts 16MHz kristāls šeit
  8. Šeit ir 2 izslēgti 0,1uF kondensatori
  9. 1 off 1000uF elektrolītiskais kondensators šeit
  10. 1 off 10uF elektrolītiskais kondensators šeit
  11. Šeit ir 2 izslēgti 22pF kondensatori

Ja vēlaties nolasīt žestu sensora izeju, izmantojot paralēlo saskarni, varat nomest PCF8574P un trīs izslēgtos 10K rezistorus.

Kāda programmatūra man ir nepieciešama?

Arduino IDE 1.6.9

Kādas prasmes man vajadzīgas?

Lai iestatītu sistēmu, izmantojiet avota kodu (iekļauts komplektā) un izveidojiet nepieciešamo shēmu, kas jums būs nepieciešama;

  • Minimāla elektronikas izpratne,
  • Zināšanas par Arduino un tā IDE,
  • Izpratne par to, kā programmēt iegulto Arduino (skatiet instrukciju “ATTiny85, ATTiny84 un ATMega328P programmēšana: Arduino kā ISP”)
  • Nedaudz pacietības.

Tēmas, uz kurām attiecas

  • Īss ķēdes pārskats
  • Īss pārskats par programmatūru
  • APDS9960 žestu uztveršanas ierīces pārbaude
  • Secinājums
  • Atsauces

1. darbība: shēmas pārskats

Ķēdes pārskats
Ķēdes pārskats

Ķēde ir sadalīta divās daļās;

  • Pirmais ir sērijveida I2C paralēlā pārveidošana, ko veic, izmantojot rezistorus R8… 10 un IC1. Šeit R8… R10 iestatiet I2C adresi 8 bitu I/O paplašinātāja mikroshēmai IC1 un NXP PCF8574A. Šīs ierīces derīgie adrešu diapazoni ir attiecīgi 0x38… 0x3F. I2C programmatūras piemērā, kas sniegts 'I2C_APDS9960_TEST.ino', #define GESTURE_SENSOR_I2C_ADDRESS būtu jāmaina, lai tas atbilstu šim adrešu diapazonam.
  • Visas pārējās sastāvdaļas veido Arduino Uno vergu, un tām ir šādas funkcijas;

    • R1, T1, R2 un D1 nodrošina vergu ierīces atiestatīšanas ieeju. Šeit aktīvs augsts impulss uz IC1 - P7 piespiedīs U1 atiestatīties.
    • R3, R4 ir strāvas ierobežošanas rezistori iegultajai ierīcei, kas programmē TX/RX līnijas.
    • C5 un R7 ļauj Arduino IDE automātiski programmēt U1, izmantojot impulsu pievienotās FTDI ierīces DTR līnijā.
    • R5 un R6 ir I2C pacelšanas rezistori APDS9960 ar C6, kas nodrošina vietējās piegādes sliedes atvienošanu.
    • U1, C1, C2 un Q1 veido iegulto Arduino Uno un attiecīgi pulksteni.
    • Visbeidzot, C3 un C4 nodrošina vietējo piegādes sliežu atvienošanu U1.

2. darbība: programmatūras pārskats

Programmatūras pārskats
Programmatūras pārskats
Programmatūras pārskats
Programmatūras pārskats
Programmatūras pārskats
Programmatūras pārskats

Preambula

Lai veiksmīgi apkopotu šo avota kodu, jums būs nepieciešamas šādas papildu bibliotēkas, lai ieprogrammētu iegulto Arduino Uno U1;

SparkFun_APDS9960.h

  • Autors: Stīvs Kvins
  • Mērķis: šī ir SparkFun APDS9960 sensora dakšveida versija, kas atdalīta no jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Tam ir dažas izmaiņas, lai palīdzētu atkļūdošanai, un tam ir sensibilizēts detektors, lai samazinātu nepatiesu iedarbināšanu.
  • No:

APDS9960_NonBlocking.h

  • Autors: Stīvs Kvins
  • Mērķis: Nodrošina tīru saskarni, lai iegultu šo APDS9960 žestu sensora nebloķējošo ieviešanu savā Arduino kodā.
  • No:

Skatiet šo pamācību, kā programmēt iegulto Arduino Uno (ATMega328P) mikrokontrolleri, ja neesat pazīstams, kā to sasniegt;

ATTINY85, ATTINY84 UN ATMEGA328P PROGRAMMĒŠANA: ARDUINO KĀ ISP

Funkcionālais pārskats

ATMega328P iegultais vergu mikrokontrolleris aptaujās INT līniju no ADPS9960. Kad šī līnija kļūst zema, mikrokontrolleris nolasa ADPS9960 reģistrus un nosaka, vai ir konstatēts derīgs žests. Ja ir konstatēts derīgs žests, šī žesta kods 0x0… 0x6, 0xF tiek ievietots portā B un tiek apgalvots, ka “nGestureAvailable” ir zems.

Kad galvenā ierīce redz, ka “nGestureAvailable” ir aktīva, tā nolasa porta B vērtību un pēc tam īslaicīgi impulsē “nGestureClear”, lai apstiprinātu datu saņemšanu.

Pēc tam vergu ierīce atceļ augstu vērtību “nGestureAvailable” un notīra datus portā B. Iepriekš 5. attēlā redzams ekrāna satvēriens, kas ņemts no loģikas analizatora pilna noteikšanas/lasīšanas cikla laikā.

Koda pārskats

Iepriekš redzamajā 1. attēlā ir sīki aprakstīts, kā darbojas U1 iebūvētā verga Arduino Uno programmatūra, kā arī 2. attēlā, kā abi fona/priekšplāna uzdevumi mijiedarbojas. 3. attēls ir koda segments, kurā aprakstīts, kā izmantot APDS9960_NonBlockinglibrary. 4. attēlā parādīta kartēšana starp Arduino Uno digitālajām tapām un faktiskajām ATMega328P aparatūras tapām.

Pēc atiestatīšanas iegultais vergu mikrokontrolleris inicializē APDS9960, ļaujot žestu noteikšanai aktivizēt tā INT izvadi, un konfigurē tā I/O, pievienojot pārtraukšanas pakalpojuma rutīnu (ISR) 'GESTURE_CLEAR ()', lai pārtrauktu vektoru INT0 (2. ciparu tapa, aparatūras IC 4. tapa), konfigurējot to krītošās malas sprūda iedarbināšanai. Tādējādi tiek veidota nGestureClear ievade no galvenās ierīces.

Pārtraukuma izejas tapa "INT" no APDS9960 ir savienota ar 4. ciparu tapu, aparatūras IC pin 6, kas ir konfigurēta kā U1 ievade.

Signāla līnija “nGestureAvailable” digitālajā 7. tapā, aparatūras IC 13. tapā ir konfigurēta kā izeja un iestatīta augsta, neaktīva (atcelta).

Visbeidzot, porta B biti 0… 3 attiecīgi tiek konfigurēti kā izejas un iestatīti zemi. Tie veido datu kodienu, kas attēlo dažādus atklātos žestu veidus; Nav = 0x0, kļūda = 0xF, augšup = 0x1, uz leju = 0x2, pa kreisi = 0x3, pa labi = 0x4, tuvu = 0x5 un tālu = 0x6.

Tiek plānots fona uzdevums “Loop”, kas nepārtraukti aptaujā APDS9960 pārtraukuma izvadi INT, nolasot 4. ciparu tapu. Kad INDS izeja no APDS9960 kļūst aktīva, norādot, ka sensors ir iedarbināts, mikrokontrolleris mēģina interpretēt jebkuru žestu, izsaucot “readGesture () 'ar to ir (1) {}; bezgalīga cilpa.

Ja ir konstatēts derīgs žests, šī vērtība tiek ierakstīta portā B, tiek apstiprināta izeja “nGestureAvailable” un iestatīts Būla semafors “bGestureAvailable”, neļaujot reģistrēt turpmākus žestus.

Kad meistars konstatē aktīvo “nGestureAvailable” izvadi, tas nolasa šo jauno vērtību un impulsē “nGestureClear” aktīvo zemo vērtību. Šī krītošā mala aktivizē priekšplāna uzdevuma “ISR GESTURE_CLEAR ()” ieplānošanu, apturot fona uzdevuma “Loop” izpildi, dzēšot portu B, “bGestureAvailable” semaforu un “nGestureAvailable” izvadi.

Priekšplāna uzdevums “GESTURE_CLEAR ()” tagad ir apturēts un fona uzdevums “Loop” ir ieplānots. Tagad var nojaust citus APDS9960 žestus.

Šādā veidā izmantojot pārtraukuma izraisītus priekšplāna/fona uzdevumus, iespējamā bezgalīgā cilpa “readGesture ()” vergu ierīcē neietekmēs galvenās ierīces darbību un netraucēs arī vergu ierīces izpildi. Tas veido ļoti vienkāršas reālā laika operētājsistēmas (RTOS) pamatu.

Piezīme. Prefikss “n” nozīmē aktīvu zemu vērtību vai apgalvojumu “nGestureAvailable”

3. darbība. Bloķējošās APDS9960 žestu uztveršanas ierīces pārbaude

Bloķējošās APDS9960 žestu uztveršanas ierīces pārbaude
Bloķējošās APDS9960 žestu uztveršanas ierīces pārbaude
Bloķējošās APDS9960 žestu uztveršanas ierīces pārbaude
Bloķējošās APDS9960 žestu uztveršanas ierīces pārbaude
Bloķējošās APDS9960 žestu uztveršanas ierīces pārbaude
Bloķējošās APDS9960 žestu uztveršanas ierīces pārbaude
Bloķējošās APDS9960 žestu uztveršanas ierīces pārbaude
Bloķējošās APDS9960 žestu uztveršanas ierīces pārbaude

Preambula

Lai gan APDS9960 modulis tiek piegādāts ar +5V, tas izmanto iebūvētu +3v3 regulatoru, kas nozīmē, ka I2C līnijas ir saderīgas ar +3v3, nevis +5v. Tāpēc es izvēlējos izmantot +3v3 saderīgu Arduino Due kā testa mikrokontrolleri, lai novērstu vajadzību pēc līmeņa pārslēdzējiem.

Tomēr, ja vēlaties izmantot faktisko Arduino Uno, jums ir jāpārvieto I2C līnijas uz U1. Skatiet šo pamācību, kurā esmu pievienojis noderīgu slaidu komplektu (I2C_LCD_With_Arduino), kas sniedz daudz praktisku padomu par I2C lietošanu.

I2C saskarnes pārbaude

1. un 2. attēlā parādīts, kā iestatīt un programmēt sistēmu I2C saskarnei. Vispirms jums būs jālejupielādē un jāinstalē bibliotēka APDS9960_NonBlocking. šeit

Paralēlās saskarnes pārbaude

3. un 4. attēlā paralēlā saskarne ir aprakstīta vienādi

4. solis. Secinājums

Secinājums
Secinājums

Vispārīgi

Kods darbojas labi un žestus uztver reaģējoši bez viltus pozitīviem. Tas ir izveidots un darbojas jau dažas nedēļas kā vergu ierīce manā nākamajā projektā. Esmu izmēģinājis daudzus dažādus kļūmju režīmus (un arī zinātkārais Quinn mājsaimniecības moggie), kas iepriekš izraisīja ESP8266-12 atiestatīšanu bez negatīvas ietekmes.

Iespējamie uzlabojumi

  • Acīmredzamais. Pārrakstiet APDS9960 žestu sensora bibliotēku, lai tā netiktu bloķēta.

    Patiesībā es sazinājos ar Broadcom, kurš mani nodeva vietējam izplatītājam, kurš nekavējoties ignorēja manu atbalsta pieprasījumu, es vienkārši neesmu SparkFun vai AdaFruit. Tāpēc, iespējams, būs jāgaida kādu laiku

  • Portējiet kodu uz mazāku vergu mikrokontrolleri. ATMega328P izmantošana vienam uzdevumam ir nedaudz pārspīlēta. Lai gan es sākotnēji apskatīju ATTiny84, pārtraucu to izmantot, jo man šķita, ka apkopotais koda izmērs atbilst robežlīnijai. Ar papildu pieskaitāmām izmaksām, kas jāmaina, lai APDS9960 bibliotēka darbotos ar citu I2C bibliotēku.

5. darbība: atsauces

Nepieciešams, lai ieprogrammētu iegulto arduino (ATMega328P - U1)

SparkFun_APDS9960.h

  • Autors: Stīvs Kvins
  • Mērķis: šī ir SparkFun APDS9960 sensora dakšveida versija, kas atdalīta no jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Tam ir dažas modifikācijas, kas palīdz atkļūdošanai, un tam ir sensibilizēts detektors, lai samazinātu nepatiesu iedarbināšanu.
  • No:

Nepieciešams, lai iegultu šo nebloķējošo funkciju savā arduino kodā un sniegtu piemērus

APDS9960_NonBlocking.h

  • Autors: Stīvs Kvins
  • Mērķis: Nodrošina tīru saskarni, lai iegultu šo APDS9960 žestu sensora nebloķējošo ieviešanu savā Arduino kodā.
  • No:

Reālā laika operētājsistēma

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

APDS9960 datu lapa

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

Ieteicams: