Talaan ng mga Nilalaman:

NonBlocking APDS9960 Gesture Sensor Pagpapatupad: 5 Hakbang
NonBlocking APDS9960 Gesture Sensor Pagpapatupad: 5 Hakbang

Video: NonBlocking APDS9960 Gesture Sensor Pagpapatupad: 5 Hakbang

Video: NonBlocking APDS9960 Gesture Sensor Pagpapatupad: 5 Hakbang
Video: Using gestures to control lights on Home Assistant 2024, Hulyo
Anonim
NonBlocking APDS9960 Gesture Sensor Pagpapatupad
NonBlocking APDS9960 Gesture Sensor Pagpapatupad
NonBlocking APDS9960 Gesture Sensor Pagpapatupad
NonBlocking APDS9960 Gesture Sensor Pagpapatupad
NonBlocking APDS9960 Gesture Sensor Pagpapatupad
NonBlocking APDS9960 Gesture Sensor Pagpapatupad

Panimula

Maituturo ang mga detalyeng ito kung paano lumikha ng isang hindi naka-block na pagpapatupad ng APDS9960 Gesture Sensor gamit ang SparkFun_APDS-9960_Sensor_Arduino_Library.

Panimula

Kaya marahil tinatanong mo sa iyong sarili kung ano ang hindi naka-block? O kahit na pagharang para sa bagay na iyon?

Mas mahalaga kung bakit mahalaga na magkaroon ng isang hindi nagba-block ng tama?

Ok, kaya't kapag nagpapatakbo ng isang programa ang isang microprocessor ay sunud-sunod itong nagpapatupad ng mga linya ng code at sa paggawa nito ay tumatawag at bumalik mula sa mga pag-andar ayon sa pagkakasunud-sunod kung saan mo ito isinulat.

Ang isang humahadlang na tawag ay isang tawag lamang sa anumang uri ng pag-andar na nagdudulot ng paghinto ng pagpapatupad, nangangahulugang isang tawag sa pag-andar kung saan ang tumatawag ay hindi ipagpatuloy ang pagpapatupad hanggang matapos ang tinawag na pag-andar.

Kaya bakit ito mahalaga?

Sa kaso kung saan nakasulat ka ng ilang code na kung saan kailangang regular na magpatupad ng maraming mga function nang sunud-sunod tulad ng basahin ang isang temperatura, basahin ang isang pindutan at i-update ang isang display, kung ang code upang i-update ang display ay isang nakaharang na tawag, ang iyong system ay hindi tumutugon sa mga pagpindot sa pindutan at pagbabago sa temperatura, dahil gugugol ng processor ang lahat ng oras na naghihintay para ma-update ang display at hindi binabasa ang katayuan ng pindutan o pinakabagong temperatura.

Para sa aking bahagi nais kong lumikha ng isang MQTT sa paglipas ng WiFi na may kakayahang IoT desktop aparato na nagbabasa ng parehong lokal at remote na mga halaga ng temp / kahalumigmigan, mga antas ng ambient light, presyon ng barometric, sinusubaybayan ang oras, ipakita ang lahat ng mga parameter na ito sa isang LCD, mag-log sa isang uSD card sa real time, basahin ang mga pag-input ng pindutan, sumulat sa mga output ng LED at subaybayan ang mga kilos upang makontrol ang mga bagay sa aking IoT imprastraktura at lahat na makokontrol ng isang ESP8266-12.

Sa kasamaang palad ang tanging mapagkukunan ng library ng APDS9960 na maaari kong makita ay ang mga aklatan ng SparkFun at AdaFruit, na kapwa tinira mula sa application code mula sa Avago (ang tagagawa ng ADPS9960) at nagtataglay ng tawag na pinangalanang 'readGesture' na naglalaman ng ilang sandali (1) {}; loop na kung saan ginamit sa proyekto sa itaas ay sanhi ng pag-reset ng ESP8266-12E tuwing ang ADPS9960 sensor ay nabusog (ibig sabihin, kapag ang isang bagay ay nanatili sa malapit, o may isa pang mapagkukunan ng IR na nag-iilaw sa sensor).

Dahil dito upang malutas ang pag-uugaling ito pinili ko upang ilipat ang pagproseso ng mga Gesture sa isang pangalawang processor kung saan ang ESP8266-12E ay naging master microcontroller at ang sistemang ito ang alipin, tulad ng inilalarawan sa Pics 1 & 2 sa itaas, ang System Overview at mga diagram ng Komposisyon ng System ayon sa pagkakabanggit. Ipinapakita ng Pic 3 ang prototype circuit.

Upang malimitahan ang mga pagbabagong kailangan kong gawin sa aking umiiral na code nagsulat din ako ng isang pambalot na klase / silid aklatan na naisip na pinangalanang 'APDS9960_NonBlocking'.

Ang sumusunod ay isang detalyadong paliwanag sa hindi nakaharang na solusyon.

Anong Mga Bahagi ang Kailangan Ko?

Kung nais mong buuin ang solusyon sa I2C na gumagana sa APDS9960_NonBlocking library kakailanganin mo ang mga sumusunod na bahagi.

  1. 1 off ATMega328P dito
  2. 1 off ang PCF8574P dito
  3. 6 off 10K Resistors dito
  4. 4 off 1K Resistors dito
  5. 1 off 1N914 Diode dito
  6. 1 off ang PN2222 NPN Transistor dito
  7. 1 off 16MHz na kristal dito
  8. 2 off 0.1uF Capacitors dito
  9. 1 off 1000uF Electrolytic Capacitor dito
  10. 1 off 10uF Electrolytic Capacitor dito
  11. 2 off 22pF Capacitors dito

Kung nais mong basahin ang output ng sensor ng kilos sa pamamagitan ng parallel interface pagkatapos ay maaari mong i-drop ang PCF8574P at tatlong off 10K resistors.

Anong software ang kailangan ko?

Arduino IDE 1.6.9

Anong mga kasanayan ang kailangan ko?

Upang maitakda ang system, gamitin ang source code (ibinigay) at lumikha ng kinakailangang circuitry kakailanganin mo ang sumusunod;

  • Isang kaunting pag-unawa ng electronics,
  • Kaalaman sa Arduino at ito ay IDE,
  • Isang pag-unawa sa kung paano mag-program ng isang naka-embed na Arduino (Tingnan ang Instructable 'Programming the ATTiny85, ATTiny84 at ATMega328P: Arduino As ISP')
  • Ilang Pasensya.

Saklaw ang mga paksa

  • Maikling pangkalahatang ideya ng circuit
  • Maikling pangkalahatang ideya ng software
  • Pagsubok sa APDS9960 Gesture Sensing Device
  • Konklusyon
  • Mga Sanggunian

Hakbang 1: Pangkalahatang-ideya ng Circuit

Pangkalahatang-ideya ng Circuit
Pangkalahatang-ideya ng Circuit

Ang circuit ay nahahati sa dalawang seksyon;

  • Ang una ay ang serial I2C sa parallel conversion na nagawa sa pamamagitan ng resistors R8 … 10 at IC1. Narito R8 … Itakda ng R10 ang I2C address para sa 8 bit I / O expander chip IC1 isang NXP PCF8574A. Ang mga wastong saklaw ng address para sa aparatong ito ay 0x38… 0x3F ayon sa pagkakabanggit. Sa halimbawang I2C software na ibinigay 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' ay kailangang baguhin upang umangkop sa saklaw ng address na ito.
  • Ang lahat ng iba pang mga bahagi ay bumubuo ng isang naka-embed na Arduino Uno ng alipin at may mga sumusunod na pag-andar;

    • Ang R1, T1, R2 at D1 ay nagbibigay ng input ng pag-reset ng isang aparato ng alipin. Narito ang isang aktibong mataas na pulso sa IC1 - P7 ay pipilitin ang U1 na i-reset.
    • Ang R3, R4, ay kasalukuyang naglilimita ng mga resistors para sa naka-embed na linya ng programa ng TX / RX.
    • Pinapayagan ng C5 at R7 ang Arduino IDE na awtomatikong i-program ang U1 sa pamamagitan ng isang pulso sa linya ng DTR ng isang nakakabit na FTDI na aparato.
    • Ang R5 at R6 ay ang I2C na kumukuha ng mga resistor para sa APDS9960 na may C6 na nagbibigay ng lokal na supply decoupling ng riles.
    • U1, C1, C2 at Q1 form ang naka-embed na Arduino Uno at ito ay orasan ayon sa pagkakabanggit.
    • Sa wakas ang C3 at C4 ay nagbibigay ng lokal na supply decoupling ng riles para sa U1.

Hakbang 2: Pangkalahatang-ideya ng Software

Pangkalahatang-ideya ng Software
Pangkalahatang-ideya ng Software
Pangkalahatang-ideya ng Software
Pangkalahatang-ideya ng Software
Pangkalahatang-ideya ng Software
Pangkalahatang-ideya ng Software

Panimula

Upang matagumpay na maipon ang source code na ito kakailanganin mo ang mga sumusunod na labis na aklatan upang mai-program ang naka-embed na Arduino Uno U1;

SparkFun_APDS9960.h

  • Ni: Steve Quinn
  • Layunin: Ito ay isang forked na bersyon ng SparkFun APDS9960 Sensor na tinidor mula sa jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Mayroon itong ilang mga pagbabago upang makatulong sa pag-debug at mayroong isang de-sensitized na detektor upang mabawasan ang maling pag-triggering.
  • Mula sa:

APDS9960_NonBlocking.h

  • Ni: Steve Quinn
  • Layunin: Nagbibigay ng isang malinis na interface upang mai-embed ang di-pagharang na pagpapatupad ng APDS9960 Gesture Sensor sa iyong Arduino code.
  • Mula sa:

Tingnan ang sumusunod na Maituturo sa kung paano mag-program ng isang naka-embed na Arduino Uno (ATMega328P) microcontroller kung hindi ka pamilyar sa kung paano ito makakamtan;

PROGRAMMING THE ATTINY85, ATTINY84 AND ATMEGA328P: ARDUINO AS ISP

Functional na Pangkalahatang-ideya

Ang ATMega328P naka-embed na microcontroller ng alipin ay bumoto sa linya ng INT mula sa ADPS9960. Kapag bumababa ang linyang ito binabasa ng microcontroller ang mga pagrehistro ng ADPS9960 at tinutukoy kung mayroong isang wastong kilos na nadama. Kung may natukoy na wastong kilos, ang code para sa kilos na ito 0x0… 0x6, 0xF ay nakalagay sa Port B at ang 'nGestureAvailable' ay mas mababa ang iginiit.

Kapag nakita ng aparato ng Master na aktibo ang 'nGestureAvailable', binabasa nito ang halaga sa Port B pagkatapos ng pulso na 'nGestureClear' mababa pansamantala upang kilalanin ang pagtanggap ng data.

Ang aparato ng alipin pagkatapos ay de-asserts 'nGestureAvailable' mataas at nililimas ang data sa Port B. Ang Pic 5 sa itaas ay nagpapakita ng isang pag-agaw ng screen na kinuha mula sa isang analyser ng lohika sa panahon ng isang buong siklo ng pagtuklas / basahin.

Pangkalahatang-ideya ng Code

Ang Pic 1 sa itaas ay nagdetalye kung paano gumagana ang software sa U1 na naka-embed na alipin na Arduino Uno, kasama ang Pic 2 kung paano nakikipag-ugnay ang dalawang gawain sa background / harapan. Ang Pic 3 ay isang segment ng code na binabalangkas kung paano gamitin ang APDS9960_NonBlockinglibrary. Ang Pic 4 ay nagbibigay ng isang pagmamapa sa pagitan ng Arduino Uno Digital Pins at aktwal na mga pin ng hardware sa ATMega328P.

Matapos i-reset ang naka-embed na microcontroller ng alipin ay pinasimulan ang APDS9960 na nagpapahintulot sa pagtuklas ng kilos upang ma-trigger ang output ng INT at mai-configure ang I / O, na ikinakabit ang nakakagambala na gawain ng serbisyo (ISR) 'GESTURE_CLEAR ()' upang makagambala sa vector INT0 (Digital pin 2, Hardware IC pin 4), pag-configure ito para sa isang bumabagsak na nag-trigger ng gilid. Binubuo nito ang nGestureClear input mula sa master device.

Ang Interrupt output pin 'INT' mula sa APDS9960 ay konektado sa Digital Pin 4, Hardware IC Pin 6 na na-configure bilang isang input sa U1.

Ang linya ng signal na 'nGestureAvailable' sa Digital pin 7, Hardware IC pin 13 ay na-configure bilang isang output at itinakda mataas, hindi aktibo (de-asserted).

Sa wakas ang Port B bits 0… 3 ayon sa pagkakabanggit ay na-configure bilang mga output at itinakda nang mababa. Bumubuo ang mga ito ng data nibble na kumakatawan sa iba't ibang mga natukoy na uri ng kilos; Wala = 0x0, Error = 0xF, Pataas = 0x1, Pababa = 0x2, Kaliwa = 0x3, Kanan = 0x4, Malapit = 0x5 at Malayo = 0x6.

Ang gawain sa background na 'Loop' ay naka-iskedyul kung saan patuloy na iboboto ang APDS9960 Makagambala output INT sa pamamagitan ng pagbabasa ng Digital Pin 4. Kapag ang output ng INT mula sa APDS9960 ay naging aktibong mababa na nagpapahiwatig na ang sensor ay na-trigger na sinubukan ng microcontroller na bigyang kahulugan ang anumang kilos sa pamamagitan ng pagtawag sa 'readGesture () 'kasama ito habang (1) {}; walang katapusang loop.

Kung may napansin na wastong kilos, ang halagang ito ay nakasulat sa Port B, ang output na 'nGestureAvailable' ay igiit at itinakda ang boolean semaphore 'bGestureAvailable', na pumipigil sa anumang karagdagang kilos na mai-log.

Kapag nakita ng master ang aktibong 'nGestureAvailable' na output binabasa nito ang bagong halaga at ang pulso na 'nGestureClear' na aktibong mababa. Ang pagbagsak na gilid na ito ay nagpapalitaw sa harapan ng gawain na 'ISR GESTURE_CLEAR ()' na naka-iskedyul na suspindihin ang pagpapatupad ng gawain sa background na 'Loop', pag-clear sa Port B, 'bGestureAvailable' semaphore at 'nGestureAvailable' output.

Ang foreground task na 'GESTURE_CLEAR ()' ay nasuspinde ngayon at naka-iskedyul muli ang gawain sa background na 'Loop'. Ang mga karagdagang kilos mula sa APDS9960 ay maaari nang maunawaan.

Sa pamamagitan ng paggamit ng nakakagambalang na-trigger na mga gawain sa harapan / background sa ganitong paraan ang potensyal na walang katapusan na loop sa 'readGesture ()' ng aparato ng alipin ay hindi makakaapekto sa master aparato mula sa pagpapatakbo at hindi rin makakahadlang sa pagpapatupad ng alipin aparato alinman. Ito ang bumubuo ng batayan ng isang napaka-simpleng operating system ng real time (RTOS).

Tandaan: Ang unlapi 'n' ay nangangahulugang aktibo mababa o asserted tulad ng sa 'nGestureAvailable'

Hakbang 3: Pagsubok sa NonBlocking APDS9960 Gesture Sensing Device

Pagsubok sa NonBlocking APDS9960 Gesture Sensing Device
Pagsubok sa NonBlocking APDS9960 Gesture Sensing Device
Pagsubok sa NonBlocking APDS9960 Gesture Sensing Device
Pagsubok sa NonBlocking APDS9960 Gesture Sensing Device
Pagsubok sa NonBlocking APDS9960 Gesture Sensing Device
Pagsubok sa NonBlocking APDS9960 Gesture Sensing Device
Pagsubok sa NonBlocking APDS9960 Gesture Sensing Device
Pagsubok sa NonBlocking APDS9960 Gesture Sensing Device

Panimula

Kahit na ang module ng APDS9960 ay ibinibigay ng + 5v gumagamit ito ng isang on-board + 3v3 regulator na nangangahulugang mga linya ng I2C ay + 3v3 na sumusunod at hindi + 5v. Ito ang dahilan kung bakit pinili ko na gamitin ang sumusunod na + 3v3 na Arduino Dahil sa test micro controller, upang maibalik ang pangangailangan para sa mga shifters sa antas.

Kung gayunpaman, nais mong gumamit ng isang tunay na Arduino Uno kung gayon kakailanganin mong i-level ang antas ng paglipat ng mga linya ng I2C sa U1. Tingnan ang sumusunod na Makatuturo kung saan nakalakip ako ng isang kapaki-pakinabang na slide set (I2C_LCD_With_Arduino) na nagbibigay ng maraming mga praktikal na tip sa paggamit ng I2C.

Pagsubok sa Interface ng I2C

Ipinapakita ng mga larawan 1 at 2 sa itaas kung paano i-set up at i-program ang system para sa interface ng I2C. Kakailanganin mong i-download at i-install muna ang library ng APDS9960_NonBlocking. dito

Parallel Interface Testing

Ang mga larawan 3 at 4 ay detalyado ng pareho para sa Parallel interface

Hakbang 4: Konklusyon

Konklusyon
Konklusyon

Pangkalahatan

Ang code ay gumagana nang maayos at nakita ang mga kilos na tumutugon nang walang anumang maling positibo. Tumatakbo ito at tumatakbo ng ilang linggo ngayon bilang isang aparato ng alipin sa aking susunod na proyekto. Sinubukan ko ang maraming magkakaibang mga mode ng kabiguan (at sa gayon ay ang matanong na Quinn moggie ng sambahayan) na dating nagresulta sa isang pag-reset ng ESP8266-12, na walang negatibong epekto.

Mga posibleng pagpapabuti

  • Ang halata. Isulat muli ang aklatan ng APDS9960 Gesture Sensor upang hindi ma-block.

    Sa totoo lang nakipag-ugnay ako sa Broadcom na inilagay ako sa isang lokal na distributor na agad na hindi pinansin ang aking kahilingan para sa suporta, hindi lang ako isang SparkFun o AdaFruit, hulaan ko. Kaya marahil ito ay maghihintay pa sandali

  • I-port ang code sa isang mas maliit na microcontroller ng alipin. Ang paggamit ng isang ATMega328P para sa isang gawain ay isang labis na labis na paggamit. Kahit na sa una ay tumingin ako sa ATTiny84, tumigil sa maikling paggamit ng isa sa palagay ko ang naipon na laki ng code ay isang linya ng hangganan na magkasya. Gamit ang idinagdag na overhead ng pagkakaroon upang baguhin ang APDS9960 library upang gumana sa isang iba't ibang mga I2C library.

Hakbang 5: Mga Sanggunian

Kinakailangan upang i-program ang naka-embed na arduino (ATMega328P - U1)

SparkFun_APDS9960.h

  • Ni: Steve Quinn
  • Layunin: Ito ay isang forked na bersyon ng SparkFun APDS9960 Sensor na tinidor mula sa jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Mayroon itong ilang mga pagbabago upang makatulong sa pag-debug at mayroong isang de-sensitized na detektor upang mabawasan ang maling pag-triggering.
  • Mula sa:

Kinakailangan upang i-embed ang hindi pag-andar na pag-andar na ito sa iyong arduino code at magbigay ng mga nagawang halimbawa

APDS9960_NonBlocking.h

  • Ni: Steve Quinn
  • Layunin: Nagbibigay ng isang malinis na interface upang mai-embed ang hindi pag-block na pagpapatupad ng APDS9960 Gesture Sensor sa iyong Arduino code.
  • Mula sa:

Sistema ng Pagpapatakbo ng Real Time

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

APDS9960 Datasheet

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

PCF8574A datasheet

Inirerekumendang: