Innholdsfortegnelse:

Gjennomføring av ikke -blokkerende APDS9960 gestsensor: 5 trinn
Gjennomføring av ikke -blokkerende APDS9960 gestsensor: 5 trinn

Video: Gjennomføring av ikke -blokkerende APDS9960 gestsensor: 5 trinn

Video: Gjennomføring av ikke -blokkerende APDS9960 gestsensor: 5 trinn
Video: 1986 Range Rover; Will it start? - Edd China's Workshop Diaries 2024, Juli
Anonim
Implementering av ikke -blokkerende APDS9960 gestsensor
Implementering av ikke -blokkerende APDS9960 gestsensor
Implementering av ikke -blokkerende APDS9960 gestsensor
Implementering av ikke -blokkerende APDS9960 gestsensor
Implementering av ikke -blokkerende APDS9960 gestsensor
Implementering av ikke -blokkerende APDS9960 gestsensor

Innledning

Denne instruksen beskriver hvordan du oppretter en ikke-blokkerende implementering av APDS9960 Gesture Sensor ved hjelp av SparkFun_APDS-9960_Sensor_Arduino_Library.

Introduksjon

Så du spør deg selv hva som ikke blokkerer? Eller til og med blokkere for den saks skyld?

Enda viktigere, hvorfor er det viktig å ha noe som ikke blokkerer riktig?

Ok, så når en mikroprosessor kjører et program, kjører den sekvensielt kodelinjer og ringer til funksjonene i henhold til rekkefølgen du skrev dem i.

Et blokkerende anrop er bare et anrop til enhver form for funksjonalitet som forårsaker stopp av utførelsen, noe som betyr et funksjonsanrop der den som ringer ikke vil gjenoppta utførelsen før den oppkalte funksjonen er fullført.

Så hvorfor er dette viktig?

I tilfellet der du har skrevet noen kode som regelmessig må utføre mange funksjoner i rekkefølge, for eksempel å lese en temperatur, lese en knapp og oppdatere en skjerm, hvis koden for å oppdatere skjermen er et blokkerende anrop, reagerer systemet ikke på knappetrykk og temperaturendringer, ettersom prosessoren vil bruke all sin tid på å vente på at skjermen skal oppdateres og ikke lese knappestatus eller siste temperatur.

For min del vil jeg lage en MQTT over WiFi -kompatibel IoT -stasjonær enhet som leser både lokale og eksterne temp/fuktighetsverdier, omgivelseslysnivåer, barometrisk trykk, holder oversikt over tid, viser alle disse parametrene på en LCD, logger på en uSD kort i sanntid, lese knappinnganger, skrive til utgangs-LED og overvåke bevegelser for å kontrollere ting i min IoT-infrastruktur og som alle skal kontrolleres av en ESP8266-12.

Dessverre var de eneste to kildene til APDS9960 -biblioteket jeg kunne finne SparkFun og AdaFruit -bibliotekene, som begge ble dratt fra applikasjonskoden fra Avago (ADPS9960 -produsenten) og har et anrop med navnet ‘readGesture’ som inneholder en stund (1) {}; sløyfe som ved bruk i prosjektet ovenfor får ESP8266-12E til å tilbakestille hver gang ADPS9960-sensoren ble mettet (dvs. når et objekt forble i nærheten, eller det var en annen IR-kilde som belyste sensoren).

Følgelig for å løse denne oppførselen valgte jeg å flytte behandlingen av bevegelsene til en andre prosessor hvorved ESP8266-12E ble hovedmikrokontrolleren og dette systemet slave, som vist på bildene 1 og 2 ovenfor, henholdsvis systemoversikten og systemkomposisjonen.. Bilde 3 viser prototypekretsen.

For å begrense endringene jeg måtte gjøre i min eksisterende kode, skrev jeg også en innpakningsklasse/et bibliotek fantasifullt kalt 'APDS9960_NonBlocking'.

Det som følger er en detaljert forklaring av løsningen som ikke blokkerer.

Hvilke deler trenger jeg?

Hvis du vil konstruere I2C -løsningen som fungerer med APDS9960_NonBlocking -biblioteket, trenger du følgende deler.

  1. 1 av ATMega328P her
  2. 1 av PCF8574P her
  3. 6 av 10K motstander her
  4. 4 av 1K motstander her
  5. 1 av 1N914 Diode her
  6. 1 av PN2222 NPN Transistor her
  7. 1 av 16MHz krystall her
  8. 2 av 0.1uF kondensatorer her
  9. 1 av 1000uF elektrolytkondensator her
  10. 1 av 10uF elektrolytkondensator her
  11. 2 av 22pF kondensatorer her

Hvis du vil lese gest -sensorutgangen via det parallelle grensesnittet, kan du slippe PCF8574P og tre av 10K -motstander.

Hvilken programvare trenger jeg?

Arduino IDE 1.6.9

Hvilke ferdigheter trenger jeg?

For å sette opp systemet, bruk kildekoden (følger med) og opprett den nødvendige kretsen du trenger følgende;

  • Et minimalt grep om elektronikk,
  • Kunnskap om Arduino og dens IDE,
  • En forståelse av hvordan du programmerer en innebygd Arduino (Se Instruerbar 'Programmering av ATTiny85, ATTiny84 og ATMega328P: Arduino As ISP')
  • Litt tålmodighet.

Emner dekket

  • Kort oversikt over kretsen
  • Kort oversikt over programvaren
  • Tester APDS9960 Gesture Sensing Device
  • Konklusjon
  • Referanser

Trinn 1: Kretsoversikt

Kretsoversikt
Kretsoversikt

Kretsen er delt inn i to seksjoner;

  • Den første er den serielle I2C til parallell konvertering oppnådd via motstandene R8 … 10 og IC1. Her satte R8 … R10 I2C -adressen for 8 -bits I/O -ekspanderbrikken IC1 og en NXP PCF8574A. Gyldige adresseområder for denne enheten er henholdsvis 0x38 … 0x3F. I I2C -programvareeksemplet som følger med 'I2C_APDS9960_TEST.ino', må #define GESTURE_SENSOR_I2C_ADDRESS endres for å passe til dette adresseområdet.
  • Alle andre komponenter danner en slave innebygd Arduino Uno og har følgende funksjoner;

    • R1, T1, R2 og D1 gir inngang for tilbakestilling av slaveenhet. Her vil en aktiv høy puls på IC1 - P7 tvinge U1 til å tilbakestille.
    • R3, R4, er strømbegrensende motstander for den innebygde enheten som programmerer TX/RX -linjer.
    • C5 og R7 lar Arduino IDE automatisk programmere U1 via en puls på DTR -linjen til en tilkoblet FTDI -enhet.
    • R5 og R6 er I2C opptrekkmotstander for APDS9960 med C6 som gir lokal frakobling av forsyningsskinne.
    • U1, C1, C2 og Q1 danner henholdsvis den innebygde Arduino Uno og klokken.
    • Endelig gir C3 og C4 lokal frakobling av forsyningsskinne for U1.

Trinn 2: Oversikt over programvare

Oversikt over programvare
Oversikt over programvare
Oversikt over programvare
Oversikt over programvare
Oversikt over programvare
Oversikt over programvare

Innledning

For å lykkes med å kompilere denne kildekoden trenger du følgende ekstra biblioteker for å programmere den innebygde Arduino Uno U1;

SparkFun_APDS9960.h

  • Av: Steve Quinn
  • Formål: Dette er en gaffelversjon av SparkFun APDS9960-sensoren gaffelt fra jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Den har noen få modifikasjoner for å hjelpe med feilsøking og har en de-sensitiv detektor for å redusere falsk utløsning.
  • Fra:

APDS9960_NonBlocking.h

  • Av: Steve Quinn
  • Formål: Gir et rent grensesnitt for å bygge inn denne ikke-blokkerende implementeringen av APDS9960 Gesture Sensor i Arduino-koden.
  • Fra:

Se følgende instruksjoner om hvordan du programmerer en innebygd Arduino Uno (ATMega328P) mikrokontroller hvis du ikke er kjent med hvordan du oppnår dette;

PROGRAMMERING AV ATTINY85, ATTINY84 OG ATMEGA328P: ARDUINO AS ISP

Funksjonell oversikt

ATMega328P innebygd slave -mikrokontroller undersøker INT -linjen fra ADPS9960. Når denne linjen går lavt, leser mikrokontrolleren ADPS9960 -registerene og avgjør om det har blitt registrert en gyldig gest. Hvis det er oppdaget en gyldig gest, blir koden for denne bevegelsen 0x0 … 0x6, 0xF plassert på Port B, og 'nGestureAvailable' er lav.

Når Master -enheten ser 'nGestureAvailable' aktiv, leser den verdien på port B og pulserer deretter 'nGestureClear' lavt midlertidig for å bekrefte mottak av dataene.

Slaveenheten avkrefter deretter 'nGestureAvailable' høyt og sletter dataene på Port B. Pic 5 ovenfor viser et skjermgrep tatt fra en logisk analysator under en full oppdagelses-/lesesyklus.

Kodeoversikt

Bilde 1 ovenfor beskriver hvordan programvaren i U1 den innebygde slaven Arduino Uno fungerer, sammen med Pic 2 hvordan de to bakgrunns-/forgrunnsoppgavene samhandler. Bilde 3 er et kodesegment som beskriver hvordan du bruker APDS9960_NonBlockinglibrary. Pic 4 gir en kartlegging mellom Arduino Uno Digital Pins og faktiske maskinvarepinner på ATMega328P.

Etter tilbakestilling initialiserer den innebygde slave -mikrokontrolleren APDS9960 slik at bevegelsesdeteksjon kan utløse INT -utgangen og konfigurerer I/O, ved å koble til interrupt service routine (ISR) 'GESTURE_CLEAR ()' for å avbryte vektoren INT0 (Digital pin 2, Hardware IC pin 4), konfigurere den for en utløser for fallende kant. Dette danner nGestureClear -inngangen fra masterenheten.

Interrupt -utgangspinnen 'INT' fra APDS9960 er koblet til Digital Pin 4, Hardware IC Pin 6 som er konfigurert som en inngang til U1.

Signallinjen 'nGestureAvailable' på Digital pin 7, Hardware IC pin 13 er konfigurert som en utgang og satt høy, inaktiv (av-påstått).

Endelig er Port B -bits 0… 3 henholdsvis konfigurert som utganger og satt lavt. Disse danner datanibbe som representerer de forskjellige oppdagede gesttypene; Ingen = 0x0, Feil = 0xF, Opp = 0x1, Ned = 0x2, Venstre = 0x3, Høyre = 0x4, Nær = 0x5 og Langt = 0x6.

Bakgrunnsoppgaven 'Loop' er planlagt som kontinuerlig undersøker APDS9960 Interrupt -utgangen INT ved å lese Digital Pin 4. Når INT -utgangen fra APDS9960 blir aktiv lav, noe som indikerer at sensoren er utløst, prøver mikrokontrolleren å tolke enhver gest ved å ringe 'readGesture () 'med det mens (1) {}; endeløs løkke.

Hvis en gyldig gest er blitt oppdaget, skrives denne verdien til Port B, utgangen 'nGestureAvailable' bekreftes og den boolske semaforen 'bGestureAvailable' settes, noe som forhindrer at flere bevegelser logges.

Når masteren oppdager den aktive 'nGestureAvailable' -utgangen, leser den denne nye verdien og pulserer 'nGestureClear' aktiv lav. Denne fallende kanten utløser forgrunnsoppgaven 'ISR GESTURE_CLEAR ()' for å planlegge å utføre utførelsen av bakgrunnsoppgaven 'Loop', fjerne port B, 'bGestureAvailable' semafor og 'nGestureAvailable' utdata.

Forgrunnsoppgaven 'GESTURE_CLEAR ()' er nå suspendert og bakgrunnsoppgaven 'Loop' blir planlagt på nytt. Ytterligere bevegelser fra APDS9960 kan nå registreres.

Ved å bruke avbruddsutløste forgrunns-/bakgrunnsoppgaver på denne måten vil den potensielle uendelige sløyfen i 'readGesture ()' på slaveenheten ikke påvirke hovedenheten fra drift og vil heller ikke hindre utførelsen av slaveenheten. Dette danner grunnlaget for et veldig enkelt sanntidsoperativsystem (RTOS).

Merk: Prefikset 'n' betyr aktiv lav eller hevdet som i 'nGestureAvailable'

Trinn 3: Testing av ikke -blokkerende APDS9960 gestbehandlingsenhet

Testing av ikke -blokkerende APDS9960 bevegelsessensorenhet
Testing av ikke -blokkerende APDS9960 bevegelsessensorenhet
Testing av ikke -blokkerende APDS9960 bevegelsessensorenhet
Testing av ikke -blokkerende APDS9960 bevegelsessensorenhet
Testing av ikke -blokkerende APDS9960 bevegelsessensorenhet
Testing av ikke -blokkerende APDS9960 bevegelsessensorenhet
Testing av ikke -blokkerende APDS9960 bevegelsessensorenhet
Testing av ikke -blokkerende APDS9960 bevegelsessensorenhet

Innledning

Selv om APDS9960-modulen leveres med +5v, bruker den en innebygd +3v3-regulator, noe som betyr at I2C-linjene er +3v3-kompatible og ikke +5v. Dette er grunnen til at jeg valgte å bruke +3v3 -kompatible Arduino Due som testmikrokontroller, for å unngå behovet for nivåskifter.

Hvis du imidlertid vil bruke en faktisk Arduino Uno, må du nivåskifte I2C -linjene til U1. Se følgende instruksjonsboks der jeg har festet et nyttig lysbildesett (I2C_LCD_With_Arduino) som gir mange praktiske tips om bruk av I2C.

I2C grensesnitttesting

Bildene 1 og 2 ovenfor viser hvordan du konfigurerer og programmerer systemet for I2C -grensesnittet. Du må laste ned og installere APDS9960_NonBlocking -biblioteket først. her

Parallell grensesnitttesting

Bildene 3 og 4 beskriver det samme for det parallelle grensesnittet

Trinn 4: Konklusjon

Konklusjon
Konklusjon

Generell

Koden fungerer godt og oppdager bevegelser responsivt uten falske positive. Det har vært i gang i noen uker nå som slaveenhet i mitt neste prosjekt. Jeg har prøvd mange forskjellige feilmoduser (og det har også den nysgjerrige Quinn husholdningsmoggen) som tidligere resulterte i en ESP8266-12 tilbakestilling, uten negativ effekt.

Mulige forbedringer

  • Det åpenbare. Skriv APDS9960 Gesture Sensor-biblioteket på nytt for å blokkere det.

    Egentlig tok jeg kontakt med Broadcom som sendte meg til en lokal distributør som straks ignorerte forespørselen min om støtte. Jeg antar bare ikke at jeg er SparkFun eller AdaFruit. Så dette må nok vente en stund

  • Port koden til en mindre slave -mikrokontroller. Å bruke en ATMega328P for en oppgave er litt av en overkill. Selv om jeg først så på ATTiny84, sluttet jeg å bruke en da jeg følte at den kompilerte størrelsen på koden var en grenselinje. Med den ekstra overhead for å måtte endre APDS9960 -biblioteket for å fungere med et annet I2C -bibliotek.

Trinn 5: Referanser

Nødvendig for å programmere den innebygde arduinoen (ATMega328P - U1)

SparkFun_APDS9960.h

  • Av: Steve Quinn
  • Formål: Dette er en gaffelversjon av SparkFun APDS9960-sensoren gaffelt fra jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Den har noen få modifikasjoner for å hjelpe med feilsøking og har en de-sensitiv detektor for å redusere falsk utløsning.
  • Fra:

Kreves for å bygge inn denne ikke-blokkerende funksjonaliteten i arduino-koden og gi utarbeidede eksempler

APDS9960_NonBlocking.h

  • Av: Steve Quinn
  • Formål: Gir et rent grensesnitt for å legge inn denne ikke-blokkerende implementeringen av APDS9960 Gesture Sensor i Arduino-koden.
  • Fra:

Sanntids operativsystem

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

APDS9960 Dataark

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

Anbefalt: