En RGB-sensor er en allsidig sensor som gir Arduino-prosjekter evnen til å oppfatte farger og lysintensitet. Utforsk hvordan slike sensorer kan brukes til å skape innovative løsninger.
Beskrivelse
RGB-sensoren har fått navnet sitt fordi den leser fargene rødt, grønt og blått. Forkortinga RGB viser til første bokstavene i hver av de tre fargene.
RGB-sensoren består av lysfølsomme fotodioder som hver for seg oppfatter rødt, grønt og blått lys, og som kombinerer informasjonen for å bestemme en fargesammensetning. Denne informasjonen kan brukes til å identifisere og klassifisere farger i ulike omgivelser.
Sensorene varierer i nøyaktighet og funksjonalitet. Enkelte sensorer kan til og med skille mellom forskjellige nyanser av en farge.
Bruksområder
RGB-sensorer har et bredt spekter av bruksområder. I industrien benyttes de til fargegjenkjenning i produksjonslinjer, blant annet til å sortere produkter etter farge eller kvalitet. To eksempler:
I matindustrien kan sensorene brukes til å sortere frukt og grønnsaker etter modenhet og kvalitet. På denne måten kan en få optimalisert pakking og distribusjon.
I tekstil- og klesindustrien sikrer bruk av RGB-sensorer at fargene på tekstiler er like gjennom hele produksjonsprosessen. Eventuelle fargeavvik kan fanges opp tidlig, noe som gir mindre feilproduksjon og lavere kostnader totalt.
Lysdesignere kan bruke RGB-sensorer til dynamiske belysningsløsninger som tilpasser seg omgivelsene. Sensorene kan også brukes i for eksempel kunstinstallasjoner, spillkontrollere eller som en del av et smarthussystem.
Forslag til bruk
Fargegjenkjenning
Lag et Arduino-prosjekt som skiller mellom forskjellige farger, og som reagerer med forskjellige handlinger basert på registrert farge.
Dynamisk belysning
Bygg en belysningsenhet med RGB-lys som tilpasser seg lyset i omgivelsene ved å endre fargetone og lysstyrke basert på informasjon fra en RGB-sensor.
Fargesortering
Lag en sorteringsmaskin som bruker en RGB-sensor og styrte aktuatorer til å sortere objekter basert på fargen deres.
Hovedtyper
Vi skiller mellom tre hovedtyper RGB-sensorer ut fra typen signaler de sender fra seg: analoge signaler, digitale signaler og frekvenssignaler.
En analog sensor sender ut ei analog spenning basert på lysstyrken den registrerer. Dette er den enkleste versjonen av RGB-sensorer, og den er ikke så mye brukt i moderne industri fordi den ikke er veldig nøyaktig. Likevel er den fin å bruke til hobbyprosjekter og i opplæring.
En digital sensor sender ut digitale signaler som beskriver intensiteten til hver farge. Et eksempel på en slik RGB-sensor er ISL29125. De digitale RGB-sensorene fungerer i hovedsak på samme måten som analoge sensorer, men på en digital sensor blir de analoge signalene omdanna til digitale signaler ved hjelp av en mikrokontroller som er plassert på selve sensoren.
Den tredje sensortypen er også digital, men den sender ut et digitalt firkantsignal (square wave) med en frekvens som varierer etter intensiteten til den aktuelle fargen. TCS230 er en slik type sensor.
Funksjonsprinsipp
En analog RGB-sensor fungerer ved å registrere intensiteten av rødt, grønt og blått lys. Den består vanligvis av tre lysfølsomme elementer (fotodioder).
Fotodiodene er som oftest belagt med en film eller et filter som kun slipper gjennom lys av enten rød, grønn eller blå farge. Når lys treffer sensoren, registrerer hver av de tre fotodiodene sin spesifikke farge og produserer en elektrisk spenning som varierer ut fra fargeintensitet eller -mengde.
Disse elektriske signalene leses av en mikrokontroller, for eksempel en Arduino, gjennom analoge innganger. Deretter kan mikrokontrolleren behandle disse verdiene for å tolke hvilken farge sensoren registrerer.
Dette gjøres vanligvis ved å kombinere de tre fargeverdiene til én enkelt fargekode, eller ved å sammenlikne verdiene med forhåndsdefinerte terskler for å identifisere bestemte farger. På denne måten kan RGB-sensoren gi informasjon om fargen på et objekt eller om lysforholdene i et gitt miljø, og denne informasjonen kan deretter brukes til ulike formål.
Ulik nøyaktighet
Digitale sensorer kan ha mange flere fotodioder enn bare tre. Ofte har de 64 dioder fordelt på fargene rødt, grønt, blått og blankt. Disse sensorene er da mer nøyaktige og har en spesialtilpassa mikrokontroller som omdanner analoge signaler til digitale signaler på selve sensoren.
Billige sensorer er ikke alltid så nøyaktige, og avlesningene kan lett påvirkes av lyset i omgivelsene. Det kan derfor være smart å lese fargen i et rom der omgivelseslyset ikke endrer seg. Til enkle prosjekter er billige sensorer uansett fortsatt gode nok.
Eksempel på oppbygging og funksjon: digital RGB-sensor TCS230
TCS230 er en mye brukt RGB-sensor for tilkopling til Arduino og er en digital variant med innebygd mikroprosessor.
Oppbygning
TCS230 registrerer fargelys ved hjelp av et panel med 64 fotodioder i et kvadratisk mønster med 8 dioder i høyden og 8 i bredden. Ved hjelp av en strøm-til-frekvens-omformer konverteres avlesningene fra fotodiodene til ei firkantbølge med en frekvens som er direkte proporsjonal med lysintensiteten. Arduinoen kan da lese dette frekvenssignalet og angi hvilken farge som lyser på sensoren.
Fargeanalyse
Fotodiodene i TCS230 har tre forskjellige fargefiltre. 16 av diodene har røde filtre, 16 har grønne filtre og 16 har blå filtre. De siste 16 fotodiodene er blanke og uten filtre.
Hver serie på 16 fotodioder er kopla parallelt, og ved hjelp av sensorens kontrollpinner S2 og S3 kan du velge hvilken serie som skal leses. Vil du for eksempel oppdage rød farge, kan du sette de to pinnene til lavt logisk nivå, i henhold til tabellen. Da leses bare de 16 rødfiltrerte fotodiodene.
Sensoren har ytterligere to kontrollpinner, S0 og S1. De brukes til å skalere utgangsfrekvensen. Frekvensen kan skaleres til tre forskjellige forhåndsinnstilte verdier, 100 %, 20 % eller 2 %. Denne frekvensskaleringsfunksjonen gjør at sensorutgangen kan optimaliseres for forskjellige frekvenstellere eller mikrokontrollere.
Kopling
VCC og GND: strømforsyning
S0, S1, S2, S3: kontrollpinner for å velge følsomhetsområde og type fotodiode som skal aktiveres
OE: Output Enable (for å aktivere/deaktivere utgangen)
OUT: frekvensutgang der det frekvensbaserte signalet leses av
Programmering
For å lage et program som skal benytte en slik fargesensor, må du først definere pinnene som sensoren er kopla til, og definere en variabel for å lese frekvensen. I oppsettdelen må du definere de fire kontrollpinnene som utganger og sensorutgangen som en Arduino-inngang. Du må også sette frekvensskaleringa. Her kan du sette den til 20 % og starte seriell kommunikasjon for å vise resultatene i Serial Monitor.
I loop-delen begynner du med å lese de rødfiltrerte fotodiodene. Det gjør du ved å sette de to kontrollpinnene S2 og S3 til lavt logisk nivå. Deretter bruker du pulseIn()-funksjonen til å lese utgangsfrekvensen og sette den inn i variabelen frekvens. Ved hjelp av Serial.print()-funksjonen skriver Arduinoen ut resultatet på den serielle skjermen. Den samme prosedyren gjelder for de to andre fargene, du trenger bare å justere kontrollpinnene for ønska farge.
Tabellen under viser hvordan ei avlesning i seriell monitor kan se ut. Arduinoen leser hvor mye lys som treffer hver av de røde, grønne og blå fotodiodene, og angir dette som en tallverdi. Verdiene i linje 3 viser at sensoren leser kun rød farge.
Eksempel på avlesning i seriell monitor
Linje
Rødt
Grønt
Blått
1
R = 77
G = 97
B = 79
2
R = 70
G = 96
B = 78
3
R = 255
G = 0
B = 0
Det fins ulike simulatorer på nett som du kan bruke til å lese ut tallverdi for en farge eller til å generere en farge ut fra tallverdier.
Verdiene for rødt, grønt og blått i rad 1 og 2 varierer noe fordi følsomheten i ulike fotodiodetyper kan variere. De tekniske dataene om følsomhet og presisjon finner du i databladet til sensoren.
Eksempelkode
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int frequency = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// Sett frekvensskalering til 20 %
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
Serial.begin(9600);
}
void loop() {
// Aktiver lesing av fotodioder med RØDT filter
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Les frekvensen til datasignalet
frequency = pulseIn(sensorOut, LOW);
// Skriv verdi i serial monitor
Serial.print("R= ");//Skriv fargenavn
Serial.print(frequency);//Skriv frekvensverdi for RØDt
Serial.print(" ");
delay(100);
// Aktiver lesing av fotodioder med GRØNT filter
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Les frekvensen til datasignalet
frequency = pulseIn(sensorOut, LOW);
// Skriv verdi i serial monitor
Serial.print("G= ");//Skriv fargenavn
Serial.print(frequency);//Skriv frekvensverdi for GRØNT
Serial.print(" ");
delay(100);
// Aktiver lesing av fotodioder med BLÅTT filter
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Les frekvensen til datasignalet
frequency = pulseIn(sensorOut, LOW);
// Skriv verdi i serial monitor
Serial.print("B= ");//Skriv fargenavn
Serial.print(frequency);//Skriv frekvensverdi for BLÅTT
Serial.println(" ");
delay(100);
}
Elektrisk tilkopling
Vanligvis kopler du en RGB-sensor til Arduino ved å bruke tre analoge innganger som leser verdier fra de røde, grønne og blå lysfølsomme elementene. Pass på å bruke riktige motstander for å begrense strømstyrken og beskytte sensoren. Koplingene kan variere fra sensormodell til sensormodell, derfor er det viktig å følge dokumentasjonen fra produsenten.
Illustrasjonen under viser et eksempel på hvordan en digital frekvensbasert RGB-sensor av typen TCS230 kan kobles til en Arduino Mega.
Programmering
Når du vil programmere en Arduino til å lese signaler fra en RGB-sensor, må du vite om sensoren sender analoge eller digitale signaler. Dette avgjør om du skal benytte analoge eller digitale pinner på Arduinoen. I kode-eksemplene under er det brukt analoge pinner (A0, A1 og A2 for henholdsvis rødt, grønt og blått).
Arduinoen leser deretter de analoge verdiene fra hver av de tre pinnene og sender dem til den serielle monitoren, med en pause på 500 millisekunder mellom hver avlesning. Pass på å velge riktig COM-port og baud rate (9600) i den serielle monitoren i Arduino IDE for å se resultatene.
Eksempelkoder for analog RGB-sensor
De to eksemplene nedenfor viser deg enkle Arduino-koder som leser verdier fra en analog RGB-sensor og sender dem til den serielle monitoren.
Eksempel 1
Her får du ei Arduino-kodeskisse som leser verdier fra de enkelte fotodiodene på RGB-sensorer og sender dem til den serielle monitoren. Vi får da se hvor stor andel lyset har av hver enkelt farge:
// Definerer pinnene til RGB-sensoren
const int pinR = A0; // Rød
const int pinG = A1; // Grønn
const int pinB = A2; // Blå
void setup() {
// Åpner serieporten med baud rate 9600
Serial.begin(9600);
}
void loop() {
// Leser analoge verdier fra RGB-sensoren
int rValue = analogRead(pinR);
int gValue = analogRead(pinG);
int bValue = analogRead(pinB);
// Skriver verdier til den serielle monitoren
Serial.print("Rød: ");
Serial.print(rValue);
Serial.print(" Grønn: ");
Serial.print(gValue);
Serial.print(" Blå: ");
Serial.println(bValue);
// Venter litt før neste avlesning
delay(500);
}
Eksempel 2
Denne koden leser analoge verdier fra de tre tilkoplingene til RGB-sensoren og sender dem til serieporten for overvåking på datamaskinen.
Additiv fargeblanding skapes ved å legge sammen lysfarger. Dette brukes til skjermfarger og i lyssetting. RGB står for grunnfargene: rød, grønn og blå.