Obsah:

Bezbloková implementácia senzora gest APDS9960: 5 krokov
Bezbloková implementácia senzora gest APDS9960: 5 krokov

Video: Bezbloková implementácia senzora gest APDS9960: 5 krokov

Video: Bezbloková implementácia senzora gest APDS9960: 5 krokov
Video: Новый Король Cooler Master MM711 2024, November
Anonim
Implementácia neblokovacieho senzora gest APDS9960
Implementácia neblokovacieho senzora gest APDS9960
Implementácia neblokovacieho senzora gest APDS9960
Implementácia neblokovacieho senzora gest APDS9960
Implementácia neblokovacieho senzora gest APDS9960
Implementácia neblokovacieho senzora gest APDS9960

Preambula

Tento návod popisuje, ako vytvoriť neblokujúcu implementáciu senzora gest APDS9960 pomocou SparkFun_APDS-9960_Sensor_Arduino_Library.

Úvod

Pravdepodobne sa teda pýtate, čo je blokovanie? Alebo dokonca blokovať?

Ešte dôležitejšie je, prečo je dôležité mať niečo neblokujúce správne?

Dobre, takže keď mikroprocesor spustí program, postupne vykoná riadky kódu a pritom volá a vracia sa z funkcií podľa poradia, v akom ste ich napísali.

Blokovací hovor je iba volanie akéhokoľvek druhu funkcií, ktoré spôsobujú zastavenie vykonávania, čo znamená volanie funkcie, v ktorom volajúci nebude pokračovať v vykonávaní, kým sa volaná funkcia neskončí.

Prečo je to teda dôležité?

V prípade, že ste napísali nejaký kód, ktorý potrebuje pravidelne vykonávať množstvo funkcií postupne, ako je čítanie teploty, čítanie tlačidla a aktualizácia displeja, v prípade, že kódom na aktualizáciu displeja je blokovanie hovoru, váš systém nebude reagovať na stláčanie tlačidiel a zmeny teploty, pretože procesor strávi všetok svoj čas čakaním na aktualizáciu displeja a nečítaním stavu tlačidiel alebo najnovšej teploty.

Pokiaľ ide o mňa, chcem vytvoriť stolné zariadenie IoT s podporou MQTT cez WiFi, ktoré číta lokálne aj vzdialené hodnoty teploty/vlhkosti, úrovne okolitého svetla, barometrický tlak, sleduje čas, zobrazuje všetky tieto parametre na LCD displeji, zaznamenáva sa do uSD kartu v reálnom čase, čítajte tlačidlové vstupy, zapisujte do výstupných diód LED a gestami monitorovania ovládajte veci v mojej infraštruktúre IoT a všetky ovládajte pomocou ESP8266-12.

Jediné dva zdroje knižnice APDS9960, ktoré som našiel, boli bohužiaľ knižnice SparkFun a AdaFruit, ktoré boli stiahnuté z aplikačného kódu od spoločnosti Avago (výrobca ADPS9960) a obsahujú hovor s názvom „readGesture“, ktorý obsahuje chvíľu (1) {}; slučka, ktorá keď sa použije v projekte uvedenom vyššie, spôsobí, že sa ESP8266-12E resetuje vždy, keď sa senzor ADPS9960 nasýti (tj. keď objekt zostane v tesnej blízkosti, alebo keď snímač osvetlí iný IR zdroj).

Preto som sa kvôli vyriešeniu tohto správania rozhodol presunúť spracovanie gest na druhý procesor, pričom ESP8266-12E sa stal hlavným mikrokontrolérom a tento systém otrokom, ako je znázornené na obrázkoch 1 a 2 vyššie, prehľad systému a diagramy zloženia systému.. Na obrázku 3 je prototyp obvodu.

Aby som obmedzil zmeny, ktoré som potreboval vykonať na svojom existujúcom kóde, napísal som tiež triedu/knižnicu wrapperu, nápadito pomenovanú „APDS9960_NonBlocking“.

Nasleduje podrobné vysvetlenie neblokujúceho riešenia.

Aké diely potrebujem?

Ak chcete zostrojiť riešenie I2C, ktoré funguje s knižnicou APDS9960_NonBlocking, budete potrebovať nasledujúce časti.

  1. 1 zľava na ATMega328P tu
  2. 1 zľava na PCF8574P tu
  3. Tu je 6 z 10K odporov
  4. 4 z 1K rezistorov tu
  5. 1 z diódy 1N914 tu
  6. 1 vypnutý tranzistor PN2222 NPN tu
  7. Tu je 1 z kryštálu 16 MHz
  8. 2 vypnuté kondenzátory 0,1 uF tu
  9. Tu nájdete 1 kus z elektrolytického kondenzátora 1 000 uF
  10. Tu je vypnutý 1 z 10uF elektrolytického kondenzátora
  11. 2 vypnuté kondenzátory 22 pF tu

Ak chcete čítať výstup senzora gest prostredníctvom paralelného rozhrania, môžete odhodiť PCF8574P a tri vypnuté 10K odpory.

Aký softvér potrebujem?

Arduino IDE 1.6.9

Aké zručnosti potrebujem?

Na nastavenie systému použite zdrojový kód (je k dispozícii) a vytvorte potrebné obvody, ktoré budete potrebovať;

  • Minimálne znalosti elektroniky,
  • Znalosť Arduina a jeho IDE,
  • Pochopenie toho, ako naprogramovať vstavané Arduino (Pozrite si pokyny v časti „Programovanie ATTiny85, ATTiny84 a ATMega328P: Arduino ako ISP“).
  • Trochu trpezlivosti.

Témy pokryté

  • Krátky prehľad okruhu
  • Stručný prehľad softvéru
  • Testovanie zariadenia na snímanie gest APDS9960
  • Záver
  • Referencie

Krok 1: Prehľad obvodu

Prehľad obvodu
Prehľad obvodu

Obvod je rozdelený na dve časti;

  • Prvým je sériová konverzia I2C na paralelnú realizovaná pomocou odporov R8… 10 a IC1. Tu R8 … R10 nastavuje adresu I2C pre 8 -bitový expandér vstupov/výstupov IC1 a NXP PCF8574A. Platné rozsahy adries pre toto zariadenie sú 0x38… 0x3F. V uvedenom príklade softvéru I2C by bolo potrebné zmeniť 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' tak, aby vyhovoval tomuto rozsahu adries.
  • Všetky ostatné komponenty tvoria podradené zariadenie Arduino Uno a majú nasledujúce funkcie;

    • R1, T1, R2 a D1 poskytujú vstup resetovania podradeného zariadenia. Tu aktívny vysoký impulz na IC1 - P7 prinúti resetovať U1.
    • R3, R4, sú odpory obmedzujúce prúd pre vstavané zariadenia programujúce linky TX/RX.
    • C5 a R7 umožňujú Arduino IDE automaticky naprogramovať U1 pomocou impulzu na riadku DTR pripojeného zariadenia FTDI.
    • R5 a R6 sú vyťahovacie odpory I2C pre APDS9960 s C6 poskytujúce oddelenie miestneho napájania koľajníc.
    • U1, C1, C2 a Q1 tvoria vstavané Arduino Uno a jeho hodiny.
    • Nakoniec C3 a C4 poskytujú oddelenie miestnych napájacích koľajníc pre U1.

Krok 2: Prehľad softvéru

Prehľad softvéru
Prehľad softvéru
Prehľad softvéru
Prehľad softvéru
Prehľad softvéru
Prehľad softvéru

Preambula

Na úspešné zostavenie tohto zdrojového kódu budete potrebovať nasledujúce ďalšie knižnice na programovanie vstavaného Arduino Uno U1;

SparkFun_APDS9960.h

  • Od: Steve Quinn
  • Účel: Toto je vidlicová verzia senzora SparkFun APDS9960, vidlicový z jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Má niekoľko úprav, ktoré pomáhajú pri ladení, a má deaktivovaný detektor na zníženie rušivého spúšťania.
  • Od:

APDS9960_NonBlocking.h

  • Od: Steve Quinn
  • Účel: Poskytuje čisté rozhranie na vloženie tejto neblokujúcej implementácie senzora gest APDS9960 do vášho kódu Arduino.
  • Od:

Ak neviete, ako to dosiahnuť, pozrite si nasledujúci návod na programovanie vstavaného mikrokontroléra Arduino Uno (ATMega328P);

PROGRAMOVANIE ATTINY85, ATTINY84 A ATMEGA328P: ARDUINO AKO ISP

Prehľad funkcií

Vstavaný podradený mikrokontrolér ATMega328P dotazuje linku INT z ADPS9960. Keď sa tento riadok zníži, mikrokontrolér prečíta registre ADPS9960 a určí, či bolo zaznamenané platné gesto. Ak bolo zistené platné gesto, kód pre toto gesto 0x0… 0x6, 0xF je umiestnený na port B a „nGestureAvailable“je tvrdené, že je nízke.

Akonáhle zariadenie Master uvidí „nGestureAvailable“aktívne, načíta hodnotu na porte B a potom dočasne zabliká „nGestureClear“, aby potvrdilo prijatie údajov.

Podřízené zariadenie potom zruší tvrdosť „nGestureAvailable“a vymaže údaje na porte B. Na obrázku 5 vyššie je zachytenie obrazovky odobraté z logického analyzátora počas úplného cyklu detekcie/čítania.

Prehľad kódu

Na obrázku 1 vyššie je podrobne popísané, ako funguje softvér v U1 vstavaného podradeného zariadenia Arduino Uno, a na obrázku 2, ako pôsobia dve úlohy na pozadí/v popredí. Obrázok 3 je segment kódu, ktorý ukazuje, ako používať knižnicu APDS9960_NonBlockinglibrary. Obrázok 4 zobrazuje mapovanie medzi digitálnymi pinmi Arduino Uno a skutočnými hardvérovými pinmi na ATMega328P.

Po resetovaní vstavaný podradený mikrokontrolér inicializuje APDS9960, ktorý umožňuje detekcii gest spustiť svoj výstup INT a nakonfiguruje jeho I/O, pripojením rutiny služby prerušenia (ISR) „GESTURE_CLEAR ()“k prerušeniu vektora INT0 (digitálny kolík 2, hardvérový integrovaný kolík 4), konfigurovaním pre spúšťač s klesajúcou hranou. To tvorí vstup nGestureClear z hlavného zariadenia.

Výstupný kolík prerušenia „INT“z APDS9960 je pripojený k digitálnemu pinu 4, hardvérovému IC pinu 6, ktorý je nakonfigurovaný ako vstup do U1.

Signálny riadok „nGestureAvailable“na digitálnom pine 7, hardvérový integrovaný obvod 13 je nakonfigurovaný ako výstup a je nastavený na vysoký, neaktívny (de-assertovaný).

Nakoniec sú bity portu B 0 … 3 nakonfigurované ako výstupy a nastavené na nízku hodnotu. Tieto tvoria dátové okusovanie, ktoré predstavuje rôzne detekované typy gest; Žiadny = 0x0, chyba = 0xF, hore = 0x1, dole = 0x2, vľavo = 0x3, vpravo = 0x4, blízko = 0x5 a ďaleko = 0x6.

Je naplánovaná úloha na pozadí „Smyčka“, ktorá nepretržite zisťuje prerušenie výstupu APT INDS pomocou čítania digitálneho pinu 4. Keď sa výstup INT z APDS9960 stane aktívnym, znamená to, že snímač bol spustený, mikrokontrolér sa pokúša interpretovať akékoľvek gesto zavolaním „readGesture () 'keď je to (1) {}; nekonečná slučka.

Ak bolo zistené platné gesto, táto hodnota sa zapíše na port B, uplatní sa výstup „nGestureAvailable“a nastaví sa boolovský semafor „bGestureAvailable“, čím sa zabráni zaznamenávaniu ďalších gest.

Akonáhle master zistí aktívny výstup „nGestureAvailable“, načíta túto novú hodnotu a aktivuje nízku hodnotu „nGestureClear“. Táto klesajúca hrana spúšťa úlohu v popredí „ISR GESTURE_CLEAR ()“, ktorá pozastavuje vykonávanie úlohy na pozadí „Smyčka“, zúčtuje port B, semafor „bGestureAvailable“a výstup „nGestureAvailable“.

Úloha v popredí „GESTURE_CLEAR ()“je teraz pozastavená a úloha na pozadí „Smyčka“je znova naplánovaná. Teraz môžete vycítiť ďalšie gestá z APDS9960.

Použitím úloh popredia/pozadia spustených týmto prerušením týmto spôsobom potenciálna nekonečná slučka v 'readGesture ()' podradeného zariadenia neovplyvní činnosť hlavného zariadenia a nebude ani prekážať vykonaniu podradeného zariadenia. To tvorí základ veľmi jednoduchého operačného systému v reálnom čase (RTOS).

Poznámka: Predpona „n“znamená aktívny nízky alebo tvrdený ako v „nGestureAvailable“

Krok 3: Testovanie neblokovacieho zariadenia na snímanie gest APDS9960

Testovanie neblokovacieho zariadenia na snímanie gest APDS9960
Testovanie neblokovacieho zariadenia na snímanie gest APDS9960
Testovanie neblokovacieho zariadenia na snímanie gest APDS9960
Testovanie neblokovacieho zariadenia na snímanie gest APDS9960
Testovanie neblokovacieho zariadenia na snímanie gest APDS9960
Testovanie neblokovacieho zariadenia na snímanie gest APDS9960
Testovanie neblokovacieho zariadenia na snímanie gest APDS9960
Testovanie neblokovacieho zariadenia na snímanie gest APDS9960

Preambula

Aj keď je modul APDS9960 dodávaný s napätím +5 V, používa vstavaný regulátor +3 v 3, čo znamená, že vedenia I2C sú v súlade s +3 v 3 a nie +5 v. Preto som sa rozhodol použiť testovací mikrokontrolér kompatibilný s Arduino Due +3v3, aby som odstránil potrebu radičov úrovní.

Ak však chcete použiť skutočné Arduino Uno, budete musieť posunúť linky I2C na úroveň U1. Pozrite si nasledujúci návod s pokynmi, kam som pripojil užitočnú sadu snímok (I2C_LCD_With_Arduino), ktorá poskytuje množstvo praktických tipov na používanie I2C.

Testovanie rozhrania I2C

Obrázky 1 a 2 vyššie ukazujú, ako nastaviť a naprogramovať systém pre rozhranie I2C. Najprv si musíte stiahnuť a nainštalovať knižnicu APDS9960_NonBlocking. tu

Testovanie paralelného rozhrania

Obrázky 3 a 4 popisujú to isté pre paralelné rozhranie

Krok 4: Záver

Záver
Záver

Generál

Kód funguje dobre a gestá odhaľuje responzívne bez falošných poplachov. Funguje to už niekoľko týždňov ako podriadené zariadenie v mojom ďalšom projekte. Vyskúšal som mnoho rôznych režimov zlyhania (a tak isto aj zvedavý moggie pre domácnosť Quinn), ktoré predtým viedli k resetovaniu ESP8266-12, bez negatívneho účinku.

Možné vylepšenia

  • Zjavné. Prepíšte knižnicu senzorov gest APDS9960 tak, aby neblokovala.

    V skutočnosti som kontaktoval spoločnosť Broadcom, ktorá ma priviedla k miestnemu distribútorovi, ktorý moju žiadosť o podporu okamžite ignoroval. Myslím, že nie som SparkFun ani AdaFruit. Na toto si teda pravdepodobne budete musieť chvíľu počkať

  • Preneste kód do menšieho podradeného mikrokontroléra. Použitie ATMega328P na jednu úlohu je trochu prehnané. Aj keď som sa pôvodne pozeral na ATTiny84, prestal som ho používať, pretože som cítil, že kompilovaná veľkosť kódu je vhodná pre hraničnú čiaru. S pridanou réžiou nutnosti úpravy knižnice APDS9960 tak, aby fungovala s inou knižnicou I2C.

Krok 5: Referencie

Vyžaduje sa na programovanie vstavaného arduina (ATMega328P - U1)

SparkFun_APDS9960.h

  • Od: Steve Quinn
  • Účel: Toto je vidlicová verzia senzora SparkFun APDS9960, vidlicový z jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Má niekoľko úprav, ktoré pomáhajú pri ladení, a má deaktivovaný detektor na zníženie rušivého spúšťania.
  • Od:

Vyžaduje sa vloženie tejto neblokujúcej funkcie do vášho kódu arduino a uvedenie spracovaných príkladov

APDS9960_NonBlocking.h

  • Od: Steve Quinn
  • Účel: Poskytuje čisté rozhranie na vloženie tejto neblokujúcej implementácie senzora gest APDS9960 do vášho kódu Arduino.
  • Od:

Operačný systém v reálnom čase

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

Dátový list APDS9960

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

Dátový list PCF8574A

Odporúča: