Bei vielen Roboterwettbewerben müssen oft Objekte nach Farbe sortiert werden. Dazu gibt es Farbsensoren, die an den I2C-Bus angeschlossen werden. Einer davon ist der TCS34725 von TAOS bzw. ams.
Gehäuse
Der TCS34725 kommt in einem kleinen SMD-Gehäuse mit 6 Pins. Es gibt dafür aber auch ein Breakout-Board von Adafruit
Ansteuerung
Nach dem Start müssen diverse Register gesetzt werden, damit der Sensor vernünftige Ergebnisse liefert. Wichtig ist die integration time. Ich habe diese auf 101 ms gesetzt, damit Flackern von Leuchtstofflampen oder LEDs rausgefiltert wird. Das gain control wird entsprechend der Beleuchtungssituation beim Sensor gesetzt. Bei mir lieferte 4x sinnvolle Werte.
Der TCS34725 hat 4 Sensoren, je einen für rot, grün und blau und einen ohne Farbfilter, der die Gesamthelligkeit messen kann. All diese Werte werden mit 16 bit in Digitalwerte umgewandelt und können einzeln ausgelesen werden.
Beispielprogramm
Hier mein Beispielprogramm für den Raspberry Pi
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <linux/i2c-dev.h> #include <fcntl.h> #include <unistd.h>
int main(void) { int file; unsigned char x; short unsigned int clear,red,green,blue;
printf("ams TCS34725\n"); if((file=open("/dev/i2c-1",O_RDWR))<0) // open i2c-bus { perror("cannot open i2c-1"); exit(1); } if(ioctl(file, I2C_SLAVE, 0x29)<0) // open slave, address TCS34725 = 0x29 { perror("cannot open slave address"); exit(1); } i2c_smbus_write_byte_data(file,0x80,0x03); // enable: AEN POW i2c_smbus_write_byte_data(file,0x81,0xd5); // ATIME integration time 101ms i2c_smbus_write_byte_data(file,0x8F,0x01); // gain control: 4x
x=i2c_smbus_read_byte_data(file, 0x92); // check device id printf("Device ID: 0x%02x\n", x); // should be 0x44;
clear=i2c_smbus_read_word_data(file, 0xb4); // CDATA register printf("Clear: 0x%04x = %i\n", clear,clear); red=i2c_smbus_read_word_data(file, 0xb6); // RDATA register printf("Red: 0x%04x = %i\n", red,red); green=i2c_smbus_read_word_data(file, 0xb8); // GDATA register printf("Green: 0x%04x = %i\n", green,green); blue=i2c_smbus_read_word_data(file, 0xba); // BDATA register printf("Blue: 0x%04x = %i\n", blue,blue);
close(file);
return 0; }
Kommentare
Kommentarfunktion für diesen Artikel geschlossen.