Përmbajtje:

Zbatimi i sensorit të gjesteve pa bllokim APDS9960: 5 hapa
Zbatimi i sensorit të gjesteve pa bllokim APDS9960: 5 hapa

Video: Zbatimi i sensorit të gjesteve pa bllokim APDS9960: 5 hapa

Video: Zbatimi i sensorit të gjesteve pa bllokim APDS9960: 5 hapa
Video: 2021 벤츠 S클래스 풀체인지~ Introduction of NEW 2021 Benz S Class 🚗🚓🚘~🤩 (W223 2021년형 NEW S클래스 소개~~😻) 2024, Korrik
Anonim
Zbatimi i sensorit të gjesteve pa bllokim APDS9960
Zbatimi i sensorit të gjesteve pa bllokim APDS9960
Zbatimi i sensorit të gjesteve pa bllokim APDS9960
Zbatimi i sensorit të gjesteve pa bllokim APDS9960
Zbatimi i sensorit të gjesteve pa bllokim APDS9960
Zbatimi i sensorit të gjesteve pa bllokim APDS9960

Parathënie

Ky udhëzues detajon se si të krijoni një zbatim jo-bllokues të Sensorit të gjesteve APDS9960 duke përdorur Bibliotekën SparkFun_APDS-9960_Sensor_Arduino_Library.

Prezantimi

Pra, me siguri po pyesni veten se çfarë është mos bllokimi? Apo edhe bllokimi për atë çështje?

Më e rëndësishmja pse është e rëndësishme të kesh një gjë që nuk bllokon siç duhet?

Ok, kështu që kur një mikroprocesor drejton një program ai ekzekuton në mënyrë sekuenciale linja të kodit dhe duke bërë kështu bën thirrje dhe kthehet nga funksionet sipas rendit në të cilin i keni shkruar ato.

Një thirrje bllokuese është vetëm një thirrje për çdo lloj funksionaliteti që shkakton një ndërprerje të ekzekutimit, që do të thotë një thirrje funksioni ku thirrësi nuk do të rifillojë ekzekutimin derisa funksioni i thirrur të përfundojë ekzekutimin.

Pra, pse është e rëndësishme kjo?

Në rastin kur keni shkruar një kod i cili duhet të ekzekutojë rregullisht shumë funksione në mënyrë të njëpasnjëshme, të tilla si leximi i një temperature, leximi i një butoni dhe azhurnimi i një ekrani, nëse kodi për të azhurnuar ekranin është një thirrje bllokuese, sistemi juaj nuk do të reagojë ndaj shtyp butonin dhe ndryshon temperaturën, pasi procesori do të kalojë gjithë kohën duke pritur që ekrani të azhurnohet dhe të mos lexojë statusin e butonit ose temperaturën e fundit.

Nga ana ime, unë dua të krijoj një pajisje desktopi IoT të aftë për WiFi MQTT e cila lexon vlerat e temperaturës/lagështisë lokale dhe të largëta, nivelet e dritës së ambientit, presionin barometrik, mban gjurmët e kohës, shfaq të gjitha këto parametra në një LCD, regjistrohuni në një uSD kartë në kohë reale, lexoni hyrjet e butonave, shkruani në LED-të dalëse dhe monitoroni gjestet për të kontrolluar gjërat në infrastrukturën time IoT dhe të gjitha këto të kontrollohen nga një ESP8266-12.

Fatkeqësisht, dy burimet e vetme të bibliotekës APDS9960 që mund të gjeja ishin bibliotekat SparkFun dhe AdaFruit, të dyja të shkëputura nga kodi i aplikacionit nga Avago (prodhuesi ADPS9960) dhe posedon një thirrje të quajtur 'readGesture' e cila përmban një kohë (1) {}; lak i cili kur përdoret në projektin e mësipërm bën që ESP8266-12E të rivendoset sa herë që sensori ADPS9960 ngopet (dmth. kur një objekt mbetet në afërsi, ose ka pasur një burim tjetër IR që ndriçon sensorin).

Si pasojë për të zgjidhur këtë sjellje, unë zgjodha të zhvendosja përpunimin e Gjesteve në një procesor të dytë, ku ESP8266-12E u bë mikrokontrolluesi kryesor dhe ky sistem skllav, siç përshkruhet në Fotografitë 1 dhe 2 më lart, Diagramet e Përmbledhjes së Sistemit dhe Kompozimit të Sistemit përkatësisht Me Fotografia 3 tregon qarkun prototip.

Për të kufizuar ndryshimet që duhej të bëja në kodin tim ekzistues, unë gjithashtu shkrova një klasë mbështjellëse/bibliotekë të quajtur në mënyrë imagjinare ‘APDS9960_NonBlocking’.

Ajo që vijon është një shpjegim i hollësishëm i zgjidhjes jo-bllokuese.

Cilat pjesë më duhen?

Nëse dëshironi të ndërtoni zgjidhjen I2C e cila punon me bibliotekën APDS9960_NonBlocking do t'ju kërkohen pjesët e mëposhtme.

  1. 1 zbritje ATMega328P këtu
  2. 1 jashtë PCF8574P këtu
  3. 6 nga rezistencat 10K këtu
  4. 4 jashtë Rezistencave 1K këtu
  5. 1 zbritje 1N914 Diodë këtu
  6. 1 jashtë PN2222 NPN Transistor këtu
  7. 1 off kristal 16MHz këtu
  8. 2 off 0.1uF Kondensatorë këtu
  9. 1 off 1000uF Kondensator elektrolitik këtu
  10. 1 off 10uF Kondensator elektrolitik këtu
  11. 2 jashtë kondensatorëve 22pF këtu

Nëse dëshironi të lexoni daljen e sensorit të gjesteve përmes ndërfaqes paralele, atëherë mund të hidhni PCF8574P dhe tre rezistorë 10K.

Çfarë programi më nevojitet?

Arduino IDE 1.6.9

Çfarë aftësish më duhen?

Për të ngritur sistemin, përdorni kodin burimor (të dhënë) dhe krijoni qarkun e nevojshëm që do t'ju duhet në vijim;

  • Një kuptim minimal i elektronikës,
  • Njohuri për Arduino dhe IDE -në e tij,
  • Një kuptim se si të programoni një Arduino të ngulitur (Shih Instructable 'Programimi i ATTiny85, ATTiny84 dhe ATMega328P: Arduino Si ISP')
  • Disa Durim.

Temat e mbuluara

  • Vështrim i shkurtër i qarkut
  • Vështrim i shkurtër i softverit
  • Testimi i pajisjes së ndjesisë së gjesteve APDS9960
  • Përfundim
  • Referencat

Hapi 1: Vështrim i qarkut

Vështrim i qarkut
Vështrim i qarkut

Qarku është i ndarë në dy seksione;

  • E para është konvertimi serik I2C në paralel i realizuar përmes rezistorëve R8… 10 dhe IC1. Këtu R8… R10 vendosni adresën I2C për çipin zgjerues I/O 8 bit IC1 dhe NXP PCF8574A. Gama e adresave të vlefshme për këtë pajisje janë përkatësisht 0x38… 0x3F. Në shembullin e softuerit I2C të dhënë 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' do të duhej të ndryshohej për t'iu përshtatur këtij diapazoni adresash.
  • Të gjithë përbërësit e tjerë formojnë një skllav të ngulitur Arduino Uno dhe kanë funksionet e mëposhtme;

    • R1, T1, R2 dhe D1 sigurojnë një hyrje të rivendosjes së pajisjes skllevër. Këtu një impuls aktiv i lartë në IC1 - P7 do të detyrojë U1 të rivendoset.
    • R3, R4, janë rezistenca aktuale kufizuese për pajisjen e ngulitur që programon linjat TX/RX.
    • C5 dhe R7 lejojnë që Arduino IDE të programojë automatikisht U1 përmes një pulsi në linjën DTR të një pajisjeje të bashkangjitur FTDI.
    • R5 dhe R6 janë rezistencë tërheqës I2C për APDS9960 me C6 që siguron shkëputjen e shinave të furnizimit lokal.
    • U1, C1, C2 dhe Q1 formojnë Arduino Uno të ngulitur dhe është ora përkatësisht.
    • Së fundi, C3 dhe C4 sigurojnë shkëputjen e hekurudhave të furnizimit lokal për U1.

Hapi 2: Vështrim i përgjithshëm i softuerit

Pasqyrë e softuerit
Pasqyrë e softuerit
Pasqyrë e softuerit
Pasqyrë e softuerit
Pasqyrë e softuerit
Pasqyrë e softuerit

Parathënie

Për të përpiluar me sukses këtë kod burim do t'ju duhen bibliotekat e mëposhtme shtesë për të programuar Arduino Uno U1 të ngulitur;

SparkFun_APDS9960.h

  • Nga: Steve Quinn
  • Qëllimi: Ky është një version i pirunuar i Sensorit SparkFun APDS9960 i pirunuar nga jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Ka disa modifikime për të ndihmuar në korrigjimin dhe ka një detektor të deensibilizuar për të zvogëluar shkaktimin e rremë.
  • Nga:

APDS9960_NonBllokimi.h

  • Nga: Steve Quinn
  • Qëllimi: Siguron një ndërfaqe të pastër për të futur këtë zbatim jo-bllokues të Sensorit të gjesteve APDS9960 në kodin tuaj Arduino.
  • Nga:

Shihni Udhëzuesin e mëposhtëm se si të programoni një mikrokontrollues të ngulitur Arduino Uno (ATMega328P) nëse nuk jeni të njohur me mënyrën se si ta arrini këtë;

PROGRAMIMI I ATTINY85, ATTINY84 DHE ATMEGA328P: ARDUINO SI ISP

Vështrim Funksional

Mikrokontrolluesi i skllevërve të ngulitur ATMega328P anketon linjën INT nga ADPS9960. Kur kjo linjë të ulet, mikrokontrolluesi lexon regjistrat ADPS9960 dhe përcakton nëse ka pasur një gjest të vlefshëm. Nëse është zbuluar një gjest i vlefshëm, kodi për këtë gjest 0x0… 0x6, 0xF vendoset në Portën B dhe 'nGestureAvailable' pohohet i ulët.

Kur pajisja Master e sheh 'nGestureAvailable' aktive, ajo lexon vlerën në Portën B, pastaj pulson 'nGestureClear' përkohësisht të ulët për të konfirmuar marrjen e të dhënave.

Pajisja skllevër atëherë deklaron "nGestureAvailable" të lartë dhe pastron të dhënat në Portin B. Figura 5 më sipër tregon një kapje të ekranit të marrë nga një analizues logjik gjatë një cikli të plotë zbulimi/leximi.

Vështrim i Përgjithshëm i Kodit

Figura 1 më sipër detajon sesi funksionon softueri në U1, skllavi i ngulitur Arduino Uno, së bashku me Figurën 2 se si bashkëveprojnë dy detyrat e sfondit/planit të parë. Fotografia 3 është një segment kodi që përshkruan mënyrën e përdorimit të bibliotekës APDS9960_NonBlocking. Fotografia 4 jep një hartëzim midis kunjave dixhital Arduino Uno dhe kunjave aktualë të harduerit në ATMega328P.

Pas rivendosjes së mikrokontrolluesit të skllavit të ngulitur inicializon APDS9960 duke lejuar zbulimin e gjesteve të shkaktojë daljen e tij INT dhe konfiguron hyrjen/daljen e tij, duke bashkangjitur rutinën e shërbimit të ndërprerjes (ISR) 'GESTURE_CLEAR ()' për të ndërprerë vektorin INT0 (Kodi dixhital 2, Pika IC e pajisjes 4), duke e konfiguruar atë për një shkas të skajit që bie. Kjo formon hyrjen nGestureClear nga pajisja kryesore.

Pin -i i daljes Interrupt 'INT' nga APDS9960 është i lidhur me Digital Pin 4, Hardware IC Pin 6 i cili është konfiguruar si hyrje në U1.

Linja e sinjalit 'nGestureAvailable' në pinin dixhital 7, PIN Hardware IC 13 është konfiguruar si dalje dhe është vendosur lartë, joaktive (e de-pohuar).

Së fundi, bitët e Portit B 0… 3, përkatësisht, konfigurohen si dalje dhe vendosen në nivel të ulët. Këto formojnë gërvishtjen e të dhënave e cila përfaqëson llojet e ndryshme të gjesteve të zbuluara; Asnjë = 0x0, Gabim = 0xF, lart = 0x1, poshtë = 0x2, majtas = 0x3, djathtas = 0x4, afër = 0x5 dhe larg = 0x6.

Detyra e sfondit 'Loop' është caktuar që sondazhon vazhdimisht APDS9960 Interrupt output nëpërmjet leximit të Kunjit Dixhital 4. Kur dalja INT nga APDS9960 bëhet aktive e ulët duke treguar se sensori është shkaktuar, mikrokontrolluesi përpiqet të interpretojë çdo gjest duke thirrur 'readGesture () 'me it while (1) {}; lak pa fund.

Nëse është zbuluar një gjest i vlefshëm, kjo vlerë i shkruhet Portit B, dalja 'nGestureAvailable' pohohet dhe semafori boolean 'bGestureAvailable' vendoset, duke parandaluar regjistrimin e ndonjë gjesti tjetër.

Pasi master zbulon daljen aktive 'nGestureAvailable' lexon këtë vlerë të re dhe pulson 'nGestureClear' aktive të ulët. Ky avantazh në rënie shkakton që detyra e parë "ISR GESTURE_CLEAR ()" të planifikohet duke pezulluar ekzekutimin e detyrës në sfond "Loop", duke pastruar Portën B, semaforin "bGestureAvailable" dhe daljen "nGestureAvailable".

Detyra e parë 'GESTURE_CLEAR ()' tani është pezulluar dhe detyra në sfond 'Loop' është ri-planifikuar. Gjestet e mëtejshme nga APDS9960 tani mund të ndihen.

Duke përdorur detyrat e ndërprera të shkaktuara në plan të parë/sfond në këtë mënyrë, laku i mundshëm i pafund në 'readGesture ()' të pajisjes skllevër nuk do të ndikojë në funksionimin e pajisjes kryesore dhe nuk do të pengojë as ekzekutimin e pajisjes skllevër. Kjo formon bazën e një sistemi operativ shumë të thjeshtë në kohë reale (RTOS).

Shënim: Parashtesa 'n' do të thotë aktiv i ulët ose i pohuar si në 'nGestureAvailable'

Hapi 3: Testimi i Pajisjes së Ndjesisë së Gjesteve të JoBllokuese APDS9960

Testimi i Pajisjes së Ndjesisë së Gjesteve të JoBllokuese APDS9960
Testimi i Pajisjes së Ndjesisë së Gjesteve të JoBllokuese APDS9960
Testimi i Pajisjes së Ndjesisë së Gjesteve të JoBllokuese APDS9960
Testimi i Pajisjes së Ndjesisë së Gjesteve të JoBllokuese APDS9960
Testimi i Pajisjes së Ndjesisë së Gjesteve të JoBllokuese APDS9960
Testimi i Pajisjes së Ndjesisë së Gjesteve të JoBllokuese APDS9960
Testimi i Pajisjes së Ndjesisë së Gjesteve të JoBllokuese APDS9960
Testimi i Pajisjes së Ndjesisë së Gjesteve të JoBllokuese APDS9960

Parathënie

Edhe pse moduli APDS9960 furnizohet me +5v ai përdor një rregullator në bord +3v3 që do të thotë se linjat e tij I2C janë në përputhje me +3v3 dhe jo +5v. Kjo është arsyeja pse unë zgjodha të përdor Arduino Due të pajtueshëm me +3v3 Due si mikrokontrollues testi, për të shmangur nevojën për ndërrues të nivelit.

Nëse megjithatë, dëshironi të përdorni një Arduino Uno aktual, atëherë do t'ju duhet të zhvendosni nivelet e linjave I2C në U1. Shih udhëzuesin e mëposhtëm ku kam bashkangjitur një grup të dobishëm rrëshqitësish (I2C_LCD_With_Arduino) i cili jep shumë këshilla praktike për përdorimin e I2C.

Testimi i ndërfaqes I2C

Fotografitë 1 dhe 2 më sipër tregojnë se si të vendosni dhe programoni sistemin për ndërfaqen I2C. Së pari do të duhet të shkarkoni dhe instaloni bibliotekën APDS9960_NonBlocking. ketu

Testimi i Ndërfaqes Paralele

Fotografitë 3 dhe 4 detajojnë të njëjtën gjë për ndërfaqen Paralele

Hapi 4: Përfundimi

Përfundim
Përfundim

Të përgjithshme

Kodi funksionon mirë dhe zbulon gjestet me përgjegjësi pa ndonjë pozitiv të rremë. Ka qenë në funksion për disa javë tani si një pajisje skllevër në projektin tim të ardhshëm. Unë kam provuar shumë mënyra të ndryshme dështimi (dhe kështu ka bërë kunji kureshtar i shtëpisë Quinn) i cili më parë rezultoi në një rivendosje të ESP8266-12, pa asnjë efekt negativ.

Përmirësimet e mundshme

  • E dukshmja. Rishkruani bibliotekën APDS9960 Gesture Sensor që të mos jetë bllokuese.

    Në fakt, unë kontaktova me Broadcom i cili më vuri te një shpërndarës lokal i cili menjëherë injoroi kërkesën time për mbështetje, unë thjesht nuk jam SparkFun apo AdaFruit, mendoj. Pra, kjo ndoshta do të duhet të presë një kohë

  • Portoni kodin në një mikrokontrollues skllav më të vogël. Përdorimi i një ATMega328P për një detyrë është pak e tepërt. Megjithëse fillimisht shikova ATTiny84, ndalova së përdoruri një pasi ndjeva se madhësia e përpiluar e kodit ishte një përshtatje e vijës kufitare. Me shpenzimet shtesë të nevojshme për të modifikuar bibliotekën APDS9960 për të punuar me një bibliotekë të ndryshme I2C.

Hapi 5: Referencat

Kërkohet për të programuar arduino të ngulitur (ATMega328P - U1)

SparkFun_APDS9960.h

  • Nga: Steve Quinn
  • Qëllimi: Ky është një version i pirunuar i Sensorit SparkFun APDS9960 i pirunuar nga jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Ka disa modifikime për të ndihmuar në korrigjimin dhe ka një detektor të deensibilizuar për të zvogëluar shkaktimin e rremë.
  • Nga:

Kërkohet për të futur këtë funksion jo bllokues në kodin tuaj arduino dhe për të dhënë shembuj të punuar

APDS9960_NonBllokimi.h

  • Nga: Steve Quinn
  • Qëllimi: Siguron një ndërfaqe të pastër për të futur këtë zbatim jo-bllokues të Sensorit të gjesteve APDS9960 në kodin tuaj Arduino.
  • Nga:

Sistemi operativ në kohë reale

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

Fleta e të dhënave APDS9960

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

Fleta e të dhënave PCF8574A

Recommended: