Parçalar · 14 dk okuma

TCRT5000 Arduino: Kızılötesi Sensör Bağlantısı, Kod ve Takometre

TCRT5000 Arduino kullanımı: IR LED ve fototransistör yapısı, siyah-beyaz zemin algılama, AO/DO çıkışı, eşik ayarı, 1–15 mm mesafe, FC-51 farkı, takometre kodu.

TCRT5000, Arduino projelerinde zemindeki siyah çizgiyi, dönen bir milin üzerindeki işareti ya da birkaç milimetre önündeki bir yüzeyi algılamak için kullanılan küçük bir kızılötesi yansıma sensörüdür. TCRT5000'i Arduino ile kullanmak çok kolaydır: hazır modülü 5V, GND ve tek bir sinyal pinine bağlarsın; kütüphane gerekmez, analogRead() ya da digitalRead() yeterlidir. Tek bir gövdede hem ışığı gönderen bir kızılötesi LED hem de yansıyan ışığı ölçen bir fototransistör bulunduğu için çizgi izleyen robotların, kâğıt algılayan yazıcıların ve devir ölçen takometrelerin ortak gözüdür.

Bu yazıda TCRT5000'in içindeki IR LED ile fototransistörün birlikte nasıl çalıştığını, siyah ve beyaz zemini neden bu kadar kolay ayırt ettiğini, modüldeki analog (AO) ve dijital (DO) çıkışın farkını, eşiğin potansiyometreyle ve yazılımla nasıl ayarlandığını öğreneceksin. Sensörün 1–15 mm arasındaki çalışma mesafesini, ortam ışığının etkisini ve bu etkiyi ortadan kaldıran ölçüm tekniğini, FC-51 engel sensöründen farkını ve TCRT5000 ile bir devir ölçer (takometre) yapmayı da Arduino Uno, ESP32 ve Raspberry Pi Pico kodlarıyla adım adım göreceksin.

TCRT5000 kızılötesi yansıma sensörü: mavi IR LED ve siyah fototransistör
TCRT5000: mavi lensli parça 950 nm'lik kızılötesi LED, siyah lensli parça ise gün ışığı filtreli fototransistördür; ikisi aynı gövdede, arada ışık geçirmeyen bir bölmeyle yan yana durur.

TCRT5000 nedir, nasıl çalışır?

TCRT5000, Vishay firmasının geliştirdiği bir yansımalı optik sensördür (reflective optical sensor). Gövdenin bir yanında kızılötesi ışık yayan bir LED, diğer yanında bu ışığa duyarlı bir fototransistör vardır ve ikisi de aynı yöne, yani sensörün önüne bakar. Aralarındaki plastik bölme LED'in ışığının fototransistöre doğrudan ulaşmasını engeller; ışık ancak önde bir yüzeye çarpıp geri yansırsa algılanır. Fototransistör, baz bölgesine düşen ışık arttıkça kolektöründen daha fazla akım geçiren bir transistördür: yüzey ne kadar çok ışık yansıtırsa kolektör akımı o kadar büyür. Siyah lens bir gün ışığı filtresidir; görünür ışığın büyük kısmını keser ve yalnızca kızılötesine yakın dalga boylarını geçirir.

ÖzellikDeğer (Vishay veri sayfası)
YapıKızılötesi LED + fototransistör, görünür ışığı engelleyen gövde
LED dalga boyu950 nm (gözle görünmez kızılötesi)
En iyi çalışma mesafesi2,5 mm
Çalışma aralığı0,2–15 mm (sinyal, en yüksek değerin %20'sinden fazla)
LED ileri gerilimiTipik 1,25 V, en fazla 1,5 V (60 mA'de)
LED en yüksek sürekli akımı60 mA
FototransistörVCEO 70 V, en fazla 100 mA kolektör akımı
Karanlık akımıTipik 10 nA, en fazla 200 nA
Boyut10,2 × 5,8 × 7 mm; TCRT5000L, 15 mm uzun bacaklı sürümdür
Çalışma sıcaklığı−25 ile +85 °C

Fototransistörün akımını Arduino doğrudan okuyamaz; akımı gerilime çevirmek için kolektöre bir yük direnci bağlanır. Hazır modüllerde bu direnç genellikle 10 kΩ'dur ve kolektörü VCC'ye çeker. Kolektördeki gerilim şu formülle bulunur: V = VCC − Ic × R. Beyaz bir yüzey fototransistörden yaklaşık 0,4 mA akıtıyorsa 10 kΩ üzerindeki düşüm 4 V olur ve çıkış 1 V'a iner. Siyah yüzeyde akım 20 µA'e düşerse düşüm yalnızca 0,2 V olur ve çıkış 4,8 V'ta kalır. Yani TCRT5000 modülünde beyaz zemin düşük, siyah zemin yüksek gerilim verir; bu ters mantık başta kafa karıştırır ama devrenin doğal sonucudur. Yük direncini büyütürsen sensör daha hassas olur ama tepkisi yavaşlar; küçültürsen hızlanır ama zayıf yansımaları ayırt edemez.

TCRT5000 siyah ve beyaz zemini nasıl ayırt eder?

Beyaz kâğıt, üzerine düşen kızılötesi ışığın büyük kısmını her yöne saçarak geri gönderir; mat siyah boya, toner ya da bant ise ışığın çoğunu yutup ısıya çevirir. TCRT5000 bu farkı fototransistör akımındaki büyük bir farka dönüştürür. Ancak sensör renkleri insan gözü gibi görmez; onun için önemli olan yüzeyin 950 nm'de ne kadar yansıttığıdır. Bu yüzden bazı sürprizler yaşanır: bazı mürekkep püskürtmeli yazıcı baskıları gözle simsiyah görünse de kızılötesinde neredeyse şeffaftır ve sensör onları beyaz sanır. Parlak siyah elektrik bandı, sensör ona dik bakarken ışığı ayna gibi geri yansıtabilir. Kırmızı, turuncu ve sarı yüzeyler çoğu zaman beyaza yakın okunur. Bu yüzden çizgi ve zemin malzemesini seçmeden önce mutlaka sensörle test et. Aşağıdaki tablo 5 V'ta, yaklaşık 3 mm yükseklikte alınmış örnek değerleri gösterir; kendi ölçümlerin sensöre ve ortama göre farklı olabilir.

YüzeyKızılötesi yansımaAO (Uno, 0–1023)DO (çoğu modül)
Beyaz kâğıtÇok yüksekYaklaşık 30–200LOW, durum LED'i yanar
Açık renk ahşap ya da masaYüksekYaklaşık 100–400Genellikle LOW
Mat siyah bant ya da lazer baskıÇok düşükYaklaşık 600–1000HIGH, durum LED'i söner
Parlak siyah elektrik bandıAçıya göre değişirKararsızKararsız
Altında yüzey yok (2 cm'den uzak)Yansıma yok1000'e yakınHIGH, siyah gibi
Tablonun son satırını unutma: sensörün önünde hiçbir şey yokken de siyah okunur. Çizgi izleyen robotunu masadan kaldırdığında motorların "çizgiyi buldum" diye dönmeye devam etmesinin sebebi budur. Tüm sensörler aynı anda siyah görürse motorları durduran basit bir kural, hem robotunu hem de masanı korur.

TCRT5000 modülü: analog (AO) ve dijital (DO) çıkış

Çıplak TCRT5000 yerine çoğu zaman hazır bir modül kullanılır. Modül kartında sensörün yanında bir LM393 karşılaştırıcı, mavi bir ayar potansiyometresi, IR LED'in akımını sınırlayan direnç, fototransistörün 10 kΩ'luk yük direnci ve iki küçük LED bulunur: biri besleme LED'i, diğeri DO çıkışını gösteren durum LED'idir. AO pini doğrudan fototransistörün kolektörüne bağlıdır ve yukarıda hesapladığın ham gerilimi verir. LM393 bu gerilimi potansiyometrenin orta ucundaki gerilimle karşılaştırır ve sonucu DO pinine yazar. Yaygın modüllerde DO beyaz zeminde LOW olur ve durum LED'i yanar; siyah zeminde ya da önünde hiçbir şey yokken HIGH olur ve LED söner. Bazı kartlarda bu mantık ters olabildiği için ilk iş Seri Monitör'de kendi modülünün davranışını kontrol et. Tek kanallı modüllerin çoğu 4 pinlidir (VCC, GND, DO, AO); yalnızca DO çıkışlı 3 pinli sürümler ile 3'lü ve 5'li çizgi sensörü dizileri de bulunur. Bir modül, IR LED direncine bağlı olarak 5 V'ta yaklaşık 15–40 mA çeker.

ÖzellikAO (analog)DO (dijital)
Verdiği bilgiYansımanın miktarıEşiğin üstünde mi, altında mı
Uno'da okumaanalogRead(): 0–1023digitalRead(): HIGH ya da LOW
EşikKodda sen belirlersinKart üzerindeki potansiyometre
Beyaz zemindeDüşük (yaklaşık 30–200)LOW
Siyah zemindeYüksek (yaklaşık 600–1000)HIGH
En iyi kullanımMesafe tahmini, PID'li çizgi izleme, kalibrasyonKesmeyle devir sayma, basit var/yok kararları

Çalışma mesafesi: 1–15 mm aralığını doğru kullanmak

TCRT5000'in veri sayfasına göre sinyal 2,5 mm'de en yüksek değerine ulaşır ve 0,2 ile 15 mm arasında bu değerin %20'sinin üzerinde kalır. Pratikte sensör 1–15 mm arasında iş görür, ama siyah ile beyaz arasındaki fark mesafe arttıkça hızla küçülür. Mesafe-sinyal eğrisi tek yönlü de değildir: 2 mm'nin altında sinyal yeniden düşer, çünkü LED'in ışık konisi ile fototransistörün görüş alanı yüzeyde ancak belli bir mesafeden sonra üst üste biner. Sensörü yüzeye dayarsan beyaz kâğıt bile koyu okunur. Bu yüzden aynı analog değer hem 1 mm'de hem 5 mm'de okunabilir; mesafe tahmini yapacaksan yalnızca 3 mm'nin ötesindeki tek yönlü bölgeyi kullan.

MesafeNe olur?Uygun kullanım
0–1 mmIşık konisi ile görüş alanı örtüşmez, beyaz bile zayıf okunurKullanma; sensörü zemine sürtme
2–3 mmEn güçlü sinyal, en büyük siyah-beyaz farkıÇizgi izleme, kâğıt ve işaret algılama
3–8 mmSinyal azalır ama fark hâlâ belirginRobot altına güvenli montaj, takometre
8–15 mmYalnızca beyaz ve parlak yüzeyler fark edilirYakınlık algılama, nesne var/yok
15 mm'den uzakSinyal ortam gürültüsüne karışırFC-51 ya da HC-SR04 gibi başka bir sensör seç

TCRT5000 ile kısa mesafe ölçmek de mümkündür: aynı yüzeyde analog değer mesafeyle düzenli değiştiği için 3, 5, 8 ve 12 mm gibi birkaç noktada ölçüm alıp bir tablo oluşturabilir, aradaki değerleri doğrusal olarak hesaplayabilirsin. Ancak bu ölçüm yüzeyin rengine bağlıdır: beyaz kâğıda göre kalibre ettiğin sensör gri bir yüzeyi olduğundan uzakta sanır. Bu yüzden TCRT5000'i bir cetvel gibi değil, aynı yüzeyde "yaklaştı mı, uzaklaştı mı" sorusunu yanıtlayan bir yakınlık sensörü olarak düşün. Santimetre ölçmek için HC-SR04 mesafe sensörü çok daha uygundur.

TCRT5000 modülü bağlantısı: Arduino Uno, ESP32 ve Pico

Modül piniArduino UnoESP32Raspberry Pi Pico
VCC5V3V33V3(OUT), pin 36
GNDGNDGNDGND, pin 38
DOD2 (kesme pini)GPIO 27GP15, pin 20
AOA0GPIO 34 (ADC1)GP26 / ADC0, pin 31
ESP32 ve Pico'nun pinleri 3,3 V'a göre tasarlanmıştır. TCRT5000 modülünü bu kartlarda 5V ya da VBUS pininden değil, 3V3 pininden besle: 5 V ile beslenen bir modülün AO ve DO çıkışları siyah zeminde 5 V'a yaklaşır ve giriş pinine zarar verebilir. 3,3 V'ta IR LED'in akımı azaldığı için algılama mesafesi biraz kısalır; bu normaldir. Modülü mutlaka 5 V ile beslemen gerekiyorsa AO hattına bir gerilim bölücü ekle. Kartının tam pin haritasını Pinout aracında görebilirsin.

Modülsüz (çıplak) TCRT5000 nasıl bağlanır?

Çıplak sensörün dört bacağı vardır: mavi taraftaki iki bacak IR LED'in anot ve katodu, siyah taraftaki iki bacak fototransistörün kolektör ve emiteridir. Hangisinin hangisi olduğunu bulmanın en kolay yolu multimetrenin diyot kademesidir: mavi taraftaki iki bacakta yalnızca bir yönde yaklaşık 1,0–1,2 V okursun; o anda kırmızı probun değdiği bacak anottur. Fototransistörü ters bağlamak ona zarar vermez, çünkü akımı 10 kΩ'luk direnç sınırlar; yalnızca çalışmaz. Okuma ışıkla değişmiyorsa siyah taraftaki iki bacağın yerini değiştir.

IR LED'in akımını bir dirençle sınırlaman gerekir. Direnci R = (VCC − VF) / I formülüyle hesaplarsın: 5 V, 1,2 V ileri gerilim ve 20 mA için (5 − 1,2) / 0,02 = 190 Ω çıkar; en yakın standart değer olan 220 Ω yaklaşık 17 mA akıtır ve bir Arduino pininin rahatça verebileceği bir akımdır. Bu hesabı LED direnci aracıyla da yapabilirsin. Fototransistörün emiterini GND'ye, kolektörünü 10 kΩ'luk bir dirençle 5V'a bağla ve kolektörü A0'a götür. Daha uzak ya da daha koyu yüzeyleri ayırt etmek için yük direncini 47 kΩ'a çıkarabilirsin; bu durumda beyaz zemin çabuk doyuma girer ama koyu bölgedeki küçük farklar büyür.

TCRT5000 bacağıBağlantı (Arduino Uno)
Anot (mavi taraf)220 Ω üzerinden 5V'a; ortam ışığı ölçümü için 5V yerine D7'ye
Katot (mavi taraf)GND
Kolektör (siyah taraf)A0'a ve 10 kΩ üzerinden 5V'a
Emiter (siyah taraf)GND

Adım adım: Arduino ile siyah-beyaz zemin algılama

  1. Modülün VCC pinini Arduino'nun 5V pinine, GND pinini GND'ye bağla.
  2. AO pinini A0'a, DO pinini D2'ye bağla.
  3. Test için beyaz bir kâğıda 2 cm genişliğinde mat siyah bir bant yapıştır.
  4. Sensörü zeminden yaklaşık 3 mm yüksekte ve yüzeye dik olacak şekilde tut ya da sabitle.
  5. Aşağıdaki kodu yükle ve Seri Monitör'ü 9600 baud ile aç.
  6. Açılıştaki 5 saniye boyunca sensörü siyah bant ile beyaz kâğıdın üzerinden birkaç kez geçir; kod en düşük ve en yüksek değeri bulup eşiği kendisi hesaplar.
  7. Sensörü siyah ve beyaz zemin arasında gezdir; kart üzerindeki L LED'i siyahta yanmalı, beyazda sönmeli.
Arduino (C++)
1// TCRT5000 ile siyah-beyaz zemin algılama / Black-white surface detection with TCRT5000
2const int SENSOR_AO = A0;      // modülün AO pini / module AO pin
3const int SENSOR_DO = 2;       // modülün DO pini / module DO pin
4const int LED_PIN = 13;        // kart üzerindeki L LED'i / onboard L LED
5const int HYST = 40;           // histerezis payı / hysteresis margin
6
7int threshold = 450;           // varsayılan eşik / default threshold
8bool onBlack = false;
9
10void setup() {
11  Serial.begin(9600);
12  pinMode(SENSOR_DO, INPUT);   // modülde çekme direnci var / the module has its own pull-up
13  pinMode(LED_PIN, OUTPUT);
14
15  Serial.println(F("5 sn: sensoru siyah ve beyazin uzerinden gecir / sweep over black and white"));
16  digitalWrite(LED_PIN, HIGH);                // kalibrasyon sürüyor / calibrating
17  int lo = 1023, hi = 0;
18  unsigned long start = millis();
19  while (millis() - start < 5000) {
20    int v = analogRead(SENSOR_AO);
21    if (v < lo) lo = v;                       // en beyaz / whitest
22    if (v > hi) hi = v;                       // en siyah / blackest
23  }
24  digitalWrite(LED_PIN, LOW);
25  if (hi - lo >= 100) {
26    threshold = (lo + hi) / 2;                // eşik = (beyaz + siyah) / 2 / threshold = (white + black) / 2
27  } else {
28    Serial.println(F("Fark cok az, varsayilan esik / Too little contrast, default threshold"));
29  }
30  Serial.print(F("Beyaz/White: ")); Serial.print(lo);
31  Serial.print(F("  Siyah/Black: ")); Serial.print(hi);
32  Serial.print(F("  Esik/Threshold: ")); Serial.println(threshold);
33}
34
35void loop() {
36  int raw = analogRead(SENSOR_AO);            // beyazda düşük, siyahta yüksek / low on white, high on black
37  bool doBlack = digitalRead(SENSOR_DO) == HIGH;   // çoğu modülde siyahta HIGH / HIGH on black on most modules
38
39  if (!onBlack && raw > threshold + HYST) onBlack = true;    // siyaha geçti / moved onto black
40  if (onBlack && raw < threshold - HYST) onBlack = false;    // beyaza geçti / moved onto white
41
42  digitalWrite(LED_PIN, onBlack ? HIGH : LOW);
43  Serial.print(F("AO: ")); Serial.print(raw);
44  Serial.print(F("  DO: ")); Serial.print(doBlack ? F("SIYAH/BLACK") : F("BEYAZ/WHITE"));
45  Serial.print(F("  Kod/Code: ")); Serial.println(onBlack ? F("SIYAH/BLACK") : F("BEYAZ/WHITE"));
46  delay(100);
47}

Kod eşiği (en düşük + en yüksek) / 2 olarak hesaplar: beyazda 80, siyahta 820 okuduysan eşik 450 olur. Tek bir eşik yerine iki sınır kullanılır: değer 490'ı geçince siyaha, 410'un altına inince beyaza geçilir. Bu histerezis sayesinde sensör tam çizginin kenarındayken çıkış titremez. Kalibrasyon sırasında fark 100'den küçük kalırsa kod varsayılan 450 eşiğini kullanır ve seni uyarır; bu genellikle sensörün çok yüksekte olduğunu ya da yalnızca tek bir renk üzerinde gezdirildiğini gösterir. DO satırı ise aynı kararın modüldeki potansiyometreyle verilmiş hâlidir; ikisini yan yana görmek potansiyometre ayarını kontrol etmenin iyi bir yoludur.

Eşik ayarı: potansiyometre mi, yazılım mı?

DO çıkışını kullanıyorsan eşik kart üzerindeki potansiyometreyle belirlenir. Potansiyometrenin orta ucundaki gerilim karşılaştırıcının referansıdır; AO gerilimi bu değeri geçtiği anda DO durum değiştirir. Doğru ayar için şu yolu izle:

  1. Sensörü kullanacağın yükseklikte beyaz zeminin üzerine koy ve potansiyometreyi durum LED'i yanana kadar çevir.
  2. Sensörü siyah çizginin üzerine kaydır ve LED'in söndüğünü kontrol et; sönmüyorsa potansiyometreyi ters yöne biraz çevir.
  3. LED'in beyazda kesin yandığı ve siyahta kesin söndüğü iki uç konumu bul ve potansiyometreyi bu iki konumun ortasına getir.
  4. Daha hassas bir ayar için multimetreyle AO'yu beyazda ve siyahta ölç, potansiyometrenin orta ucundaki gerilimi bu iki değerin ortasına getir; örneğin 0,6 V ve 4,2 V için yaklaşık 2,4 V.
  5. Ayarı her zaman robotun ya da düzeneğin çalışacağı yerde, aynı ışık altında yap.
Yazılım eşiği çoğu zaman daha esnektir: ortam ışığı ya da pil gerilimi değiştiğinde yeniden kalibre edebilir, birden fazla sensörün her birine ayrı eşik verebilirsin. DO çıkışının asıl üstünlüğü hızıdır; karşılaştırıcı mikrosaniyeler içinde karar verir ve çıkışı doğrudan bir kesme pinine bağlanabilir. Bu yüzden devir sayma gibi hızlı işlerde DO'yu, çizgi izleme ve mesafe tahmini gibi ince işlerde AO'yu kullan.

Ortam ışığının etkisi ve çözümü

Siyah lensteki gün ışığı filtresi görünür ışığı keser ama kızılötesini kesemez, çünkü sensörün kendisi de kızılötesiyle çalışır. Güneş ışığı, akkor ve halojen ampuller 950 nm civarında güçlü kızılötesi yayar; bu ışık fototransistöre ulaştığında siyah zemin bile beyaz gibi okunur. Doğrudan güneşte fototransistör tamamen doyuma girebilir ve sensör hiçbir şeyi ayırt edemez. LED ve floresan lambaların kızılötesi ışığı ise çok azdır; bu yüzden aynı robot sınıfta kusursuz çalışıp pencere önünde şaşırabilir. Çözümler basitten zora şöyle sıralanır:

  • Gölgele: Sensörün çevresine siyah bir etek, ısıyla daralan makaron ya da siyah köpük ekle; yandan gelen ışığı keser.
  • Alçak tut: Sensörü zemine 2–4 mm yaklaştır; yansıyan ışık güçlenir, ortam ışığının payı küçülür.
  • Yerinde kalibre et: Eşiği her zaman gerçek ortamda belirle ve ışık değişiyorsa açılışta yeniden ölç.
  • Farkı ölç: Çıplak sensörde IR LED'i bir Arduino pininden sür ve LED sönükken ve yanarken iki ölçüm al. Ortam ışığı iki ölçümde de aynı olduğu için aradaki fark yalnızca LED'in yansımasıdır.
Arduino (C++)
1// Ortam ışığını çıkaran ölçüm (çıplak TCRT5000) / Ambient-light-cancelling reading (bare TCRT5000)
2const int IR_LED = 7;          // 220 Ω üzerinden IR LED anoduna / to the IR LED anode via 220 Ω
3const int SENSOR = A0;         // kolektör, 10 kΩ ile 5V'a / collector, 10 kΩ pull-up to 5V
4const int SETTLE_US = 500;     // fototransistörün oturma süresi / phototransistor settling time
5
6int readReflection() {
7  digitalWrite(IR_LED, LOW);
8  delayMicroseconds(SETTLE_US);
9  int ambient = analogRead(SENSOR);           // yalnız ortam ışığı / ambient light only
10  digitalWrite(IR_LED, HIGH);
11  delayMicroseconds(SETTLE_US);
12  int lit = analogRead(SENSOR);               // ortam + yansıma / ambient + reflection
13  digitalWrite(IR_LED, LOW);
14  return ambient - lit;                       // ışık arttıkça gerilim düşer / voltage drops as light rises
15}
16
17void setup() {
18  Serial.begin(115200);
19  pinMode(IR_LED, OUTPUT);
20}
21
22void loop() {
23  long sum = 0;
24  for (int i = 0; i < 8; i++) sum += readReflection();   // 8 ölçümün ortalaması / average of 8 readings
25  int reflection = sum / 8;
26  Serial.println(reflection);                 // büyük değer = beyaz ya da yakın / large = white or near
27  delay(50);
28}

Fototransistörün tepkisi anlık değildir; 10 kΩ'luk yük direnciyle yeni değerine oturması yüzlerce mikrosaniye sürebilir, bu yüzden her ölçümden önce 500 µs beklenir. Okumalar kararsızsa SETTLE_US değerini 1000'e çıkar. Fark büyüdükçe yüzey daha beyaz ya da daha yakındır. Bu yöntem güneşi tamamen yenemez: fototransistör ortam ışığıyla zaten doyuma girmişse LED'i yakmak bir şey değiştirmez ve fark sıfıra iner; o durumda tek çare sensörü gölgelemektir. Aynı fikri çok daha hızlı uygulayan TV kumandaları ışığı 38 kHz'lik darbeler hâlinde gönderir ve alıcı yalnızca bu frekansı dinler; bu konu IR alıcı ve kumanda yazısında anlatılıyor.

TCRT5000 ile FC-51 engel sensörü arasındaki fark

İkisi de bir kızılötesi LED ile yansıyan ışığı ölçen bir alıcıdan oluştuğu ve ikisinde de LM393 karşılaştırıcı bulunduğu için sık karıştırılır. Fark tasarım amacındadır: TCRT5000 verici ile alıcıyı tek bir gövdede, birkaç milimetre önlerindeki küçük bir noktaya bakacak şekilde birleştirir. FC-51 ise ayrı bir IR LED ile ayrı bir alıcıyı yan yana kullanır ve santimetrelerce ilerideki bir engelden dönen ışığı arar. Bu yüzden FC-51 zemindeki ince bir çizgiyi güvenilir biçimde ayırt edemez, TCRT5000 de 10 cm ötedeki duvarı göremez.

ÖzellikTCRT5000 modülüFC-51 engel sensörü
YapıLED ve fototransistör tek gövdede, arada bölmeAyrı IR LED ve ayrı alıcı, yan yana
Algılama mesafesiYaklaşık 1–15 mm (en iyi 2,5 mm)Yaklaşık 2–30 cm (ayarlanabilir)
Algılama alanıDar bir noktaYaklaşık 35° koni
ÇıkışlarÇoğunlukla AO + DOYalnızca DO (engel varken LOW)
Tipik kullanımÇizgi izleme, takometre, kâğıt ve işaret algılamaEngelden kaçan robot, el ya da nesne algılama
Ortam ışığıKısa mesafe sayesinde daha dayanıklıGüneşte menzili belirgin şekilde kısalır

TCRT5000 ile devir sayma (takometre)

TCRT5000'in en kullanışlı ama az bilinen işlerinden biri dönen bir şeyin hızını ölçmektir; Vishay'in veri sayfası bile uygulamalar listesinin ilk sırasına mil enkoderi için konum sensörünü yazar. Mantık basittir: siyaha boyanmış bir diskin ya da milin üzerine beyaz bir işaret yapıştırırsın; işaret sensörün önünden her geçtiğinde DO çıkışı bir kez LOW olur. Bu darbeleri sayarak devri iki yolla hesaplayabilirsin:

  • Sayma yöntemi: devir/dk = darbe sayısı × 60 / (işaret sayısı × ölçüm süresi, saniye). 1 saniyede 25 darbe sayıldıysa ve diskte 1 işaret varsa sonuç 25 × 60 = 1500 dev/dk olur. Yüksek devirlerde çok doğrudur ama 1 saniyelik pencerede tek işaretle çözünürlüğü 60 dev/dk'dır.
  • Periyot yöntemi: devir/dk = 60.000.000 / (iki darbe arası mikrosaniye × işaret sayısı). İki darbe arasında 40.000 µs (40 ms) geçiyorsa sonuç 60.000.000 / 40.000 = 1500 dev/dk olur. Düşük devirlerde bile her darbede yeni ve hassas bir sonuç verir.
  • İşaret sayısı: Diske 2 ya da 4 eşit aralıklı işaret koymak sayma yönteminin çözünürlüğünü artırır; formüldeki işaret sayısını değiştirmeyi unutma.
  1. Ölçeceğin mili ya da tekerleği mat siyaha boya veya mat siyah bantla kapla.
  2. Üzerine yaklaşık 5 × 5 mm'lik beyaz bir kâğıt etiket yapıştır; işaret, sensörün baktığı noktadan geniş olmalı.
  3. Sensörü işarete 3–5 mm uzaklıkta, titreşmeyecek şekilde sabitle.
  4. Mili elle yavaşça çevir ve işaret her geçtiğinde DO LED'inin yanıp söndüğünü kontrol et; gerekirse potansiyometreyi ayarla.
  5. DO pinini Uno'nun kesme pinlerinden birine (D2 ya da D3) bağla ve aşağıdaki kodu yükle.
Arduino (C++)
1// TCRT5000 ile takometre (devir ölçer) / Tachometer with TCRT5000
2const byte SENSOR_DO = 2;                // DO -> D2 (kesme pini / interrupt pin)
3const byte MARKS = 1;                    // diskteki beyaz işaret sayısı / white marks on the disc
4const unsigned long MIN_GAP_US = 500;    // daha sık darbeler titreşimdir / closer pulses are glitches
5
6volatile unsigned long pulseCount = 0;
7volatile unsigned long lastPulseUs = 0;
8volatile unsigned long periodUs = 0;
9
10void onPulse() {
11  unsigned long now = micros();
12  unsigned long gap = now - lastPulseUs;
13  if (gap < MIN_GAP_US) return;          // sınırdaki titreşimi ele / filter edge chatter
14  if (lastPulseUs != 0) periodUs = gap;  // iki darbe arası süre / time between pulses
15  lastPulseUs = now;
16  pulseCount++;
17}
18
19void setup() {
20  Serial.begin(115200);
21  pinMode(SENSOR_DO, INPUT);
22  attachInterrupt(digitalPinToInterrupt(SENSOR_DO), onPulse, FALLING);   // beyaz işarette LOW olur / goes LOW on the white mark
23}
24
25void loop() {
26  static unsigned long lastPrint = 0;
27  if (millis() - lastPrint < 1000) return;   // saniyede bir hesapla / calculate once per second
28  lastPrint = millis();
29
30  noInterrupts();                        // paylaşılan değişkenleri güvenle kopyala / copy shared variables safely
31  unsigned long count = pulseCount;
32  pulseCount = 0;
33  unsigned long period = periodUs;
34  unsigned long last = lastPulseUs;
35  interrupts();
36
37  float rpmCount = count * 60.0 / MARKS;                 // sayma yöntemi / counting method
38  float rpmPeriod = 0;
39  if (period > 0 && micros() - last < 2000000UL) {       // 2 sn darbe yoksa durmuş say / stopped after 2 s without pulses
40    rpmPeriod = 60000000.0 / (period * (float)MARKS);    // periyot yöntemi / period method
41  }
42  Serial.print(F("Sayma/Count: "));
43  Serial.print(rpmCount, 0);
44  Serial.print(F(" rpm   Periyot/Period: "));
45  Serial.print(rpmPeriod, 1);
46  Serial.println(F(" rpm"));
47}

Darbeler attachInterrupt() ile yakalanır: işlemci loop() içinde ne yaparsa yapsın, DO düştüğü anda onPulse() fonksiyonu çalışır ve darbe kaçmaz. Kesme fonksiyonu ile loop() arasında paylaşılan değişkenler volatile olarak tanımlanır ve loop() onları noInterrupts() ile interrupts() arasında kopyalar; aksi hâlde 4 baytlık bir sayı okunurken kesme araya girer ve yarım güncellenmiş bir değer okunabilir. LM393'ün çıkışı siyah-beyaz sınırında birkaç kez hızla titreyebilir; MIN_GAP_US, 500 µs'den kısa aralıklarla gelen darbeleri yok sayarak bunları eler. Bu filtre tek işaretle 120.000 dev/dk'ya kadar ölçüme izin verir, yani hobi motorları için pratikte bir sınır koymaz. Kesmelerin ayrıntıları için Arduino kesme (interrupt) yazısına bakabilirsin.

Kurduğun düzeneği hızı bilinen bir motorla doğrula: örneğin sarı redüktörlü TT motor 6 V'ta yüksüz yaklaşık 200 dev/dk döner. Okuma tam iki katı çıkıyorsa diskte fark etmediğin ikinci bir parlak nokta vardır; vida başları, metal göbekler ve parlak kenarlar da işaret gibi sayılır.

ESP32 ile TCRT5000 kullanımı

ESP32'de aynı mantık çalışır, ama üç farka dikkat et. Birincisi modül 3V3 ile beslenir. İkincisi analog giriş 12 bittir ve 0–4095 arası değer verir; AO'yu yalnızca ADC1 pinlerine (GPIO 32–39) bağla, çünkü ADC2 pinleri Wi-Fi açıkken okunamaz. Üçüncüsü kesme fonksiyonu IRAM_ATTR ile işaretlenir ve ESP32'nin iki çekirdeği olduğu için paylaşılan değişkenler portMUX kritik bölgesiyle korunur. Aşağıdaki kod diskteki iki işareti sayarak yarım saniyede bir devri ve analog değeri yazdırır. ESP32'yi yeni tanıyorsan önce ESP32 Nedir? yazısına göz at.

Arduino (C++)
1// ESP32 + TCRT5000: devir ölçer ve analog okuma / tachometer and analog reading
2const int SENSOR_DO = 27;                // DO -> GPIO 27
3const int SENSOR_AO = 34;                // AO -> GPIO 34 (ADC1)
4const int MARKS = 2;                     // diskteki beyaz işaret sayısı / white marks on the disc
5const uint32_t MIN_GAP_US = 300;         // daha sık darbeler titreşimdir / closer pulses are glitches
6
7volatile uint32_t pulseCount = 0;
8volatile uint32_t lastPulseUs = 0;
9portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
10
11void IRAM_ATTR onPulse() {               // kesme kodu IRAM'de durur / ISR lives in IRAM
12  uint32_t now = micros();
13  portENTER_CRITICAL_ISR(&mux);
14  if (now - lastPulseUs >= MIN_GAP_US) {
15    lastPulseUs = now;
16    pulseCount++;
17  }
18  portEXIT_CRITICAL_ISR(&mux);
19}
20
21void setup() {
22  Serial.begin(115200);
23  pinMode(SENSOR_DO, INPUT);
24  analogReadResolution(12);              // 0-4095
25  attachInterrupt(digitalPinToInterrupt(SENSOR_DO), onPulse, FALLING);
26}
27
28void loop() {
29  static uint32_t lastMs = 0;
30  uint32_t nowMs = millis();
31  if (nowMs - lastMs < 500) return;      // yarım saniyede bir / every half second
32  uint32_t elapsed = nowMs - lastMs;
33  lastMs = nowMs;
34
35  portENTER_CRITICAL(&mux);              // iki çekirdeğe karşı koruma / protection across both cores
36  uint32_t pulses = pulseCount;
37  pulseCount = 0;
38  portEXIT_CRITICAL(&mux);
39
40  float rpm = pulses * 60000.0 / (elapsed * (float)MARKS);   // dev/dk / revolutions per minute
41  int raw = analogRead(SENSOR_AO);       // siyahta yüksek, beyazda düşük / high on black, low on white
42  Serial.printf("RPM: %.0f   AO: %d\n", rpm, raw);
43}

Ölçüm penceresi yarım saniye olduğu için kod geçen süreyi millis() ile tam olarak hesaplar ve formülde kullanır: devir/dk = darbe × 60.000 / (geçen ms × işaret sayısı). Devri Wi-Fi üzerinden bir web sayfasında göstermek ya da belirli bir hızın altına düşünce telefona bildirim göndermek, ESP32'nin bu projeye kattığı asıl değerdir. Analog değer de aynı anda okunduğu için diskin sensöre olan uzaklığının değişip değişmediğini, yani milin yalpalayıp yalpalamadığını da izleyebilirsin.

Raspberry Pi Pico ve MicroPython ile TCRT5000

Pico'da modülü 3V3(OUT) pininden besle, AO'yu GP26'ya (ADC0), DO'yu GP15'e bağla. read_u16() 0–65535 arası bir değer döndürür; beyaz zeminde düşük, siyahta yüksek okunur. Aşağıdaki kod hem zemini algılar hem de DO hattındaki darbeleri kesmeyle sayarak devri hesaplar. MicroPython kesmeleri C'deki kadar hızlı değildir; saniyede birkaç yüz darbeye kadar güvenle çalışır, çok hızlı motorlarda Arduino ya da ESP32'yi tercih et. Kurulum ve ilk adımlar için Raspberry Pi Pico Nedir? yazısına bakabilirsin.

MicroPython
1# Raspberry Pi Pico: TCRT5000 ile zemin algılama ve devir sayma
2# Raspberry Pi Pico: surface detection and RPM counting with TCRT5000
3from machine import Pin, ADC
4import machine
5import time
6
7ao = ADC(26)                     # AO -> GP26 (ADC0)
8do = Pin(15, Pin.IN)             # DO -> GP15
9led = Pin("LED", Pin.OUT)        # kart üzerindeki LED / onboard LED
10
11MARKS = 1                        # diskteki beyaz işaret sayısı / white marks on the disc
12MIN_GAP_US = 500                 # daha sık darbeler titreşimdir / closer pulses are glitches
13count = 0
14last_us = time.ticks_us()
15
16def on_pulse(pin):
17    global count, last_us
18    now = time.ticks_us()
19    if time.ticks_diff(now, last_us) < MIN_GAP_US:
20        return                   # sınırdaki titreşimi ele / filter edge chatter
21    last_us = now
22    count += 1
23
24do.irq(trigger=Pin.IRQ_FALLING, handler=on_pulse)   # beyaz işarette DO LOW olur / DO goes LOW on white
25
26while True:
27    time.sleep(1)
28    state = machine.disable_irq()   # sayacı güvenle oku / read the counter safely
29    pulses = count
30    count = 0
31    machine.enable_irq(state)
32
33    raw = ao.read_u16()             # 0-65535: beyazda düşük, siyahta yüksek / low on white, high on black
34    on_white = do.value() == 0      # çoğu modülde beyazda LOW / LOW on white on most modules
35    led.value(on_white)
36    rpm = pulses * 60 / MARKS
37    print("AO:", raw, "Zemin/Surface:", "BEYAZ/WHITE" if on_white else "SIYAH/BLACK", "RPM:", rpm)

TCRT5000 ile proje fikirleri

  • Çizgi izleyen robot: 2, 3 ya da 5 sensörlü bir diziyle siyah çizgiyi takip eden robot; sensör yerleşimi ve PID ayarı Çizgi İzleyen Robot yazısında.
  • Masa kenarını fark eden robot: Robotun önüne aşağı bakan bir TCRT5000 koy; masanın kenarına gelince sinyal "siyaha" döner ve robot düşmeden durur. Şasi ve motor kurulumu için Arduino Robot Araba Yapımı rehberine bak.
  • Motor devir göstergesi: Takometre kodunu bir OLED ekranla birleştirip devri büyük rakamlarla göster.
  • Tekerlek enkoderi ve yol sayacı: Tekerleğin iç yüzüne 8–20 siyah-beyaz dilim yapıştır, darbeleri say ve dilim sayısına bölüp tekerlek çevresiyle çarparak gidilen yolu hesapla. Yön bilgisi gerekiyorsa rotary encoder mantığındaki gibi iki sensörü yarım dilim kaydırarak yerleştir.
  • Ürün sayacı: Küçük bir konveyörün üzerinden geçen beyaz kutuları ya da kâğıtları say ve sayıyı bir ekranda göster.
  • Kâğıt bitti uyarısı: Sensörü bir etiket ya da yazıcı makarasının arkasına baktır; kâğıt bittiği anda yansıma kaybolur ve buzzer çalar.
  • Aynı ilkenin kapalı hâli: LED ile fototransistörün tek pakette, ışık geçirmez biçimde birleştirildiği optokuplörü TCRT5000 ile karşılaştırarak ışıkla sinyal taşımayı daha iyi anla.

Sık yapılan hatalar ve çözümleri

BelirtiOlası sebepÇözüm
AO hep 1000 civarında, değişmiyorSensör yüzeye çok uzak, IR LED yanmıyor ya da AO yanlış pine bağlıSensörü 3 mm'ye yaklaştır, IR LED'i telefon kamerasıyla kontrol et, kabloları gözden geçir
Siyah zemin de beyaz okunuyorGüneş ya da akkor lamba ışığı, parlak bant veya kızılötesini geçiren mürekkepSensörü gölgele, mat bant ya da lazer baskı kullan, eşiği yerinde ayarla
DO LED'i hiç değişmiyorPotansiyometre bir uçta kalmışLED'in yanıp söndüğü sınırı bul ve potansiyometreyi ona göre ayarla
Takometre gerçek devrin iki katını gösteriyorDiskte ikinci bir parlak nokta ya da sınırda titreşim varDiski tamamen mat yap, MIN_GAP_US değerini artır, MARKS değerini kontrol et
ESP32'de analog değer hep 0 ya da kararsızAO bir ADC2 pinine bağlı ve Wi-Fi açıkAO'yu GPIO 32–39 arasındaki bir ADC1 pinine taşı
Robot havaya kaldırılınca motorlar dönmeye devam ediyorYüzey yokken sensör siyah okurTüm sensörler aynı anda siyah görürse motorları durduran bir güvenlik kuralı ekle
IR LED'in çalışıp çalışmadığını gözünle göremezsin ama telefonunun kamerası görebilir: kamerayı aç ve sensörün mavi tarafına bak, ekranda mor-beyaz bir parıltı görmelisin. Bazı telefonların arka kamerasında kızılötesi filtresi bulunduğu için parıltı görünmüyorsa ön kamerayı dene.

TCRT5000 ucuz, küçük ve çok öğretici bir sensördür: tek bir parça üzerinden fototransistörü, karşılaştırıcıyı, eşik ve histerezis kavramlarını, kesmeleri ve ortam ışığıyla mücadeleyi öğrenirsin. Önce zemin algılama koduyla kendi sensörünün değerlerini tanı, sonra takometreyle hız ölç, en sonunda birden fazla sensörü bir robotun altında birleştir. Işıkla ölçmenin bir başka basit yolunu merak ediyorsan LDR ışık sensörü yazısına da göz at. BlueGrays uygulamasında TCRT5000 ile siyah-beyaz zemin tespiti ve TCRT5000 ile mesafe ölçme projelerini, ayrıca L298N ile Bluetooth kontrollü araba ve engelden kaçan robot projelerini devre şemaları ve kodlarıyla adım adım bulabilirsin.

Sıkça sorulan sorular

TCRT5000 sensörü ne işe yarar?

TCRT5000, bir kızılötesi LED ile bir fototransistörü aynı gövdede birleştiren bir yansıma sensörüdür. Birkaç milimetre önündeki yüzeyin ne kadar kızılötesi ışık yansıttığını ölçer; böylece siyah ve beyaz zemini ayırt eder, dönen bir diskteki işaretleri sayar ya da çok yakındaki bir nesneyi fark eder. En çok çizgi izleyen robotlarda, takometrelerde ve kâğıt algılamada kullanılır.

TCRT5000 kaç cm uzaklığı algılar?

TCRT5000 santimetre değil milimetre ölçeğinde çalışır. Veri sayfasına göre en güçlü sinyal 2,5 mm'de alınır ve sensör yaklaşık 0,2–15 mm arasında kullanılabilir; pratikte en güvenilir aralık 2–8 mm'dir. Daha uzak mesafeler için FC-51 kızılötesi engel sensörü ya da HC-SR04 ultrasonik mesafe sensörü seçmelisin.

TCRT5000 siyah zeminde HIGH mı LOW mu verir?

Yaygın TCRT5000 modüllerinde DO çıkışı beyaz zeminde LOW olur ve durum LED'i yanar; siyah zeminde ya da önünde yüzey yokken HIGH olur. AO çıkışı da beyazda düşük, siyahta yüksek bir değer verir. Bazı kartlarda mantık ters olabildiği için kendi modülünü Seri Monitör'de kontrol etmen en doğrusudur.

TCRT5000 ile FC-51 arasındaki fark nedir?

TCRT5000, verici ve alıcısı tek gövdede olan ve 1–15 mm gibi çok kısa mesafede çalışan bir yansıma sensörüdür; çizgi izleme ve devir sayma için idealdir. FC-51 ise ayrı bir IR LED ve alıcı kullanır, yaklaşık 2–30 cm uzaktaki engelleri algılar ve yalnızca dijital çıkış verir. Kısacası TCRT5000 zemine, FC-51 ileriye bakar.

TCRT5000 renkleri ayırt edebilir mi?

Hayır, TCRT5000 yalnızca 950 nm civarındaki kızılötesi ışığın ne kadar yansıdığını ölçer ve rengi bilemez. Bazı renkler kızılötesinde beklenmedik davranır: kırmızı ve sarı yüzeyler çoğu zaman beyaza yakın okunur, bazı mürekkep püskürtmeli siyah baskılar ise neredeyse şeffaftır. Renk ayırt etmek için TCS3200 ya da TCS34725 gibi bir renk sensörü kullanmalısın.

TCRT5000 ESP32 ve 3,3 V ile çalışır mı?

Evet, TCRT5000 modülleri 3,3–5 V arasında çalışır ve ESP32 ile Raspberry Pi Pico'da 3V3 pininden beslenmelidir. Böylece AO ve DO çıkışları 3,3 V'u geçmez ve kartın pinleri korunur. 3,3 V'ta IR LED daha az akım çektiği için algılama mesafesi biraz kısalır; AO'yu ESP32'de bir ADC1 pinine bağlamayı unutma.

Tüm projeleri gör
TCRT5000 Siyah Beyaz Zemin Tespiti
#78Orta
Premium

TCRT5000 Siyah Beyaz Zemin Tespiti

Çizgi izleyen robotların gözü olan küçük bir sensörle zeminin siyah mı beyaz mı olduğunu anlarsın. TCRT5000 sensörü zemine gözle görülmeyen bir ışık gönderip ne kadarının geri döndüğüne bakar; beyaz z

4.7(40)
49
TCRT5000 ile Yansıma (Yakınlık) Okuma
#77Orta
Premium

TCRT5000 ile Yansıma (Yakınlık) Okuma

Görünmez ışık yollayıp yansımasını ölçen küçük bir sensörle önündeki yüzeyi algılarsın. Sensör bir cisme ya da açık renkli bir yüzeye yaklaştıkça daha çok ışık geri döner; Arduino bu değeri her yarım

4.6(33)
43
Ldr İle Işık Şiddeti Okuma
#11Başlangıç

Ldr İle Işık Şiddeti Okuma

Odanın ne kadar aydınlık olduğunu sayıyla görmek ister misin? Işığa duyarlı küçük bir parça olan LDR ortam ışığını ölçer ve Arduino bu değeri yarım saniyede bir bilgisayar ekranına yazar. Elinle üstün

4.6(79)
130
HC-SR04 Mesafe Ölçme (Serial Ekran)
#27Başlangıç

HC-SR04 Mesafe Ölçme (Serial Ekran)

Yarasalar karanlıkta yollarını nasıl buluyorsa HC-SR04 sensörü de öyle çalışır: duyamadığın bir ses gönderir, yankısını dinler ve önündeki cismin ne kadar uzakta olduğunu ölçer. Arduino bu mesafeyi sa

4.6(45)
68
L298N ile Bluetooth Kontrollü Araba
#80İleri
Premium

L298N ile Bluetooth Kontrollü Araba

Telefonunu kumandaya çevirip kendi robot arabanı sür. Arduino, Bluetooth modülü üzerinden telefondaki bir kumanda uygulamasından gelen komutları alır ve motor sürücüyle tekerlekleri döndürür; araba il

5.0(38)
65
Engelden Kaçan Robot
#81İleri
Premium

Engelden Kaçan Robot

Kendi yolunu bulan akıllı bir araç yapmaya ne dersin? Engelden Kaçan Robot, önündeki ultrasonik sensör sayesinde çevresini sürekli tarar. Bir engelle karşılaştığında durur, servo motoruyla sağına ve s

5.0(38)
49
Lazerli Uyarı Sistemi
#22Orta
Premium

Lazerli Uyarı Sistemi

Filmlerdeki gibi görünmez bir ışın çiti kuruyorsun. Lazer ışığı karşıdaki ışık sensörüne düşer; biri önünden geçip ışını kestiği an LED yanar ve buzzer öter, ışın geri gelince ikisi de susar. Kapı ya

4.8(64)
82
7 Segment Display Ve Buton İle Sayaç
#43İleri
Premium

7 Segment Display Ve Buton İle Sayaç

Üç butonlu basit bir sayaç: birine bastıkça ekrandaki rakam bir artar, diğerine bastıkça bir azalır, üçüncüsü sıfıra döndürür. Tek haneli 7 segment ekran 0 ile 9 arasında sayar; sınıra dayandığında kö

4.6(35)
47