Sisukord:

Mitteblokeeriv APDS9960 žestianduri rakendamine: 5 sammu
Mitteblokeeriv APDS9960 žestianduri rakendamine: 5 sammu

Video: Mitteblokeeriv APDS9960 žestianduri rakendamine: 5 sammu

Video: Mitteblokeeriv APDS9960 žestianduri rakendamine: 5 sammu
Video: Динамическое и статическое разделение Nginx 2024, November
Anonim
Mitteblokeeriv APDS9960 žestianduri rakendamine
Mitteblokeeriv APDS9960 žestianduri rakendamine
Mitteblokeeriv APDS9960 žestianduri rakendamine
Mitteblokeeriv APDS9960 žestianduri rakendamine
Mitteblokeeriv APDS9960 žestianduri rakendamine
Mitteblokeeriv APDS9960 žestianduri rakendamine

Preambul

Selles juhendis kirjeldatakse üksikasjalikult, kuidas luua APDS9960 liigutusanduri mitteblokeeriv rakendus SparkFun_APDS-9960_Sensor_Arduino_Library abil.

Sissejuhatus

Nii et ilmselt küsite endalt, mis on blokeerimata? Või isegi blokeerimine selles küsimuses?

Veelgi olulisem on see, miks on oluline, et midagi oleks blokeerimata?

Olgu, nii et kui mikroprotsessor käivitab programmi, täidab see järjestikku koodiridu ja teeb seda tehes funktsioone ja tagastab neid vastavalt nende kirjutamise järjekorrale.

Blokeeriv kõne on lihtsalt kõne mis tahes funktsionaalsusele, mis põhjustab täitmise peatamise, st funktsioonikõne, mille korral helistaja ei jätka täitmist enne, kui kutsutud funktsioon on täidetud.

Miks see siis oluline on?

Kui olete kirjutanud koodi, mis peab regulaarselt täitma paljusid funktsioone, näiteks temperatuuri lugemist, nupu lugemist ja ekraani värskendamist, kui ekraani värskendamise kood on blokeeriv kõne, ei reageeri teie süsteem nupuvajutused ja temperatuurimuutused, kuna protsessor kulutab kogu aja ekraani värskendamist ja ei loe nupu olekut ega viimast temperatuuri.

Soovin omalt poolt luua MQTT üle WiFi -toega IoT -lauaarvuti, mis loeb nii kohalikke kui ka kaugtemperatuuri/niiskuse väärtusi, ümbritseva valguse taset, õhurõhku, jälgib aega, kuvab kõik need parameetrid LCD -ekraanil, logib uSD -le kaardil reaalajas, lugege nuppude sisendeid, kirjutage väljund-LED-idele ja jälgige liigutusi, et juhtida asju minu IoT-infrastruktuuris ja neid kõiki juhtida ESP8266-12 abil.

Kahjuks ainsad kaks APDS9960 raamatukogu allikat, mille leidsin, olid raamatukogud SparkFun ja AdaFruit, mis mõlemad olid Avago (ADPS9960 tootja) rakenduskoodist välja rebitud ja millel on kõne nimega „readGesture”, mis sisaldab mõnda aega (1) {}; silmus, mis ülaltoodud projektis kasutamisel põhjustab ESP8266-12E lähtestamise alati, kui ADPS9960 andur on küllastunud (st kui objekt jääb vahetusse lähedusse või kui andurit valgustab mõni muu infrapunaallikas).

Seetõttu otsustasin selle käitumise lahendamiseks liigutada žestide töötlemise teisele protsessorile, kus ESP8266-12E sai peamiseks mikrokontrolleriks ja see süsteem orjaks, nagu on näidatud ülaltoodud piltidel 1 ja 2, vastavalt süsteemi ülevaate ja süsteemi koostise skeemidel. Joonis 3 näitab prototüüpi.

Olemasolevasse koodi tehtavate muudatuste piiramiseks kirjutasin ka ümbriseklassi/raamatukogu, mille nimeks oli APDS9960_NonBlocking.

Järgnev on mitteblokeeriva lahenduse üksikasjalik selgitus.

Milliseid osi ma vajan?

Kui soovite luua I2C lahenduse, mis töötab koos APDS9960_NonBlocking koguga, vajate järgmisi osi.

  1. 1 ATMega328P soodustus siin
  2. 1 soodustus PCF8574P siit
  3. 6 off 10K takistid siin
  4. 4 off 1K takistid siin
  5. 1 välja 1N914 Diood siin
  6. 1 off PN2222 NPN Transistor siin
  7. Siin on välja lülitatud 16MHz kristall
  8. Siin on 2 välja 0,1 uF kondensaatorit
  9. 1 välja 1000uF elektrolüütkondensaator
  10. 1 off 10uF elektrolüütkondensaator siin
  11. Siin on 2 välja 22pF kondensaatorit

Kui soovite lugeda žestanduri väljundit paralleelliidese kaudu, võite PCF8574P ja kolm 10K takistit välja lülitada.

Millist tarkvara ma vajan?

Arduino IDE 1.6.9

Milliseid oskusi mul vaja on?

Süsteemi seadistamiseks kasutage lähtekoodi (kaasas) ja looge vajalik vooluring, mille jaoks on vaja järgmist;

  • Elektroonika minimaalne tundmine,
  • Teadmised Arduino ja selle IDE kohta,
  • Mõistmine sisseehitatud Arduino programmeerimise kohta (vt juhendit „ATTiny85, ATTiny84 ja ATMega328P programmeerimine: Arduino kui Interneti -teenuse pakkuja”)
  • Natuke kannatust.

Käsitletud teemad

  • Lühike ülevaade vooluringist
  • Lühiülevaade tarkvarast
  • APDS9960 žestituvastava seadme testimine
  • Järeldus
  • Viited

1. samm: ahela ülevaade

Ahela ülevaade
Ahela ülevaade

Ahel on jagatud kaheks osaks;

  • Esimene on seeria I2C paralleelseks muundamiseks, mis saavutatakse takistite R8… 10 ja IC1 kaudu. Siin määrab R8… R10 I2C aadressi 8 -bitisele I/O laienduskiibile IC1 ja NXP PCF8574A. Selle seadme kehtivad aadressivahemikud on vastavalt 0x38… 0x3F. Esitatud I2C tarkvara näites „I2C_APDS9960_TEST.ino” tuleks #define GESTURE_SENSOR_I2C_ADDRESS muuta selle aadressivahemiku jaoks sobivaks.
  • Kõik muud komponendid moodustavad orja sisseehitatud Arduino Uno ja neil on järgmised funktsioonid;

    • R1, T1, R2 ja D1 pakuvad alamseadme lähtestamise sisendit. Siin sunnib IC1 -P7 aktiivne kõrge impulss U1 lähtestama.
    • R3, R4 on voolu piiravad takistid sisseehitatud seadme TX/RX liinide programmeerimiseks.
    • C5 ja R7 võimaldavad Arduino IDE -l automaatselt programmeerida U1 lisatud FTDI -seadme DTR -liini impulsi kaudu.
    • R5 ja R6 on AP29960 I2C tõmbetakistid koos C6 -ga, mis tagab kohaliku toiteraudtee lahtiühendamise.
    • U1, C1, C2 ja Q1 moodustavad vastavalt manustatud Arduino Uno ja kella.
    • Lõpuks pakuvad C3 ja C4 U1 jaoks kohaliku toiteraudtee lahtiühendamist.

2. samm: tarkvara ülevaade

Tarkvara ülevaade
Tarkvara ülevaade
Tarkvara ülevaade
Tarkvara ülevaade
Tarkvara ülevaade
Tarkvara ülevaade

Preambul

Selle lähtekoodi edukaks kompileerimiseks vajate manustatud Arduino Uno U1 programmeerimiseks järgmisi lisateeke;

SparkFun_APDS9960.h

  • Autor: Steve Quinn
  • Eesmärk: See on hargnenud versioon SparkFun APDS9960 andurist, mis on hargnenud saidilt jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Sellel on silumise hõlbustamiseks mõned muudatused ja sellel on sensibiliseeritud detektor, mis vähendab valede käivitamist.
  • Alates:

APDS9960_NonBlocking.h

  • Autor: Steve Quinn
  • Eesmärk: pakub puhast liidest, et manustada see APDS9960 žestianduri mitteblokeeriv rakendus teie Arduino koodi.
  • Alates:

Vaadake järgmist juhendit, kuidas programmeerida sisseehitatud Arduino Uno (ATMega328P) mikrokontrollerit, kui te pole selle saavutamisega kursis;

ATTINY85, ATTINY84 JA ATMEGA328P PROGRAMMEERIMINE: ARDUINO AS ISP

Funktsionaalne ülevaade

ATMega328P sisseehitatud orja mikrokontroller küsib INT -liini ADPS9960 kaudu. Kui see rida läheb madalaks, loeb mikrokontroller ADPS9960 registreid ja otsustab, kas on tuvastatud kehtiv žest. Kui tuvastati kehtiv žest, pannakse selle liigutuse kood 0x0… 0x6, 0xF pordile B ja väide „nGestureAvailable” on madal.

Kui põhiseade näeb, et „nGestureAvailable” on aktiivne, loeb see pordi B väärtust ja seejärel impulsib „nGestureClear” ajutiselt, et kinnitada andmete kättesaamist.

Alamseade tühistab seejärel väärtuse „nGestureAvailable” kõrge ja kustutab andmed pordist B. Ülaltoodud pildil 5 on kujutatud ekraanipilt, mis on loogikaanalüsaatorist võetud täieliku tuvastamise/lugemise tsükli ajal.

Koodi ülevaade

Ülaltoodud pildil 1 on üksikasjalikult kirjeldatud, kuidas U1 sisseehitatud ori Arduino Uno tarkvara töötab, ja pildil 2, kuidas kaks tausta/esiplaani ülesannet interakteeruvad. Pilt 3 on koodisegment, mis kirjeldab APDS9960_NonBlockinglibrary kasutamist. Joonis 4 annab kaardistuse Arduino Uno digitaalsete tihvtide ja ATMega328P riistvarapistikute vahel.

Pärast sisseehitatud alam -mikrokontrolleri lähtestamist käivitab APDS9960, mis võimaldab žestituvastusel käivitada selle INT -väljundi, ja konfigureerib selle I/O, lisades katkestusteenuse rutiini (ISR) „GESTURE_CLEAR ()”, et katkestada vektor INT0 (digitaalne tihvt 2, riistvara IC -tihvt 4), konfigureerides selle langeva serva päästiku jaoks. See moodustab põhiseadmest nGestureClear sisendi.

APDS9960 katkestuse väljundpistik „INT” on ühendatud digitaalse tihvtiga 4, riistvara IC -pistikuga 6, mis on konfigureeritud U1 sisendiks.

Signaalirida nGestureAvailable digitaalsel tihvtil 7, riistvara IC-poldil 13 on konfigureeritud väljundiks ja seatud kõrgeks, mitteaktiivseks (kinnitamata).

Lõpuks konfigureeritakse vastavalt porti B bitid 0… 3 väljunditeks ja seatakse madalaks. Need moodustavad andmete näpistuse, mis esindab erinevaid tuvastatud liigutusi; Puudub = 0x0, viga = 0xF, üles = 0x1, alla = 0x2, vasakule = 0x3, paremale = 0x4, lähedal = 0x5 ja kaugele = 0x6.

Plaanitud on taustaülesanne „Loop”, mis küsitleb pidevalt APDS9960 katkestuse väljundit INT, lugedes digitaalset tihvti 4. Kui APDS9960 INT -väljund muutub aktiivseks, näitab see, et andur on käivitunud, proovib mikrokontroller tõlgendada kõiki žeste, helistades „readGesture () 'koos ajaga (1) {}; lõputu silmus.

Kui tuvastatakse kehtiv žest, kirjutatakse see väärtus porti B, kinnitatakse väljund „nGestureAvailable” ja määratakse loogiline semafoor „bGestureAvailable”, mis takistab edasiste žestide logimist.

Kui kapten tuvastab aktiivse väljundi „nGestureAvailable”, loeb see uue väärtuse ja annab impulsi „nGestureClear” aktiivseks madalaks. See langev serv käivitab esiplaanil oleva ülesande „ISR GESTURE_CLEAR ()” ajastamise, mis peatab taustaülesande „Loop” täitmise, tühjendab pordi B, „bGestureAvailable” semafoori ja „nGestureAvailable” väljundi.

Esiplaanil olev ülesanne „GESTURE_CLEAR ()” on nüüd peatatud ja taustaülesanne „Loop” on ajastatud. APDS9960 täiendavaid žeste on nüüd tajutav.

Kui kasutate sel viisil katkestatud käivitatud esiplaani/taustaülesandeid, ei mõjuta alamseadme „readGesture ()” potentsiaalne lõpmatu silmus põhiseadme tööd ega takista ka alamseadme täitmist. See on väga lihtsa reaalajas opsüsteemi (RTOS) alus.

Märkus. Eesliide „n” tähendab aktiivset madalat taset või kinnitust nagu „nGestureAvailable”

3. toiming: blokeerimata APDS9960 žestituvastava seadme testimine

Mitteblokeeriva APDS9960 žestituvastava seadme testimine
Mitteblokeeriva APDS9960 žestituvastava seadme testimine
Mitteblokeeruva APDS9960 žestituvastava seadme testimine
Mitteblokeeruva APDS9960 žestituvastava seadme testimine
Mitteblokeeruva APDS9960 žestituvastava seadme testimine
Mitteblokeeruva APDS9960 žestituvastava seadme testimine
Mitteblokeeruva APDS9960 žestituvastava seadme testimine
Mitteblokeeruva APDS9960 žestituvastava seadme testimine

Preambul

Isegi kui APDS9960 moodul on varustatud +5v toitega, kasutab see sisseehitatud +3v3 regulaatorit, mis tähendab, et I2C liinid on +3v3-ga ühilduvad ja mitte +5v. Seetõttu otsustasin testimikontrollerina kasutada +3v3 -ga ühilduvat Arduino Due, et vältida vajadust nihutite järele.

Kui soovite siiski kasutada tegelikku Arduino Unot, peate I2C liinid tasandile U1 viima. Vaadake järgmist juhendit, kuhu olen lisanud kasuliku slaidikomplekti (I2C_LCD_With_Arduino), mis annab palju praktilisi näpunäiteid I2C kasutamise kohta.

I2C liidese testimine

Ülaltoodud pildid 1 ja 2 näitavad, kuidas seadistada ja programmeerida süsteem I2C liidese jaoks. Esmalt peate alla laadima ja installima APDS9960_NonBlocking kogu. siin

Paralleelliidese testimine

Pildid 3 ja 4 kirjeldavad paralleelliidese puhul sama

4. samm: järeldus

Järeldus
Järeldus

Kindral

Kood töötab hästi ja tuvastab žeste tundlikult ilma valepositiivseteta. See on minu järgmises projektis juba paar nädalat kasutusel olnud orjaseadmena. Olen proovinud paljusid erinevaid tõrkerežiime (ja sama on teinud ka uudishimulik Quinni majapidamismoggie), mille tulemuseks oli varem ESP8266-12 lähtestamine ilma negatiivse mõjuta.

Võimalikud parandused

  • Ilmselge. Kirjutage APDS9960 žestiandurite kogu uuesti blokeerimata.

    Tegelikult võtsin ühendust Broadcomiga, kes saatis mind kohaliku edasimüüja juurde, kes ignoreeris minu toetusetaotlust, ma pole lihtsalt SparkFun või AdaFruit. Nii et tõenäoliselt tuleb seda mõnda aega oodata

  • Portige kood väiksemasse alam -mikrokontrollerisse. ATMega328P kasutamine ühe ülesande jaoks on natuke liialdus. Kuigi ma algselt vaatasin ATTiny84, lõpetasin selle kasutamise, kuna tundsin, et koodi kompileeritud suurus sobib piirjoonega. Lisanduvad üldkulud, kuna APDS9960 raamatukogu tuleb muuta teise I2C raamatukoguga töötamiseks.

5. samm: viited

Vajalik sisseehitatud arduino programmeerimiseks (ATMega328P - U1)

SparkFun_APDS9960.h

  • Autor: Steve Quinn
  • Eesmärk: See on hargnenud versioon SparkFun APDS9960 andurist, mis on hargnenud saidilt jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Sellel on silumise hõlbustamiseks mõned muudatused ja sellel on sensibiliseeritud detektor, mis vähendab valede käivitamist.
  • Alates:

Nõutav selle mitteblokeeriva funktsionaalsuse sisestamiseks oma arduino koodi ja töötavate näidete esitamiseks

APDS9960_NonBlocking.h

  • Autor: Steve Quinn
  • Eesmärk: pakub puhast liidest, et manustada see APDS9960 žestianduri mitteblokeeriv rakendus teie Arduino koodi.
  • Alates:

Reaalajas operatsioonisüsteem

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

APDS9960 Andmeleht

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

Soovitan: