Der APDS9960-Sensor: Grundlagen

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 178
Registriert: Do 21. Okt 2010, 18:31

Der APDS9960-Sensor: Grundlagen

Beitrag von Heinrichs » Sa 4. Mär 2023, 11:19

Der APDS-9960 ist ein Sensor mit zahlreichen Möglichkeiten:
  • Gestenerkennung
  • Farberkennung (RGB)
  • Abstandsmessung (Damit kann der APDS-9960 auch als Bewegungssensor eingesetzt werden, allerdings nur innerhalb eines Arbeitsbereiches von bis zu ca. 30 cm.)
  • Umgebungslichtmessung

apds9960_module_1a.jpg
Abb. 1
apds9960_module_1a.jpg (35.32 KiB) 8682 mal betrachtet

Der wesentliche Baustein des APDS-9960 ist der kleine rechteckige, schwarze Baustein im oberen Bereich des Moduls. Dieser Baustein besitzt eine IR-LED, deren reflektiertes Licht für die Gesten- und Abstandsdetektion verwendet wird (untere Öffnung) und ein Ensemble von verschiedenen Fotodioden (obere Öffnung); mit diesen Fotodioden können Bewegungen detektiert, Abstände gemessen sowie Farbwert- und Umgebungslichtmessungen durchgeführt werden. In der Abbildung 2 sind die in einer Matrix angeordneten Photodioden deutlich zu erkennen.

apds9960_mic2a.jpg
Abb. 2: Sensor (stark vergrößert; aus: https://elektro.turanis.de/html/prj345/index.html)
apds9960_mic2a.jpg (23.2 KiB) 8690 mal betrachtet

Die Kommunikation mit dem APDS-9960 erfolgt über I2C mit einer Taktrate von bis 400 kHz; 400 kHz entspricht gerade dem Standardwert (Default) bei Micropython; bei der Initialisierung der i2c-Schnittstelle muss diese Taktfrequenz dann nicht angegeben werden. Beim TTGO T-Display können wir die benötigte i2c-Instanz dann so erzeugen:

i2c = machine.I2C(1, scl=machine.Pin(21), sda=machine.Pin(22))

Hierbei wird auf die Anschlüsse Pin21 und Pin22 zurückgegriffen, welche beim TTGO T-Display schon (externe) Pull-Up-Widerstände besitzen (vgl. Abb. 3).

PullUps_fuer_GPIO21_GPIO22.jpg
Abb. 3: Die Pull-Up-Widerstände beim TTGO T-Display
PullUps_fuer_GPIO21_GPIO22.jpg (7.31 KiB) 8689 mal betrachtet

Wenn sie andere GPIOs für SDA und SCL oder auch ein anderes Board (z. B. den T-QT) benutzen möchten, dann müssen Sie selbst für die Pull-Ups sorgen. Dies kann auf zwei verschiedene Weisen geschehen:
  • die beiden Ports selbst über entsprechende Widerstände (ca. 1 k-Ohm) mit dem 3V-bzw. 3,3V-Anschluss verbinden, oder
  • auf dem APDS-9960-Modul die 3 mit I2C-PU beschrifteten Kontakte mit Lötzinn verbinden (vgl. Abb. 1).
Beim TTGO T-Display sieht der Anschluss dann so aus:

APDS-9960TTGO
GNDG
VCC3V
SDAPin 22
SCLPin 21

Auf die Anschlüsse VL und INT des APDS-9960 wird an dieser Stelle eingegangen.

Zum Austesten der Verbindung benutzen wir das folgende Testprogramm, welches nach einem APDS-9960 (bzw. APDS-9930, dem "kleineren Bruder" des APDS-9960) sucht; legen Sie vor der Ausführung des Programms im Quelltext durch Auskommentieren fest, ob es sich um einen APDS-9960 oder einen APDS-9930 handeln soll.

Code: Alles auswählen

# scan_i2c_for_APDS9960_9930.py

deviceAddr = 0x39  # I2C-Adresse für APDS9960 und APDS9930
deviceID_reg_9960 = 0x92 # APDS9960...
deviceID_reg_9930 = 0x12 # APDS9930
deviceID = 0xAB #  ID für APDS9960 und APDS9930 

# >>>>>>>>>> Modul durch Auskommentieren auswählen... <<<<<<<<<<<<
# deviceID_reg = deviceID_reg_9930
deviceID_reg = deviceID_reg_9960

import machine
i2c =  machine.I2C(1,scl=machine.Pin(21), sda=machine.Pin(22))

print('Scan i2c bus...')
devices = i2c.scan()

if len(devices) == 0:
  print("Kein i2c-Modul gefunden!")
else:
  print('i2c-Module gefunden:',len(devices))
  for device in devices:
    print("Adresse (dec): ", device," | Adresse (hex): ",hex(device))
    if device == deviceAddr: # APDS9960/30-I2C-Addresse = 0x39
      deviceID_read = i2c.readfrom_mem(devices[0], deviceID_reg, 1) # lies ID aus ID-Register 0x92 bzw. 0x12
      deviceID_read = list(deviceID_read)[0] # byte -> int
      if deviceID_read == deviceID: # Kennung für beide APDS gleich!
        if deviceID_reg == deviceID_reg_9960:  
          deviceTyp = 9960
        else:
          deviceTyp = 9930
        print('gefunden: APDS', end = '')
        print(deviceTyp)        
      else:
        print('Kein APDS9930/60 gefunden')

Antworten