Skocz do zawartości

Problem z czujnikiem koloru TCS3200D


Pomocna odpowiedź

Napisano

Cześć,
Potrzebuję pomocy przy sprawdzeniu czujnika koloru TCS3200D.

Używam tego kodu:

int s0=3,s1=4,s2=5,s3=6;
int out=2;
int flag=0;
byte counter=0;
byte countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);

}
void TCS()
{
flag=0;
digitalWrite(s1,HIGH);
digitalWrite(s0,HIGH);
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
attachInterrupt(0, ISR_INTO, LOW);
timer0_init();

}
void ISR_INTO()
{
counter++;
}
void timer0_init(void)
{
 TCCR2A=0x00;
 TCCR2B=0x07;   //the clock frequency source 1024 points
 TCNT2= 100;    //10 ms overflow again
 TIMSK2 = 0x01; //allow interrupt
}
int i=0;
ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function
{
   TCNT2=100;
   flag++;
if(flag==1)
 {
   countR=counter;
   Serial.print("red=");
   Serial.println(countR,DEC);
   digitalWrite(s2,HIGH);
   digitalWrite(s3,HIGH);
 }
 else if(flag==2)
  {
   countG=counter;
   Serial.print("green=");
   Serial.println(countG,DEC);
   digitalWrite(s2,LOW);
   digitalWrite(s3,HIGH);
  }
  else if(flag==3)
   {
   countB=counter;
   Serial.print("blue=");
   Serial.println(countB,DEC);
   Serial.println("\n");
   digitalWrite(s2,LOW);
   digitalWrite(s3,LOW);

   }
   else if(flag==4)
    {
    flag=0;
    }
      counter=0;
}
void loop()
{
 TCS();
while(1);
}

i po przystawieniu czerwonej kartki jest taki odczyt:

red=98

green=35

blue=220

a przy odczycie z większej odległości:

red=235

green=252

blue=118

Przy zielonej kartce:

red=103

green=130

blue=26

a przy odczycie z większej odległości:

red=138

green=201

blue=181

Przy niebieskiej kartce:

red=77

green=192

blue=251

Przy białej kartce:

red=142

green=242

blue=122

Odczyty są inne niż powinny być. Przy innych kodach do tego czujnika jest tak samo.

Czujnik kupiony z chin

Ten czujnik to nie kamera. Nie ma tam żadnej optyki więc detektor "widzi" całe światło jakie do niego wpada. Z przodu, z boku a nawet trochę z tyłu. A ty dostajesz w wynikach sumę. Umieść się (w przenośni oczywiście) w miejscu elementu światłoczułego i zastanów się co go otacza. To, że przed nim jest kartka jakiegoś koloru to tylko część "krajobrazu". Jeśli chcesz badać kolor konkretnego miejsca, musisz dospawać obiektyw lub choćby czarną rurkę.

Używałem kiedyś zestawu takich czujników (pewnie z 10) w produkcyjnym testerze płytek drukowanych zawierających dwukolorowe diody LED. Każdy czujnik - żeby dobrze widzieć tylko swoją diodę - musiał mieć przysłonę bardzo dokładnie izolującą go od sąsiedniej LEDy a przede wszystkim od światła z otoczenia. Czujniki sprawdzały jasność i kolor diodek - można je było wlutować odwrotnie i wtedy kolory się zamieniały. Początkowo nawet przeniesienie testera do innego pomieszczenia powodowało czasem konieczność poprawek w kalibracji, bo odczyty się zmieniały w zależności od odległości od okna czy koloru świetlówek.

Pokaż zdjęcie tego modułu, czym oświetlasz? Spróbuj z czarną, kartonową lub plastikową rurką (długość ok. 2-3 cm?) otaczającą czujnik. Musi być taka, by do czujnika wpadało światło tylko z mierzonego, dobrze oświetlonego (zawsze tak samo) miejsca. No i pamiętaj, że filtry tego czujnika zachodzą na siebie a i "niebieski" dla Twojego oka wcale nie musi być czysto niebieskim dla TCSa.

marek1707, owijam czujnik w biały papier żeby jak najwięcej było białego, a czujnik pokazuję RGB na czarny kolor, jakby były one odwrócone

Biały papier nie dodaje niczego białego - po prostu Twoje oko widzi go w takim kolorze, jakie światło pada a mózg "wie", że kartka jest biała i wybiela ją jeszcze bardziej.

Jeśli podejrzewasz zamianę max-min to po prostu zgaś światło. W ciemności czujnik powinien oddać trzy bardzo małe wartości. Jeśli masz tam jakieś białe LEDy oświetlające, wyłącz je i poświeć wprost na czujnik (w ciemności) diodką jednokolorową, np. czerwoną lub zieloną. Wtedy upewnisz się, że składowe, które dostajesz jakoś odpowiadają konkretnym kolorom.

Wszystkie kolory które Ty odbierasz są przemielone przez oczy i mózg - nie ufaj im. Dodatkowo światło odbite jest czym innym niż generowane przez źródło.

EDIT: Przez biały papier może nic nie przechodzić na drugą stronę i po prostu robisz czujnikowi ciemność.

marek1707, zrobiłem prowizoryczną czarną rurkę i po założeniu na czujnik jest spora różnica w odczytach, ale wyniki są większe niż 255, a RGB jest do 255 😃

szerwi, wybrałeś sobie dość trudny czujnik na początek. Zacznij od dokładnej lektury jego dokumentacji.

Na wyjściu dostajesz sygnał częstotliwościowy. Pinami s0,s1 wybierasz zakres częstotliwości - wybrałeś maksymalną wartość, więc spodziewaj się częstotliwości 600kHz na wejściu MCU.

Jeśli Twój mikrokontroler pracuje z częstotliwością 16MHz, to jak sam widzisz będzie miał pełno roboty z obsługą przerwań.

Ten fragment, a raczej jego komentarze, wydaje mi się podejrzany:

TCCR2B=0x07;   //the clock frequency source 1024 points 
 TCNT2= 100;    //10 ms overflow again 

Nie jestem ekspertem od AVR, ani nie jestem pewien czy używasz oscylatora 16MHz, ale jeśli tak to pierwsza instrukcja ustawia dzielnik na 1024, druga i tak nie ma znaczenia bo działasz w trybie "Normal Mode", więc zliczasz do 255. W efekcie przepełnienie pojawia się z częstotliwością ok. 61Hz - co nie bardzo pasuje do komentarza.

W każdym razie podczas jednego okresu timera 2 możesz uzyskać prawie 10000 impulsów od czujnika. Ponieważ zliczasz je w zmiennej typu byte, następuje przepełnienie i to co uzyskujesz wygląda dziwnie.

Kolejna sprawa to wysyłanie komunikatów przez port szeregowy z przerwania - to zupełnie psuje wszelkie próby mierzenia czasów.

Moim zdaniem powinieneś najpierw napisać co chcesz uzyskać - jaką masz częstotliwość pracy mikrokontrolera, jaki zakres pracy czujnika chciałeś wykorzystać, jaki jest czas pomiaru itd. Marek znacznie lepiej niż ja zweryfikuje Twoje założenia oraz ich zgodność z kodem.

No i oczywiście wyrzuć wszystko co zabiera czas z przerwania.

A na koniec pomyśl nad wykorzystaniem sprzętu do zliczania impulsów. Teraz mały biedny AVR ma pełno roboty obsługując przerwania - a przecież timer w trybie zliczania impulsów mógłby to robić sprzętowo.

Poprzednio zliczałeś impulsy w ustalonym przedziale czasu, teraz mierzysz szerokość impulsu. Są to zupełnie różne metody. Masz zamiar pisać losowe programy aż któryś da wynik poniżej 255?

Spróbuj najpierw zastanowić się i zrozumieć co chcesz osiągnąć. Jak już będziesz wiedział co robisz, może opisz to słowami, wyprowadź odpowiednie wzory - szkoda czasu na zgadywanie co autor miał na myśli.

No to przecież świetna okazja by się tego nauczyć. Widać, że masz ochotę, potrzebę a i jak prestiż w zespole wzrasta gdy zaczynasz robić rzeczy z pogranicza (dla niektórych) magii 🙂

Wchodzisz w to?

Uprzedzam,że będziesz musiał trochę poczytać, ale bez przesady, to nie "Chłopi". Najwięcej jest po angielsku (jak tam?), ale o AVR to i w Polsce już kilka pozycji się pojawiło. Pewnie i tu coś znajdziesz.

Jak to kiedyś mówili?.. Pomożemy!

W nocie katalogowej czujnika jest opisane jak go wysterować (o ile pamiętam dwa sygnały decydujące o wewnętrznym podziale częstotliwości i dwa wybierające kolor) i co wtedy dostajesz na jedynym wyjściu. W długiej nocie procesora są opisy timerów i ich trybów. Początkującemu może nie być łatwo się przez to przekopać i pożenić obie rzeczy razem. Z drugiej strony nie jest to jakaś wielka nauka, skomplikowane przetwarzanie sygnałów czy ciężka matematyka. I dlatego zaproponowałem pomoc. Myślę, że w tydzień Kolega sobie spokojnie z tym poradzi, chyba że jego jedyną umiejętnością jest wyszukiwanie cudzych programów i próby na ślepo.

Sporo to zajmie, a jednak porzucam pomysł dodania go do mojego samochodu. Chciałem zrobić tak, że jak np. wykryje zieloną kartkę to skręca w lewo, jak wykryje niebieską to w prawo itp. Ale jak będzie jechał po jakimś kolorowym dywanie to może głupieć. I kolory kartki też zawsze będą inaczej wykrywane.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...