Der Blog ist umgezogen: http://scholtyssek.org/blog/de/2014/11/24/tsl2561-lichtsensor-mit-dem-stm32f4/
Der TSL2561 ist ein Sensor, der die Lichtintensität messen und in einen 16-bit aufgelösten, digitalen Wert transformieren kann. Auf dem Sensor sind zwei Fotodioden enthalten, die das Lichtspektrum messen und in einen digitalen 16-Bit Wert transformieren. Die erste Fotodiode misst das Lichtspektrum inklusive dem infraroten Anteil. Die zweite Diode misst lediglich die infraroten Lichtbereich. Die synchron aufgezeichneten Messwerte werden über eigene Kanälen in Datenregister transferiert (channel0 und channel1). Die Idee dabei ist, dass beide Werte dazu verwendet werden, den infraroten Lichtanteil durch eine Subtraktion zu herauszurechnen. Das resultierende Lichtspektrum entspricht somit dem, welches das menschliche Auge erfassen kann.
Die Messwerte können über den I2C oder den SMBus ausgelesen werden. In diesem Artikel wird eine Kommunikation über den I2C-Bus eingesetzt, um Daten zwischen dem STM32F4 und dem TSL2561 auszutauschen.
Der TSL2561 ist ein Sensor, der die Lichtintensität messen und in einen 16-bit aufgelösten, digitalen Wert transformieren kann. Auf dem Sensor sind zwei Fotodioden enthalten, die das Lichtspektrum messen und in einen digitalen 16-Bit Wert transformieren. Die erste Fotodiode misst das Lichtspektrum inklusive dem infraroten Anteil. Die zweite Diode misst lediglich die infraroten Lichtbereich. Die synchron aufgezeichneten Messwerte werden über eigene Kanälen in Datenregister transferiert (channel0 und channel1). Die Idee dabei ist, dass beide Werte dazu verwendet werden, den infraroten Lichtanteil durch eine Subtraktion zu herauszurechnen. Das resultierende Lichtspektrum entspricht somit dem, welches das menschliche Auge erfassen kann.
Die Messwerte können über den I2C oder den SMBus ausgelesen werden. In diesem Artikel wird eine Kommunikation über den I2C-Bus eingesetzt, um Daten zwischen dem STM32F4 und dem TSL2561 auszutauschen.
Den Sensor anschließen
Der TSL2561 arbeitet mit einer Spannung von 3.8V, verwenden Sie nicht den 5V Pin des STM32F4, sonst laufen Sie Gefahr, den Sensor zu zerstören. Es gibt zwei Anschlüssen für die I2C-Kommunikation (SDA und SCL). Der SDA Pin ist für den Datenaustausch mit dem Sensor, währen SCL für den Bustakt verwendet wird. Der ADDR Pin ermöglicht es, den Sensor mit einer I2C Adresse zu konfigurieren. Solange die Standardadresse auf dem Bus nicht für ein anderes Gerät verwendet wird, kann diese problemlos verwendet werden. Die Standardadresse für den Sensor lautet 0x39, diese kann aber auf die Adressen 0x29 bzw. 0x49 angepasst werden. Außerdem kann der Sensor einen Interrupt auslösen, sodass es nicht notwendig ist, diesen zu pollen. In dieser Beispielimplementierung wird allerdings auf die Verwendung eines Sensorinterrupts verzichtet.
TSL2561 Lichtsensor |
Die Software
Der STM32F4 Controller verfügt über mehrere I2C Schnittstellen. In diesem Beispiel wird I2C1 verwendet, welcher an den IOs GPIO6 (SCL) und GPIO7 (SDA) angeschlossen ist. Die Konfiguration ist übrigens in einer Konfigurationsdatei gekapselt, sodass diese leicht angepasst werden kann. Die Software kann aus dem Repository (Projektname TSL2561_example) runtergeladen werden. Die Taktfrequenz für die I2C Kommunikation liegt bei 400 kHz, diese ist, wie auch die IOs, in der Konfigurationsdatei hinterlegt. Die init_lightsensor(void) Methode konfiguriert alle benötigten IOs und die Peripherie für die I2C Kommunikation mittels initLightSensorI2C(void).
Die Messwerte werden in insgesamt vier Registern hinterlegt (zwei für jeden Kanal), welche ausgelesen werden können. Diese Register enthalten die Messwerte als 8 Bit low bzw high bytes.
Die Messwerte werden in insgesamt vier Registern hinterlegt (zwei für jeden Kanal), welche ausgelesen werden können. Diese Register enthalten die Messwerte als 8 Bit low bzw high bytes.
Adresse 0x00 | Beschreibung control register |
---|---|
0x8C | low byte (channel0) |
0x8D | high byte (channel0) |
0x8E | low byte (channel1) |
0x8F | high byte (channel1) |
Um Bytes aus den Registern des Moduls zu lesen, wird vorab die Registeradresse an das Control Register (0x00) des Moduls geschickt. Außerdem muss das sogenannte Command Bit gesetzt werden, damit das Modul korrekt auf die Anfragen reagiert.
Die empfangenen Daten können in die SI-Einheit LUX umgerechnet werden. Diese Berechnung ist bereits in dem Beispielprogramm enthalten. Die read_lightness_value() Methode empfängt die Datenbytes und führt die Transformation durch.
Appendix
http://www.adafruit.com/datasheets/TSL2561.pdf