Farvegenkendelsesmodul
Modul til genkendelse af farver
Princip
Målet med modulet er at kende farver fra hinanden ved måling med farvesensor.
På modulet sidder der 4 hvide lysdioder, der kan belyse det objekt man vil måle farven på, så man kan montere farvesensoren i et lukket rum, hvor den kan blive uafhængig af lys fra omgivelserne. Modulet er ikke nødvendigvis som dette modul[1], men der er et eksempel på hvordan modulet kan aflæses. Modulet er købt ved dx.com[2].
Det centrale element i modulet er en Color Light-to-frequency converter[3], der kan måle lysniveauet der kommer ind på chippen, og ved at den har elektronisk styrede filtre, så kan den genkende grundfarverne og give et bud på den samlede farvekode.
Den måde chippen fungerer på er at den har en lys-sensor, hvis værdi man kan aflæse ved at måle den frekvens chippen giver ud, og nogle programmerbare filtre man kan lægge foran lys-sensoren. Når man vil anvende chippen, så indstiller man den til en grundlæggende funktion, altså hvilket frekvensområde den skal give ud, og så kan man foretage 4 forskellige måliger:
- Frekvensen for lysniveauet uden filer
- Frekvensen for lysniveauet med Rødt filter
- Frekvensen for lysniveauet med Blåt filter
- Frekvensen for lysniveauet med Grønt filter
Ud fra disse målinger kan man foretage en konvertering til enten RGB-kode eller til en vurdering af farven.
Arduino
Man kan anvende en Arduino til at læse direkte på modulet, men da outputtet fra modulet kommer som en frekvens, så kan det kræve en del processorkraft og i hvert fald en del tid at aflæse sensoren. På den anden side, så kan det give en rigtig god fornemmelse af hvordan sensoren arbejder, at man laver aflæsningen direkte i Arduinoen.
Metoden er nok ikke anbefalelsesværdig, hvis man skal have mange andre ting til at fungere samtidigt med farvesensoren.
Brug
Der kan findes et bibliotek til dette modul [4]. Dette Bibliotek er afhængig af et andet bibliotek der er omtalt her [5], og som kan hentes her[6].
Med eksemplerne i dette bibliotek skal S0 og S1 have et højt signal, S2 skal forbindes til Digital port 12 på arduinoen og S3 skal forbindes til Digital port 13. OE skal i Digital port 8 og OUT skal forbindes til digital port 5. De fleste af disse porte kan ændres i koden af eksemplerne fra biblioteket, dog ikke OUT til port 5 da den er hard codet ind i FreqCount biblioteket.
Der er 4 eksempler med i biblioteket. Color match eksemplet er det Der vil fokuseres på her. Når du køre eksemplet skal man være opmærksom på at den serielle monitor skal indstilles til 57600 Baud. Color match har 2 functioner, den ene er Learn der kan bruges til at calibrere programmet og match, der kan sige hvilken farve er foran sensoren (OBS. Dataen fra Learn skal manuelt ligges ind i ColorMatch.H som åbnes sammen med eksemplet).
Opkobling
Color-sensor modulet kan kobles til en Arduino som vist på diagrammet herunder.
Arduino med color-sensor modul tilkoblet
Teori
Farve-værdierne udtrykkes ved hjælp af frekvenser.
Det at måle en frekvens er at registrere hvor mange svingninger der er pr. sekund.
I modulet sættes ben 5 op til at at tælle hvor mange svingninger der kommer inden for et sekund ved at anvende FreqCount-biblioteketet[6]. dette gøres ved at initialisere freqCount-modulet med en værdi på 1000ms. Dette betyder at tælleren registreres nulstilles for hvert sekund, hvorefter man kan kalde read() metoden, der læser hvor mange svingninger der var i det sidste sekund.
I MD_TSC230-biblioteket[4] ligger en indlærings-rutine, der læser først på sort, og derefter på hvid, for at registrere min. og max. værdierne på på de forskellige farver (alle er indeholdt i det hvide lys). Herefter kan biblioteket bestemme hvilken farve der læses.
Kode
Det eksempel der anvendes er ret omfattende, så her vises blot koden for loop().
void loop()
{
static uint8_t runState = 0;
static uint8_t readState = 0;
if (modeOp == LEARN_MODE) // Learning mode
{
switch(runState)
{
case 0: // calibrate black
readState = fsmReadValue(readState, BLACK_CAL);
if (readState == 0) runState++;
break;
case 1: // calibrate white
readState = fsmReadValue(readState, WHITE_CAL);
if (readState == 0) runState++;
break;
case 2: // prep for learning mode
Serial.println(F("\n\nFor each color, enter name and sense color"));
ctIndex = 0;
runState++;
break;
case 3: // learn color values
readState = fsmReadValue(readState, LEARN_VAL);
if (readState == 0)
{
for (uint8_t j=0; j<RGB_SIZE; j++)
{
ct[ctIndex].rgb.value[j] = rgb.value[j];
}
ctIndex++;
if (ctIndex >= ARRAY_SIZE(ct)) runState++;
}
break;
case 4: // output the text data
outputHeader();
runState++;
break;
default:
runState = 0; // start again if we get here as something is wrong
}
}
else // Matching mode
{
switch(runState)
{
case 0: // read a value
readState = fsmReadValue(readState, READ_VAL);
if (readState == 0) runState++;
break;
case 1: // find the matching color
{
uint8_t i = colorMatch(&rgb);
Serial.print(F("\nClosest color is "));
Serial.print(ct[i].name);
runState++;
}
break;
default:
runState = 0; // start again if we get here as something is wrong
}
}
}
Softwaren kan arbejde i to forskellige modes. I LearnMode kan man indlære de forskellige frekvenser der svarer til de forskellige farver, inden for visse tolerancer. Dette gøres ved at farvesensoren præsenteres for de forskellige farver indtil den er kalibreret.
Det letteste er så at skrive disse kalibreringsværdier ind i headerfilen til biblioteket, så den kender disse værdier til næste gang.
Herefter kan man anvende et MatchMode, hvor softwaren nu kan genkende de forskellige farve, baseret på kalibreringen.
Test af Modulet tilsluttet en Arduino
Modulet er blevet testet sammen med en Arduino, og det fungerer.
Dette savner nærmere beskrivelse.
ATtiny
For ikke at belaste softwaren i Arduinoen kan man lægge alt målearbejdet ud i en ATtiny fx. af typen ATTINY461, der er en lille 20 bens microcontroller.
Der opbygges så et separat modul hvor både ATtinyen og farvesensoren sidder på, og hvor der etableres en I²C-protokol i ATtinyen. På denne måde kan dette modul bruges til at måle farver selvstændigt, og så kan man fra fx. en Arduino spørge om der er en farve-måling klar, og hvis der er, så kan man aflæse den i det format som ATtinyen nu kan levere.
Brug
Modulet bruges ved at man sender en byte med værdien 0x01 vha. I²C til modulet. Der kan derefter anmodes om 6 bytes.
- 1-2: Rød
- 3-4: Grøn
- 5-6: Blå
Værdierne kan sættes sammen på følgende måde
red1 = <1. byte> red2 = <2. byte> green1 = <3. byte> green2 = <4. byte> blue1 = <5. byte> blue2 = <6. byte> red = (red2) | (red1 << 8) green = (green2) | (green1 << 8) blue = (blue2) | (blue1 << 8)
Teori
Det er i princippet den samme teori for farve-sensor modulet som er beskrevet under Arduinoen, og principperne for at aflæse farverne er også de samme.
Der hvor forskellen kommer er at der etableres en I²C-kommunikation til en anden microcontroller.
Konstruktion
ATtinyen kunne konstrueres ud fra følgende diagram:
Diagram over ATtiny med en color-sensor tilsluttet og kommeunikations-interface til I²C
Krav
- ATtiny/ATmega med en 8-bit timer, en 16-bit timer med ekstern clock, TWI hardware til I²C og 4 outputs til styring.
- 10µF elektrolyt
- 100nF kondensator
- Switch
- 10k ohm modstand
Den vedhæftede zip-fil indeholder alle tegninger til at lave et modul der passer til en ATTiny461.
Kode
Den vedhæftede zip-fil indeholder alt koden til ATtiny-modulet. Filen color.h kan bruges til at konfigurere de brugte pins, men vær obs. på de opstillede krav og forbind tingene som det konstruerede print. Media:colorsensor_src.zip
Test
Konstruktionen med ATtiny er ikke bygget op og testet, men hvis man skulle anvende color-sensoren til en praktisk anvendelse sammen med en Arduino ville det være den bedste måde at gøre det på.
Referencer
- ↑ Farvesensor med Arduino-kode
- ↑ Købsside til farvesensor som vi har den (okt.2017)
- ↑ Datablad for en TSC230 komponent
- ↑ 4,0 4,1 Arduino farvesensor library
- ↑ freq-Count library
- ↑ 6,0 6,1 GitHub Frequency Count Library