Under Construction


Was ich mir vorgenommen hatte, kann man unten sehen. Dies sind die Probleme:

----------------------------------------------------------------------------------------------------------------------------------------------

Wikipedia sagt: "Ein Farbsensor dient der messtechnischen Erfassung der Farbe einer Oberfläche."

Das hier verwandte Verfahren wurde von Philippe E. Hurbain abgeschaut. Die Oberfläche wird nacheinander mit verschiedenen Farben (Rot, Grün, Blau) beleuchtet und jeweils das reflektierte Licht gemessen. Ein µC (ATtiny 45) steuert farbige LEDs an und misst die Helligkeit mit einem Fototransistor. Die Ansteuerung des ATtiny erfolgt über einen I²C-Bus. Der (übersichtliche) Schaltplan:
Schaltplan

Die LEDs wurden zusammen mit dem Fototransistor (in der Mittelachse) in einen parabolisch geformten Halter (war einmal eine "Satelliten-Schüssel") eingesetzt. 
Satelliten-Schüssel  Sensorkopf von vorn

Hinzu kommen ein Gehäuse aus zusammen geklebten LEGO-Steinen und ein passender Stecker. Den Stecker kann man bei Mindsensors kaufen.
Bauteile

SMD-Technik bei den Vorwiderständen spart eine Menge Platz.
Sensorkopf von hinten SMD Widerstände

Der verdrahtete Chip Der verdrahtete Chip. Auch hier spart SMD eine Menge Platz.


Mit Beleuchtung
... Und mit Beleuchtung:

Durch den parabolisch geformten Halter treffen sich die Lichtkegel der LEDs einige Millimeter vor dem Fototransistor, erkennbar an dem weißen Fleck (additive Farbmischung).
Farbmischung


I2C Register:

Register

Lesen

Schreiben

0x00-0x07

Software Version – „V1.00“ (aufgefüllt mit 0x00)

-

0x08-0x0f

Hersteller – „ULLI“ 

(aufgefüllt mit 0x00)

-

0x10-0x17

Gerätekennung – „COLOR“

(aufgefüllt mit 0x00)

-

0x18-0x1D

-

-

0x1E

Automatische LED-Abschaltung

0x00: Aktiviert,  0xFF: deaktiviert

-

0x1F

Bus-Adresse
Das Auslesen dieser Adresse liefert keinen vernünftigen Wert.
Der Beginn der Lesesequenz kann nicht vom Beginn der
Schreibsequenz unterschieden werden. Statt dessen 2 Bytes
bei der Registeradresse 0x1E abfordern und das 2. Byte
auswerten.

Bus-Adresse

0x20

-

Kommando

0x21

Status Einzelmessung
0x00: Messung abgeschlossen
0x01: Messung in Gange
0xFF: Einzelmesswert ungültig,
           Mehrfachmessung durchgeführt

-

0x22

Einzelmessung, Messwert LSB

-

0x23

Einzelmessung, Messwert MSB -

0x24

Status Mehrfachmessung
0x00: Messung abgeschlossen
0x01: Messung in Gange
0xFF: Merfachmesswert ungültig,
           Einzelmessung durchgeführt

-

0x25

Mehrfachmessung Rot-Wert

-

0x26

Mehrfachmessung Grün-Wert

-

0x27

Mehrfachmessung Blau-Wert

-

0x28

Mehrfachmessung Dunkelwert

-

I²C Operationen:

Kommando

Aktion

0x00

LEDs aus

0x01 - 0x07

LEDs an: 0x01 rot, 0x02 grün, 0x04 blau

0x10 - 0x17

Start Messen mit entsprechenden LEDs an

0x20

Start Messen mit drei Farben nacheinander und Dunkelwert 

0x30

Automatisches LED-Abschalten deaktivieren

0x31

Automatisches LED-Abschalten aktivieren 

I2C BUS-Adresse:

Standardeinstellung ist 0x10 und 0x00. 0x10 kann über das Register 0x1F geändert werden.

Zustandsdiagramm:
Zustandsdiagramm

Gestrichelte Linie: Ereignis Transmission Start

Leseanforderung: Das Byte, auf das der Registerzeiger zeigt wird übertragen, anschließend wird der Zeiger inkrementiert. Der Zeiger wird nicht über 0x49 hinaus erhöht.

Schreibanforderung 0x1F:Es wird auf das Token 0x55 und anschließend auf das Byte mit der neuen Adresse gewartet. Beide müssen im gleichen Transferzyklus mit übertragen werden. Ein erneuter Übertragungszyklus (Start-Bedingung auf dem I2C-Bus) führt zum Abbruch. Wenn das 3. Byte übertragen wurde, wird die neue Bus-Adresse übernommen. Das System verbleibt im Zustand „Adressänderungsmodus“ um evtl. weitere übertragene Daten zu abzufangen. Die Bus-Adresse wird im EEPROM gespeichert und steht beim nächsten Einschalten wieder zur Verfügung.

Schreibanforderung 0x20: Es wird auf das Kommandobyte gewartet. Dies muss im gleichen Transferzyklus mit übertragen werden. Ein erneuter Übertragungszyklus (Start-Bedingung auf dem I2C-Bus) führt zum Abbruch. Wenn das 2. Byte übertragen wurde, wird das Kommando ausgeführt (LEDs geschaltet, Messung gestartet, etc.). Das System verbleibt im Zustand „Auftragsmodus“ um evtl. weitere übertragene Daten zu abzufangen.

Schreibanforderung: Bei allen anderen Schreibanforderungen wird der Registerzeiger auf den übertragenen Wert gesetzt. Ist dieser größer als 0x28, erhält der Registerzeiger den Inhalt 0x28. Das System verbleibt im Zustand „Registermodus“ um evtl. weitere übertragene Daten zu abzufangen.

Initialisierung: Bus-Adresse wird aus dem EEPROM geladen.

Code:

avrdude -p t45 -P com1 -c siprog -U hfuse:w:hfuse.hex:i

:010000005FA0
:00000001FF