Kazalo:

Neblokiranje senzorja kretenj APDS9960: 5 korakov
Neblokiranje senzorja kretenj APDS9960: 5 korakov

Video: Neblokiranje senzorja kretenj APDS9960: 5 korakov

Video: Neblokiranje senzorja kretenj APDS9960: 5 korakov
Video: blokiranje egra kako i zasto 2024, Julij
Anonim
Neblokirajoča izvedba senzorja kretenj APDS9960
Neblokirajoča izvedba senzorja kretenj APDS9960
Neblokirajoča izvedba senzorja kretenj APDS9960
Neblokirajoča izvedba senzorja kretenj APDS9960
Neblokirajoča izvedba senzorja kretenj APDS9960
Neblokirajoča izvedba senzorja kretenj APDS9960

Preambula

V tem navodilu je podrobno opisano, kako z uporabo sparkFun_APDS-9960_Sensor_Arduino_Library ustvariti neblokirajočo izvedbo senzorja kretenj APDS9960.

Uvod

Torej se verjetno sprašujete, kaj je blokada? Ali celo blokiranje glede tega?

Še pomembneje pa je, zakaj je pomembno, da karkoli ne blokira?

V redu, torej, ko mikroprocesor zažene program, zaporedno izvede vrstice kode in pri tem kliče in se vrne iz funkcij po vrstnem redu, v katerem ste jih napisali.

Blokirajoči klic je samo klic katere koli vrste funkcionalnosti, ki povzroči ustavitev izvajanja, kar pomeni klic funkcije, kjer klicatelj ne bo nadaljeval izvajanja, dokler klicana funkcija ni končana.

Zakaj je torej to pomembno?

V primeru, da ste napisali neko kodo, ki mora redno izvajati številne funkcije zaporedno, na primer prebrati temperaturo, prebrati gumb in posodobiti zaslon, če bo koda za posodobitev zaslona blokirajoči klic, se vaš sistem ne bo odzval pritiska na tipke in spremembe temperature, saj bo procesor ves čas čakal, da se zaslon posodobi, in ne bo bral stanja gumba ali zadnje temperature.

Namesto tega želim ustvariti namizno napravo IoT, ki podpira Wi -Fi, prek MQTT, ki bere lokalne in oddaljene vrednosti temperature/vlažnosti, ravni svetlobe v okolici, barometrični tlak, spremlja čas, prikaže vse te parametre na LCD -ju, se prijavi na USB kartico v realnem času, branje vnosov gumbov, pisanje na izhodne LED diode in spremljanje kretenj za nadzor stvari v moji infrastrukturi IoT, vse to pa mora nadzorovati ESP8266-12.

Na žalost sta bila edina dva vira knjižnice APDS9960, ki sem jih našel, knjižnici SparkFun in AdaFruit, ki sta bili iztrgani iz kode aplikacije Avago (proizvajalec ADPS9960) in imata klic z imenom ‘readGesture’, ki vsebuje nekaj časa (1) {}; zanko, ki pri uporabi v zgornjem projektu povzroči ponastavitev ESP8266-12E vsakič, ko senzor ADPS9960 postane nasičen (tj. ko je predmet ostal v neposredni bližini ali je senzor osvetlil drug vir IR).

Zato sem se za rešitev tega vedenja odločil, da obdelavo gest premaknem v drugi procesor, pri čemer je ESP8266-12E postal glavni mikrokrmilnik, ta sistem pa podrejen, kot je prikazano na slikah 1 in 2 zgoraj, diagrami Pregled sistema in Sestava sistema.. Slika 3 prikazuje prototip vezja.

Da bi omejil spremembe, ki sem jih moral narediti v svoji obstoječi kodi, sem napisal tudi razred/knjižnico ovoja, domišljeno imenovano "APDS9960_NonBlocking".

Sledi podrobna razlaga rešitve, ki ne blokira.

Katere dele potrebujem?

Če želite zgraditi rešitev I2C, ki deluje s knjižnico APDS9960_NonBlocking, boste potrebovali naslednje dele.

  1. 1 pri ATMega328P tukaj
  2. 1 off PCF8574P tukaj
  3. 6 iz 10K uporov tukaj
  4. Tukaj izklopite 4 ukaze 1K
  5. 1 izklopite diodo 1N914 tukaj
  6. 1 izklopite tranzistor PN2222 NPN tukaj
  7. Tukaj je 1 off 16MHz kristal
  8. 2 tukaj kondenzatorjev 0,1uF
  9. 1 off 1000uF elektrolitski kondenzator tukaj
  10. 1 tukaj 10uF elektrolitski kondenzator
  11. 2 tukaj kondenzatorjev 22pF

Če želite prebrati izhod senzorja kretenj preko vzporednega vmesnika, lahko spustite PCF8574P in tri 10K upore.

Kakšno programsko opremo potrebujem?

Arduino IDE 1.6.9

Kakšne veščine potrebujem?

Za nastavitev sistema uporabite izvorno kodo (priloženo) in ustvarite potrebno vezje, ki ga potrebujete;

  • Minimalno razumevanje elektronike,
  • Poznavanje Arduina in njegove IDE,
  • Razumevanje, kako programirati vgrajeni Arduino (glejte navodila za programiranje ATTiny85, ATTiny84 in ATMega328P: Arduino kot ponudnik internetnih storitev)
  • Nekaj potrpežljivosti.

Zajete teme

  • Kratek pregled vezja
  • Kratek pregled programske opreme
  • Testiranje naprave za zaznavanje kretenj APDS9960
  • Zaključek
  • Reference

1. korak: Pregled vezja

Pregled vezja
Pregled vezja

Vezje je razdeljeno na dva dela;

  • Prva je serijska pretvorba I2C v vzporedno, izvedena preko uporov R8 … 10 in IC1. Tu R8… R10 nastavi naslov I2C za 8 -bitni V/I razširitveni čip IC1 in NXP PCF8574A. Veljavni obsegi naslovov za to napravo so 0x38… 0x3F. V primeru programske opreme I2C "I2C_APDS9960_TEST.ino" "#define GESTURE_SENSOR_I2C_ADDRESS" bi bilo treba spremeniti, da ustreza temu obsegu naslovov.
  • Vse druge komponente tvorijo podrejeni Arduino Uno in imajo naslednje funkcije;

    • R1, T1, R2 in D1 zagotavljajo vhod za ponastavitev pomožne naprave. Tu bo aktivni visok impulz na IC1 - P7 prisilil U1, da se ponastavi.
    • R3, R4, so upori, ki omejujejo tok za vgrajeno napravo za programiranje linij TX/RX.
    • C5 in R7 omogočata, da Arduino IDE samodejno programira U1 preko impulza na liniji DTR priključene naprave FTDI.
    • R5 in R6 sta vlečna upora I2C za APDS9960 s C6, ki zagotavljata ločevanje lokalnih dovodnih tirnic.
    • U1, C1, C2 in Q1 tvorijo vgrajen Arduino Uno in njegovo uro.
    • Končno C3 in C4 zagotavljata ločitev lokalne oskrbovalne tirnice za U1.

2. korak: Pregled programske opreme

Pregled programske opreme
Pregled programske opreme
Pregled programske opreme
Pregled programske opreme
Pregled programske opreme
Pregled programske opreme

Preambula

Za uspešno sestavljanje te izvorne kode boste potrebovali naslednje dodatne knjižnice za programiranje vdelanega Arduino Uno U1;

SparkFun_APDS9960.h

  • Avtor: Steve Quinn
  • Namen: To je razcepljena različica senzorja SparkFun APDS9960, razcepljena iz jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Ima nekaj sprememb, ki pomagajo pri odpravljanju napak, in ima desenzibiliziran detektor za zmanjšanje lažnega sprožanja.
  • Iz:

APDS9960_NonBlocking.h

  • Avtor: Steve Quinn
  • Namen: Zagotavlja čist vmesnik za vgradnjo te neblokirajoče izvedbe senzorja kretenj APDS9960 v vašo kodo Arduino.
  • Iz:

Glejte naslednja navodila, kako programirati vgrajeni mikrokrmilnik Arduino Uno (ATMega328P), če niste seznanjeni s tem, kako to doseči;

PROGRAMIRANJE ATTINY85, ATTINY84 IN ATMEGA328P: ARDUINO KOT ISP

Funkcionalni pregled

Vgrajeni pomožni mikrokrmilnik ATMega328P anketira linijo INT iz ADPS9960. Ko se ta vrstica spusti, mikrokrmilnik prebere registre ADPS9960 in ugotovi, ali je bila zaznana veljavna gesta. Če je bila zaznana veljavna gesta, se koda za to potezo 0x0… 0x6, 0xF postavi na vrata B in „nGestureAvailable“je nizko.

Ko glavna naprava vidi, da je 'nGestureAvailable' aktivna, prebere vrednost na vratih B in nato začasno utripa 'nGestureClear' nizko, da potrdi prejem podatkov.

Podrejena naprava nato izniči visoko vrednost 'nGestureAvailable' in počisti podatke na vratih B. Slika 5 zgoraj prikazuje posnetek zaslona, posnet z logičnega analizatorja med celotnim ciklom zaznavanja/branja.

Pregled kode

Na sliki 1 zgoraj je opisano, kako deluje programska oprema v U1 vgrajenem podrejenem Arduino Uno, skupaj s sliko 2 pa, kako medsebojno vplivata dve nalogi v ozadju/ospredju. Slika 3 je segment kode, ki opisuje uporabo knjižnice APDS9960_NonBlockinglibrary. Slika 4 prikazuje preslikavo med digitalnimi zatiči Arduino Uno in dejanskimi zatiči strojne opreme na ATMega328P.

Po ponastavitvi vgrajeni podrejeni mikrokrmilnik inicializira APDS9960, kar zaznavanju gibov sproži izhod INT in konfigurira njegov V/I, pri čemer se rutini storitve prekinitve (ISR) 'GESTURE_CLEAR ()' prekine vektor INT0 (digitalni zatič 2, strojni IC zatič 4), ga konfigurirate za sprožilec padajočega roba. To tvori vnos nGestureClear iz glavne naprave.

Izhodni zatič za prekinitev 'INT' iz APDS9960 je priključen na digitalni pin 4, strojni IC pin 6, ki je konfiguriran kot vhod na U1.

Signalna linija 'nGestureAvailable' na digitalnem zatiču 7, priključku 13 strojne opreme IC je konfigurirana kot izhod in nastavljena visoko, neaktivno (razveljavljeno).

Končno so bitovi vrat B 0… 3 konfigurirani kot izhodi in nastavljeni nizko. Ti tvorijo podatke, ki predstavljajo različne zaznane vrste kretenj; Nič = 0x0, napaka = 0xF, gor = 0x1, dol = 0x2, levo = 0x3, desno = 0x4, blizu = 0x5 in daleč = 0x6.

Načrtovano je opravilo v ozadju 'Zanka', ki nenehno pregleduje APDS9960 prekinitveni izhod INT z branjem digitalnega zatiča 4. Ko izhod INT iz APDS9960 postane nizek, kar kaže, da je senzor sprožen, mikrokrmilnik poskuša razlagati katero koli potezo s klicem 'readGesture () 'with it while (1) {}; neskončna zanka.

Če je bila zaznana veljavna gesta, se ta vrednost zapiše v vrata B, potrdi se izhod 'nGestureAvailable' in nastavi se logični semafor 'bGestureAvailable', ki preprečuje beleženje nadaljnjih kretenj.

Ko mojster zazna aktivni izhod 'nGestureAvailable', prebere to novo vrednost in utripa nizko aktivno 'nGestureClear'. Ta padajoči rob sproži načrtovanje naloge v ospredju 'ISR GESTURE_CLEAR ()', ki ustavi izvajanje naloge v ozadju 'Zanka', počisti vrata B, semafor 'bGestureAvailable' in 'nGestureAvailable'.

Opravilo v ospredju 'GESTURE_CLEAR ()' je zdaj prekinjeno, opravilo v ozadju 'Zanka' pa znova razporejeno. Zdaj je mogoče zaznati nadaljnje kretnje iz APDS9960.

Z uporabo nalogov v ospredju/ozadju, ki jih sproži prekinitev, potencialna neskončna zanka v "readGesture ()" podrejene naprave ne bo vplivala na delovanje glavne naprave in tudi ne bo ovirala izvajanja podrejene naprave. To je osnova zelo preprostega operacijskega sistema v realnem času (RTOS).

Opomba: Predpona 'n' pomeni aktivno nizko ali uveljavljeno kot v 'nGestureAvailable'

3. korak: Preizkusite napravo za zaznavanje kretenj, ki ne blokira APDS9960

Testiranje naprave za zaznavanje kretenj, ki ne blokira APDS9960
Testiranje naprave za zaznavanje kretenj, ki ne blokira APDS9960
Testiranje naprave za zaznavanje kretenj, ki ne blokira APDS9960
Testiranje naprave za zaznavanje kretenj, ki ne blokira APDS9960
Testiranje naprave za zaznavanje kretenj, ki ne blokira APDS9960
Testiranje naprave za zaznavanje kretenj, ki ne blokira APDS9960
Testiranje naprave za zaznavanje kretenj, ki ne blokira APDS9960
Testiranje naprave za zaznavanje kretenj, ki ne blokira APDS9960

Preambula

Čeprav je modul APDS9960 dobavljen z +5v, uporablja vgrajen regulator +3v3, kar pomeni, da so linije I2C skladne s +3v3 in ne +5v. Zato sem se kot preskusni mikro krmilnik odločil uporabiti Arduino Due, ki je skladen s standardom +3v3, da bi odpravil potrebo po menjalnikih.

Če pa želite uporabiti dejanski Arduino Uno, morate ravni I2C premakniti na U1. Glejte spodnje navodilo, kjer sem priložil uporaben niz diapozitivov (I2C_LCD_With_Arduino), ki daje veliko praktičnih nasvetov o uporabi I2C.

Testiranje vmesnika I2C

Slika 1 in 2 zgoraj prikazujeta, kako nastaviti in programirati sistem za vmesnik I2C. Najprej boste morali prenesti in namestiti knjižnico APDS9960_NonBlocking. tukaj

Vzporedno testiranje vmesnikov

Slike 3 in 4 podrobno opisujeta paralelni vmesnik

4. korak: Zaključek

Zaključek
Zaključek

Splošno

Koda dobro deluje in odzivno zaznava kretnje brez lažno pozitivnih rezultatov. Že nekaj tednov deluje kot podrejena naprava v naslednjem projektu. Poskusil sem veliko različnih načinov odpovedi (in tudi radovedna gospodinjska moggie Quinn), ki je prej povzročila ponastavitev ESP8266-12, brez negativnih učinkov.

Možne izboljšave

  • Očitno. Ponovno napišite knjižnico senzorja kretenj APDS9960, da ne blokira.

    Pravzaprav sem stopil v stik z Broadcomom, ki me je poslal k lokalnemu distributerju, ki je takoj prezrl mojo prošnjo za podporo. Mislim, da nisem samo SparkFun ali AdaFruit. Tako da bo na to verjetno treba še malo počakati

  • Prenesite kodo na manjši pomožni mikrokrmilnik. Uporaba ATMega328P za eno nalogo je malo pretirano. Čeprav sem sprva pogledal ATTiny84, ga nisem več uporabljal, saj se mi je zdelo, da je sestavljena velikost kode primerna za mejno črto. Z dodatnimi stroški, ki jih je treba spremeniti v knjižnici APDS9960 za delo z drugo knjižnico I2C.

5. korak: Reference

Potrebno za programiranje vgrajenega arduina (ATMega328P - U1)

SparkFun_APDS9960.h

  • Avtor: Steve Quinn
  • Namen: To je razcepljena različica senzorja SparkFun APDS9960, razcepljena iz jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Ima nekaj sprememb, ki pomagajo pri odpravljanju napak, in ima senzor za odpravo občutljivosti za zmanjšanje lažnega sprožanja.
  • Iz:

Ta funkcija, ki ne blokira, je potrebna za vgradnjo v vašo kodo arduino in podaja delovne primere

APDS9960_NonBlocking.h

  • Avtor: Steve Quinn
  • Namen: Zagotavlja čist vmesnik za vgradnjo te neblokirajoče izvedbe senzorja kretenj APDS9960 v vašo kodo Arduino.
  • Iz:

Operacijski sistem v realnem času

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

Tehnični list APDS9960

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

Tehnični list PCF8574A

Priporočena: