Designa egen 3D-geststyrning till låg kostnad
Bidraget med av DigiKeys nordamerikanska redaktörer
2019-08-13
Att använda reglage, knappar, spakar och pekskärmar är det vanligaste sättet för människor att interagera med maskiner och inbäddade enheter. Men den senaste utvecklingen inom sensorteknik har gjort det möjligt för utvecklarna att lägga till tredimensionell (3D) geststyrning i produkterna.
Det kan vara dyrt att köpa och integrera geststyrenheter, beroende på vilken teknik som används. Men det finns ett brett spektrum av teknik – från billigare sensorer som använder IR-LED:ar och fotodioder för att upptäcka rörelser, till dyra kameror för gestigenkänning. IR-gestsensorer är billiga, kan anslutas digitalt till en billig mikrostyrenhet, och kan – med hjälp av lite programvara – göras tillräckligt noggrann för många tillämpningar.
Den här artikeln handlar om geststyrning med hjälp av Broadcom APDS-9960 – en IR-baserad geststyrsensor som enkelt kan integreras med i stort sett alla inbäddade system.
IR-baserade gestsensorer
Teorin bakom IR-baserade gestsensorer är ganska enkel. Som utvecklare kanske du vill att enheten ska detektera exempelvis följande handgester:
- Uppåt/nedåt
- Vänster/höger
- Framåt/bakåt
För var och en av ovanstående rörelser måste sensorn kunna avläsa rörelseriktningen. Det sker med hjälp av två huvudsystem i sensorn: dels en LED (ljusemitterande diod) och dels ett antal riktningsfotodioder. Riktningsfotodioderna är fyra stycken fotodioder som är placerade ett visst avstånd från IR-LED:en. I Broadcom APDS-9960 – en sensor som känner av omgivningsljus, närhet och gester – är de fyra fotodioderna placerade i ett rombmönster där varje diod har en riktningsspecificerare för uppåt, nedåt, vänster och höger (figur 1).
Figur 1: Broadcom APDS-9960 har en integrerad IR-LED och fyra riktningsfotodioder som upptäcker reflekterad IR-energi. Denna reflekterade energi kan analyseras enligt en gestprofil. (Bildkälla: Broadcom)
LED:en avger infraröd energi som flödar vidare ut i tomma rymden om det inte finns ett föremål – till exempel en hand – som reflekterar energin. Den reflekterade energin upptäcks av fotodioderna, som också detekterar energin med olika intensiteter beroende på var föremålet (handen) är placerat. Exempel: En fotodiod vid gestens framkant tar inledningsvis emot mindre mängd reflekterad energi än en fotodiod vid rörelsens bakkant, så att en av fotodioderna får ett högre värde än den andra. Reflekterat ljus av olika intensitet registreras av de olika fotodioderna under den tid som gesten pågår. Flödet av riktningsinformation kan sedan analyseras, för att identifiera gesten.
Anta till exempel att en användare sveper handen från den övre till den undre delen av sensorn. I början av gesten detekterar ”nedåt-fotodioden” en större mängd reflekterad ljus än ”uppåt-fotodioden”. När gesten utförs flyttas handen till en punkt där båda dioderna tar emot en lika stor mängd energi. När gesten slutförs tar nedåt-fotodioden emot en mindre mängd reflekterat ljus och uppå-fotodioden en större mängd, vilket inverterar kurvan och fasen för fotodioderna (figur 2).
Figur 2: En gest i nedåtgående riktning framför Broadcom APDS-9960 genererar dessa fotodiodkurvor, där den främre kurvan motsvarar gestens riktning. (Bildkälla: Broadcom)
Med förståelse av hur data genereras när en gest utförs, är nästa steg att studera gränssnittet mot APDS-9960.
Gränssnitt mot geststyrenheten Broadcom APDS-9960
APDS-9960 levereras i en åtta-stifts ytmonterad (SMD-8) kapsel och upptar minimalt utrymme på pc-kortet (figur 3). Sensorns storlek är endast 3,94 × 2,36 × 1,35 mm. Kapseln rymmer de vanliga ström- och jordstiften, samt ett I2C-gränssnitt för digital anslutning till en mikrostyrenhet och stift för anpassning av LED-drivkretsarna. Vidare innehåller kapsel ett brytarstift, för att meddela mikrostyrenheten när det finns tillgängliga gestdata att bearbeta.
Figur 3: APDS-9960 levereras i en kompakt ytmonterad SMD-8-kapsel som upptar minimalt kortutrymme. (Bildkälla: Broadcom)
Det finns flera tillgängliga alternativ för att bygga en prototyp och gränssnittet mot APDS-9960. Ett exempel är SparkFuns utvärderingskort APDS-9960, som är ett relativt litet breakout-kort med LED-drivkretsar, vilket gör att kortet är användningsklart (figur 4). Utvecklaren behöver bara löda fast en stiftlist för bygling och jord, koppla in I2C-bussen och eventuellt ett brytarstift till en mikrostyrenhet – sedan är det bara att börja utveckla den inbäddade programvaran. SparkFun-kortet har också monteringshål, vilket gör det enkelt att ”slänga in” kortet om det är lämpligt att använda ett befintligt kort i tillämpningen.
Figur 4: Utvärderingskortet APDS-9960 från SparkFun har alla kretsar som behövs för att komma igång med geststyrning. (Bildkälla: DigiKey)
Alternativt kan utvecklarna använda Adafruits breakout-kort APDS-9960, även det en allt-i-ett-lösning (figur 5). Adafruits breakout-kort är intressant, eftersom det är litet men ändå innehåller en 3-volts regulator som kan användas för att leverera kraft till andra kretsar, exempelvis en LED eller en lågeffekts mikrostyrenhet. Dessutom får utvecklarna en komplett användarhandbok för breakout-kortet, och flera programvarubibliotek för att ansluta Arduino-korten eller utvecklingskort som kör Python. Detta gör APDS-9960 till en perfekt användningsklar lösning, som väsentligt kan förkorta tiden för att komma igång med sensorn.
Figur 5: Breakout-kortet APDS-9960 från Adafruit innefattar APDS-9960-enheten, en inbyggd 3-volts regulator samt I2C-spänningsomvandlingskretsar för stöd av 3-volts eller 5-volts bussar. (Bildkälla: DigiKey)
Det enklaste sättet att skapa ett gränssnitt för de här breakout-korten är att löda fast Molex 22-28-4255-stiftlister på korten. Det bästa är att vända stiftlisterna nedåt, vilket ger flera fördelar: För det första blir det då möjligt att placera kortet på ett kopplingsdäck, till exempel Digilent 340-002-1, ett lödningsfritt kopplingsdäck (figur 6). För det andra hålls kortytan fri från ledningar, så att det blir gott om plats att utföra gester utan att trassla in sig.
Figur 6: Breakout-kortet APDS-9960 från Adafruit, färdiglött och placerat på Digilents lödningsfria kopplingsdäck. (Bildkälla: Adafruit)
I det här skedet är det dags att koppla in ström- och jordkablarna, och I2C-ledningarna måste kopplas till ett mikrostyrenhetskort. Vilket utvecklingskort som helst kan användas, förutsatt att det har en mikrostyrenhet. Ett bra alternativ är STMicroelectronics B-L475E-IOT01A2 STM32L475 IoT Discovery Kit for IoT Node (figur 7). Detta utvecklingskort är försett med Arduino-stiftlister och stöder MicroPython, som mycket enkelt kan programmeras på kortet. När det är klart kan Python-skript användas för att skapa ett gränssnitt mot gestsensorn. Geststyrning blir därmed något som kan åstadkommas ganska enkelt.
Figur 7: STM32L475 Discovery Kit for IoT Node innefattar Arduino-stiftlister som enkelt kan anslutas till APDS-9960-breakout-korten. (Bildkälla: STMicroelectronics)
Använda Python för att detektera gester
Att hämta gestdata från APDS-9960 är inte svårt, men man måste läsa igenom databladet noggrant. APDS-9960 har flera funktioner, däribland:
- Gestavkänning
- Avkänning av bakgrundsbelysning
- Avkänning av RGB-färger
- Närhetsavkänning
Samtliga av ovanstående funktioner styrs av en tillståndsmaskin, som körs baserat på hur registren är konfigurerade för tillämpningen. Till exempel kan man förhindra gestmotorn från att köras hela tiden, genom att använda närhetsavkänningsmotorn för att detektera förekomst av en hand. När den reflekterade IR-energin når ett förkonfigurerat värde, övergår ”närhetsmotorns” tillstånd till gestmotorn, som mäter riktningsdioderna och placerar det uppmätta värdet i en FIFO-buffert (first-in, first-out). För att detta ska fungera måste styrregistret vara konfigurerat för närhet, och en värdegräns måste ställas in.
Beroende på vilka gester som behövs i tillämpningen kanske utvecklaren måste skriva algoritmer för detektering av särskilda gester. Men för vanliga gester, som uppåt/nedåt eller höger/vänster, kan utvecklaren använda Adafruits APDS-9960 CircuitPython-bibliotek. När biblioteket har kopierats till Python-enheten kan det importeras med hjälp av den kod som visas i Kod 1. Koden importerar APDS-9960-biblioteket och ett antal bibliotek som stöder I2C-bussen.
Copy import board import busio import adafruit_apds9960.apds9960 i2c = busio.I2C(board.SCL, board.SDA) sensor = adafruit_apds9960.apds9960.APDS9960(i2c)
Kod 1: CircuitPythons import- och biblioteksinitieringskod för att skapa ett gränssnitt med geststyrenheten APDS-9960. (Bildkälla: Adafruit)
Sensorobjektet är en instans av APDS-9960-biblioteket. Strax ska vi se hur enkelt det är att använda. För att aktivera gestigenkänning behöver utvecklaren bara använda följande kod:
Copy sensor.enable_gesture = True Programloopen för att avläsa gesten är bara ett fåtal kodrader (Kod 2).
gesture = sensor.gesture() while gesture == 0: gesture = sensor.gesture() print('Saw gesture: {0}'.format(gesture))
Kod 2: Att detektera en gest är detsamma som att göra ett enkelt anrop till en biblioteksmetod ett upprepat antal gånger. (Bildkälla: Adafruit)
Som framgår av koden, skrivs den detekterade gesten till skärmen (figur 8).
Figur 8: Exempel på gestutmatning från Adafruits APDS-9960 CircuitPython-bibliotek. (Bildkälla: Adafruit)
Gestutmatningen anges som ett siffervärde, som enkelt kan översättas enligt följande:
0 = ingen gest detekterad
1 = uppåt-gest detekterad
2 = nedåt-gest detekterad
3 = vänster-gest detekterad
4 = höger-gest detekterad
Grundläggande gestigenkänning kan, som synes, vara väldigt enkelt när man använder ett befintligt bibliotek och ett fåtal kodrader. För mer avancerade gester måste man modifiera biblioteket för möjlighet att analysera rå-gestdata.
Tips och trick för att skapa en geststyrenhet
Vill du bygga och integrera en geststyrsensor i en produkt ställs du inför ett antal utmaningar. Här är några tips som du kan använda när du arbetar med infraröd-baserade geststyrenheter:
- Använd gestsensorns interna närhetsdetektor för att starta geststyrmotorn, så att antalet ogiltiga geststarter minimeras.
- Börja med ett befintligt gestbibliotek och bygg fler gester utöver de som redan finns.
- Justera fotodiodernas förstärkning till värden som är lämpade för gesttillämpningen.
- Justera LED-utgångsdrivenhetens intensitet till värden som passar för tillämpningen. Viss finjustering kan bli nödvändigt för att få repeterbara resultat.
- Det är en god idé att inleda applikationsutvecklingen genom att utveckla högnivåprogramvara och se till att du förstår hur sensorn fungerar innan du övergår till lågnivåkod.
Följer du de här tipsen minimeras tiden för att konfigurera och börja använda IR-geststyrningen.
Slutsats
Det finns en ständig strävan efter att göra maskiner som användarna kan kommunicera med på ett mer naturligt och intuitivt sätt. Ett populärt alternativ är att använda geststyrning. Det finns många sätt att åstadkomma geststyrning, men enklast och mest prisvärt är det att använda en infraröd-baserad gestsensor. Som har beskrivits i artikeln, behöver det inte ta särskilt lång tid att integrera en gestsensor med en mikrostyrenhet, förutsatt att utvecklaren drar nytta av befintlig maskinvara och programvara.
Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.




