- 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
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.
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).
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).
APDS-9960 | TTGO |
GND | G |
VCC | 3V |
SDA | Pin 22 |
SCL | Pin 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')