Sadržaj:

Neblokirajući senzor gesta APDS9960 Implementacija: 5 koraka
Neblokirajući senzor gesta APDS9960 Implementacija: 5 koraka

Video: Neblokirajući senzor gesta APDS9960 Implementacija: 5 koraka

Video: Neblokirajući senzor gesta APDS9960 Implementacija: 5 koraka
Video: How to use Arduino Gesture Sensor with Arduino | APDS9960 Sensor with Arduino Gesture Control DIY 2024, Studeni
Anonim
Neblokirajuća implementacija senzora gesta APDS9960
Neblokirajuća implementacija senzora gesta APDS9960
Neblokirajuća implementacija senzora gesta APDS9960
Neblokirajuća implementacija senzora gesta APDS9960
Neblokirajuća implementacija senzora gesta APDS9960
Neblokirajuća implementacija senzora gesta APDS9960

Preambula

Ovaj Instructable opisuje kako stvoriti neblokirajuću implementaciju APDS9960 senzora pokreta pomoću SparkFun_APDS-9960_Sensor_Arduino_Library.

Uvod

Pa se vjerojatno pitate što nije blokiranje? Ili čak blokiranje po tom pitanju?

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

U redu, pa kad 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 samo je poziv bilo kojoj vrsti funkcije 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 to važno?

U slučaju da ste napisali neki kôd koji mora redovito izvršavati mnoge funkcije uzastopno, poput očitavanja temperature, čitanja gumba i ažuriranja zaslona, ako kôd za ažuriranje zaslona bude blokirajući poziv, vaš sustav neće reagirati na pritiskom tipki i promjenama temperature jer će procesor cijelo vrijeme čekati da se zaslon ažurira, a neće čitati status gumba 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 udaljene vrijednosti temperature/vlažnosti, razine svjetla u okolini, barometarski tlak, prati vrijeme, prikazuje sve te parametre na LCD -u, prijavljuje se na USB karticu u stvarnom vremenu, čitati ulaze s gumbima, pisati na izlazne LED diode i pratiti pokrete za kontrolu stvari u mojoj IoT infrastrukturi, a sve to kontrolirati ESP8266-12.

Nažalost, jedina dva izvora biblioteke APDS9960 koje sam mogao pronaći bile su knjižnice SparkFun i AdaFruit, obje su otrgnute 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 sustav rob, kako je prikazano na slici 1 i 2 gore, dijagrami Pregled sustava i Sastav sustava. Na slici 3 prikazan je prototip sklopa.

Kako bih ograničio promjene koje sam trebao unijeti u svoj postojeći kôd, također sam napisao klasu omotnice/knjižnicu 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 radi s knjižnicom APDS9960_NonBlocking, trebat će vam sljedeći dijelovi.

  1. 1 popusta na ATMega328P ovdje
  2. 1 popusta na PCF8574P ovdje
  3. Ovdje možete skinuti 6 off 10K otpornika
  4. Ovdje su 4 isključena 1K otpornika
  5. Ovdje 1 isključite diodu 1N914
  6. 1 isključite PN2222 NPN tranzistor ovdje
  7. Ovdje 1 kristal od 16 MHz
  8. Ovdje imate 2 kondenzatora od 0,1 uF
  9. Ovdje je 1 od 1000uF elektrolitičkog kondenzatora
  10. Ovdje je 1 od 10uF elektrolitičkog kondenzatora
  11. Ovdje imate 2 kondenzatora od 22 pF

Ako želite pročitati izlaz senzora gesta putem paralelnog sučelja, tada 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 sustav, upotrijebite izvorni kod (isporučen) i stvorite potrebna kola, trebat će vam 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.

Tema završena

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

Korak 1: Pregled kruga

Pregled kruga
Pregled kruga

Krug je podijeljen u dva dijela;

  • Prva je serijska konverzija I2C u paralelnu koja se ostvaruje preko otpornika R8 … 10 i IC1. Ovdje R8… R10 postavljaju I2C adresu za 8 -bitni I/O ekspanzioni čip IC1 i NXP PCF8574A. Važeći rasponi adresa za ovaj uređaj su 0x38 … 0x3F. U primjeru softvera I2C "I2C_APDS9960_TEST.ino" "#define GESTURE_SENSOR_I2C_ADDRESS" moralo bi se izmijeniti kako bi odgovarao 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 podređenog uređaja. Ovdje će aktivni visoki impuls na IC1 - P7 natjerati U1 na resetiranje.
    • R3, R4, su otpornici za ograničavanje struje za ugrađene uređaje koji programiraju TX/RX linije.
    • 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 pull up otpornici za APDS9960 sa C6 koji osiguravaju lokalno razdvajanje opskrbnih tračnica.
    • U1, C1, C2 i Q1 tvore ugrađeni Arduino Uno i njegov sat.
    • Konačno, C3 i C4 omogućuju lokalno razdvajanje opskrbnih tračnica 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 knjižnice za programiranje ugrađenog Arduino Uno U1;

SparkFun_APDS9960.h

  • Napisao: Steve Quinn
  • Namjena: 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 pogrešaka i ima desenzibilizirani detektor za smanjenje lažnog aktiviranja.
  • S:

APDS9960_NonBlocking.h

  • Napisao: Steve Quinn
  • Svrha: Omogućuje čisto sučelje za ugrađivanje ove neblokirajuće implementacije APDS9960 senzora pokreta u vaš Arduino kôd.
  • S:

Pogledajte sljedeće Upute 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. Kad se ovaj redak spusti, mikrokontroler čita ADPS9960 registre i utvrđuje je li primijećena valjana gesta. Ako je otkrivena valjana gesta, kôd za ovu gestu 0x0 … 0x6, 0xF postavlja se na port B, a 'nGestureAvailable' nisko.

Kad glavni uređaj vidi da je "nGestureAvailable" aktivno, očitava vrijednost na priključku B, a zatim privremeno pulsira "nGestureClear" nisko kako bi potvrdio primitak podataka.

Podređeni uređaj tada poništava visoku vrijednost 'nGestureAvailable' i briše podatke na priključku B. Slika 5 gore prikazuje snimku zaslona snimljenu s logičkog analizatora tijekom cijelog ciklusa otkrivanja/čitanja.

Pregled koda

Slika 1 gore prikazuje kako softver u U1 ugrađenom podređenom Arduino Uno funkcionira, zajedno sa slikom 2 kako međusobno djeluju dva zadatka u pozadini/prednjem planu. 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č. Time se formira nGestureClear ulaz s 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 pin 7, hardverski IC pin 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 gesta; Ništa = 0x0, pogreška = 0xF, gore = 0x1, dolje = 0x2, lijevo = 0x3, desno = 0x4, blizu = 0x5 i daleko = 0x6.

Zakazan je pozadinski zadatak 'Petlja' koji neprestano anketira APDS9960 prekidni izlaz INT čitanjem digitalnog pina 4. Kad izlaz INT iz APDS9960 postane aktivan nisko, što znači da je senzor aktiviran, mikrokontroler pokušava protumačiti bilo koju gestu 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', čime se sprječava bilježenje daljnjih gesta.

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

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

Korištenjem zadataka u prednjem planu/pozadini koji pokreću prekidi na ovaj način, potencijalna beskonačna petlja u 'readGesture ()' podređenog uređaja neće utjecati na rad glavnog uređaja niti će ometati izvršavanje podređenog uređaja. To čini osnovu vrlo jednostavnog operacijskog sustava 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 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
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 I2C linije usklađene s +3v3, a ne +5v. Zato sam odlučio koristiti Arduino Due koji je usklađen s +3v3 kao testni 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.

Testiranje sučelja I2C

Slike 1 i 2 gore pokazuju kako postaviti i programirati sustav za I2C sučelje. Morat ćete prvo preuzeti i instalirati knjižnicu APDS9960_NonBlocking. ovdje

Paralelno testiranje sučelja

Slike 3 i 4 prikazuju isto za paralelno sučelje

Korak 4: Zaključak

Zaključak
Zaključak

Općenito

Kôd dobro radi i detektira geste odgovorno bez lažnih pozitivnih rezultata. Već je nekoliko tjedana pokrenut kao robni 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. Ponovno napišite biblioteku senzora pokreta APDS9960 da ne blokira.

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

  • Prenesite kôd na manji slave mikrokontroler. Korištenje ATMega328P za jedan zadatak pomalo 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 potrebu mijenjanja knjižnice APDS9960 za rad s drugom knjižnicom I2C.

5. korak: Reference

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

SparkFun_APDS9960.h

  • Napisao: Steve Quinn
  • Namjena: 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 pogrešaka i ima desenzibilizirani detektor za smanjenje lažnog aktiviranja.
  • S:

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

APDS9960_NonBlocking.h

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

Operativni sustav u stvarnom vremenu

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

Tehnički list APDS9960

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

Preporučeni: