9. Czujnik koloru ( Color sensor)

Czujnik koloru

Czujnik składa się z dwóch podstawowych elementów - lampki LED oraz fotodetektora. Dioda jest w stanie emitować światło w jednym z trzech kolorów podstawowych: czerwonym, zielonym i niebieskim. Podczas pomiaru oświetla ona badany obiekt, a detektor wykrywa natężenie odbitego od niego światła.

Właściwie czujnik koloru łączy w sobie trzy różne funkcje. Pozwala robotowi rozróżniać kolory oraz światło od ciemności. Potrafi wykryć 6 różnych kolorów, odczytać natężenie światła w pokoju oraz zmierzyć intensywność oświetlenia kolorowych powierzchni. Czujnik koloru może być także wykorzystany jako wielobarwne źródło światła.





W zależności od tego, co ma robić należy sensor go odpowiednio zadeklarować.

SetSensorColorFull ("port"); SetSensorType ("port", SENSOR_TYPE_COLORFULL);- świecą wszystkie 3 diody.
SetSensorColorRed ("port"); SetSensorType ("port", SENSOR_TYPE_COLORRED);- czerwonym
SetSensorColorGreen ("port");SetSensorType ("port", SENSOR_TYPE_COLORGREEN); - zielonym
SetSensorColorBlue ("port"); SetSensorType ("port", SENSOR_TYPE_COLORBLUE);- niebieskim
SetSensorColorNone ("port"); SetSensorType ("port", SENSOR_TYPE_COLORNONE); - będzie mierzył natężenie światła zewnętrznego.

Numery kolorów
czarny - 1
niebieski - 2
zielony - 3
żółty - 4
czerwony - 5
biały - 6

Nasz robot ma czytać kolory po angielsku (pliki .rso muszą być przesłane do NXT). Podłącz do portu czujnik koloru. Aby rozpoznawanie kolorów przebiegało optymalnie, czujnik powinien być umieszczony pod lekkim kątem w odległości około 1 cm do powierzchni. Niewłaściwe odczyty koloru mogą wystąpić, jeżeli
czujnik ustawiony jest pod niewłaściwym kątem lub pracuje przy jasnym oświetleniu.




















Zbuduj dowolnego robota jeżdżącego i podłącz sensor koloru (w tym programie port_3). Nasz robot będzie jechał, a gdy napotka białą linę cofnie się i obróci. Program napiszemy z wykorzystaniem subroutines (sub).

 /*robot nie przekracza białej linii cofa się i losowo obraca */

 #define granica 2   //kolor biały ma numer 2
 #define v 75        //prędkość obrotu
 #define w 65        //prędkość robota
 int los;

sub turn_l()       //obrót w lewo
 {
  OnRev( OUT_BC,w);Wait(Random(2000));     //Random (20000)- losuje liczbę od 0 do 2000
  OnFwd(OUT_B,v);OnRev(OUT_C,v);Wait(2000);  
 }

sub turn_r()    //obrót w prawo
 {
  OnRev( OUT_BC,w);Wait(Random(2000));
  OnFwd(OUT_C,v);OnRev(OUT_B,v);Wait(Random(2000));
 }

 task main()
{
   SetSensorColorFull(IN_3) ;
   OnFwd(OUT_BC,v);
   while (true)
   {
     if(Sensor(IN_3)< granica)
     {
         los=Random(100);  // tutaj losuje liczbę  i od niej uzależnione jest w którą stronę robot się obróci

         if (los>50)        
         { turn_l();        
          OnFwd(OUT_BC,v);
          }

          else
         { turn_r();
          OnFwd(OUT_BC,v);
          }
     }
   }
}


Niech robot jedzie i zlicza czarne linie, gra dźwięk gdy ja napotka. Liczba linii będzie wyświetlana na wyświetlaczu NXT.
Do wyświetlania na wyświetlaczu służy instrukcja NumOut("x", "y", "value", "options");
x , y - współrzędne wyświetlania pierwszego znaku (0, 0 - lewy dolny róg).
value -   wyświetlana wartość

options - opcjonalnie - opcje wyświetlania (można pominąć)
instrukcja ClearScreen() czyści wyświetlacz 

 // robot zlicza czarne (kol) linie
  //wyświetla na wyświetlaczu

 #define kol 1
  int n;     //zmienna do zliczania

 task main()
{
   n=0;
   ClearScreen();   //czyści ekran
   NumOut(0,0,n);  //wyświetla w punkcie wyświetlacza o współrzędnych 00 - lewy dolny róg liczbę n
   SetSensorColorFull(IN_3) ;
   OnFwd(OUT_BC,45);
   while (true)
   {
     if (Sensor(IN_3)== kol)
     {
         PlaySound(0);
         n=n+1  ;     Wait(1000);
         ClearScreen();
         NumOut(0,0,n);

        }
   }
}



Zadania.

1.Napisz program, w którym robot będzie jechał przez jakiś czas np. 10 sekund i zliczał linie koloru np. czarnego. Liczba zliczonych linii ma być wyświetlana na wyświetlaczu LCD NXT. Gdy robot zatrzyma się ma tyle razy „zapipczeć”, ile linii naliczył.