Projekt: Snímač farby ColorPal: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
(32 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených) | |||
Riadok 11: | Riadok 11: | ||
== Zadanie == | == Zadanie == | ||
Zobrazte na LCD aktuálnu snímanú farbu zmeranú snímačom ColorPal. | Zobrazte na LCD aktuálnu snímanú farbu zmeranú snímačom ColorPal. | ||
[[Obrázok:SnimacFarbyColorPal.jpg]] | |||
'''Literatúra:''' | |||
* [http://www.parallax.com/StoreSearchResults/tabid/768/txtSearch/28380/List/0/SortField/4/ProductID/617/Default.aspx Product Page] (parallax.com) | |||
* [http://www.parallax.com/Portals/0/Downloads/docs/prod/sens/28380ColorPAL.pdf Datasheet] | |||
* [http://www.parallax.com/Portals/0/Downloads/docs/prod/sens/28380-TSL12T-TSL13T-D.pdf Sensor datasheet] | |||
==Snímač a generátor farby ColorPAL== | ==Snímač a generátor farby ColorPAL== | ||
Riadok 17: | Riadok 26: | ||
*Sníma spektrum okolitého osvetlenia s citlivosťou až 44uW/cm2 na lsb. | *Sníma spektrum okolitého osvetlenia s citlivosťou až 44uW/cm2 na lsb. | ||
*Generuje 24 bitové farby pomocou vstavaného RGB LED. | *Generuje 24 bitové farby pomocou vstavaného RGB LED. | ||
*Možnosť pripojenia priamo na skúšobnú dosku alebo pomocou. | *Možnosť pripojenia priamo na skúšobnú dosku alebo pomocou predlžovacích káblov. | ||
*Na detekciu a generovanie farby využíva sériovú komunikáciu cez jeden pin. | *Na detekciu a generovanie farby využíva sériovú komunikáciu cez jeden pin. | ||
*Detekcia a generovanie farieb je riadené pomocou vstavaného mikrokontrolera. | *Detekcia a generovanie farieb je riadené pomocou vstavaného mikrokontrolera. | ||
*Disponuje vstavanou EEPROM pamäťou pre uloženie snímaných informácií a generačných programov. | *Disponuje vstavanou EEPROM pamäťou pre uloženie snímaných informácií a generačných programov. | ||
*Autorun funkcia umožňuje spustenie vopred určeného programu iba použitím napájania. | *Autorun funkcia umožňuje spustenie vopred určeného programu iba použitím napájania. | ||
[[Súbor:Obr8.jpg]] | |||
== Princíp činnosti == | == Princíp činnosti == | ||
Riadok 36: | Riadok 47: | ||
::'''Obr. 3: Pohľad z hora prevodníka''' | ::'''Obr. 3: Pohľad z hora prevodníka''' | ||
Výstupom snímača je napätie, | Výstupom snímača je napätie, úmerné celého žiarenia ktoré detekuje a ktoré sú potom merané podľa hore uvedenej krivky spektrálnej citlivosti. Keď predmet je osvetlený iba červenou LED, tak snímač bude reagovať s napätím úmerným červenej zložky z farby predmetu a podobne s modrou a zelenou. Snímač a RGB LED diódy sú umiestnené vedľa seba v jednej plastickej trubice. | ||
Riadok 46: | Riadok 57: | ||
== Programovanie == | == Programovanie == | ||
Komunikácia s ColorPAL-om je realizovaná cez | Komunikácia s ColorPAL-om je realizovaná cez sériovú linku, prijímanie a odosielanie medzi 2400 a 7200 baudom. ColorPAL má v sebe zabudovaný pullup rezistor, preto nie je potrebné používať externý. Pretože používa open-drain protokol, pin ktorý sa používa na komunikáciu s ColorPAL-om by mal byť vždy nastavený ako vstupný, okrem prípadu keď je v stave 0. Pri inicializovaní snímača musíme čakať aby ColorPAL dal tento pin do jednotky predtým než začneme posielať príkazy. | ||
Snímač môže pracovať v rôznych | Snímač môže pracovať v rôznych režimoch: | ||
*Priamy | *Priamy režim: príkazy sú prijímané a vykonávané ihneď | ||
*Bufferovací | *Bufferovací režim: príkazy sú prijímané a uložené do buffera pre použitie v budúcnosti | ||
*Vykonávací | *Vykonávací režim: príkazy, ktoré sú uložené do EEPROM pamäte, sa vykonajú | ||
Snímač vieme resetovať | Snímač vieme resetovať tromi rôznymi spôsobmi: | ||
*Powerup: pri prvom zapnutí ColorPAL začne vykonávať príkazy, ktoré sú uložené vo vnútornej pamäti EEPROM na adrese 00. Pri novom, ešte neprogramovanom snímači tento program prejde do priameho módu. | *Powerup: pri prvom zapnutí ColorPAL začne vykonávať príkazy, ktoré sú uložené vo vnútornej pamäti EEPROM na adrese 00. Pri novom, ešte neprogramovanom snímači tento program prejde do priameho módu. | ||
*Short Break: 7 milisekundová logická 0 resetuje snímač a začne sa vykonávať Powerup. | *Short Break: 7 milisekundová logická 0 resetuje snímač a začne sa vykonávať Powerup. | ||
*Long Break: 80< milisekundová logická 0 resetuje snímač a | *Long Break: 80< milisekundová logická 0 resetuje snímač a vstúpi do Priameho módu. | ||
[[Súbor:Obr20.jpg]] | |||
== Riešenie == | == Riešenie == | ||
Sériová linka používa piny D0 a D1 portu D mikropočítača. LCD panel,ktorý sme na paneli mali vopred zapojený používa tiež PORTD pre komunikáciu, kvôli čomu sme tento LCD modul nevedeli použiť na výpis výsledku merania snímača. Zapojili sme nový LCD modul, ktorý používa PORTB ako riadiacu zbernicu a PORTC ako dátovú zbernicu. Patričné zmeny sme vykonali aj v hlavičkových súboroch: | |||
[[lcd.c]], [[lcd.h]] | |||
Presné zapojenie LCD modulu je na Obr.5. | |||
[[Súbor:Obr.5.jpg]] | |||
::'''Obr. 5: Zapojenie LCD modulu''' | |||
Potrebovali sme pripojiť k projektu ešte ďalšie súbory:[[serial.c]] [[serial.h]] | |||
Zdrojový kód nášho programu: | |||
<source lang="c"> | <source lang="c"> | ||
#include "lcd.h" | #include "lcd.h" | ||
Riadok 68: | Riadok 93: | ||
#include <stdio.h> | #include <stdio.h> | ||
char sgetc(void) | |||
{ | { | ||
while ((UCSR0A & (1 << RXC0)) == 0) // | while ((UCSR0A & (1 << RXC0)) == 0) // Počká kým sú prijaté dáta | ||
{ | { | ||
// | // Nerobí nič, pokiaľ nie sú dáta prijaté a nie je pripravené čítať z UDR | ||
}; | }; | ||
return UDR0; // | return UDR0; // prijatý bajt sa uloží do UDR0 | ||
} | } | ||
int main(void) | |||
{ | |||
char buffer[9]; | char buffer[9]; | ||
inituart(); | inituart(); | ||
int i; | |||
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); | FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); // "sendchar" je funkcia pre posielanie jedného znaku | ||
inituart(); | inituart(); //inicializácia sériovej linky | ||
_delay_ms(80); | _delay_ms(80); | ||
unsigned char znak; | unsigned char znak; | ||
_delay_ms(2000); | _delay_ms(2000); | ||
Riadok 104: | Riadok 122: | ||
lcdDataWrite(znak='A'); | lcdDataWrite(znak='A'); | ||
lcdDataWrite(znak='H'); | lcdDataWrite(znak='H'); //testovanie výpisu na LCD panel | ||
lcdDataWrite(znak='O'); | lcdDataWrite(znak='O'); | ||
lcdDataWrite(znak='J'); | lcdDataWrite(znak='J'); | ||
Riadok 110: | Riadok 128: | ||
stdout = &mystdout; // Odteraz funguje printf(); | stdout = &mystdout; // Odteraz funguje printf(); | ||
DDRD&=0xF8; // | DDRD&=0xF8; //nastavenie používaných pinov D0,D1 a D2 ako vstupné | ||
PORTD=0x00; // | PORTD=0x00; //bez nastavenia pull-up rezistorov | ||
DDRD|=0x06; | DDRD|=0x06; //nastavenie pinov D1 a D2 ako výstupné | ||
PORTD=0x00; | PORTD=0x00; | ||
_delay_ms(80); | _delay_ms(80); // 80 ms logická nula pre vstup do priameho módu | ||
DDRD&=0xFA; //nastavenie pinu D2 ako vstupný | |||
inituart(); | |||
stdout = &mystdout; | |||
DDRD&= | /* printf("=C!"); | ||
_delay_ms(2000); | |||
printf("=R!"); | |||
_delay_ms(2000); //testovanie RGB LED | |||
printf("=Q!"); | |||
_delay_ms(2000); | |||
printf("=B!"); | |||
_delay_ms(2000);*/ | |||
printf("=(00 @ m )!"); //posielanie príkazu na opakované meranie-pred výstupný údaj vloží znak "@" | |||
DDRD&=0xF8; // nastavenia pinov D0,D1 a D2 ako vstupné | |||
for (;;) | |||
{ | |||
while(sgetc()!='@'); //ak v prijatých dátach sa vyskytne znak "@" | |||
for(i=0;i<9;i++) //uloží nasledujúcich 9 znakov do bufferu | |||
buffer[i]=sgetc(); | |||
lcdControlWrite(0xC0); //skočí na druhý riadok LCD modulu | |||
for(i=0;i<9;i++) | |||
lcdDataWrite(buffer[i]); //výpis znakov na LCD | |||
} | |||
for(;;); | |||
return 0; | |||
} | |||
</source> | </source> | ||
Počas riešenia úlohy sa nám vyskytol problém že sme sa nevedeli dostať do priameho režimu. Presvedčili sme sa s osciliskopom že na dátovom pine snímača sa nevyskytuje 80 milisekundová log. 0 a preto sa snímač nedostal do požadovaného módu. Použili sme pin D2 portu D pre správne nastavenie log. 0 pre vstup do priameho módu. | |||
Posielaním príkazov sme nemali problém cez sériovú linku snímača, RGB LED sme vedeli vysvecovať pomocou LED príkazov podľa datasheet-u. Prijaté dáta sme vedeli zobrazovať len na termináli. Snímač nám vrátil 9 číslicové hexa kódy v tvare @RRRGGGBBB. Tento údaj nám dáva informáciu o tom, v akom pomere sú prítomné jednotlivé zložky (červená, zelená a modrá) žiarenia odrazeného od skúmanej farby. Jednotlivé hexa zložky sme premenili na decimálne hodnoty, ktoré sme potom prepočítali na RGB kód. Pomocou týchto RGB kódov sme prispeli ku grafickému zobrazeniu meranej farby použitím grafického editora. (Obr. 6) Prepočty jednotlivých farieb vidíme v tabulke: | |||
[[Súbor:Obr10.jpg]] | |||
== Záver == | |||
Vykonali sme pár meraní na týchto farbách s nasledovnými výsledkami: | |||
[[Súbor:Obr9.jpg]] | |||
::'''Obr. 6: Porovnanie reálnych a snímaných farieb so snímačom ColorPAL''' | |||
Z výsledkov merania je zrejmé že snímač nie je celkom presný. K presnejšiemu meraniu potrebujeme nakalibrovať snímač a použiť korekciu. |
Aktuálna revízia z 14:04, 18. november 2013
Snímač farby ColorPAL
- Vypracovali:
- Bc. Tamás Vincze
- Bc. Adam Rozsár
- Študijný odbor: Aplikovaná mechatronika
- Ročník: 2.Ing
Zadanie
Zobrazte na LCD aktuálnu snímanú farbu zmeranú snímačom ColorPal.
Literatúra:
- Product Page (parallax.com)
- Datasheet
- Sensor datasheet
Snímač a generátor farby ColorPAL
Vlastnosti
- Sníma celý rozsah farieb o ktorých dáva informáciu vo forme RGB (Red/Green/Blue) komponentov.
- Sníma spektrum okolitého osvetlenia s citlivosťou až 44uW/cm2 na lsb.
- Generuje 24 bitové farby pomocou vstavaného RGB LED.
- Možnosť pripojenia priamo na skúšobnú dosku alebo pomocou predlžovacích káblov.
- Na detekciu a generovanie farby využíva sériovú komunikáciu cez jeden pin.
- Detekcia a generovanie farieb je riadené pomocou vstavaného mikrokontrolera.
- Disponuje vstavanou EEPROM pamäťou pre uloženie snímaných informácií a generačných programov.
- Autorun funkcia umožňuje spustenie vopred určeného programu iba použitím napájania.
Princíp činnosti
ColorPAL používa RGB LED na osvetlenie meranej farby (jedna farba naraz), spolu so široko spektrovým prevodníkom svetlo-napätie na meranie odrazeného svetla. Podľa množstva svetla ktoré sa odráža od meranej farby pri osvetlení od červenej, zelenej a modrej LED diódy je možné určiť farbu vzorky. ColorPAL používa sveteľný senzor TAOS typu TSL13T, ktorý má krivku spektrálnej citlivosťi nasledovný:
- Obr. 1: Krivka spektrálnej citlivosti prevodníka svetlo-napätie
Prevodník je kombináciou fotodiódy a transimpedančného zosilňovača v jednom integrovanom obvode. Aktívna plocha fotodiódy je 0.5 mm x 0.5 mm a senzor vníma žiarenie s vlnovou dĺžkou v rozsahu od 320 nm do 1050 nm.Výstupné napätie sa mení lineárne s intenzitou dopadajúceho žiarenia.
- Obr. 2: Funkčná schéma zapojenie prevodníka
- Obr. 3: Pohľad z hora prevodníka
Výstupom snímača je napätie, úmerné celého žiarenia ktoré detekuje a ktoré sú potom merané podľa hore uvedenej krivky spektrálnej citlivosti. Keď predmet je osvetlený iba červenou LED, tak snímač bude reagovať s napätím úmerným červenej zložky z farby predmetu a podobne s modrou a zelenou. Snímač a RGB LED diódy sú umiestnené vedľa seba v jednej plastickej trubice.
Použitie
Senzor používa 3 piny: regulované +5V napájanie, zem a sériový dátový pin s otvoreným kolektorom. Pri práci sme snímač napojili na skúšobnú dosku podľa Obr. 2. Museli sme dávať pozor, aby bol jumper vhodne nastavený, na Vdd a nie na Vin.
- Obr. 4: Schéma zapojenia snímača ColorPAL
Programovanie
Komunikácia s ColorPAL-om je realizovaná cez sériovú linku, prijímanie a odosielanie medzi 2400 a 7200 baudom. ColorPAL má v sebe zabudovaný pullup rezistor, preto nie je potrebné používať externý. Pretože používa open-drain protokol, pin ktorý sa používa na komunikáciu s ColorPAL-om by mal byť vždy nastavený ako vstupný, okrem prípadu keď je v stave 0. Pri inicializovaní snímača musíme čakať aby ColorPAL dal tento pin do jednotky predtým než začneme posielať príkazy.
Snímač môže pracovať v rôznych režimoch:
- Priamy režim: príkazy sú prijímané a vykonávané ihneď
- Bufferovací režim: príkazy sú prijímané a uložené do buffera pre použitie v budúcnosti
- Vykonávací režim: príkazy, ktoré sú uložené do EEPROM pamäte, sa vykonajú
Snímač vieme resetovať tromi rôznymi spôsobmi:
- Powerup: pri prvom zapnutí ColorPAL začne vykonávať príkazy, ktoré sú uložené vo vnútornej pamäti EEPROM na adrese 00. Pri novom, ešte neprogramovanom snímači tento program prejde do priameho módu.
- Short Break: 7 milisekundová logická 0 resetuje snímač a začne sa vykonávať Powerup.
- Long Break: 80< milisekundová logická 0 resetuje snímač a vstúpi do Priameho módu.
Riešenie
Sériová linka používa piny D0 a D1 portu D mikropočítača. LCD panel,ktorý sme na paneli mali vopred zapojený používa tiež PORTD pre komunikáciu, kvôli čomu sme tento LCD modul nevedeli použiť na výpis výsledku merania snímača. Zapojili sme nový LCD modul, ktorý používa PORTB ako riadiacu zbernicu a PORTC ako dátovú zbernicu. Patričné zmeny sme vykonali aj v hlavičkových súboroch:
Presné zapojenie LCD modulu je na Obr.5.
- Obr. 5: Zapojenie LCD modulu
Potrebovali sme pripojiť k projektu ešte ďalšie súbory:serial.c serial.h
Zdrojový kód nášho programu:
#include "lcd.h"
#include "serial.h"
#include <stdio.h>
char sgetc(void)
{
while ((UCSR0A & (1 << RXC0)) == 0) // Počká kým sú prijaté dáta
{
// Nerobí nič, pokiaľ nie sú dáta prijaté a nie je pripravené čítať z UDR
};
return UDR0; // prijatý bajt sa uloží do UDR0
}
int main(void)
{
char buffer[9];
inituart();
int i;
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); // "sendchar" je funkcia pre posielanie jedného znaku
inituart(); //inicializácia sériovej linky
_delay_ms(80);
unsigned char znak;
_delay_ms(2000);
lcdInit4(); // inicializacia v 4-bitovom rezime
lcdControlWrite(1<<LCD_CLR); // display clear
lcdControlWrite(0x40); // pozicia 0,0
lcdDataWrite(znak='A');
lcdDataWrite(znak='H'); //testovanie výpisu na LCD panel
lcdDataWrite(znak='O');
lcdDataWrite(znak='J');
stdout = &mystdout; // Odteraz funguje printf();
DDRD&=0xF8; //nastavenie používaných pinov D0,D1 a D2 ako vstupné
PORTD=0x00; //bez nastavenia pull-up rezistorov
DDRD|=0x06; //nastavenie pinov D1 a D2 ako výstupné
PORTD=0x00;
_delay_ms(80); // 80 ms logická nula pre vstup do priameho módu
DDRD&=0xFA; //nastavenie pinu D2 ako vstupný
inituart();
stdout = &mystdout;
/* printf("=C!");
_delay_ms(2000);
printf("=R!");
_delay_ms(2000); //testovanie RGB LED
printf("=Q!");
_delay_ms(2000);
printf("=B!");
_delay_ms(2000);*/
printf("=(00 @ m )!"); //posielanie príkazu na opakované meranie-pred výstupný údaj vloží znak "@"
DDRD&=0xF8; // nastavenia pinov D0,D1 a D2 ako vstupné
for (;;)
{
while(sgetc()!='@'); //ak v prijatých dátach sa vyskytne znak "@"
for(i=0;i<9;i++) //uloží nasledujúcich 9 znakov do bufferu
buffer[i]=sgetc();
lcdControlWrite(0xC0); //skočí na druhý riadok LCD modulu
for(i=0;i<9;i++)
lcdDataWrite(buffer[i]); //výpis znakov na LCD
}
for(;;);
return 0;
}
Počas riešenia úlohy sa nám vyskytol problém že sme sa nevedeli dostať do priameho režimu. Presvedčili sme sa s osciliskopom že na dátovom pine snímača sa nevyskytuje 80 milisekundová log. 0 a preto sa snímač nedostal do požadovaného módu. Použili sme pin D2 portu D pre správne nastavenie log. 0 pre vstup do priameho módu. Posielaním príkazov sme nemali problém cez sériovú linku snímača, RGB LED sme vedeli vysvecovať pomocou LED príkazov podľa datasheet-u. Prijaté dáta sme vedeli zobrazovať len na termináli. Snímač nám vrátil 9 číslicové hexa kódy v tvare @RRRGGGBBB. Tento údaj nám dáva informáciu o tom, v akom pomere sú prítomné jednotlivé zložky (červená, zelená a modrá) žiarenia odrazeného od skúmanej farby. Jednotlivé hexa zložky sme premenili na decimálne hodnoty, ktoré sme potom prepočítali na RGB kód. Pomocou týchto RGB kódov sme prispeli ku grafickému zobrazeniu meranej farby použitím grafického editora. (Obr. 6) Prepočty jednotlivých farieb vidíme v tabulke:
Záver
Vykonali sme pár meraní na týchto farbách s nasledovnými výsledkami:
- Obr. 6: Porovnanie reálnych a snímaných farieb so snímačom ColorPAL
Z výsledkov merania je zrejmé že snímač nie je celkom presný. K presnejšiemu meraniu potrebujeme nakalibrovať snímač a použiť korekciu.