Atelier.

atelier · lecții

Lecția 11 30 min intermediar 3 întrebări quiz

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:

TCS34725ESP32
VCC3.3V
GNDGND
SDAGPIO 21
SCLGPIO 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

  1. Printează 5 dreptunghiuri colorate (galben, roșu, albastru, verde, mov) pe coală obișnuită A4 cu imprimanta de acasă
  2. Cu senzorul la 1 cm deasupra fiecărui tile, scrie pe Serial valorile R, G, B
  3. Calculează rR = R/C, rG = G/C, rB = B/C pentru fiecare culoare
  4. 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ă)