Obsah:

Bezbloková implementace senzoru gest APDS9960: 5 kroků
Bezbloková implementace senzoru gest APDS9960: 5 kroků

Video: Bezbloková implementace senzoru gest APDS9960: 5 kroků

Video: Bezbloková implementace senzoru gest APDS9960: 5 kroků
Video: Шокирующая правда о нечеловеческих НЛО: Джон Гриневальд раскрывает все 2024, Červenec
Anonim
Bezbloková implementace senzoru gest APDS9960
Bezbloková implementace senzoru gest APDS9960
Bezbloková implementace senzoru gest APDS9960
Bezbloková implementace senzoru gest APDS9960
Bezbloková implementace senzoru gest APDS9960
Bezbloková implementace senzoru gest APDS9960

Preambule

Tento instruktáž podrobně popisuje, jak vytvořit neblokující implementaci senzoru gest APDS9960 pomocí SparkFun_APDS-9960_Sensor_Arduino_Library.

Úvod

Takže se pravděpodobně ptáte sami sebe, co neblokuje? Nebo dokonce blokovat?

Ještě důležitější je, proč je důležité mít něco neblokujícího správně?

Dobře, takže když mikroprocesor spustí program, postupně provede řádky kódu a přitom volá a vrací se z funkcí podle pořadí, v jakém jste je napsali.

Blokovací volání je pouze volání jakéhokoli druhu funkcí, které způsobí zastavení provádění, což znamená volání funkce, kde volající nebude pokračovat v provádění, dokud se volaná funkce nedokončí.

Proč je to tedy důležité?

V případě, že jste napsali nějaký kód, který potřebuje pravidelně provádět řadu funkcí postupně, jako je čtení teploty, čtení tlačítka a aktualizace displeje, pokud by kód pro aktualizaci displeje byl blokovací hovor, váš systém nebude reagovat na stisknutí tlačítka a změna teploty, protože procesor stráví veškerý čas čekáním na aktualizaci displeje a nečtením stavu tlačítka nebo nejnovější teploty.

Pokud jde o mě, chci vytvořit stolní zařízení IoT s podporou MQTT přes WiFi, které čte lokální i vzdálené hodnoty teploty/vlhkosti, úrovně okolního světla, barometrický tlak, sleduje čas, zobrazuje všechny tyto parametry na displeji LCD, přihlašuje se do uSD kartu v reálném čase, číst vstupy tlačítek, zapisovat na výstupní LED diody a monitorovat gesta pro ovládání věcí v mé infrastruktuře IoT a to vše ovládat pomocí ESP8266-12.

Jediné dva zdroje knihovny APDS9960, které jsem našel, byly bohužel knihovny SparkFun a AdaFruit, z nichž oba byly vytrženy z aplikačního kódu od společnosti Avago (výrobce ADPS9960) a mají volání s názvem „readGesture“, které obsahuje chvíli (1) {}; smyčka, která při použití ve výše uvedeném projektu způsobí, že se ESP8266-12E resetuje, kdykoli se senzor ADPS9960 nasytí (tj. když objekt zůstane v těsné blízkosti, nebo je tam jiný IR zdroj osvětlující senzor).

V důsledku toho jsem se rozhodl toto chování vyřešit, a proto jsem přesunul zpracování gest na druhý procesor, přičemž ESP8266-12E se stal hlavním mikrokontrolérem a tento systém otrokem, jak je znázorněno na obrázcích 1 a 2 výše, Přehled systému a diagramy složení systému, resp.. Na obrázku 3 je prototyp obvodu.

Abych omezil změny, které jsem potřeboval provést na svém stávajícím kódu, napsal jsem také třídu/knihovnu wrapperu nápaditě pojmenovanou „APDS9960_NonBlocking“.

Následuje podrobné vysvětlení neblokujícího řešení.

Jaké díly potřebuji?

Pokud chcete vytvořit řešení I2C, které funguje s knihovnou APDS9960_NonBlocking, budete potřebovat následující části.

  1. 1 sleva na ATMega328P zde
  2. 1 sleva na PCF8574P zde
  3. 6 z 10K rezistorů zde
  4. 4 off 1K odpory zde
  5. 1 off 1N914 Dioda zde
  6. 1 off PN2222 NPN Transistor zde
  7. Zde 1 off 16MHz krystalu
  8. 2 off 0,1uF kondenzátory zde
  9. 1 z 1 000 uF elektrolytického kondenzátoru zde
  10. 1 z 10uF elektrolytického kondenzátoru zde
  11. 2 off 22pF kondenzátory zde

Pokud chcete číst výstup senzoru gest přes paralelní rozhraní, můžete upustit PCF8574P a tři off 10K odpory.

Jaký software potřebuji?

Arduino IDE 1.6.9

Jaké dovednosti potřebuji?

K nastavení systému použijte zdrojový kód (je součástí dodávky) a vytvořte potřebné obvody, které budete potřebovat;

  • Minimální znalost elektroniky,
  • Znalost Arduina a jeho IDE,
  • Pochopení toho, jak naprogramovat vestavěné Arduino (viz instrukce „Programování ATTiny85, ATTiny84 a ATMega328P: Arduino jako ISP“)
  • Trochu trpělivosti.

Pokrytá témata

  • Stručný přehled obvodu
  • Stručný přehled softwaru
  • Testování zařízení pro snímání gest APDS9960
  • Závěr
  • Reference

Krok 1: Přehled obvodu

Přehled obvodu
Přehled obvodu

Obvod je rozdělen na dvě části;

  • Prvním je sériová konverze I2C na paralelní pomocí odporů R8… 10 a IC1. Zde R8… R10 nastavuje adresu I2C pro 8bitový rozšiřující čip I/O IC1 a NXP PCF8574A. Platné rozsahy adres pro toto zařízení jsou 0x38… 0x3F. V poskytnutém příkladu softwaru I2C je třeba změnit 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' tak, aby vyhovoval tomuto rozsahu adres.
  • Všechny ostatní komponenty tvoří podřízený Arduino Uno a mají následující funkce;

    • R1, T1, R2 a D1 poskytují resetovací vstup podřízeného zařízení. Zde aktivní vysoký impuls na IC1 - P7 donutí U1 resetovat.
    • R3, R4, jsou odpory omezující proud pro vestavěné zařízení programující linky TX/RX.
    • C5 a R7 umožňují Arduino IDE automaticky programovat U1 pomocí pulsu na DTR řádku připojeného FTDI zařízení.
    • R5 a R6 jsou I2C pull up rezistory pro APDS9960 s C6 zajišťující odpojení lokální napájecí lišty.
    • U1, C1, C2 a Q1 tvoří vestavěné Arduino Uno a jeho hodiny.
    • Nakonec C3 a C4 zajišťují odpojení místní napájecí lišty pro U1.

Krok 2: Přehled softwaru

Přehled softwaru
Přehled softwaru
Přehled softwaru
Přehled softwaru
Přehled softwaru
Přehled softwaru

Preambule

K úspěšnému zkompilování tohoto zdrojového kódu budete potřebovat následující další knihovny pro programování integrovaného Arduino Uno U1;

SparkFun_APDS9960.h

  • Autor: Steve Quinn
  • Účel: Toto je vidlicová verze senzoru SparkFun APDS9960, vidlicový z jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Má několik úprav, které pomáhají s laděním, a má deaktivovaný detektor, který snižuje rušivé spouštění.
  • Od:

APDS9960_NonBlocking.h

  • Autor: Steve Quinn
  • Účel: Poskytuje čisté rozhraní pro vložení této neblokující implementace senzoru gest APDS9960 do vašeho kódu Arduino.
  • Od:

Pokud nevíte, jak toho dosáhnout, přečtěte si následující instrukci o programování integrovaného mikrokontroléru Arduino Uno (ATMega328P);

PROGRAMOVÁNÍ ATTINY85, ATTINY84 A ATMEGA328P: ARDUINO JAKO ISP

Přehled funkcí

Vestavěný podřízený mikrokontrolér ATMega328P dotazuje linku INT z ADPS9960. Když tento řádek klesne, mikrokontrolér přečte registry ADPS9960 a určí, zda došlo k detekci platného gesta. Pokud bylo zjištěno platné gesto, kód pro toto gesto 0x0… 0x6, 0xF je umístěn na port B a „nGestureAvailable“je prohlášeno za nízké.

Když zařízení Master uvidí aktivní 'nGestureAvailable', načte hodnotu na portu B a poté dočasně pulzuje 'nGestureClear' pro potvrzení přijetí dat.

Podřízené zařízení poté odhlásí vysokou hodnotu „nGestureAvailable“a vymaže data na portu B. Na obrázku 5 výše je zachycení obrazovky odebráno z logického analyzátoru během úplného cyklu detekce/čtení.

Přehled kódu

Na výše uvedeném obrázku 1 je podrobně popsáno, jak software v U1 funguje vestavěný slave Arduino Uno, a na obrázku 2, jak tyto dvě úlohy na pozadí/popředí interagují. Obrázek 3 je segment kódu, který popisuje, jak používat knihovnu APDS9960_NonBlockinglibrary. Obrázek 4 zobrazuje mapování mezi digitálními piny Arduino Uno a skutečnými hardwarovými piny na ATMega328P.

Po resetu vložený podřízený mikrokontrolér inicializuje APDS9960, což umožňuje detekci gest spouštět jeho výstup INT a konfiguruje jeho I/O, připojením rutiny služby přerušení (ISR) 'GESTURE_CLEAR ()' k přerušení vektoru INT0 (digitální pin 2, hardwarový IC pin 4), konfigurace pro spouštění na sestupné hraně. To tvoří vstup nGestureClear z hlavního zařízení.

Výstupní pin přerušení 'INT' z APDS9960 je připojen k digitálnímu pinu 4, hardwarovému IC pinu 6, který je konfigurován jako vstup do U1.

Signální linka 'nGestureAvailable' na digitálním pinu 7, hardwarový IC pinu 13 je konfigurována jako výstup a nastavena na vysokou, neaktivní (zrušenou).

Nakonec jsou bity portu B 0… 3 konfigurovány jako výstupy a nastaveny na nízkou hodnotu. Ty tvoří datové okusování, které představuje různé detekované typy gest; Žádný = 0x0, Chyba = 0xF, Nahoru = 0x1, Dolů = 0x2, Vlevo = 0x3, Vpravo = 0x4, Blízko = 0x5 a Dál = 0x6.

Je naplánován úkol na pozadí „Smyčka“, který průběžně dotazuje přerušení výstupu APDS9960 pomocí čtení digitálního pinu 4. Když se výstup INT z APDS9960 aktivuje nízko, což znamená, že byl spuštěn senzor, mikrokontrolér se pokusí interpretovat jakékoli gesto voláním „readGesture () 's it while (1) {}; nekonečná smyčka.

Pokud bylo zjištěno platné gesto, je tato hodnota zapsána na port B, je uplatněn výstup „nGestureAvailable“a je nastaven booleovský semafor „bGestureAvailable“, což zabraňuje zaznamenávání dalších gest.

Jakmile master detekuje aktivní výstup „nGestureAvailable“, přečte tuto novou hodnotu a pulzuje aktivní minimum „nGestureClear“. Tato sestupná hrana spouští úlohu popředí „ISR GESTURE_CLEAR ()“, která pozastaví provádění úlohy „Loop“na pozadí, vymaže port B, semafor „bGestureAvailable“a výstup „nGestureAvailable“.

Úkol v popředí „GESTURE_CLEAR ()“je nyní pozastaven a úkol na pozadí „Smyčka“je znovu naplánován. Nyní lze vycítit další gesta z APDS9960.

Použitím úloh popředí/pozadí spuštěných přerušením tímto způsobem potenciální nekonečná smyčka v 'readGesture ()' podřízeného zařízení neovlivní provoz hlavního zařízení a nebude bránit ani provedení podřízeného zařízení. To tvoří základ velmi jednoduchého operačního systému v reálném čase (RTOS).

Poznámka: Předpona „n“znamená aktivní nízký nebo tvrdý jako v „nGestureAvailable“

Krok 3: Testování neblokovacího zařízení pro snímání gest APDS9960

Testování neblokovacího zařízení pro snímání gest APDS9960
Testování neblokovacího zařízení pro snímání gest APDS9960
Testování neblokovacího zařízení pro snímání gest APDS9960
Testování neblokovacího zařízení pro snímání gest APDS9960
Testování neblokovacího zařízení pro snímání gest APDS9960
Testování neblokovacího zařízení pro snímání gest APDS9960
Testování neblokovacího zařízení pro snímání gest APDS9960
Testování neblokovacího zařízení pro snímání gest APDS9960

Preambule

Přestože je modul APDS9960 dodáván s +5v, používá integrovaný regulátor +3v3, což znamená, že jeho I2C linky jsou kompatibilní s +3v3 a ne +5v. To je důvod, proč jsem se rozhodl použít testovací mikrokontrolér kompatibilní s Arduino Due +3v3, abych se vyhnul potřebě řadičů úrovně.

Pokud však chcete použít skutečný Arduino Uno, pak budete muset posunout linky I2C na úroveň U1. Viz následující Instructable, kam jsem připojil užitečnou sadu snímků (I2C_LCD_With_Arduino), která poskytuje spoustu praktických tipů k používání I2C.

Testování rozhraní I2C

Obrázky 1 a 2 výše ukazují, jak nastavit a naprogramovat systém pro rozhraní I2C. Nejprve si budete muset stáhnout a nainstalovat knihovnu APDS9960_NonBlocking. tady

Testování paralelního rozhraní

Obrázky 3 a 4 zobrazují totéž pro paralelní rozhraní

Krok 4: Závěr

Závěr
Závěr

Všeobecné

Kód funguje dobře a detekuje gesta responzivně bez falešných poplachů. Už několik týdnů funguje a funguje jako podřízené zařízení v mém dalším projektu. Zkoušel jsem mnoho různých režimů selhání (a stejně tak zvídavý moinie pro domácnost Quinn), které dříve vedly k resetování ESP8266-12, bez negativního účinku.

Možná vylepšení

  • Zjevné. Přepište knihovnu senzorů gest APDS9960 tak, aby neblokovala.

    Vlastně jsem kontaktoval Broadcom, který mě poslal k místnímu distributorovi, který okamžitě ignoroval mou žádost o podporu, asi nejsem SparkFun nebo AdaFruit. Takže na to si asi bude muset chvíli počkat

  • Přeneste kód do menšího podřízeného mikrokontroléru. Použití ATMega328P pro jeden úkol je trochu přehnané. Ačkoli jsem se zpočátku podíval na ATTiny84, přestal jsem používat jeden, protože jsem cítil, že kompilovaná velikost kódu odpovídá hraniční čáře. S přidanou režií nutností upravit knihovnu APDS9960 tak, aby fungovala s jinou knihovnou I2C.

Krok 5: Reference

Vyžadováno k programování vestavěného arduina (ATMega328P - U1)

SparkFun_APDS9960.h

  • Autor: Steve Quinn
  • Účel: Toto je vidlicová verze senzoru SparkFun APDS9960, vidlicový z jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Má několik úprav, které pomáhají s laděním, a má deaktivovaný detektor, který snižuje rušivé spouštění.
  • Od:

Vyžadováno k vložení této neblokující funkce do vašeho kódu arduino a uvedení zpracovaných příkladů

APDS9960_NonBlocking.h

  • Autor: Steve Quinn
  • Účel: Poskytuje čisté rozhraní pro vložení této neblokující implementace senzoru gest APDS9960 do vašeho kódu Arduino.
  • Od:

Operační systém v reálném čase

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

Datový list APDS9960

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

Doporučuje: