Farbwerte über den RGB-Sensor auslesen (dieser hängt am linken Grove-Anschluss, Grove-Kabel muss ggf. angelötet werden). Dann RGB-LED des mini entsprechend der gemessenen Werte einstellen. Farbwerte werden zusätzlich über die serielle Konsole ausgegeben.
Wie funktionierts?I2C direkt zu benutzen ist garnicht so einfach. Das Protokoll erlaubt es einem Gerät Daten zu senden oder Daten zu empfangen. Dazu gibt es die folgenden Funktionen:
Schreibe eine Zahl an das Gerät:
pins.i2cWriteNumber(Geräteadresse, Zahl, Datenformat)
Lies eine Zahl vom Gerät:
pins.i2cReadNumber(Geräteadresse, Datenformat)
Wichtig dabei ist, dass je nach Datenformat, eine Zahl einer bestimmten Menge an Bytes entspricht. Im PXT Editor gibt es nur 8-bit (1 Byte) oder 16-bit (2 Byte). Wir lassen, der Einfachheit halber, Zahlen mit Vorzeichen weg.
Der Sensor ISL29125 erwartet beim Schreiben immer eine Registeradresse (das ist nicht die Geräteadresse!) und einen Wert, der in das Register geschrieben werden soll. Dabei ist das Register 1 Byte und der Wert 1 Byte. Beides muss in einem Rutsch geschrieben werden, d.h. wir müssen 2 Byte senden.
Im Beispiel gibt es beim Start einen Resetbefehl:
pins.i2cWriteNumber(0x44, 0x0046, NumberFormat.UInt16BE)
Was bedeutet das? Wir senden an das Gerät mit der Adresse 0x44
(68) den Befehl in das Register 0x00
den Wert 0x46
zu schreiben. Dazu setzen wir die Registeradresse 0x00
und den Wert 0x46
zu einem 16 bit Wert 0x0046
(70) zusammen. Dabei erwartet der Sensor, dass wir zuerst das niedrige Byte (0x46
) senden und dann das hohe (0x00
). Damit das auch so passiert, geben wir an, dass als Datenformat UInt16BE
benutzt wird. Das bedeutet "unsigned Integer" (vorzeichenlose ganze Zahl) im Format "big endian" (schreibe zuerst das untere Byte, dann das hohe Byte).
Hier mal zur Veranschaulichung: 0x0046
als 16 bits:
Dezimal 70
Hexadezimal 0 0 4 6
Binär 0000 0000 0100 0110
^^^^^^^^^ ^^^^^^^^^^
oberes unteres Byte
Das gleiche gilt natürlich auch für das Lesen vom Gerät, da wir aber eigentlich immer nur 8 bit (1 Byte, UInt8BE) lesen, ist nur wichtig, dass eine vorzeichenlose Zahl gelesen wird. Sollte aber erwartet werden, dass 2 Byte gelesen werden sollen, muss bei ISL29125 wieder UInt16BE
angegeben werden, da sonst die Zahl falsch dekodiert wird.
Nun noch zum Abschluss ein Beispiel, wo es klar wird, was passiert, wenn wir das falsche Encoding benutzen. Schauen wir uns die Konfiguration, die nach dem Reset kommt:
pins.i2cWriteNumber(0x44, 0x0105, NumberFormat.UInt16BE)
Wir schreiben wieder an Gerät mit der Adresse 0x44
. Diesmal soll in das Register 0x01
der Wert 0x05
(RGB Sampling) geschrieben werden.
Gesendet wird:
Hexadezimal 0 1 0 5
Binär 0000 0001 0000 0101
^^^^^^^^^ ^^^^^^^^^^
oberes unteres Byte
Würden wir statt UInt16BE
nun UInt16LE
, würde beim Sensor folgendes ankommen:
Hexadezimal 0 5 0 1
Binär 0000 0101 0000 0001
^^^^^^^^^ ^^^^^^^^^^
unteres oberes Byte
Der Sensor würde also versuchen in das Register 0x05
den Wert 0x01
zu schreiben. Ganz klar falsch.
Also immer beim Datenformat aufpassen.
Comments
Please log in or sign up to comment.