Sadržaj:
- Korak 1: Pregled kruga
- Korak 2: Pregled softvera
- Korak 3: Testiranje uređaja koji ne blokira APDS9960 za prepoznavanje gesta
- Korak 4: Zaključak
- 5. korak: Reference
Video: Neblokirajući senzor gesta APDS9960 Implementacija: 5 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:37
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 popusta na ATMega328P ovdje
- 1 popusta na PCF8574P ovdje
- Ovdje možete skinuti 6 off 10K otpornika
- Ovdje su 4 isključena 1K otpornika
- Ovdje 1 isključite diodu 1N914
- 1 isključite PN2222 NPN tranzistor ovdje
- Ovdje 1 kristal od 16 MHz
- Ovdje imate 2 kondenzatora od 0,1 uF
- Ovdje je 1 od 1000uF elektrolitičkog kondenzatora
- Ovdje je 1 od 10uF elektrolitičkog kondenzatora
- 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
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
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
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
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:
Mjerenje udaljenosti s osjetnikom 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 projekt ima za cilj izgraditi interaktivni TicTacToe model koristeći dvije LED u različitim bojama koje označavaju dva igrača koji koriste malinu pi. Zamisao je ovdje bila da se to provede 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 bez podataka o vía de luz (LiFi) nije stvarni problem. Za rješavanje problema en una primera aproximación, se desarrolló un dispositivo capaz de tener una comunicación en una vía por medio de luz, un unento de LEDs infrarrojos
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 povoljno realizirati. U ovom projektu napravit ću pametni prekidač za upravljanje ventilatorom pomoću ESP-01S Rela