Design en fargesensor med målinger vist via en RGB LED-modul

Möbel selbst designen | Galileo | ProSieben (Juni 2019).

$config[ads_text] not found
Anonim

Design en fargesensor med målinger vist via en RGB LED-modul


Vis farger ved å justere intensiteten til røde, grønne og blå lysdioder.

støttende informasjon

  • Tilpasset PCB-design med en EFM8 Microcontroller

Farger av hvitt

Målet med dette prosjektet er å skape en enhet som måler lysets "farge". Som du sikkert vet, er lyset som typisk belyser menneskelivet faktisk en blanding av utallige forskjellige bølgelengder av elektromagnetisk stråling. Hver bølgelengde i det synlige spektret (som strekker seg fra 400 nm til 700 nm) tilsvarer en bestemt farge, og våre øyne tolker denne blandingen av farger som "hvitt" lys.

Men du har utvilsomt lagt merke til at livet ser litt annerledes avhengig av den dominerende belysningskilden. Lysrør og intens sollys virker spesielt hvitt, mens glødelamper og lys skaper en varmere "gulaktig" atmosfære. Disse variasjonene oppstår fordi forskjellige kilder til "hvitt" lys produserer drastisk forskjellige fargerike blandinger. Dette forholdet mellom intensitet og bølgelengde refereres til som spektral sammensetning, som er et av de konseptene som er lettere å forklare med bilder enn med ord. Ta en titt på denne grafikken fra Popular Mechanics.

Jeg anbefaler den medfølgende artikkelen, med tittelen Ultimate Light Bulb Test: Glødende vs Compact Fluorescent vs LED. Den gir interessant og detaljert informasjon om spektrale egenskaper til forskjellige lyspærer, inkludert noen ord som folk kan bruke til å beskrive lysets kvalitet som genereres av hver pære.

Rød, Grønn og Blå

Begrepet "RGB" er så vanlig i dag at det er nesten et ord i seg selv. Vi vil ikke belaste denne artikkelen med en omfattende diskusjon av primære farger og trichromacy av menneskesyn; Det er nok å si at standard-tilsetningsvisningssystemer (for eksempel dataskjermer) bruker en kombinasjon av rødt, grønt og blått lys for å generere et bredt spekter av forskjellige farger. Det følger at vi kan bruke en kombinasjon av røde, grønne og blå fotodetektorer til å "måle" fargen. I sammenheng med hvitt lys er det kanskje mer nyttig å tenke på det på denne måten: Ved å bruke separate (men tilstøtende) detektorer følsomme for rødt, grønt og blått lys, kan vi estimere spektral sammensetning basert på mengden lysenergi i Den nedre tredjedel av det synlige spektret (som svarer til den blå detektoren), den midterste tredjedel (tilsvarende grønn) og den øvre tredje (tilsvarende rød). Dette bør være tydeligere når du tenker på følgende bilde, som overfører den relative spektralfølsomheten til de røde, grønne, blå og klare fotodetektorer i RGB-sensoren som brukes til dette prosjektet (p / n BH1745NUC fra Rohm).

Det er kritisk å forstå at forholdet mellom LED-intensitet og fremoverstrøm er mye enklere enn forholdet mellom LED-intensitet og fremspenning. Vurder følgende tomter fra databladet for LED-modulen som brukes i dette prosjektet.

firmware

Her er en lenke for å laste ned en zip-fil som inneholder alle kilde- og prosjektfiler for testing av RGB LED-kretsløpet. Når du laster prosjektet inn i Simplicity Studio, kan du dobbeltklikke på "hwconf" -filen for å få tilgang til konfigurasjonsdetaljer for portstifter og eksterne enheter. Vær også oppmerksom på at disse kildefilene inneholder noen kode som ikke er nødvendig for dette demoprosjektet. du kan ignorere alt det for nå.

Kilde og prosjektfiler

Funksjonaliteten til dette prosjektet er følgende: DAC-kanal A styrer den røde lysdioden, kanal B styrer den grønne lysdioden, og kanal C styrer den blå lysdioden. EFM8 første trinns kanal A fra 0 til 255, deretter kanal B fra 0 til 255, deretter kanal C fra 0 til 255. Resultatet vises i videoen på slutten av denne artikkelen. RGB-inkrementeringsrutinen implementeres som følger:

 while (1) { /*It is an 8-bit DAC, so the full range is 0 to 255. First channel A * (corresponding to the red LED) is incremented, then channel * B (corresponding to green), then channel C (corresponding to blue).*/ /*The unused colors are set to zero to ensure that * we display pure red, green, and blue.*/ UpdateDAC(DAC_RGB_G, 0); UpdateDAC(DAC_RGB_B, 0); UpdateDAC(DAC_RGB_R, 0); Delay_10ms(100); for(n=1; n>0; n++) { UpdateDAC(DAC_RGB_R, n); Delay_us(10000); } UpdateDAC(DAC_RGB_R, 0); UpdateDAC(DAC_RGB_B, 0); UpdateDAC(DAC_RGB_G, 0); Delay_10ms(100); for(n=1; n>0; n++) { UpdateDAC(DAC_RGB_G, n); Delay_us(10000); } UpdateDAC(DAC_RGB_R, 0); UpdateDAC(DAC_RGB_G, 0); UpdateDAC(DAC_RGB_B, 0); Delay_10ms(100); for(n=1; n>0; n++) { UpdateDAC(DAC_RGB_B, n); Delay_us(10000); } } 

Koden og kommentarene i UpdateDAC () -funksjonen beskriver prosessen med å laste inn nye data i DAC-brikken:

 void UpdateDAC(unsigned char ChannelABCorD, unsigned char DACcode) { //ensure that we are not interrupting an ongoing transmission while(SPI_State != IDLE); /*This switch statement sets the two most significant bits of the 16-bit DAC word * according to which channel is being updated. It also sets the two "operation mode" * bits to binary 01, which corresponds to "write to specified register and * update outputs."*/ switch(ChannelABCorD) { case DAC_CH_A: UpdateDAC_FirstByte = 0x10; break; case DAC_CH_B: UpdateDAC_FirstByte = 0x50; break; case DAC_CH_C: UpdateDAC_FirstByte = 0x90; break; case DAC_CH_D: UpdateDAC_FirstByte = 0xD0; break; } /*The upper four bits of the DAC code are the lower four bits * of the first byte, and the lower four bits of the DAC code are * the upper four bits of the second byte.*/ UpdateDAC_FirstByte = UpdateDAC_FirstByte | (DACcode >> 4); UpdateDAC_SecondByte = DACcode << 4; SPI0CFG |= BIT4; //this sets the proper clock polarity for the DAC interface DAC_NSS = LOW; //activate DAC slave select SPI0DAT = UpdateDAC_FirstByte; SPI_State = FIRST_DAC_BYTE_SENT; } 

SPI-overføringen begynner med de siste fire uttalelsene i UpdateDAC () og fortsetter i SPI-state-maskinen, som er innlemmet i SPI-avbruddstjenesterutinen.

 SI_INTERRUPT (SPI0_ISR, SPI0_IRQn) { //SPI registers are on all SFR pages, so need need to modify SFRPAGE SPI0CN0 &= ~BIT7; //clear interrupt flag switch(SPI_State) { //SPI communications with DAC===================================== case FIRST_DAC_BYTE_SENT: SPI0DAT = UpdateDAC_SecondByte; SPI_State = SECOND_DAC_BYTE_SENT; break; case SECOND_DAC_BYTE_SENT: DAC_NSS = HIGH; //disable slave select SPI_State = IDLE; break; } } 

Konklusjon

Vi har nå kretser og firmware som sammen setter RGB-LED-en i en fargeskjerm med en pixel med 8-bits dybde. I neste artikkel vil vi bruke denne pikselen til å visuelt formidle fargeegenskapene til lyset som lyser RGB-sensoren.

Neste artikkel i serie: Design en fargesensor med målinger vist via en RGB LED-modul, del 2

Gi dette prosjektet et forsøk for deg selv! Få BOM.