Turinys:

Neblokuojantis APDS9960 gesto jutiklio diegimas: 5 žingsniai
Neblokuojantis APDS9960 gesto jutiklio diegimas: 5 žingsniai

Video: Neblokuojantis APDS9960 gesto jutiklio diegimas: 5 žingsniai

Video: Neblokuojantis APDS9960 gesto jutiklio diegimas: 5 žingsniai
Video: Gesture Sensor & LED matrix 2024, Liepa
Anonim
Neblokuojantis APDS9960 gesto jutiklio diegimas
Neblokuojantis APDS9960 gesto jutiklio diegimas
Neblokuojantis APDS9960 gesto jutiklio diegimas
Neblokuojantis APDS9960 gesto jutiklio diegimas
Neblokuojantis APDS9960 gesto jutiklio diegimas
Neblokuojantis APDS9960 gesto jutiklio diegimas

Preambulė

Šioje instrukcijoje išsamiai aprašoma, kaip naudojant „SparkFun_APDS-9960_Sensor_Arduino_Library“sukurti neužblokuojantį APDS9960 gestų jutiklio diegimą.

Įvadas

Taigi jūs tikriausiai klausiate savęs, kas nėra blokavimas? O gal net blokavimas šiuo klausimu?

Dar svarbiau, kodėl svarbu nieko neužblokuoti?

Gerai, taigi, kai mikroprocesorius paleidžia programą, jis nuosekliai vykdo kodo eilutes ir tai darydamas skambina į funkcijas ir grįžta iš jų tokia tvarka, kokia jas parašėte.

Blokuojantis skambutis yra tik skambutis į bet kokias funkcijas, dėl kurių vykdymas sustabdomas, o tai reiškia funkcinį iškvietimą, kai skambinantysis nebeatnaujina, kol baigiama vykdyti iškviesta funkcija.

Taigi kodėl tai svarbu?

Jei parašėte kodą, kuris turi reguliariai vykdyti daugybę funkcijų, pavyzdžiui, nuskaityti temperatūrą, perskaityti mygtuką ir atnaujinti ekraną, jei ekrano atnaujinimo kodas yra blokuojantis skambutis, jūsų sistema nereaguoja mygtuko paspaudimai ir temperatūros pokyčiai, nes procesorius praleis visą laiką laukdamas, kol ekranas bus atnaujintas, o ne skaitys mygtuko būseną ar naujausią temperatūrą.

Savo ruožtu noriu sukurti MQTT per „Wi -Fi“palaikantį „IoT“darbalaukio įrenginį, kuris nuskaito tiek vietines, tiek nuotolines temperatūros/drėgmės vertes, aplinkos šviesos lygį, barometrinį slėgį, seka laiką, rodo visus šiuos parametrus LCD ekrane, prisijunkite prie uSD kortelę realiuoju laiku, skaityti mygtukų įvestis, rašyti į išvesties šviesos diodus ir stebėti gestus, kad būtų galima valdyti dalykus mano daiktų interneto infrastruktūroje ir visa tai valdyti ESP8266-12.

Deja, vieninteliai du APDS9960 bibliotekos šaltiniai, kuriuos galėjau rasti, buvo „SparkFun“ir „AdaFruit“bibliotekos, kurios abi buvo nukopijuotos nuo „Avago“(ADPS9960 gamintojo) programos kodo ir turi skambutį pavadinimu „readGesture“, kuriame yra šiek tiek laiko (1) {}; kilpa, kuri, naudojant aukščiau pateiktą projektą, sukelia ESP8266-12E atstatymą, kai ADPS9960 jutiklis tampa prisotintas (ty kai objektas lieka arti ar yra kitas IR šaltinis, apšviečiantis jutiklį).

Todėl norėdamas išspręsti šią problemą nusprendžiau perkelti gestų apdorojimą į antrąjį procesorių, kai ESP8266-12E tapo pagrindiniu mikrovaldikliu, o ši sistema-vergu, kaip parodyta 1 ir 2 paveikslėliuose, sistemos apžvalgos ir sistemos sudėties schemose.. 3 paveiksle parodyta prototipo grandinė.

Norėdami apriboti turimo kodo pakeitimus, aš taip pat parašiau įvyniojimo klasę/biblioteką, pavadintą „APDS9960_NonBlocking“.

Toliau pateikiamas išsamus neblokuojančio sprendimo paaiškinimas.

Kokių dalių man reikia?

Jei norite sukurti I2C sprendimą, kuris veikia su APDS9960_NonBlocking biblioteka, jums reikės šių dalių.

  1. 1 nuolaida „ATMega328P“čia
  2. 1 nuolaida PCF8574P čia
  3. 6 išjungti 10K rezistorius čia
  4. Čia yra 4 išjungti 1K rezistoriai
  5. 1 išjungtas 1N914 diodas čia
  6. 1 nuolaida PN2222 NPN tranzistorius čia
  7. Čia yra 1 išjungtas 16MHz kristalas
  8. 2 išjungti 0,1uF kondensatorius čia
  9. 1 nuolaida 1000uF elektrolitiniam kondensatoriui čia
  10. 1 išjungtas 10uF elektrolitinis kondensatorius čia
  11. Čia yra 2 išjungti 22pF kondensatoriai

Jei norite skaityti gesto jutiklio išvestį per lygiagrečią sąsają, galite numesti PCF8574P ir tris 10K rezistorius.

Kokios programinės įrangos man reikia?

„Arduino IDE“1.6.9

Kokių įgūdžių man reikia?

Norėdami nustatyti sistemą, naudokite šaltinio kodą (pateiktą) ir sukurkite reikiamą grandinę, jums reikės:

  • Minimalus elektronikos išmanymas,
  • Žinios apie Arduino ir jo IDE,
  • Supratimas, kaip programuoti įterptąjį „Arduino“(žr. Instrukciją „ATTiny85, ATTiny84 ir ATMega328P programavimas: Arduino kaip interneto paslaugų teikėjas“)
  • Šiek tiek kantrybės.

Aptartos temos

  • Trumpa grandinės apžvalga
  • Trumpa programinės įrangos apžvalga
  • APDS9960 gestų jutimo įrenginio bandymas
  • Išvada
  • Nuorodos

1 žingsnis: grandinės apžvalga

Grandinės apžvalga
Grandinės apžvalga

Grandinė yra padalinta į dvi dalis;

  • Pirmasis yra serijinis I2C lygiagretus konvertavimas, atliktas naudojant rezistorius R8… 10 ir IC1. Čia R8… R10 nustato I2C adresą 8 bitų įvesties/išvesties lustui IC1 ir NXP PCF8574A. Tinkami šio įrenginio adresų diapazonai yra atitinkamai 0x38… 0x3F. Pateiktame „I2C“programinės įrangos pavyzdyje „I2C_APDS9960_TEST.ino“#define GESTURE_SENSOR_I2C_ADDRESS reikės pakeisti, kad jis atitiktų šį adresų diapazoną.
  • Visi kiti komponentai sudaro įterptąjį „Arduino Uno“ir turi šias funkcijas;

    • R1, T1, R2 ir D1 teikia pavaldinio įrenginio atstatymo įvestį. Čia aktyvus didelis IC1 - P7 impulsas privers U1 atstatyti.
    • R3, R4 yra srovę ribojantys rezistoriai įterptiesiems įrenginiams, programuojantiems TX/RX linijas.
    • C5 ir R7 leidžia „Arduino IDE“automatiškai užprogramuoti U1 per impulsą prijungto FTDI įrenginio DTR linijoje.
    • R5 ir R6 yra I2C traukimo rezistoriai, skirti APDS9960, o C6 - tai vietinis tiekimo bėgių atjungimas.
    • U1, C1, C2 ir Q1 sudaro įterptąjį „Arduino Uno“ir atitinkamai laikrodį.
    • Galiausiai C3 ir C4 užtikrina U1 vietinio tiekimo bėgio atsiejimą.

2 veiksmas: programinės įrangos apžvalga

Programinės įrangos apžvalga
Programinės įrangos apžvalga
Programinės įrangos apžvalga
Programinės įrangos apžvalga
Programinės įrangos apžvalga
Programinės įrangos apžvalga

Preambulė

Norėdami sėkmingai surinkti šį šaltinio kodą, jums reikės šių papildomų bibliotekų, skirtų programuoti įterptąjį „Arduino Uno U1“;

SparkFun_APDS9960.h

  • Autorius: Steve Quinn
  • Tikslas: Tai šakinė „SparkFun APDS9960“jutiklio versija, išsišakojusi iš „jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library“. Jis turi keletą modifikacijų, padedančių derinti, ir turi jautrumą mažinantį detektorių, kuris sumažina klaidingą paleidimą.
  • Iš:

APDS9960_NonBlocking.h

  • Autorius: Steve Quinn
  • Tikslas: Suteikia švarią sąsają, kad į „Arduino“kodą būtų galima įterpti šį neužblokuojantį APDS9960 gestų jutiklio diegimą.
  • Iš:

Žiūrėkite šią instrukciją, kaip užprogramuoti įterptąjį „Arduino Uno“(ATMega328P) mikrovaldiklį, jei nežinote, kaip tai pasiekti;

ATTINY85, ATTINY84 IR ATMEGA328P PROGRAMAVIMAS: ARDUINO AS ISP

Funkcinė apžvalga

„ATMega328P“įterptas vergų mikrovaldiklis apklausia INT liniją iš ADPS9960. Kai ši eilutė nusileidžia, mikrovaldiklis skaito ADPS9960 registrus ir nustato, ar buvo pastebėtas galiojantis gestas. Jei buvo aptiktas tinkamas gestas, šio gesto kodas 0x0… 0x6, 0xF dedamas į B prievadą ir teigiama, kad „nGestureAvailable“yra mažas.

Kai pagrindinis įrenginys mato, kad „nGestureAvailable“yra aktyvus, jis skaito B prievado vertę, tada laikinai impulsuoja „nGestureClear“, kad patvirtintų duomenų gavimą.

Tada pavaldinis įrenginys panaikina reikšmę „nGestureAvailable“ir išvalo duomenis iš B prievado. 5 paveikslėlyje parodyta ekrano kopija, paimta iš loginio analizatoriaus viso aptikimo/skaitymo ciklo metu.

Kodo apžvalga

Aukščiau esančioje 1 nuotraukoje išsamiai aprašyta, kaip veikia U1 programinė įranga, įterptas vergas „Arduino Uno“, ir 2 paveikslėlyje, kaip sąveikauja dvi foninės/pirmojo plano užduotys. 3 pav. Yra kodo segmentas, kuriame aprašoma, kaip naudoti APDS9960_NonBlockinglibrary. 4 paveiksle pateikiamas „Arduino Uno“skaitmeninių kaiščių ir tikrųjų „ATMega328P“aparatūros kaiščių atvaizdavimas.

Iš naujo nustatęs įterptąjį vergų mikrovaldiklį, inicijuoja APDS9960, leidžiantį gestų aptikimui suaktyvinti jo INT išvestį, ir sukonfigūruoja jo įvestį/išvestį, pridedant pertraukimo paslaugų rutiną (ISR) „GESTURE_CLEAR ()“, kad pertrauktų vektorių INT0 (2 skaitmeninis kaištis, aparatūros IC 4 kontaktas), sukonfigūruodami jį krentančio krašto gaidukui. Tai sudaro pagrindinio įrenginio įvestį „nGestureClear“.

Pertraukimo išvesties kaištis „INT“iš APDS9960 yra prijungtas prie skaitmeninio kaiščio 4, aparatūros IC kaiščio 6, kuris sukonfigūruotas kaip įvestis į U1.

„NGestureAvailable“signalo linija 7 skaitmeniniame kaištyje, aparatinės įrangos IC 13 kaištyje, yra sukonfigūruota kaip išvestis ir nustatyta aukšta, neaktyvi (panaikinta).

Galiausiai B prievado bitai 0… 3 atitinkamai sukonfigūruoti kaip išėjimai ir nustatyti žemi. Tai sudaro duomenų gniužulą, kuris atspindi įvairius aptiktus gestų tipus; Nėra = 0x0, klaida = 0xF, aukštyn = 0x1, žemyn = 0x2, kairė = 0x3, dešinė = 0x4, arti = 0x5 ir toli = 0x6.

Suplanuota foninė užduotis „Loop“, kuri nuolat apklausia APDS9960 pertraukimo išvestį INT skaitydama skaitmeninį 4 kaištį. Kai INDS išvestis iš APDS9960 tampa aktyvi, rodo, kad jutiklis buvo suaktyvintas, mikrovaldiklis bando interpretuoti bet kokį gestą skambindamas „readGesture () 'with it while (1) {}; begalinė kilpa.

Jei aptiktas tinkamas gestas, ši vertė įrašoma į B prievadą, patvirtinama išvestis „nGestureAvailable“ir nustatomas loginis semaforas „bGestureAvailable“, neleidžiant registruoti jokių kitų gestų.

Kai kapitonas aptinka aktyvią „nGestureAvailable“išvestį, ji nuskaito šią naują vertę ir impulsuoja „nGestureClear“aktyvią žemą reikšmę. Šis mažėjantis kraštas suaktyvina pagrindinio plano užduoties „ISR GESTURE_CLEAR ()“suplanavimą, sustabdydamas foninės užduoties „Loop“vykdymą, išvalydamas prievadą B, „bGestureAvailable“semaforą ir „nGestureAvailable“.

Pirmojo plano užduotis „GESTURE_CLEAR ()“dabar sustabdyta, o foninė užduotis „Loop“suplanuota iš naujo. Dabar galima aptikti kitus gestus iš APDS9960.

Tokiu būdu naudojant pertraukimo suaktyvintas pirmojo plano/fono užduotis, potenciali begalinė pavaldinio įrenginio „readGesture ()“kilpa neturės įtakos pagrindinio įrenginio veikimui ir netrukdys vykdyti pavaldinio įrenginio. Tai yra labai paprastos realaus laiko operacinės sistemos (RTOS) pagrindas.

Pastaba: priešdėlis „n“reiškia aktyvų žemą arba tvirtinamas kaip „nGestureAvailable“

3 veiksmas: neblokuojančio APDS9960 gestų jutimo įrenginio testavimas

Neblokuojančio APDS9960 gestų jutiklio įrenginio bandymas
Neblokuojančio APDS9960 gestų jutiklio įrenginio bandymas
Neblokuojamo APDS9960 gestų jutiklio įrenginio bandymas
Neblokuojamo APDS9960 gestų jutiklio įrenginio bandymas
Neblokuojančio APDS9960 gestų jutiklio įrenginio bandymas
Neblokuojančio APDS9960 gestų jutiklio įrenginio bandymas
Neblokuojamo APDS9960 gestų jutiklio įrenginio bandymas
Neblokuojamo APDS9960 gestų jutiklio įrenginio bandymas

Preambulė

Nors APDS9960 modulis tiekiamas su +5 V, jis naudoja įmontuotą +3v3 reguliatorių, o tai reiškia, kad I2C linijos atitinka +3v3, o ne +5v. Štai kodėl nusprendžiau naudoti „ +3v3“suderinamą „Arduino Due“kaip bandomąjį mikrovaldiklį, kad nereikėtų lygių perjungiklių.

Jei vis dėlto norite naudoti tikrą „Arduino Uno“, turėsite perkelti I2C linijas į U1 lygį. Žiūrėkite šią instrukciją, kurioje pridėjau naudingą skaidrių rinkinį (I2C_LCD_With_Arduino), kuriame pateikiama daug praktinių patarimų, kaip naudoti I2C.

I2C sąsajos testavimas

1 ir 2 paveikslėliuose parodyta, kaip nustatyti ir užprogramuoti I2C sąsajos sistemą. Pirmiausia turėsite atsisiųsti ir įdiegti APDS9960_NonBlocking biblioteką. čia

Lygiagrečios sąsajos testavimas

3 ir 4 paveikslėliuose lygiagrečiai naudojama sąsaja

4 žingsnis: Išvada

Išvada
Išvada

Generolas

Kodas veikia gerai ir gestus reaguoja be jokių klaidingų teigiamų rezultatų. Jau kelias savaites jis veikia ir veikia kaip vergas mano kitame projekte. Aš išbandžiau daugybę skirtingų gedimo režimų (taip pat ir smalsus „Quinn“buitinis moggie), dėl kurio anksčiau buvo nustatytas ESP8266-12 atstatymas be jokio neigiamo poveikio.

Galimi patobulinimai

  • Akivaizdu. Perrašykite APDS9960 gestų jutiklio biblioteką, kad ji nebūtų blokuojama.

    Tiesą sakant, aš susisiekiau su „Broadcom“, kuris kreipėsi į vietinį platintoją, kuris nedelsdamas ignoravo mano pagalbos prašymą, aš tiesiog nesu „SparkFun“ar „AdaFruit“. Taigi greičiausiai teks šiek tiek palaukti

  • Perkelkite kodą į mažesnį vergų mikrovaldiklį. „ATMega328P“naudojimas vienai užduočiai yra šiek tiek per daug. Nors iš pradžių pažvelgiau į „ATTiny84“, nustojau juo naudotis, nes maniau, kad surinktas kodo dydis tinka pasieniui. Pridedant pridėtines išlaidas, kai reikia modifikuoti APDS9960 biblioteką, kad ji veiktų su kita I2C biblioteka.

5 žingsnis: nuorodos

Būtina programuoti įterptąjį arduino (ATMega328P - U1)

SparkFun_APDS9960.h

  • Autorius: Steve Quinn
  • Tikslas: Tai šakinė „SparkFun APDS9960“jutiklio versija, išsišakojusi iš „jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library“. Jis turi keletą modifikacijų, padedančių derinti, ir turi jautrumą mažinantį detektorių, kuris sumažina klaidingą paleidimą.
  • Iš:

Būtina įterpti šią neužblokuojančią funkciją į savo arduino kodą ir pateikti veikiančių pavyzdžių

APDS9960_NonBlocking.h

  • Autorius: Steve Quinn
  • Tikslas: Suteikia švarią sąsają, kad į „Arduino“kodą būtų galima įterpti šį neužblokuojantį APDS9960 gestų jutiklio diegimą.
  • Iš:

Realaus laiko operacinė sistema

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

APDS9960 duomenų lapas

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

Rekomenduojamas: