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 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.
| Özellik | Değer (Vishay veri sayfası) |
|---|---|
| Yapı | Kızılötesi LED + fototransistör, görünür ışığı engelleyen gövde |
| LED dalga boyu | 950 nm (gözle görünmez kızılötesi) |
| En iyi çalışma mesafesi | 2,5 mm |
| Çalışma aralığı | 0,2–15 mm (sinyal, en yüksek değerin %20'sinden fazla) |
| LED ileri gerilimi | Tipik 1,25 V, en fazla 1,5 V (60 mA'de) |
| LED en yüksek sürekli akımı | 60 mA |
| Fototransistör | VCEO 70 V, en fazla 100 mA kolektör akımı |
| Karanlık akımı | Tipik 10 nA, en fazla 200 nA |
| Boyut | 10,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üzey | Kızılötesi yansıma | AO (Uno, 0–1023) | DO (çoğu modül) |
|---|---|---|---|
| Beyaz kâğıt | Çok yüksek | Yaklaşık 30–200 | LOW, durum LED'i yanar |
| Açık renk ahşap ya da masa | Yüksek | Yaklaşık 100–400 | Genellikle LOW |
| Mat siyah bant ya da lazer baskı | Çok düşük | Yaklaşık 600–1000 | HIGH, durum LED'i söner |
| Parlak siyah elektrik bandı | Açıya göre değişir | Kararsız | Kararsız |
| Altında yüzey yok (2 cm'den uzak) | Yansıma yok | 1000'e yakın | HIGH, siyah gibi |
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.
| Özellik | AO (analog) | DO (dijital) |
|---|---|---|
| Verdiği bilgi | Yansımanın miktarı | Eşiğin üstünde mi, altında mı |
| Uno'da okuma | analogRead(): 0–1023 | digitalRead(): HIGH ya da LOW |
| Eşik | Kodda sen belirlersin | Kart üzerindeki potansiyometre |
| Beyaz zeminde | Düşük (yaklaşık 30–200) | LOW |
| Siyah zeminde | Yüksek (yaklaşık 600–1000) | HIGH |
| En iyi kullanım | Mesafe tahmini, PID'li çizgi izleme, kalibrasyon | Kesmeyle 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.
| Mesafe | Ne olur? | Uygun kullanım |
|---|---|---|
| 0–1 mm | Işık konisi ile görüş alanı örtüşmez, beyaz bile zayıf okunur | Kullanma; sensörü zemine sürtme |
| 2–3 mm | En güçlü sinyal, en büyük siyah-beyaz farkı | Çizgi izleme, kâğıt ve işaret algılama |
| 3–8 mm | Sinyal azalır ama fark hâlâ belirgin | Robot altına güvenli montaj, takometre |
| 8–15 mm | Yalnızca beyaz ve parlak yüzeyler fark edilir | Yakınlık algılama, nesne var/yok |
| 15 mm'den uzak | Sinyal ortam gürültüsüne karışır | FC-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 pini | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 3V3 | 3V3(OUT), pin 36 |
| GND | GND | GND | GND, pin 38 |
| DO | D2 (kesme pini) | GPIO 27 | GP15, pin 20 |
| AO | A0 | GPIO 34 (ADC1) | GP26 / ADC0, pin 31 |
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
- Modülün VCC pinini Arduino'nun 5V pinine, GND pinini GND'ye bağla.
- AO pinini A0'a, DO pinini D2'ye bağla.
- Test için beyaz bir kâğıda 2 cm genişliğinde mat siyah bir bant yapıştır.
- Sensörü zeminden yaklaşık 3 mm yüksekte ve yüzeye dik olacak şekilde tut ya da sabitle.
- Aşağıdaki kodu yükle ve Seri Monitör'ü 9600 baud ile aç.
- 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.
- Sensörü siyah ve beyaz zemin arasında gezdir; kart üzerindeki L LED'i siyahta yanmalı, beyazda sönmeli.
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:
- Sensörü kullanacağın yükseklikte beyaz zeminin üzerine koy ve potansiyometreyi durum LED'i yanana kadar çevir.
- Sensörü siyah çizginin üzerine kaydır ve LED'in söndüğünü kontrol et; sönmüyorsa potansiyometreyi ters yöne biraz çevir.
- LED'in beyazda kesin yandığı ve siyahta kesin söndüğü iki uç konumu bul ve potansiyometreyi bu iki konumun ortasına getir.
- 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.
- Ayarı her zaman robotun ya da düzeneğin çalışacağı yerde, aynı ışık altında yap.
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.
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.
| Özellik | TCRT5000 modülü | FC-51 engel sensörü |
|---|---|---|
| Yapı | LED ve fototransistör tek gövdede, arada bölme | Ayrı IR LED ve ayrı alıcı, yan yana |
| Algılama mesafesi | Yaklaşık 1–15 mm (en iyi 2,5 mm) | Yaklaşık 2–30 cm (ayarlanabilir) |
| Algılama alanı | Dar bir nokta | Yaklaşık 35° koni |
| Çıkışlar | Çoğunlukla AO + DO | Yalnızca DO (engel varken LOW) |
| Tipik kullanım | Çizgi izleme, takometre, kâğıt ve işaret algılama | Engelden 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.
- Ölçeceğin mili ya da tekerleği mat siyaha boya veya mat siyah bantla kapla.
- Üzerine yaklaşık 5 × 5 mm'lik beyaz bir kâğıt etiket yapıştır; işaret, sensörün baktığı noktadan geniş olmalı.
- Sensörü işarete 3–5 mm uzaklıkta, titreşmeyecek şekilde sabitle.
- 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.
- DO pinini Uno'nun kesme pinlerinden birine (D2 ya da D3) bağla ve aşağıdaki kodu yükle.
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.
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.
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.
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
| Belirti | Olası sebep | Çözüm |
|---|---|---|
| AO hep 1000 civarında, değişmiyor | Sensö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 okunuyor | Güneş ya da akkor lamba ışığı, parlak bant veya kızılötesini geçiren mürekkep | Sensörü gölgele, mat bant ya da lazer baskı kullan, eşiği yerinde ayarla |
| DO LED'i hiç değişmiyor | Potansiyometre 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österiyor | Diskte ikinci bir parlak nokta ya da sınırda titreşim var | Diski 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ız | AO bir ADC2 pinine bağlı ve Wi-Fi açık | AO'yu GPIO 32–39 arasındaki bir ADC1 pinine taşı |
| Robot havaya kaldırılınca motorlar dönmeye devam ediyor | Yüzey yokken sensör siyah okur | Tüm sensörler aynı anda siyah görürse motorları durduran bir güvenlik kuralı ekle |
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.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
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

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

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

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

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

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

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

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ö
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 160'tan fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

