INHOUDSOPGAWE:

Nie -blokkerende APDS9960 implementering van gebaarsensors: 5 stappe
Nie -blokkerende APDS9960 implementering van gebaarsensors: 5 stappe

Video: Nie -blokkerende APDS9960 implementering van gebaarsensors: 5 stappe

Video: Nie -blokkerende APDS9960 implementering van gebaarsensors: 5 stappe
Video: Обзор модуля APDS 9960 | Датчик жестов 2024, Julie
Anonim
Nie -blokkerende implementering van APDS9960 gebaar sensor
Nie -blokkerende implementering van APDS9960 gebaar sensor
Nie -blokkerende implementering van APDS9960 gebaar sensor
Nie -blokkerende implementering van APDS9960 gebaar sensor
Nie -blokkerende implementering van APDS9960 gebaar sensor
Nie -blokkerende implementering van APDS9960 gebaar sensor

Aanhef

In hierdie instruksie word uiteengesit hoe u 'n nie-blokkerende implementering van die APDS9960 gebaar sensor kan skep met behulp van die SparkFun_APDS-9960_Sensor_Arduino_Library.

Inleiding

U vra uself dus waarskynlik af wat nie blokkeer nie? Of selfs blokkering vir die saak?

Belangriker nog, hoekom is dit belangrik om iets wat nie blokkeer nie, reg te hê?

Ok, as 'n mikroverwerker 'n program uitvoer, voer dit opeenvolgende reëls kode uit en skakel sodoende oproepe na funksies terug na die volgorde waarin u dit geskryf het.

'N Blokkerende oproep is slegs 'n oproep na enige funksie wat die uitvoering stop, wat 'n funksie -oproep beteken, waar die oproeper nie die uitvoering sal hervat totdat die oproepe voltooi is nie.

So hoekom is dit belangrik?

As u 'n kode geskryf het wat gereeld funksies opeenvolgend moet uitvoer, soos om 'n temperatuur te lees, 'n knoppie te lees en 'n skerm op te dateer, sou u stelsel nie reageer as die kode om die skerm op te dateer nie. druk op die knoppie en verander die temperatuur, aangesien die verwerker al die tyd spandeer om te wag totdat die skerm opgedateer word en nie die knoppiestatus of die nuutste temperatuur lees nie.

Van my kant wil ek 'n MQTT via WiFi -geskikte IoT -lessenaar -toestel skep wat beide plaaslike en afgeleë temp/humiditeitswaardes, omringende ligvlakke, barometriese druk, tyd volg, al hierdie parameters op 'n LCD vertoon, aanmeld by 'n uSD kaart in reële tyd, lees knoppie-insette, skryf na uitvoer-LED's en monitor gebare om dinge in my IoT-infrastruktuur te beheer en alles wat deur 'n ESP8266-12 beheer moet word.

Ongelukkig was die enigste twee bronne van die APDS9960 -biblioteek wat ek kon vind, die SparkFun- en AdaFruit -biblioteke, wat albei van die toepassingskode van Avago (die ADPS9960 -vervaardiger) verwyder is en 'n oproep met die naam 'readGesture' bevat, wat 'n rukkie bevat (1) {}; lus wat veroorsaak dat die ESP8266-12E, wanneer dit in die bogenoemde projek gebruik word, herstel wanneer die ADPS9960-sensor versadig raak (dit wil sê wanneer 'n voorwerp naby bly of daar 'n ander IR-bron die sensor verlig).

Gevolglik om hierdie gedrag op te los, het ek gekies om die verwerking van die gebare na 'n tweede verwerker te plaas, waardeur die ESP8266-12E die hoofmikrokontroleerder geword het en hierdie stelsel die slaaf, soos uitgebeeld in foto's 1 en 2 hierbo, onderskeidelik die stelseloorsig en stelselsamestelling diagramme. Foto 3 toon die prototipe kring.

Om die veranderinge wat ek aan my bestaande kode moes maak, te beperk, het ek ook 'n omslagklas/biblioteek met 'n verbeeldingryke naam 'APDS9960_NonBlocking' geskryf.

Hierna volg 'n gedetailleerde verduideliking van die oplossing wat nie blokkeer nie.

Watter onderdele het ek nodig?

As u die I2C -oplossing wat saam met die APDS9960_NonBlocking -biblioteek werk, wil bou, benodig u die volgende dele.

  1. 1 afslag op ATMega328P hier
  2. 1 afslag op PCF8574P hier
  3. 6 van 10K weerstande hier
  4. 4 af 1K weerstande hier
  5. 1 af 1N914 -diode hier
  6. 1 af PN2222 NPN Transistor hier
  7. 1 uit 16MHz kristal hier
  8. 2 af 0.1uF -kondensators hier
  9. 1 af 1000uF elektrolitiese kondensator hier
  10. 1 af 10uF elektrolitiese kondensator hier
  11. 2 af 22pF -kondensators hier

As u die uitvoer van die gebaarsensor via die parallelle koppelvlak wil lees, kan u die PCF8574P en drie 10K -weerstande laat val.

Watter sagteware het ek nodig?

Arduino IDE 1.6.9

Watter vaardighede het ek nodig?

Om die stelsel op te stel, gebruik die bronkode (verskaf) en skep die nodige stroombane; u benodig die volgende;

  • 'N minimale greep op elektronika,
  • Kennis van Arduino en sy IDE,
  • 'N Begrip van hoe om 'n ingebedde Arduino te programmeer (sien Instrueerbare' Programmering van ATTiny85, ATTiny84 en ATMega328P: Arduino As ISP ')
  • Bietjie geduld.

Onderwerpe gedek

  • Kort oorsig van die kring
  • Kort oorsig van die sagteware
  • Toets die APDS9960 gebaarwaarnemingsapparaat
  • Afsluiting
  • Verwysings

Stap 1: Kringoorsig

Kringoorsig
Kringoorsig

Die stroombaan is in twee afdelings verdeel;

  • Die eerste is die seriële I2C na parallelle omskakeling via weerstande R8 … 10 en IC1. Hier stel R8… R10 die I2C -adres vir die 8 bis I/O -uitbreidingskyfie IC1 en NXP PCF8574A in. Geldige adresreekse vir hierdie toestel is onderskeidelik 0x38 … 0x3F. In die voorbeeld van die I2C -sagteware, 'I2C_APDS9960_TEST.ino', moet '#define GESTURE_SENSOR_I2C_ADDRESS' verander word om by hierdie adresreeks te pas.
  • Alle ander komponente vorm 'n slaaf ingebedde Arduino Uno en het die volgende funksies;

    • R1, T1, R2 en D1 bied 'n terugvoerinvoer vir slawe -toestelle. Hier sal 'n aktiewe hoë polsslag op IC1 - P7 U1 dwing om terug te stel.
    • R3, R4, is stroombeperkende weerstande vir die ingebedde toestel wat TX/RX -lyne programmeer.
    • Met C5 en R7 kan die Arduino IDE U1 outomaties programmeer via 'n puls op die DTR -lyn van 'n aangehegte FTDI -toestel.
    • R5 en R6 is I2C -optrekweerstands vir die APDS9960, met C6 wat die ontkoppeling van die plaaslike spoor voorsien.
    • U1, C1, C2 en Q1 vorm onderskeidelik die ingebedde Arduino Uno en die klok.
    • Uiteindelik bied C3 en C4 plaaslike ontkoppeling van die toevoerrail vir U1.

Stap 2: Sagteware -oorsig

Sagteware Oorsig
Sagteware Oorsig
Sagteware Oorsig
Sagteware Oorsig
Sagteware Oorsig
Sagteware Oorsig

Aanhef

Om hierdie bronkode suksesvol saam te stel, benodig u die volgende ekstra biblioteke om die ingebedde Arduino Uno U1 te programmeer;

SparkFun_APDS9960.h

  • Deur: Steve Quinn
  • Doel: Dit is 'n gevurkte weergawe van die SparkFun APDS9960-sensor wat gevoer is van jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Dit het 'n paar wysigings om te help met ontfouting en het 'n ontgevoelige detektor om vals sneller te verminder.
  • Van:

APDS9960_NonBlocking.h

  • Deur: Steve Quinn
  • Doel: bied 'n skoon koppelvlak om hierdie nie-blokkerende implementering van die APDS9960 gebaarssensor in u Arduino-kode in te sluit.
  • Van:

Lees die volgende instruksies oor hoe om 'n ingebedde Arduino Uno (ATMega328P) mikrobeheerder te programmeer as u nie vertroud is met hoe om dit te bereik nie;

PROGRAMMERING VAN DIE ATTINY85, ATTINY84 EN ATMEGA328P: ARDUINO AS ISP

Funksionele oorsig

Die ATMega328P ingebedde slawe -mikrokontroleerder ondersoek die INT -lyn vanaf die ADPS9960. As hierdie lyn laag word, lees die mikrobeheerder die ADPS9960 -registers en bepaal of daar 'n geldige gebaar waargeneem is. As 'n geldige gebaar opgespoor is, word die kode vir hierdie gebaar 0x0 … 0x6, 0xF op poort B geplaas en 'nGestureAvailable' word laag beweer.

As 'nGestureAvailable' op die meester -toestel aktief is, lees dit die waarde op poort B, dan 'nGestureClear' tydelik laag om die ontvangs van die data te erken.

Die slaweapparaat maak dan 'nGestureAvailable' hoog en bevestig die data op poort B. Pic 5 hierbo toon 'n skermgreep wat uit 'n logiese ontleder geneem is tydens 'n volledige opsporing/lees siklus.

Kode Oorsig

Op foto 1 hierbo word uiteengesit hoe die sagteware in U1 die ingeslote slaaf Arduino Uno funksioneer, asook Pic 2 hoe die twee agtergrond-/voorgrondtake werk. Pic 3 is 'n kodesegment wat beskryf hoe u die APDS9960_NonBlockinglibrary kan gebruik. Pic 4 gee 'n kartering tussen Arduino Uno Digital Pins en werklike hardeware -penne op die ATMega328P.

Nadat die ingebedde slawe -mikrobeheerder herstel is, initialiseer die APDS9960 sodat gebaaropsporing sy INT -uitset kan aktiveer en die I/O daarvan kan konfigureer, en onderbreek diensroetine (ISR) 'GESTURE_CLEAR ()' om vektor INT0 te onderbreek (Digitale pen 2, Hardware IC -pen 4) Dit stel dit in vir 'n sneller met 'n valrand. Dit vorm die nGestureClear -invoer vanaf die meester -toestel.

Die Interrupt output pin 'INT' van die APDS9960 is gekoppel aan Digital Pin 4, Hardware IC Pin 6, wat as 'n invoer na U1 gekonfigureer is.

Die 'nGestureAvailable' seinlyn op Digitale pen 7, Hardware IC-pen 13 is as 'n uitset gekonfigureer en hoog, onaktief (de-beweer) gestel.

Uiteindelik word Port B bits 0… 3 onderskeidelik as uitsette gekonfigureer en laag gestel. Dit vorm die gegewens wat die verskillende tipes gebare wat opgespoor word voorstel; None = 0x0, Error = 0xF, Up = 0x1, Down = 0x2, Left = 0x3, Right = 0x4, Near = 0x5 and Far = 0x6.

Die agtergrondtaak 'Lus' word geskeduleer, wat die APDS9960 Interrupt -uitvoer INT deurlopend opspoor via die lees van digitale pen 4. As die INT -uitset van die APDS9960 aktief word, dui dit aan dat die sensor geaktiveer is, probeer die mikrokontroleerder om enige gebaar te interpreteer deur 'readGesture () 'met dit terwyl (1) {}; eindelose lus.

As 'n geldige gebaar opgespoor is, word hierdie waarde na poort B geskryf, die 'nGestureAvailable' uitset word bevestig en die booleaanse semafoor 'bGestureAvailable' gestel, wat verhoed dat verdere gebare aangemeld word.

Sodra die meester die aktiewe 'nGestureAvailable' uitset bespeur, lees hy hierdie nuwe waarde en pols 'nGestureClear' aktiewe laagtepunt. Hierdie dalende rand veroorsaak dat die voorgrondtaak 'ISR GESTURE_CLEAR ()' geskeduleer word om die uitvoering van die agtergrondtaak 'Loop' op te skort, deur poort B, 'bGestureAvailable' semafoor en 'nGestureAvailable' uitvoer uit te vee.

Die voorgrondtaak 'GESTURE_CLEAR ()' is nou opgeskort en die agtergrondtaak 'Lus' word weer geskeduleer. Verdere gebare van die APDS9960 kan nou waargeneem word.

Deur op hierdie manier onderbrekende voorgrond-/agtergrondtake te gebruik, beïnvloed die potensiële oneindige lus in 'readGesture ()' van die slave -toestel nie dat die meesterapparaat werk nie en belemmer dit ook nie die uitvoering van die slave -toestel nie. Dit vorm die basis van 'n baie eenvoudige intydse bedryfstelsel (RTOS).

Opmerking: die voorvoegsel 'n 'beteken aktief laag of beweer soos in' nGestureAvailable '

Stap 3: Toets die nie -blokkerende APDS9960 toestel vir gebaaropsporing

Toets die nie -blokkerende APDS9960 toestel vir gebaaropsporing
Toets die nie -blokkerende APDS9960 toestel vir gebaaropsporing
Toets die nie -blokkerende APDS9960 toestel vir gebaaropsporing
Toets die nie -blokkerende APDS9960 toestel vir gebaaropsporing
Toets die nie -blokkerende APDS9960 toestel vir gebaaropsporing
Toets die nie -blokkerende APDS9960 toestel vir gebaaropsporing
Toets die nie -blokkerende APDS9960 toestel vir gebaaropsporing
Toets die nie -blokkerende APDS9960 toestel vir gebaaropsporing

Aanhef

Alhoewel die APDS9960-module van +5v voorsien word, gebruik dit 'n ingeboude +3v3-reguleerder, wat beteken dat die I2C-lyne +3v3 voldoen en nie +5v nie. Daarom het ek gekies om die +3v3 -geskikte Arduino Due te gebruik as die toetsmikrokontroleerder om die behoefte aan vlakverskuiwers te vermy.

As u egter 'n werklike Arduino Uno wil gebruik, moet u die I2C -lyne na U1 gelyk skuif. Sien die volgende instruksies waar ek 'n nuttige skyfiestel (I2C_LCD_With_Arduino) aangeheg het, wat baie praktiese wenke gee oor die gebruik van I2C.

I2C -koppelvlaktoetsing

Foto's 1 en 2 hierbo wys hoe u die stelsel vir die I2C -koppelvlak instel en programmeer. U moet eers die APDS9960_NonBlocking -biblioteek aflaai en installeer. hier

Parallelle koppelvlak toets

Foto's 3 en 4 beskryf dieselfde vir die parallelle koppelvlak

Stap 4: Gevolgtrekking

Afsluiting
Afsluiting

Algemeen

Die kode werk goed en bespeur gebare responsief sonder enige vals positiewe. Dit is nou al 'n paar weke aan die gang as slawe -toestel in my volgende projek. Ek het verskillende mislukkingsmetodes probeer (en so ook die nuuskierige Quinn-huishouding), wat voorheen tot 'n ESP8266-12-herstel gelei het, sonder 'n negatiewe uitwerking.

Moontlike verbeterings

  • Die voor die hand liggend. Skryf die APDS9960 Gesture Sensor-biblioteek herskryf sodat dit nie blokkeer nie.

    Eintlik het ek met Broadcom gekontak, wat my na 'n plaaslike verspreider gestuur het, wat my versoek om ondersteuning onmiddellik geïgnoreer het; ek dink nie ek is 'n SparkFun of AdaFruit nie. So dit sal waarskynlik 'n rukkie moet wag

  • Gee die kode na 'n kleiner slaaf -mikrobeheerder. Om 'n ATMega328P vir een taak te gebruik, is 'n bietjie te veel. Alhoewel ek aanvanklik na die ATTiny84 gekyk het, het ek opgehou om een te gebruik, want ek het gevoel dat die saamgestelde grootte van die kode 'n grenslyn is. Met die ekstra koste om die APDS9960 -biblioteek te moet aanpas om met 'n ander I2C -biblioteek te werk.

Stap 5: Verwysings

Vereis om die ingebedde arduino (ATMega328P - U1) te programmeer

SparkFun_APDS9960.h

  • Deur: Steve Quinn
  • Doel: Dit is 'n gevurkte weergawe van die SparkFun APDS9960-sensor wat van jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library gevork is. Dit het 'n paar wysigings om te help met ontfouting en het 'n ontgevoelige detektor om vals sneller te verminder.
  • Van:

Dit is nodig om hierdie nie-blokkerende funksie in u arduino-kode in te sluit en voorbeelde te gee

APDS9960_NonBlocking.h

  • Deur: Steve Quinn
  • Doel: bied 'n skoon koppelvlak om hierdie nie-blokkerende implementering van die APDS9960 gebaarssensor in u Arduino-kode in te sluit.
  • Van:

Real -time bedryfstelsel

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

APDS9960 Gegevensblad

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

Aanbeveel: