Sadržaj:

Implementacija neblokirajućeg senzora gesta APDS9960: 5 koraka
Implementacija neblokirajućeg senzora gesta APDS9960: 5 koraka

Video: Implementacija neblokirajućeg senzora gesta APDS9960: 5 koraka

Video: Implementacija neblokirajućeg senzora gesta APDS9960: 5 koraka
Video: Понятие "имплементация" 2024, Juli
Anonim
Implementacija neblokirajućeg senzora pokreta APDS9960
Implementacija neblokirajućeg senzora pokreta APDS9960
Implementacija neblokirajućeg senzora pokreta APDS9960
Implementacija neblokirajućeg senzora pokreta APDS9960
Neblokirajuća implementacija senzora gesta APDS9960
Neblokirajuća implementacija senzora gesta APDS9960

Preambula

U ovom Uputstvu je detaljno opisano kako stvoriti neblokirajuću implementaciju APDS9960 senzora pokreta pomoću SparkFun_APDS-9960_Sensor_Arduino_Library.

Uvod

Znači, vjerojatno se pitate što nije blokiranje? Ili čak blokiranje po tom pitanju?

Još važnije, zašto je važno imati nešto što ne blokira?

U redu, pa kada mikroprocesor pokrene program, on sekvencijalno izvršava redove koda i pritom poziva i vraća funkcije iz redoslijeda kojim ste ih napisali.

Blokirajući poziv je samo poziv bilo kojoj funkciji koja uzrokuje zaustavljanje izvršenja, što znači poziv funkcije u kojoj pozivatelj neće nastaviti izvršavanje sve dok pozvana funkcija ne završi s izvršavanjem.

Pa zašto je ovo važno?

U slučaju da ste napisali neki kôd koji mora redovno izvršavati mnoge funkcije uzastopno, kao što je očitavanje temperature, čitanje dugmeta i ažuriranje ekrana, ako kôd za ažuriranje ekrana bude blokirajući poziv, vaš sistem neće reagovati na pritiskom na tipke i promjenama temperature, jer će procesor cijelo vrijeme provoditi čekajući da se zaslon ažurira, a ne čita status dugmeta ili najnoviju temperaturu.

Sa svoje strane želim stvoriti MQTT preko Wi -Fi IoT stolnog uređaja koji podržava WiFi koji čita i lokalne i daljinske vrijednosti temperature/vlažnosti, razine svjetla u okolini, barometarski tlak, prati vrijeme, prikazuje sve ove parametre na LCD -u, prijavljuje se na USB karticu u stvarnom vremenu, čitajte unose s gumbima, pišite na izlazne LED diode i pratite pokrete za kontrolu stvari u mojoj IoT infrastrukturi, a sve to kontrolira ESP8266-12.

Nažalost, jedina dva izvora biblioteke APDS9960 koje sam mogao pronaći su bile SparkFun i AdaFruit biblioteke, obje su preuzete iz aplikacijskog koda Avaga (proizvođača ADPS9960) i posjeduju poziv pod nazivom ‘readGesture’ koji sadrži neko vrijeme (1) {}; petlja koja, kada se koristi u gore navedenom projektu, uzrokuje resetiranje ESP8266-12E kad god je senzor ADPS9960 postao zasićen (tj. kada je objekt ostao u neposrednoj blizini, ili je postojao drugi IR izvor koji osvjetljava senzor).

Zbog toga sam za rješavanje ovog ponašanja odabrao premještanje obrade gesta na drugi procesor pri čemu je ESP8266-12E postao glavni mikrokontroler, a ovaj sistem rob, kako je prikazano na slici 1 i 2 gore, dijagrami Pregled sistema i Sastav sistema. Slika 3 prikazuje prototipno kolo.

Kako bih ograničio promjene koje sam morao unijeti u svoj postojeći kôd, napisao sam i klasu omotača/biblioteku maštovito nazvanu „APDS9960_NonBlocking“.

Slijedi detaljno objašnjenje rješenja koje ne blokira.

Koji dijelovi mi trebaju?

Ako želite konstruirati I2C rješenje koje funkcionira s bibliotekom APDS9960_NonBlocking, trebat će vam sljedeći dijelovi.

  1. 1 popusta na ATMega328P ovdje
  2. 1 popusta na PCF8574P ovdje
  3. 6 od 10K otpornika ovdje
  4. Ovdje možete pronaći 4 off 1K otpornika
  5. 1 off 1N914 Diode here
  6. 1 za PN2222 NPN tranzistor ovdje
  7. 1 kristal od 16 MHz ovdje
  8. 2 ovdje za kondenzatore od 0,1 uF
  9. 1 od 1000uF elektrolitičkog kondenzatora ovdje
  10. 1 od 10uF elektrolitičkog kondenzatora ovdje
  11. 2 kondenzatora od 22pF ovdje

Ako želite pročitati izlaz senzora gesta putem paralelnog sučelja, možete ispustiti PCF8574P i tri 10K otpornika.

Koji softver mi treba?

Arduino IDE 1.6.9

Koje vještine su mi potrebne?

Da biste postavili sistem, upotrijebite izvorni kod (priložen) i stvorite potrebna kola potrebno vam je sljedeće;

  • Minimalno razumijevanje elektronike,
  • Poznavanje Arduina i njegovog IDE -a,
  • Razumijevanje načina programiranja ugrađenog Arduina (vidi Instructable 'Programiranje ATTiny85, ATTiny84 i ATMega328P: Arduino kao ISP')
  • Malo strpljenja.

Obrađene teme

  • Kratak pregled kola
  • Kratak pregled softvera
  • Testiranje uređaja za prepoznavanje gesta APDS9960
  • Zaključak
  • Reference

Korak 1: Pregled kola

Pregled kola
Pregled kola

Krug je podijeljen u dvije sekcije;

  • Prvi je serijska konverzija I2C u paralelno ostvarena preko otpornika R8 … 10 i IC1. Ovdje R8… R10 postavljaju I2C adresu za 8 -bitni I/O ekspanderski čip IC1 i NXP PCF8574A. Važeći rasponi adresa za ovaj uređaj su 0x38 … 0x3F. U primjeru softvera I2C koji je ponuđen 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' bi trebalo promijeniti tako da odgovara ovom rasponu adresa.
  • Sve ostale komponente tvore robotski ugrađeni Arduino Uno i imaju sljedeće funkcije;

    • R1, T1, R2 i D1 pružaju ulaz za resetiranje slave uređaja. Ovdje će aktivni visoki impuls na IC1 - P7 prisiliti U1 na resetiranje.
    • R3, R4, su otpornici za ograničavanje struje za ugrađene uređaje za programiranje TX/RX linija.
    • C5 i R7 dopuštaju Arduino IDE -u da automatski programira U1 putem impulsa na DTR liniji priključenog FTDI uređaja.
    • R5 i R6 su I2C otporni otpornici za APDS9960 sa C6 koji osiguravaju lokalno razdvajanje opskrbnih šina.
    • U1, C1, C2 i Q1 tvore ugrađeni Arduino Uno i njegov sat.
    • Konačno, C3 i C4 omogućuju lokalno razdvajanje opskrbnih šina za U1.

Korak 2: Pregled softvera

Pregled softvera
Pregled softvera
Pregled softvera
Pregled softvera
Pregled softvera
Pregled softvera

Preambula

Za uspješno sastavljanje ovog izvornog koda trebat će vam sljedeće dodatne biblioteke za programiranje ugrađenog Arduino Uno U1;

SparkFun_APDS9960.h

  • Napisao: Steve Quinn
  • Svrha: Ovo je račvana verzija SparkFun APDS9960 senzora račvanog od jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Ima nekoliko izmjena koje pomažu u otklanjanju grešaka i ima desenzibilizirani detektor za smanjenje lažnog aktiviranja.
  • Sa:

APDS9960_NonBlocking.h

  • Napisao: Steve Quinn
  • Svrha: Omogućava čisto sučelje za ugrađivanje ove neblokirajuće implementacije APDS9960 senzora pokreta u vaš Arduino kod.
  • Sa:

Pogledajte sljedeće instrukcije o tome kako programirati ugrađeni Arduino Uno (ATMega328P) mikrokontroler ako niste upoznati kako to postići;

PROGRAMIRANJE ATTINY85, ATTINY84 I ATMEGA328P: ARDUINO KAO ISP

Funkcionalni pregled

Ugrađeni pomoćni mikrokontroler ATMega328P anketira liniju INT iz ADPS9960. Kada se ova linija spusti, mikrokontroler čita ADPS9960 registre i utvrđuje je li primijećen valjani pokret. Ako je otkrivena valjana gesta, kôd za ovu gestu 0x0… 0x6, 0xF postavlja se na port B i 'nGestureAvailable' se tvrdi nisko.

Kada glavni uređaj vidi da je 'nGestureAvailable' aktivna, on čita vrijednost na portu B, a zatim privremeno pulsira 'nGestureClear' nisko kako bi potvrdio prijem podataka.

Podređeni uređaj tada više ne potvrđuje 'nGestureAvailable' i briše podatke na portu B. Slika 5 gore prikazuje snimku ekrana snimljenu iz logičkog analizatora tokom cijelog ciklusa otkrivanja/čitanja.

Pregled koda

Slika 1 gore prikazuje kako softver u U1 funkcionira ugrađeni slave Arduino Uno, zajedno sa slikom 2 kako dva pozadinska/prednja zadatka međusobno djeluju. Slika 3 je segment koda koji prikazuje kako se koristi APDS9960_NonBlockinglibrary. Slika 4 prikazuje mapiranje između Arduino Uno digitalnih pinova i stvarnih hardverskih pinova na ATMega328P.

Nakon resetiranja ugrađeni podređeni mikrokontroler inicijalizira APDS9960 dopuštajući detekciji gesta da pokrene svoj INT izlaz i konfigurira njegov I/O, dodajući rutinu usluge prekida (ISR) 'GESTURE_CLEAR ()' za prekid vektora INT0 (digitalni pin 2, hardverski IC pin 4), konfigurirajući ga za padajući okidač. Ovo formira nGestureClear ulaz sa glavnog uređaja.

Izlazni pin prekida 'INT' iz APDS9960 spojen je na digitalni pin 4, hardverski IC pin 6 koji je konfiguriran kao ulaz na U1.

Signalna linija 'nGestureAvailable' na digitalnom pinu 7, hardverskom IC pinu 13 konfigurirana je kao izlaz i postavljena visoko, neaktivno (poništeno).

Konačno, bitovi porta B 0… 3 su konfigurirani kao izlazi i postavljeni nisko. Oni tvore grickanje podataka koji predstavlja različite otkrivene vrste pokreta; Ništa = 0x0, greška = 0xF, gore = 0x1, dolje = 0x2, lijevo = 0x3, desno = 0x4, blizu = 0x5 i daleko = 0x6.

Zakazan je pozadinski zadatak 'Petlja' koji neprestano ispituje APDS9960 prekidni izlaz INT čitanjem digitalnog pina 4. Kada INT izlaz iz APDS9960 postane aktivan nisko, što znači da je senzor aktiviran, mikrokontroler pokušava protumačiti bilo koji pokret pozivanjem 'readGesture () 'with it while (1) {}; beskonačna petlja.

Ako je otkrivena valjana gesta, ova vrijednost se zapisuje na port B, potvrđuje se izlaz 'nGestureAvailable' i postavlja se logički semafor 'bGestureAvailable', sprečavajući daljnje geste da budu zabilježene.

Kada master otkrije aktivni izlaz 'nGestureAvailable', čita ovu novu vrijednost i pulsira 'nGestureClear' aktivno nisko. Ova padajuća ivica pokreće planiranje zadatka u prvom planu 'ISR GESTURE_CLEAR ()' koji obustavlja izvršavanje pozadinskog zadatka 'Petlja', brišući port B, 'bGestureAvailable' semafor i 'nGestureAvailable' izlaz.

Zadatak u prednjem planu 'GESTURE_CLEAR ()' je sada obustavljen, a pozadinski zadatak 'Petlja' ponovo zakazan. Sada se mogu osjetiti daljnji pokreti iz APDS9960.

Korištenjem zadataka u prednjem planu/pozadini koji pokreću prekidi na ovaj način, potencijalna beskonačna petlja u 'readGesture ()' slave uređaja neće utjecati na rad glavnog uređaja i neće ometati izvršavanje slave uređaja. Ovo čini osnovu vrlo jednostavnog operativnog sistema u stvarnom vremenu (RTOS).

Napomena: Prefiks 'n' znači aktivno nisko ili potvrđeno kao u 'nGestureAvailable'

Korak 3: Testiranje uređaja koji ne blokira APDS9960 za prepoznavanje gesta

Testiranje uređaja za blokiranje APDS9960 pokreta koji ne blokira
Testiranje uređaja za blokiranje APDS9960 pokreta koji ne blokira
Testiranje uređaja koji ne blokira APDS9960 Gesture Sensing Device
Testiranje uređaja koji ne blokira APDS9960 Gesture Sensing Device
Testiranje uređaja koji ne blokira APDS9960 Gesture Sensing Device
Testiranje uređaja koji ne blokira APDS9960 Gesture Sensing Device
Testiranje uređaja koji ne blokira APDS9960 Gesture Sensing Device
Testiranje uređaja koji ne blokira APDS9960 Gesture Sensing Device

Preambula

Iako se modul APDS9960 isporučuje s +5v, on koristi ugrađeni regulator +3v3, što znači da su njegove I2C linije usklađene sa +3v3, a ne +5v. Zbog toga sam odlučio koristiti Arduino Due koji je usklađen sa +3v3 kao probni mikro kontroler kako bih otklonio potrebu za mjenjačima nivoa.

Ako, međutim, želite koristiti stvarni Arduino Uno, tada ćete morati poravnati linije I2C na U1. Pogledajte sljedeće Instructable gdje sam priložio koristan niz slajdova (I2C_LCD_With_Arduino) koji daje puno praktičnih savjeta o korištenju I2C.

I2C testiranje sučelja

Slike 1 i 2 gore pokazuju kako postaviti i programirati sistem za I2C sučelje. Morat ćete prvo preuzeti i instalirati biblioteku APDS9960_NonBlocking. ovdje

Paralelno testiranje interfejsa

Slike 3 i 4 isti detalji za paralelno sučelje

Korak 4: Zaključak

Zaključak
Zaključak

Općenito

Kôd dobro funkcionira i detektira geste odgovorno bez lažnih pozitivnih rezultata. Već nekoliko sedmica radi i radi kao slave uređaj u mom sljedećem projektu. Isprobao sam mnogo različitih načina kvara (pa tako i znatiželjna Quinnova kućna moggie) što je prethodno rezultiralo resetiranjem ESP8266-12, bez negativnih učinaka.

Moguća poboljšanja

  • Očigledno. Ponovo napišite biblioteku senzora pokreta APDS9960 da ne blokira.

    Zapravo sam kontaktirao Broadcom i poslao me lokalnom distributeru koji je odmah ignorisao moj zahtjev za podršku, pretpostavljam da jednostavno nisam SparkFun ili AdaFruit. Tako da će ovo vjerovatno morati pričekati neko vrijeme

  • Prenesite kôd na manji slave mikrokontroler. Korištenje ATMega328P za jedan zadatak malo je pretjerano. Iako sam u početku pogledao ATTiny84, prestao sam ga koristiti jer sam osjetio da je sastavljena veličina koda prikladna za rubnu liniju. Uz dodatne troškove koji se odnose na to da je potrebno promijeniti biblioteku APDS9960 za rad s drugom bibliotekom I2C.

Korak 5: Reference

Potrebno za programiranje ugrađenog arduina (ATMega328P - U1)

SparkFun_APDS9960.h

  • Napisao: Steve Quinn
  • Svrha: Ovo je račvana verzija SparkFun APDS9960 senzora račvanog od jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Ima nekoliko izmjena koje pomažu u otklanjanju grešaka i ima desenzibilizirani detektor za smanjenje lažnog aktiviranja.
  • Sa:

Potrebno za ugradnju ove funkcije koja ne blokira u vaš arduino kôd i davanje primjera

APDS9960_NonBlocking.h

  • Napisao: Steve Quinn
  • Svrha: Omogućava čisto sučelje za ugrađivanje ove neblokirajuće implementacije APDS9960 senzora pokreta u vaš Arduino kod.
  • Sa:

Operativni sistem u realnom vremenu

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

APDS9960 Tehnički list

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

Preporučuje se: