Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

29 Haziran 2021 Salı

TCS230 / TCS3200 Renk Sensörünün Arduino ile Kullanımı

 TCS230 / TCS3200 Renk Sensörünün Arduino ile Kullanımı

Renk sensörleri, karmaşık otomasyon sorunlarına daha güvenilir çözümler sağlar. Yiyecek ve içecek, otomotiv ve imalat endüstrileri dahil olmak üzere çeşitli endüstrilerde, malzeme tespiti, parçalardaki renk izlerini tespit etme, üretim sürecindeki adımları doğrulama vb. Amaçlarla kullanılırlar.

Endüstriyel uygulamalarda pahalı renk sensörleri kullanılırken, TCS230 renk sensörü gibi ucuz sensörler daha az sıkı uygulamalar için kullanılabilir.

TCS230 renk sensörü (aynı zamanda TCS3200 olarak da bilinir) oldukça popülerdir, ucuzdur ve kullanımı kolaydır. Bu renk sensörünü Arduino projemizde kullanmadan önce, bir renk sensörünün gerçekte nasıl çalıştığını görmek iyi olur.

Renk Sensörleri Nasıl Çalışır?

Beyaz ışık, farklı dalga boylarına sahip üç ana renkten (Kırmızı, yeşil ve mavi) oluşur. Bu renkler, farklı renk tonları oluşturmak için birbirleriyle birleşir.

Beyaz ışık herhangi bir yüzeye düştüğünde, yüzey malzemesinin özelliklerine bağlı olarak ışığın bir kısmı emilir ve bir kısmı yansıtılır. Gördüğümüz renk, hangi dalga boylarının gözlerimize geri yansıdığının bir sonucudur.

renkleri nasıl görüyoruz

Şimdi sensöre dönersek, tipik bir renk sensörü, nesneye modüle edilmiş bir ışık yansıtan yüksek yoğunluklu beyaz bir LED içerir. Yansıtılan ışığın rengini algılamak için, neredeyse tüm renk sensörleri, aşağıdaki resimde gösterildiği gibi, ' Bayer Filtresi ' olarak da bilinen, renge duyarlı bir filtre ızgarasından ve altında bir dizi fotodiyottan oluşur.

renk sensörü bayer filtresi ve fotodiyot düzenlemesi

Tek bir piksel, biri kırmızı, biri mavi, biri yeşil ve biri açık filtreli (filtresiz) olmak üzere 4 filtreden oluşur. Bu model aynı zamanda ' Bayer Modeli ' olarak da bilinir Her filtre, aşağıda gösterildiği gibi, ışığı olduğu gibi geçirirken, her filtre alttaki fotodiyoda yalnızca tek bir renkteki ışığı geçirir. Şeffaf filtreden geçen bu ekstra ışık, düşük ışık koşullarında büyük bir avantajdır.

filtrelerden geçen renk sensörü bayer filtresi çalışma ışığı

İşlem çipi daha sonra her bir fotodiyodu (her seferinde bir renk) adresler ve ışığın yoğunluğunu ölçer. Bir dizi fotodiyot olduğu için, sonuçların önce ortalaması alınır ve ardından işlenmek üzere gönderilir. Kırmızı, yeşil ve mavi ışığın göreceli seviyesi ölçülerek nesnenin rengi belirlenir.

TCS230 Renk Sensörü Modülü

Modülün merkezinde Texas Advanced Optoelectronic Solutions - TCS230'dan ucuz bir RGB sensör çipi bulunur. TCS230 Renk Sensörü, neredeyse sonsuz sayıda görünür rengi algılayıp ölçebilen eksiksiz bir renk detektörüdür.



Sensörün kendisi, dört beyaz LED ile çevrili modülün merkezinde görülebilir. Modüle güç verildiğinde LED'ler yanar ve algılanan nesneyi aydınlatmak için kullanılır. Bu LED'ler sayesinde sensör, nesnenin rengini veya parlaklığını belirlemek için tamamen karanlıkta da çalışabilir.

TCS230, 2,7 ila 5,5 volt besleme voltajında ​​çalışır ve TTL mantık düzeyinde çıkışlar sağlar.

TCS230 İşletimi

TCS230, 16 fotodiyotun kırmızı filtreli, 16 fotodiyotun yeşil filtreli, 16 fotodiyotun mavi filtreli ve kalan 16 fotodiyotun filtresiz temiz olduğu 8 x 8 fotodiyot dizisi yardımıyla rengi algılar.

Sensöre yakından bakarsanız, aslında bu filtreleri görebilirsiniz.

tcs230 tcs3200 renk sensörü yakın çekim

16 fotodiyotun her biri paralel olarak bağlanır, bu nedenle S2 ve S3 iki kontrol pini kullanarak hangisini okuyacağınızı seçebilirsiniz. Örneğin, yalnızca kırmızı rengi algılamak istiyorsanız, tabloya göre iki pini DÜŞÜK olarak ayarlayarak 16 kırmızı filtreli fotodiyot seçebilirsiniz.

Benzer şekilde, farklı S2 ve S3 kombinasyonları ile farklı fotodiyot türleri seçebilirsiniz.

S2S3Fotodiyot tipi
DÜŞÜKDÜŞÜKKırmızı
DÜŞÜKYÜKSEKMavi
YÜKSEKDÜŞÜKTemizle (Filtre yok)
YÜKSEKYÜKSEKYeşil

Dahili bir akım-frekans dönüştürücü, fotodiyotlardan gelen okumaları, frekansı seçilen rengin yoğunluğuyla orantılı olan bir kare dalgaya dönüştürür. Tipik çıkış frekansı aralığı 2HZ ~ 500KHZ'dir.

Sensörde, çıkış frekansını ölçeklendirmek için kullanılan iki kontrol pini daha vardır, S0 ve S1. Frekans,% 2,% 20 veya% 100 olmak üzere üç farklı ön ayar değerine ölçeklenebilir. Bu frekans ölçekleme işlevi, sensörün çeşitli mikro denetleyiciler ve diğer cihazlarla kullanılmasına izin verir.

S0S1Çıkış frekansı ölçeklendirmesi
DÜŞÜKDÜŞÜKGücü kapat
DÜŞÜKYÜKSEK% 2
YÜKSEKDÜŞÜK% 20
YÜKSEKYÜKSEK100%

Farklı S0 ve S1 kombinasyonları ile farklı ölçeklendirme faktörleri elde edebilirsiniz. Arduino için çoğu uygulama% 20 ölçeklendirmeyi kullanır.

TCS230 Renk Sensörü Modülü Pin Çıkışı

Aşağıdaki şema, ortak bir TCS230 modülünün pini göstermektedir.

tcs230 tcs3200 renkli sensör modülü pin çıkışı

GND bir toprak pimidir.

OEÇıkışı Etkinleştirme pinidir. Bu pin nadiren kullanılır ve çoğu modülde kalıcı olarak etkinleştirilir. Zaten etkinleştirilmemişse, DÜŞÜK çekin.

S0 & S1 pimler frekans ölçeklendirmesini seçmek için kullanılır.

S2 & S3 renk dizisini seçmek için iğneler kullanılır.

DIŞARI pin bir TTL seviyesi kare dalgadır.

VCCpin modüle güç sağlar. 2.7V ila 5.5V güç kaynağına bağlayın.

TCS230 Renk Sensörünü Arduino UNO'ya Kablolama

TCS 230'u bir Arduino'ya bağlamak çok basittir. Her pin, Çıkış Etkinleştirme pini dışında kullanılır ve modül, Arduino'nun 5 voltluk çıkışından güvenli bir şekilde beslenir.

TCS230 ile deneyler için bağlantı aşağıdadır:

arduino ile kablolama tcs230 tcs3200 renk sensörü modülü

Arduino'da kullanılan pinlerin hiçbiri kritik değildir çünkü modül herhangi bir pime özgü özellik gerektirmez, bu nedenle farklı pinler kullanmak istiyorsanız bunu güvenle yapabilirsiniz. Kablolardaki herhangi bir değişikliği yansıtmak için koddaki pin numaralarını değiştirdiğinizden emin olun.

Sensörünüz Arduino ya bağlandıktan sonra, bir kod yazma zamanı!

Sensörü Kalibre Etme

TCS230 renk sensörüyle çalışmak için aslında iki taslak kullanacağız.

  1. İlk taslak (kalibrasyon taslağı) sensörden ham verileri elde etmemize yardımcı olacaktır.
  2. İkinci taslak (ana Arduino çizimi), algılanan renk için RGB değerlerini görüntülemek için önceden alınan ham verileri kullanacaktır.

Her iki çizimin de aynı donanım bağlantısını kullanacağını unutmayın.

Aşağıda kalibrasyon taslağı verilmiştir. Bu taslak, TCS230 sensörünü renge göre ele alır ve çıkış piminin darbe genişliğini okur. Çıkış daha sonra seri monitörde görüntülenir.

Çizimi Arduino'nuza yükleyin ve sensörü nesnelere bakacak şekilde monte edin. Beyaz ve siyah renk için bir referans nesne bularak başlayın. Bu referans nesneleri, üç rengin tümü için hem maksimum hem de minimum değerlerde okumalar üretecektir.

// Define color sensor pins
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

// Variables for Color Pulse Width Measurements
int redPW = 0;
int greenPW = 0;
int bluePW = 0;

void setup() {
	// Set S0 - S3 as outputs
	pinMode(S0, OUTPUT);
	pinMode(S1, OUTPUT);
	pinMode(S2, OUTPUT);
	pinMode(S3, OUTPUT);

	// Set Pulse Width scaling to 20%
	digitalWrite(S0,HIGH);
	digitalWrite(S1,LOW);

	// Set Sensor output as input
	pinMode(sensorOut, INPUT);

	// Setup Serial Monitor
	Serial.begin(9600);
}

void loop() {
	// Read Red Pulse Width
	redPW = getRedPW();
	// Delay to stabilize sensor
	delay(200);

	// Read Green Pulse Width
	greenPW = getGreenPW();
	// Delay to stabilize sensor
	delay(200);

	// Read Blue Pulse Width
	bluePW = getBluePW();
	// Delay to stabilize sensor
	delay(200);

	// Print output to Serial Monitor
	Serial.print("Red PW = ");
	Serial.print(redPW);
	Serial.print(" - Green PW = ");
	Serial.print(greenPW);
	Serial.print(" - Blue PW = ");
	Serial.println(bluePW);
}


// Function to read Red Pulse Widths
int getRedPW() {
	// Set sensor to read Red only
	digitalWrite(S2,LOW);
	digitalWrite(S3,LOW);
	// Define integer to represent Pulse Width
	int PW;
	// Read the output Pulse Width
	PW = pulseIn(sensorOut, LOW);
	// Return the value
	return PW;
}

// Function to read Green Pulse Widths
int getGreenPW() {
	// Set sensor to read Green only
	digitalWrite(S2,HIGH);
	digitalWrite(S3,HIGH);
	// Define integer to represent Pulse Width
	int PW;
	// Read the output Pulse Width
	PW = pulseIn(sensorOut, LOW);
	// Return the value
	return PW;
}

// Function to read Blue Pulse Widths
int getBluePW() {
	// Set sensor to read Blue only
	digitalWrite(S2,LOW);
	digitalWrite(S3,HIGH);
	// Define integer to represent Pulse Width
	int PW;
	// Read the output Pulse Width
	PW = pulseIn(sensorOut, LOW);
	// Return the value
	return PW;
}

Kod yükledikten sonra bu tür okumalar alacaksınız. Her iki uçta da aldığınız okumaları kaydedin.

tcs230 renkli sensör kalibrasyon çıktısı

Kod Açıklaması:

Taslak, TCS230'u bağlamak için kullanılan pimlerin tanımlanmasıyla başlar. Bazı değişkenler ayrıca kırmızı, yeşil ve mavi renk dizisinin darbe genişliklerini temsil edecek şekilde tanımlanmıştır.

#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

int redPW = 0;
int greenPW = 0;
int bluePW = 0;

Kurulumda S0-S3 pinlerini çıkış olarak tanımlıyoruz. Bu pinler, frekans ölçeklendirmesini ve ele almak istediğimiz rengi seçmek için kullanılacaktır. S0 ve S1 pinleri, bu renk sensörünü bir Arduino ile kullanırken ortak bir değer olan frekans ölçeklendirmesini% 20'ye ayarlamak için kullanılır. Ardından, sensörlerin Çıkış pini Arduino'ya bir giriş olarak tanımlanır, burası kare dalgayı alacağımız yerdir. Son olarak, seri monitörü kurduk.

void setup() {
	// Set S0 - S3 as outputs
	pinMode(S0, OUTPUT);
	pinMode(S1, OUTPUT);
	pinMode(S2, OUTPUT);
	pinMode(S3, OUTPUT);

	// Set Pulse Width scaling to 20%
	digitalWrite(S0,HIGH);
	digitalWrite(S1,LOW);

	// Set Sensor output as input
	pinMode(sensorOut, INPUT);

	// Setup Serial Monitor
	Serial.begin(9600);
}

Döngü bölümünde, üç işlevi çağırır getRedPW()getGreenPW()ve getBluePW()darbe genişliği elde edildi. getRedPW()Örnek olarak inceleyelim .

getRedPW()İşlev kırmızı darbe genişliği alır. Kırmızı filtreyi seçmek için S2 ve S3 pinlerini ayarlayarak başlar. Bu, bu işlevin yeşil ve mavi emsallerinden farklı olduğu tek adımdır.

Ardından, darbe genişliğini saklamak için bir tam sayı tanımlanır. Darbe genişliği daha sonra Arduino pulseIn()işlevi kullanılarak belirlenir Bu fonksiyon darbe genişliğini ölçer, bunu darbenin DÜŞÜK kısmının genişliğini ölçecek şekilde yapılandırdığımızı unutmayın. Sonuç milisaniye cinsinden zamandır. Bu değer daha sonra döndürülür ve işlev sona erer.

int getRedPW() {
	// Set sensor to read Red only
	digitalWrite(S2,LOW);
	digitalWrite(S3,LOW);
	// Define integer to represent Pulse Width
	int PW;
	// Read the output Pulse Width
	PW = pulseIn(sensorOut, LOW);
	// Return the value
	return PW;
}

Döngüde, renkli darbe genişliklerini okumak için üç işlev çağırıyoruz ve sensörün stabilize olmasını sağlamak için aralarına 200 ms'lik bir gecikme ekliyoruz. Daha sonra değerleri seri monitörde yazdırıyoruz ve döngüyü tekrarlıyoruz.

void loop() {
	// Read Red Pulse Width
	redPW = getRedPW();
	// Delay to stabilize sensor
	delay(200);

	// Read Green Pulse Width
	greenPW = getGreenPW();
	// Delay to stabilize sensor
	delay(200);

	// Read Blue Pulse Width
	bluePW = getBluePW();
	// Delay to stabilize sensor
	delay(200);

	// Print output to Serial Monitor
	Serial.print("Red PW = ");
	Serial.print(redPW);
	Serial.print(" - Green PW = ");
	Serial.print(greenPW);
	Serial.print(" - Blue PW = ");
	Serial.println(bluePW);
}

Arduino Kodu - TCS230'dan RGB Değerlerini Okuma

Okumalarınızı aldıktan sonra, TCS230 renk sensöründen RGB değerlerini okuyacağımız bir sonraki taslağı yükleyebilirsiniz.

Krokiyi yüklemeden önce, çizimin üst kısmındaki kalibrasyon çiziminden elde ettiğiniz altı kalibrasyon değerini girin. "0" ı gerçek değerlerinizle değiştirin.

// Define color sensor pins
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

// Calibration Values
// *Get these from Calibration Sketch
int redMin = 0; // Red minimum value
int redMax = 0; // Red maximum value
int greenMin = 0; // Green minimum value
int greenMax = 0; // Green maximum value
int blueMin = 0; // Blue minimum value
int blueMax = 0; // Blue maximum value

// Variables for Color Pulse Width Measurements
int redPW = 0;
int greenPW = 0;
int bluePW = 0;

// Variables for final Color values
int redValue;
int greenValue;
int blueValue;

void setup() {
	// Set S0 - S3 as outputs
	pinMode(S0, OUTPUT);
	pinMode(S1, OUTPUT);
	pinMode(S2, OUTPUT);
	pinMode(S3, OUTPUT);

	// Set Sensor output as input
	pinMode(sensorOut, INPUT);

	// Set Frequency scaling to 20%
	digitalWrite(S0,HIGH);
	digitalWrite(S1,LOW);

	// Setup Serial Monitor
	Serial.begin(9600);
}

void loop() {
	// Read Red value
	redPW = getRedPW();
	// Map to value from 0-255
	redValue = map(redPW, redMin,redMax,255,0);
	// Delay to stabilize sensor
	delay(200);

	// Read Green value
	greenPW = getGreenPW();
	// Map to value from 0-255
	greenValue = map(greenPW, greenMin,greenMax,255,0);
	// Delay to stabilize sensor
	delay(200);

	// Read Blue value
	bluePW = getBluePW();
	// Map to value from 0-255
	blueValue = map(bluePW, blueMin,blueMax,255,0);
	// Delay to stabilize sensor
	delay(200);

	// Print output to Serial Monitor
	Serial.print("Red = ");
	Serial.print(redValue);
	Serial.print(" - Green = ");
	Serial.print(greenValue);
	Serial.print(" - Blue = ");
	Serial.println(blueValue);
}


// Function to read Red Pulse Widths
int getRedPW() {
	// Set sensor to read Red only
	digitalWrite(S2,LOW);
	digitalWrite(S3,LOW);
	// Define integer to represent Pulse Width
	int PW;
	// Read the output Pulse Width
	PW = pulseIn(sensorOut, LOW);
	// Return the value
	return PW;
}

// Function to read Green Pulse Widths
int getGreenPW() {
	// Set sensor to read Green only
	digitalWrite(S2,HIGH);
	digitalWrite(S3,HIGH);
	// Define integer to represent Pulse Width
	int PW;
	// Read the output Pulse Width
	PW = pulseIn(sensorOut, LOW);
	// Return the value
	return PW;
}

// Function to read Blue Pulse Widths
int getBluePW() {
	// Set sensor to read Blue only
	digitalWrite(S2,LOW);
	digitalWrite(S3,HIGH);
	// Define integer to represent Pulse Width
	int PW;
	// Read the output Pulse Width
	PW = pulseIn(sensorOut, LOW);
	// Return the value
	return PW;
}

Kddu yükleyin ve sonuçları farklı renk örnekleriyle gözlemleyin. Gerekirse kalibrasyon değerlerinde küçük ayarlamalar yapabilirsiniz.

Kod Açıklama

Aşağıdakiler dışında, bu çizimin çoğunun önceki çizimle tamamen aynı olduğunu fark edeceksiniz:

Kalibrasyon çiziminden elde ettiğiniz altı kalibrasyon değeri, çizimin üst kısmına girilir.

// Calibration Values
int redMin = 0; // Red minimum value
int redMax = 0; // Red maximum value
int greenMin = 0; // Green minimum value
int greenMax = 0; // Green maximum value
int blueMin = 0; // Blue minimum value
int blueMax = 0; // Blue maximum value

Çıktısını almak istediğimiz RGB değerleri için üç yeni değişken tanımlandı.

int redValue;
int greenValue;
int blueValue;

Döngü bölümünde, önceki çizimde kullanılan aynı işlevi kullanarak değerlerin her birini okuruz. Ardından map(), kalibrasyon değerlerimizi referans olarak kullanarak bu değerleri RGB değerlerine dönüştürmek için Arduino işlevini kullanırız.

Aralığı tersine çevirdiğimize dikkat edin (Min değer 255 amd Maks değer 0'a eşlenir) çünkü fonksiyonlarımız frekansı değil darbe genişliğini döndürür.

// Read Red value
redPW = getRedPW();
// Map to value from 0-255
redValue = map(redPW, redMin,redMax,255,0);
// Delay to stabilize sensor
delay(200);

Son olarak, değerleri seri monitörde çıkarıyoruz. Bu son okumalar, taranan öğenin RGB değerlerine karşılık gelecektir.

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.

Hiç yorum yok:

Yorum Gönder

Yorum yazdığınız ve üye olduğunuz için Size teşekkür ederim.Burada olduğunuza göre hepimizin ilgi alanı Elektronik ve Programlama sonsuz bir dünyadayız.Hepimize Başarılar...

Not: Yalnızca bu blogun üyesi yorum gönderebilir.