Mendeteksi Warna Objek dengan Arduino Nano dan Sensor TCS3200
Komponen dan Perlengkapan
Berikut adalah daftar komponen yang dibutuhkan untuk membangun proyek deteksi warna ini:
- Arduino Nano R3
- Modul Pengenalan Warna (Color Sensor Module)
- LCD Standar Adafruit - 16x2 Teks Putih pada Latar Biru
- Papan Pemancar (Breadboard)
Aplikasi dan Layanan Online
Arduino IDE digunakan untuk menulis dan mengunggah kode ke papan Arduino.
Tentang Proyek Ini
Ini adalah tutorial sederhana yang menjelaskan cara membaca warna menggunakan Arduino dan sensor seperti TCS3200. Ide utamanya adalah mendeteksi warna suatu objek dan menampilkannya pada layar LCD. Proyek ini merupakan bagian dari proyek yang lebih besar, yaitu Robot Arm yang akan memilih tindakan yang tepat berdasarkan warna objek. Diagram blok di atas menunjukkan komponen utama.
Video di bawah ini menunjukkan proyek akhir dalam operasi:
Langkah 1: Daftar Biaya Material (BoM)
Tautan dan harga di bawah ini hanya untuk referensi:
- Arduino Nano (US$ 8,00)
- Modul Sensor Warna TCS3200 (US$ 9,00)
- Modul LCD Serial Backlight Biru IIC/I2C/TWI 1602 (US$ 8,00)
- Papan Pemancar (US$ 2,00)
- Kabel
Langkah 2: Sensor Warna TCS3200
Menurut datasheet-nya, TCS3200 adalah pengubah cahaya-ke-frekuensi warna yang dapat diprogram, menggabungkan fotodioda silikon yang dapat dikonfigurasi dan pengubah arus-ke-frekuensi pada satu sirkuit terintegrasi CMOS monolitik.
Keluaran adalah gelombang persegi (siklus kerja 50%) dengan frekuensi yang sebanding langsung dengan intensitas cahaya (iradiansi). Frekuensi keluaran skala penuh dapat discale oleh salah satu dari tiga nilai preset melalui dua pin kontrol input (S0 dan S1). Input digital dan output digital memungkinkan antarmuka langsung dengan mikrokontroler atau sirkuit logika lainnya.
Output enable (OE) menempatkan output dalam keadaan impedansi tinggi untuk berbagi baris input mikrokontroler oleh multiple unit. Pada TCS3200, pengubah cahaya-ke-frekuensi membaca array fotodioda 8 x 8.
- Belas fotodioda memiliki filter biru
- 16 fotodioda memiliki filter hijau
- 16 fotodioda memiliki filter merah
- 16 fotodioda bersih tanpa filter.
Pin S2 dan S3 digunakan untuk memilih grup fotodioda mana (merah, hijau, biru, bersih) yang aktif. Fotodioda berukuran 110 μm x 110 μm dan berada pada jarak 134 μm.
OE (Enable) harus dihubungkan ke GND (LOW).
Sensor dilindungi dan harus diberi daya antara 2,7 dan 5,5 VDC. Kami akan menggunakan output 5V Arduino untuk memberi daya pada sensor. Untuk menggunakan sensor dengan benar, kami akan memasang cincin getah kecil untuk mengisolasi sensor dari cahaya samping. Saya menggunakan lem pan untuk memasangnya.
Langkah 3: Menghubungkan Perangkat Keras
Hubungkan Sensor TCS3200 seperti di bawah ini:
- S0 ==> Pin Nano D4
- S1 ==> Pin Nano D5
- S2 ==> Pin Nano D6
- S3 ==> Pin Nano D7
- OUT ==> Pin Nano D8
- EN ==> GND
- VCC ==> +5V
- GND ==> GND
Hubungkan Tampilan Serial LCD 2/16 I2C:
- SDA ==> Pin Nano A4
- SCL ==> Pin Nano A5
Pasang Arduino Nano pada Papan Pemancar. Hubungkan output 5V Nano dan GND pada kedua rel daya.
Langkah 4: Kode Arduino
Hal pertama yang harus didefinisikan adalah penskalaan frekuensi seperti yang ditentukan pada tabel di atas. Pin S0 dan S1 digunakan untuk itu. Penskalaan frekuensi output berguna untuk mengoptimalkan pembacaan sensor untuk berbagai penghitung frekuensi atau mikrokontroler. Kami akan mengatur S0 dan S1, keduanya ke HIGH (100%):
digitalWrite(s0,HIGH); digitalWrite(s1,HIGH);
Hal selanjutnya yang harus dilakukan adalah memilih warna yang akan dibaca oleh fotodioda (Merah, Hijau, atau Biru), kami menggunakan pin kontrol S2 dan S3 untuk itu. Karena fotodioda terhubung secara paralel, pengaturan S2 dan S3 ke LOW dan HIGH dalam kombinasi yang berbeda memungkinkan Anda untuk memilih fotodioda yang berbeda, seperti yang ditunjukkan pada tabel di atas.
digitalWrite(s2, LOW); digitalWrite(s3, LOW); red = pulseIn(outPin, LOW); // Membaca komponen MERAH dari warna
digitalWrite(s2, HIGH); digitalWrite(s3, HIGH); grn = pulseIn(outPin, LOW); // Membaca komponen HIJAU dari warna
digitalWrite(s2, LOW); digitalWrite(s3, HIGH); blu = pulseIn(outPin, LOW); // Membaca komponen BIRU dari warna
Pada kode akhir, kami akan membaca beberapa kali setiap komponen RGB dan mengambil rata-ratanya, sehingga kami dapat mengurangi kesalahan jika salah satu pembacaan buruk.
Setelah kami memiliki 3 komponen (RGB), kami harus menentukan warna apa itu. Caranya adalah dengan mengkalibrasi proyek sebelumnya. Anda dapat menggunakan kertas uji atau objek berwarna yang dikenal dan membaca 3 komponen yang dihasilkan.
Anda dapat memulai dengan milik saya, dengan mengubah parameter untuk tingkat cahaya Anda:
void getColor() { readRGB(); if (red > 8 && red < 18 && grn > 9 && grn < 19 && blu > 8 && blu < 16) color = "WHITE"; else if (red > 80 && red < 125 && grn > 90 && grn < 125 && blu > 80 && blu < 125) color = "BLACK"; else if (red > 12 && red < 30 && grn > 40 && grn < 70 && blu > 33 && blu < 70) color = "RED"; else if (red > 50 && red < 95 && grn > 35 && grn < 70 && blu > 45 && blu < 85) color = "GREEN"; else if (red > 10 && red < 20 && grn > 10 && grn < 25 && blu > 20 && blu < 38) color = "YELLOW"; else if (red > 65 && red < 125 && grn > 65 && grn < 115 && blu > 32 && blu < 65) color = "BLUE"; else color = "NO_COLOR"; }
Seperti yang Anda lihat di atas, saya telah menentukan 6 warna: putih, hitam, merah, hijau, kuning, dan biru. Seperti cahaya lingkungan menurun, parameter cenderung naik.
Di dalam loop(), saya menentukan pembacaan tampilan pada LCD setiap 1 detik.
Kode lengkap dapat ditemukan di GitHub saya.
Langkah 5: Kesimpulan
Seperti biasa, saya harap proyek ini dapat membantu orang lain menemukan jalan mereka dalam dunia elektronika, robotika, dan IoT yang menarik!
Silakan kunjungi GitHub saya untuk file yang diperbarui: Color Detector
Untuk proyek lainnya, silakan kunjungi blog saya: MJRoRobot.org
Salam dari selatan dunia!
Sampai jumpa di tutorial saya selanjutnya!
Terima kasih,
Marcelo
Kode
- Cuplikan Kode #2
- Cuplikan Kode #3
Cuplikan Kode #2Teks Biasa
digitalWrite(s2, LOW); digitalWrite(s3, LOW); red = pulseIn(outPin, LOW); // Membaca komponen MERAH dari warna digitalWrite(s2, HIGH); digitalWrite(s3, HIGH); grn = pulseIn(outPin, LOW); // Membaca komponen HIJAU dari warna digitalWrite(s2, LOW); digitalWrite(s3, HIGH); blu = pulseIn(outPin, LOW); // Membaca komponen BIRU dari warna
Cuplikan Kode #3Teks Biasa
void getColor() { readRGB(); if (red > 8 && red < 18 && grn > 9 && grn < 19 && blu > 8 && blu < 16) color = "WHITE"; else if (red > 80 && red < 125 && grn > 90 && grn < 125 && blu > 80 && blu < 125) color = "BLACK"; else if (red > 12 && red < 30 && grn > 40 && grn < 70 && blu > 33 && blu < 70) color = "RED"; else if (red > 50 && red < 95 && grn > 35 && grn < 70 && blu > 45 && blu < 85) color = "GREEN"; else if (red > 10 && red < 20 && grn > 10 && grn < 25 && blu > 20 && blu < 38) color = "YELLOW"; else if (red > 65 && red < 125 && grn > 65 && grn < 115 && blu > 32 && blu < 65) color = "BLUE"; else color = "NO_COLOR"; }
Github
https://github.com/Mjrovai/Color-Detector
Skematik
Hardware
https://github.com/Mjrovai/Color-Detector/blob/master/Color%20Detector.fzz