spot_img

Arduino ile Bukalemun Lamba

Bukalemunların önemli bir yeteneği olan, temas ettiği yüzeyin rengini alıp kendini kamufle edebildiğini birçok belgeselde görmüş olmalısınız. Bizde onların bu doğal yeteneklerini örnek alarak, Arduino ve bir renk tanıma sensöründen yararlanarak koyulduğu zeminin rengini alan bir lamba geliştireceğiz.

Projemiz üç ana parçadan oluşmaktadır;

  1. Zeminin rengini algılayarak bize kodlayacak sensör modülü
  2. Sensör modülünden gelen kodlamayı okuyup işleyerek aktaran ana ünite
  3. Ana ünitenin ilettiği kodlamaya uygun renk üretecek aydınlatma modülü

Kullanacağımız malzemeleri tanıyalım;

1-Renk Tanıma Sensörü TCS230 Modülü

Arduino ile Bukalemun Lamba

TCS230 renk algılama modülüdür. Bu modül, farklı renkleri algılayabilen bir sensör içerir. Özellikle mikrodenetleyiciler ile proje geliştirirken sıkça kullanılır. TCS230, kırmızı, mavi, yeşil ve beyaz ışığı algılayabilir ve bunları mikrodenetleyicilere veya diğer elektronik cihazlara aktarabilir.

2-Arduino Uno

Arduino ile Bukalemun Lamba

3-RGB LED

RGB LED’lerin iki türü vardır: “ortak anot” ve “ortak katot”. İlkinde, tüm LED’lerin ortak anodu, yani pozitif terminali bulunurken, üç LED, her birinin katot terminalini çalıştırarak ayrı ayrı kontrol edilir. “Ortak katot” bileşenlerinde, üç LED negatif terminali paylaşır ve her bir LED, pozitif terminal olan anot kullanılarak çalıştırılır. İkincisi, Arduino Uno ile kullanılmaya daha uygun bir konfigürasyondur.

Devre Şeması

Şemada TCS230 sensörlü, mikrodenetleyici Arduino ve RGB LED arasındaki bağlantıları görebilirsiniz.

Kod Yapısı

Okumaları ve yapılan hesaplamaların sonuçlarını görüntülemek için Seri Monitörü kullanacağız. LED’leri açıp kapatmak için S0 ve S1 pinlerini doğru şekilde yapılandıracağız. Lamba bir yüzey üzerinde duruyorsa, TCS230 pini S2 ve S3 aracılığıyla her okumaya uygun filtre konfigürasyonunu uygulayarak hem yansıyan ışığın toplam yoğunluğunu hem de ayrı ayrı renk bileşenlerinin göreceli yoğunluklarını ölçeceğiz. Her bir bileşenin bağıl yoğunluğu, herhangi bir filtre olmadan okunan toplam renk yoğunluğuna göre hesaplanır. Her bir filtrenin uygulamasına karşılık gelen yayılan frekansı okumak için, belirli bir pin üzerindeki darbe uzunluğunu okuyan “pulsein” komutu kullanılır. Komut, bizim durumumuzda DÜŞÜK seviyede veya YÜKSEK seviyede darbe süresini okuyacak şekilde yapılandırılabilir. Bu durumda komut, pin seviyesi LOW değerini alana kadar bekler, ardından seviye HIGH’a dönene kadar ölçüm süresini başlatır ve ölçümü kesintiye uğratır. Okumanın sonucu mikrosaniye cinsindendir.

Arduino ile Bukalemun Lamba

int S0 = 2;    // output frequency control pin
int S1 = 3;    // input frequency control pin
int S2 = 6;    // pin color filter control
int S3 = 5;    // pin color filter control
int taosOutPin = 4;   // pin output for PWM
int LED = 13;  // pinD
int R = 9;     // PWM red
int G = 10;    // PWM green
int B = 11;    // PWM blue
double Coeff = 0;
int Ro = 0;    // pin E
int Go = 0;    // pin E
int Bo = 0;    //  pin E
void setup() {
TCS230setup();
Serial.begin(115200);
Serial.print(“\n\n\nready\n\n\n”);
pinMode(R,OUTPUT); //S2 pinE
pinMode(G,OUTPUT); //S2 pinE
pinMode(B,OUTPUT); //S2 pinE
delay(100);
}
void loop() {
Serial.print(detectColor(taosOutPin)); // serial debug
Serial.print(“\n\n\n”);
delay(1000);
}
int detectColor(int taosOutPin){
// surface detection
double isPresentTolerance = 5;
double isPresent = colorRead(taosOutPin,0,0)/colorRead(taosOutPin,0,1);
Serial.print(“isPresent:”);
Serial.println(isPresent,2);
Serial.print(“valore isPresentTolerance:”);
Serial.println(isPresentTolerance,2);
if(isPresent < isPresentTolerance){
Serial.println(“nessuna superficie rilevata”);
return 0;
}
double red,blue,green;
// light intensity detection no filters
double white = colorRead(taosOutPin,0,1);
 // red
red = white/colorRead(taosOutPin,1,1);
// blue
blue = white/colorRead(taosOutPin,2,1);
// green
green = white/colorRead(taosOutPin,3,1);
Serial.print(“red”);
Serial.println(red);
Serial.print(“blue”);
Serial.println(blue);
Serial.print(“green”);
Serial.println(green);
if(red > blue && red > green)
Coeff = 255 / red;
Ro = 255;
Go = green * Coeff;
Bo = blue * Coeff;
LED_RGB(Ro, Go, Bo);
return 1;
 }
if(blue > green && blue > red){
Coeff = 255 / blue;
Bo = 255;
Go = green * Coeff;
Ro = red * Coeff;
LED_RGB(Ro, Go, Bo);
return 2;
}
if(green > blue && green > red){
Coeff = 255 / green;
Go = 255;
Ro = red * Coeff;
Bo = blue * Coeff;
LED_RGB(Ro, Go, Bo);
return 3;
}
}
double colorRead(int taosOutPin, int color, boolean LEDstate){
//make sure that the pin is set to input
pinMode(taosOutPin, INPUT);
taosMode(1);
int sensorDelay = 3;
//set pins to trigger filters
if(color == 0){// bianco (no filtri)
digitalWrite(S3, LOW); //S3
digitalWrite(S2, HIGH); //S2
// Serial.print(” w”);
}else if(color == 1){// red filter
digitalWrite(S3, LOW); //S3
digitalWrite(S2, LOW); //S2
// Serial.print(” r”);
}else if(color == 2){// blue filter
digitalWrite(S3, HIGH); //S3
digitalWrite(S2, LOW); //S2
// Serial.print(” b”);
}else if(color == 3){// green filter
digitalWrite(S3, HIGH); //S3
digitalWrite(S2, HIGH); //S2
// Serial.print(” g”);
}
double readPulse
 if(LEDstate == 0){
   taosMode(0);     
//      digitalWrite(LED, LOW);
}
if(LEDstate == 1){
 taosMode(1);
//      digitalWrite(LED, HIGH);
 }
 delay(sensorDelay);
 readPulse = pulseIn(taosOutPin, LOW, 80000);
 // pulse timeout read setting
if(readPulse < .1){
   readPulse = 80000;
  }
 // turn off sensor led
taosMode(0);
 return readPulse;
}
// manages the frequency output mode TaosMode(0);
// sero, sensor quiet
void taosMode(int mode){
if(mode == 0){
//power OFF
  digitalWrite(LED, LOW);
  digitalWrite(S0, LOW); //S0
digitalWrite(S1, LOW); //S1
// Serial.println(“mOFFm”);
 }else if(mode == 1){
// frequenza 1:1
   digitalWrite(S0, HIGH); //S0
   digitalWrite(S1, HIGH); //S1
 // Serial.println(“m1:1m”);
 }else if(mode == 2){
// frequenza 1:5
 digitalWrite(S0, HIGH); //S
 digitalWrite(S1, LOW); //S1
 //Serial.println(“m1:5m”);
}else if(mode == 3){
// frequenza 1:50
digitalWrite(S0, LOW); //S0
digitalWrite(S1, HIGH); //S1
 //Serial.println(“m1:50m”);
}
return
void LED_RGB(int Rx, int Gx, int Bx){
analogWrite(R, Rx);
analogWrite(G, Gx);
analogWrite(B, Bx);
 return;
}
void TCS230setup(){
 // init pin frequency management
pinMode(LED,OUTPUT);
// color filter management pin
pinMode(S2,OUTPUT); //S2
pinMode(S3,OUTPUT); //s3
// output pin light-frequency conversion
pinMode(taosOutPin, INPUT);
// pin to select ouput mode
pinMode(S0,OUTPUT); //S0 pinB
pinMode(S1,OUTPUT); //S1 pinA 
return;
}