Sadržaj:
- Korak 1: Pregled kola
- Korak 2: Pregled softvera
- Korak 3: Testiranje uređaja koji ne blokira APDS9960 za prepoznavanje gesta
- Korak 4: Zaključak
- Korak 5: Reference
Video: Implementacija neblokirajućeg senzora gesta APDS9960: 5 koraka
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:08
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 popusta na ATMega328P ovdje
- 1 popusta na PCF8574P ovdje
- 6 od 10K otpornika ovdje
- Ovdje možete pronaći 4 off 1K otpornika
- 1 off 1N914 Diode here
- 1 za PN2222 NPN tranzistor ovdje
- 1 kristal od 16 MHz ovdje
- 2 ovdje za kondenzatore od 0,1 uF
- 1 od 1000uF elektrolitičkog kondenzatora ovdje
- 1 od 10uF elektrolitičkog kondenzatora ovdje
- 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
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
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
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
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:
Mjerenje udaljenosti s senzorom gesta APDS9960: 6 koraka
Mjerenje udaljenosti pomoću senzora gesta APDS9960: U ovom ćemo vodiču naučiti kako mjeriti udaljenost pomoću senzora gesta APDS9960, arduino i Visuino. Pogledajte video
Kako koristiti APDS9960 senzor gesta s Arduinom: 7 koraka
Kako koristiti APDS9960 senzor gesta s Arduinom: U ovom ćemo vodiču naučiti kako koristiti APDS9960 senzor gesta s Arduinom za prikaz uputstava za ruke na OLED zaslonu pomoću softvera Visuino. Pogledajte video
TicTacToe hardverska implementacija pomoću RaspberryPi: 4 koraka
TicTacToe hardverska implementacija pomoću RaspberryPi -a: Ovaj projekat ima za cilj izgradnju interaktivnog TicTacToe modela koristeći dvije LED u različitim bojama koje označavaju dva igrača koji koriste malinu pi. Ideja je ovdje bila da se ovo implementira u većim razmjerima na uličici - zamislite mrežu od 3x3 polu -globusa (li
Implementacija LiFi, Uso sencillo: 5 koraka
Implementacija LiFi, Uso Sencillo: Prijenos podataka o vía de luz (LiFi) nije stvarni problem. Za rješavanje problema s jednim primarnim aproksimacijskim uređajem, desarrolló i dispozitivno osposobljavanje za tener, zajedničko korištenje i unatrag u medio de luz, u kombinaciji s LED diodama infracrveno
Jednostavna implementacija WiFI kontrole u vašem domu: 5 koraka
WiFI kontrola jednostavna za implementaciju u vašem domu: ESP-01S je jeftino i jednostavno za korištenje bežično rješenje. Kombinacijom s drugim senzorima i aktuatorom, daljinski nadzor i upravljanje mogu se zgodno realizirati. U ovom projektu ću izgraditi pametni prekidač za kontrolu ventilatora pomoću ESP-01S Rela