Farvegenkendelsesmodul

Fra Kommunikation-IT Holstebro HTX
Skift til: navigering, søgning
Modul til at genkende farver med

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
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
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

  1. Farvesensor med Arduino-kode
  2. Købsside til farvesensor som vi har den (okt.2017)
  3. Datablad for en TSC230 komponent
  4. 4,0 4,1 Arduino farvesensor library
  5. freq-Count library
  6. 6,0 6,1 GitHub Frequency Count Library