Taula de continguts:

Implementació del sensor de gest APDS9960 sense bloqueig: 5 passos
Implementació del sensor de gest APDS9960 sense bloqueig: 5 passos

Vídeo: Implementació del sensor de gest APDS9960 sense bloqueig: 5 passos

Vídeo: Implementació del sensor de gest APDS9960 sense bloqueig: 5 passos
Vídeo: Gesture Control With Maker Nano RP2040 And APDS9960 Sensor 2024, De novembre
Anonim
Implementació del sensor de gest APDS9960 sense bloqueig
Implementació del sensor de gest APDS9960 sense bloqueig
Implementació del sensor de gest APDS9960 sense bloqueig
Implementació del sensor de gest APDS9960 sense bloqueig
Implementació del sensor de gest APDS9960 sense bloqueig
Implementació del sensor de gest APDS9960 sense bloqueig

Preàmbul

Aquest document instructiu detalla com crear una implementació sense bloqueig del sensor de gest APDS9960 mitjançant SparkFun_APDS-9960_Sensor_Arduino_Library.

Introducció

Per tant, probablement us preguntareu què és el no bloqueig? O fins i tot el bloqueig?

Més important encara, per què és important tenir alguna cosa que no bloquegi, oi?

D’acord, doncs, quan un microprocessador executa un programa, executa seqüencialment línies de codi i, en fer-ho, fa trucades i torna de les funcions segons l’ordre en què les heu escrit.

Una trucada de bloqueig és només una trucada a qualsevol tipus de funcionalitat que provoqui l’aturada de l’execució, és a dir, una trucada de funció en què la persona que truca no reprendrà l’execució fins que la funció cridada s’acabi d’executar.

Per què és important això?

En el cas que hagueu escrit algun codi que necessiti executar regularment moltes funcions seqüencialment, com ara llegir una temperatura, llegir un botó i actualitzar una pantalla, si el codi per actualitzar la pantalla és una trucada de bloqueig, el vostre sistema no respondrà a els botons premen i canvien de temperatura, ja que el processador passarà tot el temps esperant que la pantalla s’actualitzi i no llegeixi l’estat del botó ni la temperatura més recent.

Per la meva banda, vull crear un dispositiu d’escriptori IoT compatible amb MQTT a través de WiFi que llegeixi els valors de temperatura / humitat locals i remots, els nivells de llum ambiental, la pressió baromètrica, faci un seguiment del temps, mostri tots aquests paràmetres en una pantalla LCD, registri’s en un uSD targeta en temps real, llegeix entrades de botons, escriu als LED de sortida i supervisa gestos per controlar les coses de la meva infraestructura IoT i tot el que pot controlar un ESP8266-12.

Malauradament, les dues úniques fonts de la biblioteca APDS9960 que vaig poder trobar van ser les biblioteques SparkFun i AdaFruit, ambdues extretes del codi d'aplicació d'Avago (el fabricant de l'ADPS9960) i que tenen una trucada anomenada "readGesture" que conté una estona (1) {}; bucle que, quan s'utilitza al projecte anterior, fa que l'ESP8266-12E es restableixi cada vegada que el sensor ADPS9960 es saturés (és a dir, quan un objecte romania molt a prop o hi havia una altra font IR que il·luminava el sensor).

En conseqüència, per resoldre aquest comportament, vaig optar per moure el processament dels gestos a un segon processador pel qual l’ESP8266-12E es convertia en el microcontrolador principal i aquest sistema l’esclau, tal com es mostra a les imatges 1 i 2 anteriors, els diagrames de Visió general del sistema i de composició del sistema respectivament.. La imatge 3 mostra el prototip de circuit.

Per tal de limitar els canvis que necessitava fer al meu codi existent, també vaig escriure una classe / biblioteca d'embolcall anomenada imaginativament "APDS9960_NonBlocking".

El que segueix és una explicació detallada de la solució que no bloqueja.

Quines parts necessito?

Si voleu construir la solució I2C que funcioni amb la biblioteca APDS9960_NonBlocking, necessitareu les parts següents.

  1. 1 de descompte en ATMega328P aquí
  2. 1 de descompte PCF8574P aquí
  3. Resistències de 10 K de descompte aquí
  4. 4 descomptes de resistències 1K aquí
  5. 1 off 1N914 Diode aquí
  6. 1 off PN2222 NPN Transistor aquí
  7. 1 descompte de cristall de 16 MHz aquí
  8. Hi ha 2 condensadors de 0,1 uF aquí
  9. 1 descompte de condensador electrolític 1000uF aquí
  10. 1 descompte de condensador electrolític de 10uF aquí
  11. Hi ha 2 condensadors de 22 pF aquí

Si voleu llegir la sortida del sensor de gestos mitjançant la interfície paral·lela, podeu deixar caure el PCF8574P i tres resistències de 10K.

Quin programari necessito?

Arduino IDE 1.6.9

Quines habilitats necessito?

Per configurar el sistema, utilitzeu el codi font (subministrat) i creeu els circuits necessaris.

  • Una comprensió mínima de l’electrònica,
  • Coneixement d'Arduino i el seu IDE,
  • Comprensió de com programar un Arduino incrustat (vegeu la secció "Programació de l'ATTiny85, ATTiny84 i ATMega328P: Arduino com a ISP")
  • Una mica de paciència.

Temes tractats

  • Breu visió general del circuit
  • Breu descripció general del programari
  • Prova del dispositiu de detecció de gestos APDS9960
  • Conclusió
  • Referències

Pas 1: Visió general del circuit

Visió general del circuit
Visió general del circuit

El circuit es divideix en dues seccions;

  • El primer és la conversió sèrie I2C a paral·lel realitzada mitjançant les resistències R8 … 10 i IC1. Aquí R8 … R10 estableix l'adreça I2C per al xip expansor d'E / S de 8 bits IC1 i un NXP PCF8574A. Els intervals d'adreces vàlids per a aquest dispositiu són 0x38 … 0x3F respectivament. A l'exemple de programari I2C proporcionat, caldria modificar "I2C_APDS9960_TEST.ino" "#define GESTURE_SENSOR_I2C_ADDRESS" per adaptar-se a aquest interval d'adreces.
  • La resta de components formen un Arduino Uno incrustat esclau i tenen les funcions següents;

    • R1, T1, R2 i D1 proporcionen una entrada de restabliment del dispositiu esclau. Aquí, un pols actiu actiu a IC1 - P7 obligarà U1 a restablir-se.
    • R3, R4, són resistències de limitació de corrent per al dispositiu incrustat que programa línies TX / RX.
    • C5 i R7 permeten a Arduino IDE programar automàticament U1 mitjançant un impuls a la línia DTR d’un dispositiu FTDI connectat.
    • R5 i R6 són resistències de tracció I2C per a l'APDS9960 amb C6 que proporciona un desacoblament del carril de subministrament local.
    • U1, C1, C2 i Q1 formen l'Arduino Uno incrustat i el seu rellotge respectivament.
    • Finalment, C3 i C4 proporcionen un desacoblament ferroviari de subministrament local per a U1.

Pas 2: Visió general del programari

Descripció general del programari
Descripció general del programari
Descripció general del programari
Descripció general del programari
Descripció general del programari
Descripció general del programari

Preàmbul

Per compilar amb èxit aquest codi font, necessitareu les biblioteques addicionals següents per programar l’Arduino Uno U1 incrustat;

SparkFun_APDS9960.h

  • Per: Steve Quinn
  • Finalitat: es tracta d’una versió bifurcada del sensor SparkFun APDS9960 bifurcat des de jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Té algunes modificacions per ajudar amb la depuració i té un detector desensibilitzat per reduir el desencadenament espuri.
  • De:

APDS9960_NonBlocking.h

  • Per: Steve Quinn
  • Propòsit: proporciona una interfície neta per incrustar aquesta implementació que no bloqueja el sensor de gest APDS9960 al vostre codi Arduino.
  • De:

Consulteu la següent instrucció sobre com programar un microcontrolador Arduino Uno incrustat (ATMega328P) si no esteu familiaritzat amb com aconseguir-ho;

PROGRAMACIÓ DELS ATTINY85, ATTINY84 I ATMEGA328P: ARDUINO COM A ISP

Visió general funcional

El microcontrolador esclau incrustat ATMega328P enquesta la línia INT des de l'ADPS9960. Quan aquesta línia baixa, el microcontrolador llegeix els registres ADPS9960 i determina si s’ha detectat un gest vàlid. Si s'ha detectat un gest vàlid, el codi d'aquest gest 0x0 … 0x6, 0xF es col·loca al port B i "nGestureAvailable" s'afirma baix.

Quan el dispositiu mestre veu "nGestureAvailable" actiu, llegeix el valor del port B i després "nGestureClear" baixa temporalment per confirmar la recepció de les dades.

Aleshores, el dispositiu esclau anul·la el paràmetre 'nGestureAvailable' i elimina les dades del port B. La foto 5 mostra una captura de pantalla d'un analitzador lògic durant un cicle complet de detecció / lectura.

Visió general del codi

La imatge 1 anterior detalla el funcionament del programari a U1, l'esclau incrustat Arduino Uno, i la imatge 2, de com interactuen les dues tasques de fons / primer pla. La imatge 3 és un segment de codi que descriu com utilitzar la biblioteca APDS9960_NonBlocking. La imatge 4 mostra un mapatge entre els pins digitals Arduino Uno i els pins de maquinari reals de l'ATMega328P.

Després de reiniciar, el microcontrolador esclau incrustat inicialitza l'APDS9960, cosa que permet la detecció de gestos activar la sortida INT i configurar la seva E / S, adjuntant la rutina de servei d'interrupció (ISR) 'GESTURE_CLEAR ()' per interrompre el vector INT0 (pin digital 2, pin IC de maquinari 4), configurant-lo per a un activador de caiguda. Això forma l'entrada nGestureClear del dispositiu mestre.

El pin de sortida d'interrupció 'INT' de l'APDS9960 està connectat al pin digital 4, pin IC de maquinari 6 que es configura com a entrada a U1.

La línia de senyal "nGestureAvailable" del pin digital 7, pin IC de maquinari 13 es configura com una sortida i es defineix com a alta, inactiva (desafirmada).

Finalment, els bits 0 … 3 del port B es configuren respectivament com a sortides i es defineixen com a baixos. Aquests formen el mordisc de dades que representa els diversos tipus de gestos detectats; Cap = 0x0, Error = 0xF, Amunt = 0x1, Baix = 0x2, Esquerra = 0x3, Dreta = 0x4, Prop de = 0x5 i Lluny = 0x6.

Està programada la tasca de fons 'bucle' que enquesta contínuament la sortida d'interrupció APDS9960 INT mitjançant la lectura del pin digital 4. Quan la sortida INT de l'APDS9960 es fa activa indicant que el sensor s'ha activat, el microcontrolador intenta interpretar qualsevol gest cridant 'readGesture () 'amb it's while (1) {}; bucle sense fi.

Si s'ha detectat un gest vàlid, aquest valor s'escriu al port B, s'afirma la sortida "nGestureAvailable" i el semàfor booleà "bGestureAvailable" s'estableix, evitant que es puguin registrar altres gestos.

Un cop el mestre detecta la sortida activa 'nGestureAvailable', llegeix aquest nou valor i impulsa 'nGestureClear' activament baix. Aquesta davallada activa la tasca en primer pla 'ISR GESTURE_CLEAR ()' per programar la suspensió de l'execució de la tasca en segon pla 'Bucle', netejant el port B, el semàfor 'bGestureAvailable' i la sortida 'nGestureAvailable'.

La tasca en primer pla 'GESTURE_CLEAR ()' ja està suspesa i la tasca en segon pla 'Bucle' es torna a programar. Ara es poden intuir altres gestos de l'APDS9960.

Si utilitzeu tasques de primer pla / fons activades per interrupció d'aquesta manera, el bucle infinit potencial a 'readGesture ()' del dispositiu esclau no afectarà el funcionament del dispositiu mestre i tampoc impedirà l'execució del dispositiu esclau. Això constitueix la base d’un sistema operatiu en temps real (RTOS) molt senzill.

Nota: el prefix 'n' significa actiu baix o afirmat com a "nGestureAvailable"

Pas 3: provar el dispositiu de detecció de gestos APDS9960 no bloquejant

Provant el dispositiu de detecció de gestos APDS9960 no bloquejant
Provant el dispositiu de detecció de gestos APDS9960 no bloquejant
Provant el dispositiu de detecció de gestos APDS9960 no bloquejant
Provant el dispositiu de detecció de gestos APDS9960 no bloquejant
Prova del dispositiu de detecció de gestos APDS9960 NoBlocking
Prova del dispositiu de detecció de gestos APDS9960 NoBlocking
Prova del dispositiu de detecció de gestos APDS9960 NoBlocking
Prova del dispositiu de detecció de gestos APDS9960 NoBlocking

Preàmbul

Tot i que el mòdul APDS9960 es subministra amb + 5v, utilitza un regulador incorporat + 3v3, és a dir, les línies I2C compleixen + 3v3 i no + 5v. És per això que vaig optar per utilitzar Arduino Due compatible amb + 3v3 com a micro controlador de prova, per evitar la necessitat de canviar de nivell.

No obstant això, si voleu utilitzar un Arduino Uno real, haureu de canviar de nivell les línies I2C a U1. Consulteu el següent document instructiu on he adjuntat un útil conjunt de diapositives (I2C_LCD_With_Arduino) que proporciona molts consells pràctics sobre l’ús d’I2C.

Proves d'interfície I2C

Les imatges 1 i 2 anteriors mostren com configurar i programar el sistema per a la interfície I2C. Primer haureu de descarregar i instal·lar la biblioteca APDS9960_NonBlocking. aquí

Proves d'interfície paral·lela

Les imatges 3 i 4 detallen el mateix per a la interfície paral·lela

Pas 4: Conclusió

Conclusió
Conclusió

General

El codi funciona bé i detecta els gestos de forma responsable sense falsos positius. Fa poques setmanes que funciona i funciona com a dispositiu esclau en el meu proper projecte. He provat molts modes de fallada diferents (i també ho ha estat el curiós moggie domèstic Quinn) que anteriorment va provocar un restabliment de l'ESP8266-12, sense cap efecte negatiu.

Possibles millores

  • L’obvi. Torneu a escriure la biblioteca del sensor de gest APDS9960 perquè no es bloquegi.

    De fet, em vaig posar en contacte amb Broadcom que em va dirigir a un distribuïdor local que va ignorar ràpidament la meva sol·licitud d'assistència, suposo que no sóc ni SparkFun ni AdaFruit. Per tant, probablement haurà d’esperar una estona

  • Porteu el codi a un microcontrolador esclau més petit. Utilitzar un ATMega328P per a una tasca és una mica excessiu. Tot i que inicialment vaig mirar l’ATTiny84, vaig deixar d’utilitzar-ne un ja que sentia que la mida compilada del codi era una línia de vora adequada. Amb la sobrecàrrega addicional d’haver de modificar la biblioteca APDS9960 per treballar amb una biblioteca I2C diferent.

Pas 5: referències

Obligatori per programar l’arduino incrustat (ATMega328P - U1)

SparkFun_APDS9960.h

  • Per: Steve Quinn
  • Finalitat: es tracta d’una versió bifurcada del sensor SparkFun APDS9960 bifurcada des de jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Té algunes modificacions per ajudar amb la depuració i té un detector desensibilitzat per reduir el desencadenament espuri.
  • De:

Cal inserir aquesta funcionalitat que no bloqueja al vostre codi arduino i posar exemples funcionats

APDS9960_NonBlocking.h

  • Per: Steve Quinn
  • Propòsit: proporciona una interfície neta per incrustar aquesta implementació que no bloqueja el sensor de gest APDS9960 al vostre codi Arduino.
  • De:

Sistema operatiu en temps real

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

Full de dades APDS9960

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

Recomanat: