Komponen · 16 mnt baca

Panduan TCRT5000 Arduino: Pengkabelan Sensor IR, Kode, dan Takometer

Pakai TCRT5000 dengan Arduino: LED IR dan fototransistor, deteksi permukaan hitam/putih, output AO/DO, ambang, jangkauan 1–15 mm, FC-51 vs TCRT5000, kode RPM.

TCRT5000 adalah sensor pantulan inframerah kecil yang dipakai di proyek Arduino untuk mendeteksi garis hitam di lantai, tanda di poros yang berputar, atau permukaan beberapa milimeter di depannya. Memakai TCRT5000 dengan Arduino itu mudah: kamu cukup menghubungkan modul siap pakainya ke 5V, GND, dan satu pin sinyal; tidak perlu library, analogRead() atau digitalRead() sudah cukup. Karena satu kemasan berisi LED inframerah yang memancarkan cahaya sekaligus fototransistor yang mengukur cahaya pantulannya, sensor ini menjadi mata bersama bagi robot pengikut garis, printer yang mendeteksi kertas, dan takometer yang mengukur kecepatan.

Di artikel ini kamu akan mempelajari bagaimana LED IR dan fototransistor di dalam TCRT5000 bekerja sama, kenapa sensor ini begitu mudah membedakan permukaan hitam dan putih, perbedaan output analog (AO) dan digital (DO) modulnya, serta cara mengatur ambang dengan potensiometer maupun lewat software. Kamu juga akan melihat, langkah demi langkah dengan kode Arduino Uno, ESP32, dan Raspberry Pi Pico, jarak kerja sensor 1–15 mm, pengaruh cahaya sekitar dan teknik pengukuran yang menghilangkannya, perbedaannya dengan sensor rintangan FC-51, serta cara membuat takometer (pengukur RPM) dengan TCRT5000.

Sensor pantulan inframerah TCRT5000: LED IR biru dan fototransistor hitam
TCRT5000: bagian berlensa biru adalah LED inframerah 950 nm, bagian berlensa hitam adalah fototransistor dengan filter cahaya siang; keduanya duduk berdampingan di rumah yang sama, dipisahkan dinding penghalang cahaya.

Apa itu TCRT5000 dan bagaimana cara kerjanya?

TCRT5000 adalah sensor optik pantulan yang dikembangkan Vishay. Satu sisi rumahnya berisi LED yang memancarkan cahaya inframerah, sisi lainnya fototransistor yang peka cahaya, dan keduanya menghadap ke arah yang sama, ke depan sensor. Dinding plastik di antara keduanya mencegah cahaya LED langsung mencapai fototransistor; cahaya baru terdeteksi kalau mengenai permukaan di depan dan memantul kembali. Fototransistor adalah transistor yang mengalirkan arus kolektor makin besar ketika makin banyak cahaya jatuh ke daerah basisnya: makin banyak cahaya yang dipantulkan permukaan, makin besar arus kolektornya. Lensa hitam itu adalah filter cahaya siang; ia menahan sebagian besar cahaya tampak dan hanya meloloskan panjang gelombang yang dekat dengan inframerah.

FiturNilai (datasheet Vishay)
KonstruksiLED inframerah + fototransistor, rumah yang menahan cahaya tampak
Panjang gelombang LED950 nm (inframerah tak terlihat)
Jarak kerja terbaik2,5 mm
Rentang kerja0,2–15 mm (sinyal di atas 20% dari puncaknya)
Tegangan maju LEDTipikal 1,25 V, maks. 1,5 V (pada 60 mA)
Arus kontinu maks. LED60 mA
FototransistorVCEO 70 V, arus kolektor maks. 100 mA
Arus gelapTipikal 10 nA, maks. 200 nA
Ukuran10,2 × 5,8 × 7 mm; TCRT5000L adalah versi berkaki panjang (15 mm)
Suhu kerja−25 sampai +85 °C

Arduino tidak bisa membaca arus fototransistor secara langsung; untuk mengubah arus menjadi tegangan, sebuah resistor beban dihubungkan ke kolektor. Di modul siap pakai, resistor ini biasanya 10 kΩ dan menarik kolektor ke VCC (pull-up). Tegangan kolektor dihitung dengan V = VCC − Ic × R. Kalau permukaan putih membuat arus sekitar 0,4 mA mengalir lewat fototransistor, tegangan yang jatuh di 10 kΩ adalah 4 V dan output-nya turun ke 1 V. Kalau arusnya turun ke 20 µA di atas permukaan hitam, tegangan yang jatuh hanya 0,2 V dan output-nya tetap di 4,8 V. Jadi di modul TCRT5000, putih memberi tegangan rendah dan hitam memberi tegangan tinggi; logika terbalik ini membingungkan pada awalnya, tetapi memang begitulah cara rangkaiannya bekerja. Resistor beban yang lebih besar membuat sensor lebih peka tetapi lebih lambat; yang lebih kecil membuatnya lebih cepat tetapi tidak mampu membedakan pantulan yang lemah.

Bagaimana TCRT5000 membedakan hitam dan putih?

Kertas putih memantulkan kembali sebagian besar cahaya inframerah yang mengenainya ke segala arah; cat hitam doff, toner, atau selotip hitam menyerap sebagian besar cahaya dan mengubahnya menjadi panas. TCRT5000 mengubah perbedaan ini menjadi perbedaan besar pada arus fototransistor. Tetapi sensor ini tidak melihat warna seperti mata manusia; yang penting baginya adalah seberapa banyak permukaan memantulkan cahaya pada 950 nm. Ini menimbulkan beberapa kejutan: sebagian cetakan inkjet terlihat hitam pekat di mata tetapi hampir tembus di inframerah, sehingga sensor menganggapnya putih. Isolasi listrik hitam yang mengilap bisa memantulkan cahaya langsung kembali seperti cermin kalau sensor melihatnya tegak lurus. Permukaan merah, oranye, dan kuning sering terbaca mendekati putih. Jadi selalu uji bahan garis dan lantaimu dengan sensor sebelum memutuskan memakainya. Tabel di bawah menunjukkan contoh nilai yang diambil pada 5 V dan ketinggian sekitar 3 mm; hasil bacaanmu sendiri bisa berbeda tergantung sensor dan lingkungannya.

PermukaanPantulan inframerahAO (Uno, 0–1023)DO (kebanyakan modul)
Kertas putihSangat tinggiSekitar 30–200LOW, LED status menyala
Kayu terang atau mejaTinggiSekitar 100–400Biasanya LOW
Selotip hitam doff atau cetakan laserSangat rendahSekitar 600–1000HIGH, LED status mati
Isolasi listrik hitam mengilapTergantung sudutTidak stabilTidak stabil
Tidak ada permukaan di bawah (lebih dari 2 cm)Tidak ada pantulanMendekati 1000HIGH, seperti hitam
Jangan lupakan baris terakhir tabel: kalau tidak ada apa-apa di depannya, sensor juga membaca hitam. Itulah sebabnya motor robot pengikut garis terus berputar seolah-olah “menemukan garis” ketika robotnya kamu angkat dari meja. Aturan sederhana yang menghentikan motor ketika semua sensor melihat hitam bersamaan akan melindungi robotmu sekaligus mejamu.

Modul TCRT5000: output analog (AO) dan digital (DO)

Biasanya yang dipakai adalah modul siap pakai, bukan TCRT5000 tanpa modul. Di samping sensornya, papan modul membawa komparator LM393, potensiometer penyetel berwarna biru, resistor pembatas arus LED IR, resistor beban 10 kΩ untuk fototransistor, dan dua LED kecil: satu LED daya, satunya lagi LED status yang menunjukkan output DO. Pin AO terhubung langsung ke kolektor fototransistor dan memberi tegangan mentah yang kamu hitung tadi. LM393 membandingkan tegangan ini dengan tegangan di kaki tengah (wiper) potensiometer, lalu menuliskan hasilnya ke pin DO. Di modul yang umum, DO menjadi LOW di atas permukaan putih dan LED status menyala; di atas hitam, atau kalau tidak ada apa-apa di depannya, DO menjadi HIGH dan LED-nya mati. Karena logikanya terbalik di sebagian board, cek dulu perilaku modulmu sendiri di Serial Monitor. Kebanyakan modul satu kanal punya 4 pin (VCC, GND, DO, AO); ada juga versi 3 pin yang hanya punya DO, serta deret sensor garis 3 dan 5 kanal. Satu modul menarik arus sekitar 15–40 mA pada 5 V, tergantung resistor LED IR-nya.

FiturAO (analog)DO (digital)
Yang diberitahukanSeberapa banyak cahaya yang dipantulkanApakah di atas atau di bawah ambang
Pembacaan di UnoanalogRead(): 0–1023digitalRead(): HIGH atau LOW
AmbangKamu atur di kodePotensiometer di board
Di atas putihRendah (sekitar 30–200)LOW
Di atas hitamTinggi (sekitar 600–1000)HIGH
Paling cocok untukPerkiraan jarak, mengikuti garis dengan PID, kalibrasiMenghitung RPM dengan interrupt, keputusan ya/tidak sederhana

Jarak kerja: memaksimalkan rentang 1–15 mm

Menurut datasheet TCRT5000, sinyalnya mencapai puncak pada 2,5 mm dan tetap di atas 20% dari puncak itu antara 0,2 dan 15 mm. Dalam praktiknya sensor ini bisa dipakai dari 1 sampai 15 mm, tetapi perbedaan hitam dan putih cepat mengecil seiring bertambahnya jarak. Kurva jarak-sinyalnya juga tidak searah: di bawah 2 mm sinyalnya turun lagi, karena kerucut cahaya LED dan bidang pandang fototransistor baru bertemu di permukaan setelah jarak tertentu. Tempelkan sensor ke sebuah permukaan, maka kertas putih pun terbaca gelap. Jadi nilai analog yang sama bisa muncul pada 1 mm maupun 5 mm; kalau ingin memperkirakan jarak, pakai hanya daerah searah di atas 3 mm.

JarakApa yang terjadi?Cocok untuk
0–1 mmKerucut cahaya dan bidang pandang tidak bertemu, putih pun terbaca lemahHindari; jangan biarkan sensor terseret di lantai
2–3 mmSinyal terkuat, perbedaan hitam-putih terbesarMengikuti garis, deteksi kertas dan tanda
3–8 mmSinyal turun tetapi perbedaannya masih jelasPemasangan aman di bawah robot, takometer
8–15 mmHanya permukaan putih dan mengilap yang terdeteksiDeteksi kedekatan, ada/tidak ada benda
Lebih dari 15 mmSinyal tenggelam dalam derau sekitarPilih sensor lain seperti FC-51 atau HC-SR04

Kamu juga bisa mengukur jarak pendek dengan TCRT5000: karena nilai analognya berubah secara teratur mengikuti jarak di permukaan yang sama, kamu bisa mengambil bacaan di beberapa titik seperti 3, 5, 8, dan 12 mm, membuat tabel, lalu menginterpolasi secara linear di antaranya. Tetapi pengukuran ini bergantung pada warna permukaan: sensor yang dikalibrasi di kertas putih akan mengira permukaan abu-abu lebih jauh daripada sebenarnya. Jadi anggap TCRT5000 bukan sebagai penggaris, melainkan sensor kedekatan yang menjawab “makin dekat atau makin jauh?” di permukaan yang sama. Untuk mengukur dalam sentimeter, sensor jarak HC-SR04 jauh lebih cocok.

Pengkabelan modul TCRT5000: Arduino Uno, ESP32, dan Pico

Pin modulArduino UnoESP32Raspberry Pi Pico
VCC5V3V33V3(OUT), pin 36
GNDGNDGNDGND, pin 38
DOD2 (pin interrupt)GPIO 27GP15, pin 20
AOA0GPIO 34 (ADC1)GP26 / ADC0, pin 31
Pin ESP32 dan Pico dirancang untuk 3,3 V. Di board-board ini, beri daya modul TCRT5000 dari pin 3V3, bukan dari 5V atau VBUS: pada modul yang diberi 5 V, output AO dan DO mendekati 5 V di atas hitam dan bisa merusak pin input. Pada 3,3 V arus LED IR berkurang, jadi jarak deteksinya sedikit lebih pendek; itu normal. Kalau kamu benar-benar harus memberi modul 5 V, tambahkan pembagi tegangan di jalur AO. Peta pin lengkap board-mu bisa kamu lihat di alat diagram pin.

Bagaimana cara menghubungkan TCRT5000 tanpa modul?

Sensor tanpa modul punya empat kaki: dua di sisi biru adalah anoda dan katoda LED IR, dua di sisi hitam adalah kolektor dan emitor fototransistor. Cara termudah membedakannya adalah mode dioda multimeter: di dua kaki sisi biru kamu akan membaca sekitar 1,0–1,2 V hanya pada satu arah; kaki yang disentuh probe merah ketika itu adalah anoda. Memasang fototransistor terbalik tidak akan merusaknya, karena resistor 10 kΩ membatasi arusnya; sensornya hanya tidak akan bekerja. Kalau bacaannya tidak berubah terhadap cahaya, tukar kedua kaki di sisi hitam.

Arus LED IR perlu kamu batasi dengan resistor. Nilainya dihitung dengan R = (VCC − VF) / I: untuk 5 V, tegangan maju 1,2 V, dan 20 mA, hasilnya (5 − 1,2) / 0,02 = 190 Ω; nilai standar terdekat, 220 Ω, memberi sekitar 17 mA, arus yang bisa diberikan pin Arduino dengan nyaman. Perhitungan ini juga bisa kamu lakukan dengan kalkulator resistor LED. Hubungkan emitor fototransistor ke GND dan kolektornya ke 5V lewat resistor 10 kΩ, lalu sambungkan kolektor ke A0. Untuk membedakan permukaan yang lebih jauh atau lebih gelap, kamu bisa menaikkan resistor beban ke 47 kΩ; permukaan putih jadi cepat jenuh, tetapi perbedaan kecil di daerah gelap makin besar.

Kaki TCRT5000Sambungan (Arduino Uno)
Anoda (sisi biru)Ke 5V lewat 220 Ω; ke D7 alih-alih 5V untuk pengukuran cahaya sekitar
Katoda (sisi biru)GND
Kolektor (sisi hitam)Ke A0, dan ke 5V lewat 10 kΩ
Emitor (sisi hitam)GND

Langkah demi langkah: mendeteksi permukaan hitam dan putih dengan Arduino

  1. Hubungkan pin VCC modul ke pin 5V Arduino dan GND ke GND.
  2. Hubungkan pin AO ke A0 dan pin DO ke D2.
  3. Untuk pengujian, tempel strip selotip hitam doff selebar 2 cm di selembar kertas putih.
  4. Pegang atau pasang sensor sekitar 3 mm di atas permukaan, tegak lurus terhadapnya.
  5. Upload kode di bawah dan buka Serial Monitor di 9600 baud.
  6. Selama 5 detik pertama, gerakkan sensor bolak-balik di atas selotip hitam dan kertas putih beberapa kali; kode akan mencari nilai terendah dan tertinggi lalu menghitung ambangnya sendiri.
  7. Gerakkan sensor di antara hitam dan putih; LED L di board seharusnya menyala di atas hitam dan mati di atas putih.
C++ (Arduino IDE)
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}

Kode menghitung ambang sebagai (terendah + tertinggi) / 2: kalau kamu membaca 80 di putih dan 820 di hitam, ambangnya 450. Alih-alih satu ambang, kode memakai dua batas: ia beralih ke hitam begitu nilainya naik di atas 490 dan kembali ke putih begitu nilainya turun di bawah 410. Berkat histeresis ini, output tidak berkedip-kedip ketika sensor tepat berada di tepi garis. Kalau selisihnya tetap di bawah 100 selama kalibrasi, kode kembali ke ambang bawaan 450 dan memberi peringatan; ini biasanya berarti sensornya terlalu tinggi atau hanya digerakkan di atas satu warna. Kolom DO menunjukkan keputusan yang sama yang dibuat potensiometer modul; melihat keduanya berdampingan adalah cara yang bagus untuk mengecek setelan potensiometer.

Mengatur ambang: potensiometer atau software?

Kalau kamu memakai output DO, ambangnya diatur dengan potensiometer di board. Tegangan di kaki tengah potensiometer adalah referensi komparator; begitu tegangan AO melewatinya, DO berganti keadaan. Ikuti langkah-langkah ini untuk setelan yang baik:

  1. Letakkan sensor di atas permukaan putih pada ketinggian yang akan kamu pakai, lalu putar potensiometer sampai LED status menyala.
  2. Geser sensor ke atas garis hitam dan cek apakah LED-nya mati; kalau tidak, putar potensiometer sedikit ke arah sebaliknya.
  3. Cari dua posisi ujung ketika LED jelas menyala di atas putih dan jelas mati di atas hitam, lalu atur potensiometer di tengah-tengah keduanya.
  4. Untuk setelan yang lebih halus, ukur AO di atas putih dan di atas hitam dengan multimeter, lalu atur tegangan di kaki tengah potensiometer di tengah-tengah kedua nilai itu; misalnya sekitar 2,4 V untuk 0,6 V dan 4,2 V.
  5. Selalu lakukan penyetelan di tempat robot atau alatnya akan berjalan, di bawah pencahayaan yang sama.
Ambang di software biasanya lebih fleksibel: kamu bisa mengkalibrasi ulang ketika cahaya sekitar atau tegangan baterai berubah, dan memberi setiap sensor ambangnya sendiri kalau sensornya lebih dari satu. Keunggulan sebenarnya output DO adalah kecepatan; komparator mengambil keputusan dalam hitungan mikrodetik dan output-nya bisa langsung masuk ke pin interrupt. Jadi pakai DO untuk pekerjaan cepat seperti menghitung RPM, dan AO untuk pekerjaan halus seperti mengikuti garis dan memperkirakan jarak.

Pengaruh cahaya sekitar dan cara mengatasinya

Filter cahaya siang di lensa hitam menahan cahaya tampak, tetapi tidak bisa menahan inframerah, karena sensornya sendiri bekerja dengan inframerah. Sinar matahari serta lampu pijar dan halogen memancarkan inframerah yang kuat di sekitar 950 nm; ketika cahaya ini mencapai fototransistor, permukaan hitam pun terbaca seperti putih. Di bawah sinar matahari langsung, fototransistor bisa jenuh sepenuhnya dan sensor tidak bisa membedakan apa pun. Sebaliknya, lampu LED dan lampu neon hanya memancarkan sedikit sekali inframerah, karena itulah robot yang sama bisa berjalan sempurna di kelas tetapi kebingungan di dekat jendela. Berikut solusinya, dari yang paling sederhana sampai yang paling sulit:

  • Beri peneduh: Tambahkan rok hitam, selongsong heat-shrink, atau busa hitam di sekeliling sensor; ini menahan cahaya yang datang dari samping.
  • Pasang rendah: Dekatkan sensor 2–4 mm dari permukaan; cahaya pantulannya makin kuat dan porsi cahaya sekitar makin kecil.
  • Kalibrasi di lokasi: Selalu atur ambang di lingkungan sebenarnya, dan ukur ulang ketika alat mulai menyala kalau pencahayaannya berubah.
  • Ukur selisihnya: Dengan sensor tanpa modul, kendalikan LED IR dari pin Arduino dan ambil dua bacaan, satu dengan LED mati dan satu dengan LED menyala. Cahaya sekitar sama di kedua bacaan, jadi selisihnya hanyalah pantulan dari LED.
C++ (Arduino IDE)
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}

Fototransistor tidak merespons seketika; dengan resistor beban 10 kΩ ia bisa butuh ratusan mikrodetik untuk stabil di nilai barunya, karena itu kode menunggu 500 µs sebelum setiap bacaan. Kalau bacaannya tidak stabil, naikkan SETTLE_US ke 1000. Makin besar selisihnya, makin putih atau makin dekat permukaannya. Metode ini tidak bisa sepenuhnya mengalahkan matahari: kalau cahaya sekitar sudah membuat fototransistor jenuh, menyalakan LED tidak mengubah apa-apa dan selisihnya turun ke nol; satu-satunya solusi adalah meneduhi sensor. Remote TV menerapkan ide yang sama jauh lebih cepat dengan mengirim cahaya dalam semburan 38 kHz, dan penerimanya hanya mendengarkan frekuensi itu; penjelasannya ada di artikel penerima IR dan remote.

TCRT5000 vs sensor rintangan FC-51: apa bedanya?

Keduanya sering tertukar karena sama-sama terdiri dari LED inframerah dan penerima yang mengukur cahaya pantulan, dan sama-sama memakai komparator LM393. Perbedaannya ada pada tujuan rancangannya: TCRT5000 menggabungkan pemancar dan penerima dalam satu rumah, diarahkan ke satu titik kecil beberapa milimeter di depannya. Sebaliknya, FC-51 memakai LED IR dan penerima yang terpisah, dipasang berdampingan, dan mencari cahaya yang kembali dari rintangan beberapa sentimeter jauhnya. Itulah sebabnya FC-51 tidak bisa diandalkan untuk mengenali garis tipis di lantai, dan TCRT5000 tidak bisa melihat dinding yang berjarak 10 cm.

FiturModul TCRT5000Sensor rintangan FC-51
KonstruksiLED dan fototransistor dalam satu rumah, dengan dinding di antaranyaLED IR dan penerima terpisah, berdampingan
Jarak deteksiSekitar 1–15 mm (terbaik pada 2,5 mm)Sekitar 2–30 cm (bisa diatur)
Area deteksiSatu titik sempitKerucut sekitar 35°
OutputBiasanya AO + DOHanya DO (LOW ketika ada rintangan)
Pemakaian umumMengikuti garis, takometer, deteksi kertas dan tandaRobot penghindar rintangan, deteksi tangan atau benda
Cahaya sekitarLebih tahan berkat jaraknya yang pendekJangkauan turun cukup jauh di bawah sinar matahari

Menghitung RPM dengan TCRT5000 (takometer)

Salah satu pekerjaan TCRT5000 yang paling berguna tetapi kurang dikenal adalah mengukur seberapa cepat sesuatu berputar; bahkan datasheet Vishay menaruh sensor posisi untuk shaft encoder di urutan teratas daftar aplikasinya. Idenya sederhana: kamu menempelkan tanda putih di cakram atau poros yang dicat hitam; setiap kali tanda itu melewati sensor, output DO menjadi LOW sekali. Dengan menghitung pulsa-pulsa ini, kecepatannya bisa dihitung dengan dua cara:

  • Metode hitungan: rpm = jumlah pulsa × 60 / (jumlah tanda × waktu pengukuran dalam detik). Kalau terhitung 25 pulsa dalam 1 detik dan cakramnya punya 1 tanda, hasilnya 25 × 60 = 1500 rpm. Metode ini sangat akurat di kecepatan tinggi, tetapi dengan jendela 1 detik dan satu tanda, resolusinya 60 rpm.
  • Metode periode: rpm = 60.000.000 / (mikrodetik di antara dua pulsa × jumlah tanda). Kalau di antara dua pulsa berlalu 40.000 µs (40 ms), hasilnya 60.000.000 / 40.000 = 1500 rpm. Metode ini memberi hasil baru yang presisi di setiap pulsa, bahkan di kecepatan rendah.
  • Jumlah tanda: Memasang 2 atau 4 tanda dengan jarak sama di cakram meningkatkan resolusi metode hitungan; jangan lupa mengubah jumlah tanda di rumusnya.
  1. Cat poros atau roda yang ingin kamu ukur dengan warna hitam doff, atau tutupi dengan selotip hitam doff.
  2. Tempelkan label kertas putih berukuran sekitar 5 × 5 mm; tanda ini harus lebih lebar daripada titik yang dilihat sensor.
  3. Pasang sensor 3–5 mm dari tanda dengan kokoh supaya tidak bergetar.
  4. Putar poros pelan-pelan dengan tangan dan cek apakah LED DO berkedip setiap kali tanda lewat; setel potensiometer kalau perlu.
  5. Hubungkan pin DO ke salah satu pin interrupt Uno (D2 atau D3) dan upload kode di bawah.
C++ (Arduino IDE)
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}

Pulsa ditangkap dengan attachInterrupt(): apa pun yang sedang dikerjakan prosesor di loop(), onPulse() berjalan begitu DO turun, jadi tidak ada pulsa yang terlewat. Variabel yang dipakai bersama oleh rutin interrupt dan loop() dideklarasikan volatile, dan loop() menyalinnya di antara noInterrupts() dan interrupts(); kalau tidak, interrupt bisa terjadi ketika angka 4 byte sedang dibaca dan kamu mendapat nilai yang baru setengah diperbarui. Output LM393 bisa bergetar beberapa kali di tepi hitam-putih; MIN_GAP_US menyaringnya dengan mengabaikan pulsa yang datang kurang dari 500 µs setelah pulsa sebelumnya. Dengan satu tanda, saringan ini masih memungkinkan pembacaan sampai 120.000 rpm, jadi dalam praktiknya tidak membatasi motor hobi. Untuk penjelasan lebih lanjut tentang interrupt, lihat artikel interrupt Arduino.

Cek alatmu dengan motor yang kecepatannya sudah diketahui: misalnya motor gearbox TT kuning berputar sekitar 200 rpm tanpa beban pada 6 V. Kalau hasil bacaannya tepat dua kali lipat, ada titik mengilap kedua di cakram yang belum kamu sadari; kepala sekrup, hub logam, dan tepi yang mengilap juga terhitung sebagai tanda.

Memakai TCRT5000 dengan ESP32

Logika yang sama berlaku di ESP32, tetapi perhatikan tiga perbedaan. Pertama, modulnya diberi daya dari 3V3. Kedua, input analognya 12-bit dan memberi nilai 0 sampai 4095; hubungkan AO hanya ke pin ADC1 (GPIO 32–39), karena pin ADC2 tidak bisa dibaca ketika Wi-Fi menyala. Ketiga, rutin interrupt ditandai dengan IRAM_ATTR, dan karena ESP32 punya dua inti, variabel bersama dilindungi dengan critical section portMUX. Kode di bawah menghitung dua tanda di cakram dan mencetak RPM serta nilai analog setiap setengah detik. Kalau kamu baru mengenal ESP32, lihat dulu Apa Itu ESP32?.

C++ (Arduino IDE)
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}

Karena jendela pengukurannya setengah detik, kode mengukur waktu yang berlalu secara tepat dengan millis() dan memakainya di rumus: rpm = pulsa × 60.000 / (ms yang berlalu × jumlah tanda). Menampilkan kecepatan di halaman web lewat Wi-Fi, atau mengirim notifikasi ke ponselmu ketika kecepatannya turun di bawah nilai tertentu, itulah tambahan sebenarnya dari ESP32 untuk proyek ini. Karena nilai analog juga dibaca bersamaan, kamu juga bisa memantau apakah jarak cakram ke sensor berubah, dengan kata lain apakah porosnya oleng.

Memakai TCRT5000 dengan Raspberry Pi Pico dan MicroPython

Di Pico, beri daya modul dari pin 3V3(OUT), hubungkan AO ke GP26 (ADC0) dan DO ke GP15. read_u16() mengembalikan nilai 0 sampai 65535; nilainya rendah di atas putih dan tinggi di atas hitam. Kode di bawah mendeteksi permukaan sekaligus menghitung RPM dengan menghitung pulsa di jalur DO memakai interrupt. Interrupt MicroPython tidak secepat di C; interrupt ini bekerja andal sampai beberapa ratus pulsa per detik, jadi untuk motor yang sangat cepat pilih Arduino atau ESP32. Untuk instalasi dan langkah pertama, lihat Apa Itu Raspberry Pi Pico?.

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)

Ide proyek TCRT5000

  • Robot pengikut garis: Robot yang mengikuti garis hitam dengan deret 2, 3, atau 5 sensor; penempatan sensor dan penyetelan PID dibahas di artikel Robot Pengikut Garis.
  • Robot yang mengenali tepi meja: Pasang TCRT5000 yang menghadap ke bawah di bagian depan robot; di tepi meja sinyalnya berubah menjadi “hitam” dan robot berhenti sebelum jatuh. Untuk sasis dan motornya, lihat panduan Cara Membuat Mobil Robot Arduino.
  • Layar kecepatan motor: Gabungkan kode takometer dengan layar OLED dan tampilkan RPM dengan angka besar.
  • Encoder roda dan odometer: Tempelkan 8–20 segmen hitam dan putih di bagian dalam roda, hitung pulsanya, bagi dengan jumlah segmen, lalu kalikan dengan keliling roda untuk mendapatkan jarak tempuh. Kalau arahnya juga perlu diketahui, pasang dua sensor berjarak setengah segmen, seperti pada rotary encoder.
  • Penghitung barang: Hitung kotak putih atau lembaran kertas yang lewat di konveyor kecil dan tampilkan totalnya di layar.
  • Alarm kertas habis: Arahkan sensor ke bagian belakang gulungan label atau kertas printer; begitu kertasnya habis, pantulannya hilang dan buzzer berbunyi.
  • Prinsip yang sama, dalam kemasan tertutup: Bandingkan TCRT5000 dengan optocoupler, tempat LED dan fototransistor disegel bersama dalam satu kemasan kedap cahaya, untuk lebih memahami bagaimana sinyal berpindah lewat cahaya.

Kesalahan umum dan cara mengatasinya

GejalaKemungkinan penyebabSolusi
AO tetap di sekitar 1000 dan tidak berubahSensor terlalu jauh dari permukaan, LED IR tidak menyala, atau AO di pin yang salahDekatkan sensor ke 3 mm, cek LED IR dengan kamera ponsel, periksa ulang pengkabelan
Permukaan hitam terbaca putihSinar matahari atau lampu pijar, selotip mengilap, atau tinta yang meloloskan inframerahTeduhi sensor, pakai selotip doff atau cetakan laser, atur ambang di lokasi
LED DO tidak pernah berubahPotensiometer terputar sampai mentok di salah satu ujungCari titik ketika LED berganti keadaan dan setel potensiometer di situ
Takometer menunjukkan dua kali RPM sebenarnyaAda titik mengilap kedua di cakram atau getaran sinyal di tepiBuat cakram benar-benar doff, naikkan MIN_GAP_US, cek nilai MARKS
Di ESP32 nilai analog selalu 0 atau tidak stabilAO ada di pin ADC2 dan Wi-Fi menyalaPindahkan AO ke pin ADC1 antara GPIO 32 dan 39
Motor terus berputar ketika robot diangkatTanpa permukaan di bawahnya, sensor membaca hitamTambahkan aturan keamanan yang menghentikan motor ketika semua sensor melihat hitam bersamaan
Kamu tidak bisa melihat dengan mata sendiri apakah LED IR bekerja, tetapi kamera ponselmu bisa: buka kamera dan arahkan ke sisi biru sensor, maka seharusnya terlihat cahaya ungu keputihan di layar. Sebagian ponsel punya filter inframerah di kamera belakang, jadi kalau cahayanya tidak terlihat, coba kamera depan.

TCRT5000 adalah sensor yang murah, kecil, dan sangat mendidik: dengan satu komponen saja kamu belajar tentang fototransistor, komparator, ambang dan histeresis, interrupt, serta cara menghadapi cahaya sekitar. Mulailah dengan mengenali nilai-nilai sensormu sendiri lewat kode deteksi permukaan, lalu ukur kecepatan dengan takometer, dan terakhir gabungkan beberapa sensor di bawah sebuah robot. Kalau kamu penasaran dengan cara sederhana lain untuk mengukur dengan cahaya, lihat juga artikel sensor cahaya LDR. Di aplikasi BlueGrays kamu akan menemukan proyek Deteksi Permukaan Hitam dan Putih TCRT5000 dan Membaca Pantulan (Kedekatan) dengan TCRT5000, serta Mobil Kendali Bluetooth dengan L298N dan Robot Penghindar Rintangan, masing-masing dengan skema rangkaian langkah demi langkah dan kodenya.

Pertanyaan umum

Untuk apa sensor TCRT5000 dipakai?

TCRT5000 adalah sensor pantulan yang menggabungkan LED inframerah dan fototransistor dalam satu rumah. Sensor ini mengukur seberapa banyak cahaya inframerah yang dipantulkan permukaan beberapa milimeter di depannya, sehingga bisa membedakan hitam dan putih, menghitung tanda di cakram yang berputar, atau mendeteksi benda yang sangat dekat. Sensor ini paling banyak dipakai di robot pengikut garis, takometer, dan deteksi kertas.

Berapa jangkauan deteksi TCRT5000?

TCRT5000 bekerja dalam skala milimeter, bukan sentimeter. Menurut datasheet-nya, sinyal terkuat ada pada 2,5 mm dan sensor bisa dipakai dari sekitar 0,2 sampai 15 mm; dalam praktiknya rentang yang paling andal adalah 2–8 mm. Untuk jarak yang lebih jauh, pilih sensor rintangan inframerah FC-51 atau sensor jarak ultrasonik HC-SR04.

Apakah TCRT5000 mengeluarkan HIGH atau LOW di atas hitam?

Di modul TCRT5000 yang umum, output DO menjadi LOW di atas putih dan LED status menyala; di atas hitam, atau kalau tidak ada permukaan di depannya, output-nya menjadi HIGH. Output AO juga memberi nilai rendah di atas putih dan nilai tinggi di atas hitam. Karena logikanya terbalik di sebagian board, sebaiknya cek modulmu sendiri di Serial Monitor.

Apa perbedaan TCRT5000 dan FC-51?

TCRT5000 adalah sensor pantulan dengan pemancar dan penerima dalam satu rumah yang bekerja pada jarak sangat pendek, sekitar 1–15 mm; sensor ini ideal untuk mengikuti garis dan menghitung RPM. FC-51 memakai LED IR dan penerima yang terpisah, mendeteksi rintangan sekitar 2–30 cm jauhnya, dan hanya punya output digital. Singkatnya, TCRT5000 melihat ke lantai dan FC-51 melihat ke depan.

Bisakah TCRT5000 mendeteksi warna?

Tidak, TCRT5000 hanya mengukur seberapa banyak cahaya inframerah di sekitar 950 nm yang dipantulkan; sensor ini tidak bisa mengetahui warna. Sebagian warna berperilaku tak terduga di inframerah: permukaan merah dan kuning sering terbaca mendekati putih, sedangkan sebagian cetakan inkjet hitam hampir tembus. Untuk membedakan warna, pakai sensor warna seperti TCS3200 atau TCS34725.

Apakah TCRT5000 bisa dipakai dengan ESP32 dan 3,3 V?

Bisa, modul TCRT5000 bekerja antara 3,3 dan 5 V, dan di ESP32 serta Raspberry Pi Pico modul ini sebaiknya diberi daya dari pin 3V3. Dengan begitu output AO dan DO tidak pernah melebihi 3,3 V dan pin board tetap aman. Pada 3,3 V LED IR menarik arus lebih kecil, jadi jarak deteksinya sedikit lebih pendek; di ESP32, jangan lupa menghubungkan AO ke pin ADC1.

Lihat semua proyek
Deteksi Permukaan Hitam dan Putih TCRT5000
#78Menengah
Premium

Deteksi Permukaan Hitam dan Putih TCRT5000

Dengan sensor kecil yang menjadi mata robot pengikut garis, kamu bisa tahu apakah lantainya hitam atau putih. TCRT5000 menyinari lantai dengan cahaya tak terlihat dan mengecek berapa banyak yang terpa

4.7(40)
49
Membaca Pantulan (Kedekatan) dengan TCRT5000
#77Menengah
Premium

Membaca Pantulan (Kedekatan) dengan TCRT5000

Dengan sensor kecil yang memancarkan cahaya tak terlihat dan mengukur berapa banyak yang terpantul kembali, kamu bisa mendeteksi permukaan di depannya. Makin dekat sebuah benda atau permukaan berwarna

4.6(33)
43
Mengukur Intensitas Cahaya dengan LDR
#11Pemula

Mengukur Intensitas Cahaya dengan LDR

Ingin melihat seberapa terang kamarmu dalam bentuk angka? LDR, komponen kecil yang bereaksi terhadap cahaya, mengukur cahaya di sekitarnya, dan Arduino menulis nilainya ke layar komputermu setiap sete

4.6(81)
139
Pengukuran Jarak HC-SR04 (Tampilan Serial)
#27Pemula

Pengukuran Jarak HC-SR04 (Tampilan Serial)

Sensor HC-SR04 bekerja persis seperti kelelawar yang mencari jalan dalam gelap: ia mengirim suara yang tidak bisa kamu dengar, mendengarkan pantulannya, dan mengukur seberapa jauh benda di depannya. A

4.6(46)
71
Mobil Kendali Bluetooth dengan L298N
#80Mahir
Premium

Mobil Kendali Bluetooth dengan L298N

Jadikan ponselmu remote dan kendarai mobil robotmu sendiri. Arduino menerima perintah dari aplikasi remote control di ponselmu lewat modul Bluetooth dan memutar roda dengan driver motor; mobil maju, m

5.0(38)
65
Robot Penghindar Rintangan
#81Mahir
Premium

Robot Penghindar Rintangan

Bagaimana kalau membuat kendaraan pintar yang mencari jalannya sendiri? Robot Penghindar Rintangan terus memindai sekelilingnya berkat sensor ultrasonik di depannya. Ketika menemui rintangan, robot be

5.0(38)
49
Sistem Peringatan Laser
#22Menengah
Premium

Sistem Peringatan Laser

Kamu memasang pagar sinar tak terlihat, persis seperti di film. Laser menyorot sensor cahaya di sisi seberang; begitu ada orang lewat dan memutus sinarnya, LED menyala dan buzzer berbunyi, dan ketika

4.8(64)
83
Penghitung dengan Layar 7 Segmen dan Tombol
#43Mahir
Premium

Penghitung dengan Layar 7 Segmen dan Tombol

Penghitung sederhana dengan tiga tombol: tekan satu dan angka di layar naik satu, tekan yang lain dan turun satu, dan yang ketiga mengembalikannya ke nol. Layar 7 segmen satu digit menghitung dari 0 s

4.6(35)
47