Senzor de culoare TCS34725 — cum vede mașina
Cum citește un senzor RGB ce-i pe podea. I2C, calibrare, și de ce galbenul tău nu-i la fel ca galbenul meu.
Ce înveți
- Ce înseamnă RGB — orice culoare = combinație de 3 numere (R, G, B) între 0 și 255
- Cum citești componentele R, G, B prin I2C de la TCS34725
- Ce-i clearul (lumina totală) și cum îl folosești ca să normalizezi
- Cum decizi din 3 numere dacă-i galben, roșu, albastru, etc.
Ce-i un senzor de culoare
Senzorul TCS34725 are 4 mici fotodiode sub o lentilă:
- una sensibilă la R (roșu, ~620 nm)
- una sensibilă la G (verde, ~530 nm)
- una sensibilă la B (albastru, ~470 nm)
- una sensibilă la toate (clear / lumină totală)
Lumina care intră în lentilă activează fiecare diodă proporțional cu cât e culoarea ei prezentă. Un cip ADC convertește activitatea în numere de la 0 la ~65000.
Galben pur: R=mare, G=mare, B=mic
Roșu: R=mare, G=mic, B=mic
Albastru: R=mic, G=mic, B=mare
Verde: R=mic, G=mare, B=mic
Alb (toate): R=mare, G=mare, B=mare
Negru (lumină 0): R=0, G=0, B=0
Cum vorbește cu ESP32 — I2C
TCS34725 e un cip I2C. Are nevoie de doar 2 fire de date:
| TCS34725 | ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO 21 |
| SCL | GPIO 22 |
(LED-ul integrat poate fi controlat cu un al treilea pin pe LED.)
I2C e ca o conversație cu adrese: ESP32 strigă „hei, dispozitivul 0x29, dă-mi valorile RGB” și dispozitivul răspunde.
Cod minim
#include <Wire.h>
#include "Adafruit_TCS34725.h"
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_24MS,
TCS34725_GAIN_4X);
void setup() {
Serial.begin(115200);
if (!tcs.begin()) {
Serial.println("EROARE: TCS34725 nu răspunde");
while (1);
}
}
void loop() {
uint16_t r, g, b, c;
tcs.getRawData(&r, &g, &b, &c);
Serial.printf("R=%d G=%d B=%d C=%d\n", r, g, b, c);
delay(100);
}
De la 3 numere la o culoare
Cea mai robustă logică: folosește raporturi (proporții), nu valori absolute.
float rR = (float)r / c; // 0.0 .. 1.0
float rG = (float)g / c;
float rB = (float)b / c;
if (rR > 0.4 && rG > 0.4 && rB < 0.2) {
return "GALBEN"; // banană — încetinești
}
if (rR > 0.5 && rG < 0.25 && rB < 0.25) {
return "ROSU"; // rachetă — boost
}
if (rB > 0.5 && rR < 0.25 && rG < 0.25) {
return "ALBASTRU"; // scut
}
if (rG > 0.45 && rR < 0.30 && rB < 0.30) {
return "VERDE"; // turbo verde
}
// mai multe culori adaugi după ce calibrezi
return "NECUNOSCUT";
De ce LED-ul integrat ajută
Senzorul are un LED alb pe el care iluminează ce-i sub. Dacă-l aprinzi
(tcs.setInterrupt(false) în Adafruit lib), ai lumină constantă indiferent
că-i ziuă sau seară. Raporturile devin foarte stabile.
Dezavantaj: LED-ul consumă curent, dar nu mult (~40 mA). Pentru CART-K e ok.
Calibrare — primul pas când îl primești
- Printează 5 dreptunghiuri colorate (galben, roșu, albastru, verde, mov) pe coală obișnuită A4 cu imprimanta de acasă
- Cu senzorul la 1 cm deasupra fiecărui tile, scrie pe Serial valorile R, G, B
- Calculează
rR = R/C,rG = G/C,rB = B/Cpentru fiecare culoare - Pune pragurile (ca în exemplul de mai sus) pe baza datelor tale concrete
Atenție: galbenul de la imprimanta ta nu-i identic cu galbenul de la imprimanta mea. Calibrezi cu tile-urile TALE.
Pas următor
Lecția 13: cum trimit mașina ta un mesaj la mașina lui Darius când îl lovești.
După lecția asta, poți
- Conectezi orice senzor I2C la ESP32 cu doar 2 fire (SDA + SCL)
- Distingi 5-8 culori diferite dintr-un singur citit RGB
- Înțelegi de ce lumina ambientală schimbă citirea (de ce LED-ul senzorului ajută)