Friday, May 25, 2012

Sensor warna ekonomis menggunakan Led RGB dan LDR

Dengan menggunakan LED RGB dan LDR, kita dapat membuat sensor warna yang cukup memadai, prinsip kerjanya adalah dengan melakukan pencatatan terhadap masing-masing pantulan sinar warna (Merah,Hijau dan Biru) terhadap kertas warna tertentu, kombinasi nilai pantulan tersebut digunakan sebagai nilai referensi warna tersebut.


Contoh hasilnya sbb:



Wiring dan skematik


Sketch Program:
---
/* Program sensor warna
   Oleh   : Aan Darmawan
   web    : valfa.blogspot.com
   update : 25 Mei 2012
*/
   
#include <Servo.h> 
Servo myservo; 
int sensorPin = A0;
int LedBiru =3; // Led warna biru digital pin 3
int LedHijau=4; // Led warna hijau digital pin 4
int LedMerah=5; // Led warna merah digital pin 5
int hasil,hasilb,hasilm,hasilh;
int k=8;  // toleransi warna

void setup() {
// declare the ledPin as an OUTPUT:
  pinMode(LedBiru,OUTPUT);
  pinMode(LedMerah,OUTPUT);
  pinMode(LedHijau,OUTPUT);  
  digitalWrite(LedBiru,LOW);
  digitalWrite(LedMerah,LOW);
  digitalWrite(LedHijau,LOW);
  myservo.attach(9);  // motor servo pin digital 9
  myservo.write(90);      
  delay(100);       
  Serial.begin(9600);
  delay(1000);
}

void loop() {
  // nyalakan LedMerah
  digitalWrite(LedMerah,HIGH);
  //delay 150 ms agar LDR baca stabil
  delay(150);
  // baca data sensor
  hasil= analogRead(sensorPin);
  hasilm=map(hasil,0,1023,0,255);
  Serial.print("R,G,B = ");
  Serial.print(hasilm); 
  digitalWrite(LedMerah,LOW);    
  delay(150);

  // nyalakan LedHijau
  digitalWrite(LedHijau,HIGH);
  //delay 150 ms agar LDR baca stabil
  delay(150);
  // baca data sensor
  hasil= analogRead(sensorPin);
  hasilh=map(hasil,0,1023,0,255);  
  Serial.print(",");
  Serial.print(hasilh); 
  digitalWrite(LedHijau,LOW);    
  delay(150);
  
  // nyalakan LedBiru
  digitalWrite(LedBiru,HIGH);
  //delay 150 ms agar LDR baca stabil
  delay(150);
  // baca data sensor
  hasil= analogRead(sensorPin);
  hasilb=map(hasil,0,1023,0,255);  
  Serial.print(",");
  Serial.println(hasilb); 
  digitalWrite(LedBiru,LOW);  
  delay(150);

  // cek warna dibandingkan dengan nilai hasil kalibrasi
  if(abs(hasilm-208)<k && abs(hasilh-203)<k && abs(hasilb-177)<k){
    Serial.println(" -> WARNA PUTIH!\n");
    myservo.write(10);    } else
  if(abs(hasilm-209)<k && abs(hasilh-165)<k && abs(hasilb-139)<k){
    Serial.println(" -> WARNA MERAH !\n");
    myservo.write(30);   } else
  if(abs(hasilm-135)<k && abs(hasilh-182)<k && abs(hasilb-147)<k){
    Serial.println(" -> WARNA HIJAU !\n");
     myservo.write(50); }  else  
  if(abs(hasilm-138)<k && abs(hasilh-163)<k && abs(hasilb-166)<k){
    Serial.println(" -> WARNA BIRU !\n");
    myservo.write(70);   } else
  if(abs(hasilm-156)<k && abs(hasilh-184)<k && abs(hasilb-172)<k){
    Serial.println(" -> WARNA CYAN !\n");
    myservo.write(90);   } else
  if(abs(hasilm-199)<k && abs(hasilh-159)<k && abs(hasilb-170)<k){
    Serial.println(" -> WARNA UNGU !\n");
     myservo.write(110); }  else  
  if(abs(hasilm-209)<k && abs(hasilh-214)<k && abs(hasilb-223)<k){
    Serial.println(" -> WARNA KUNING !\n");
    myservo.write(130);   }  else  
  if(abs(hasilm-210)<k && abs(hasilh-206)<k && abs(hasilb-211)<k){
    Serial.println(" -> WARNA PINK !\n");
    myservo.write(150);   } else
  if(abs(hasilm-165)<k && abs(hasilh-197)<k && abs(hasilb-205)<k){
    Serial.println(" -> WARNA HIJAU MUDA !\n");
    myservo.write(170);   } else
//  if(abs(hasilm-209)<k && abs(hasilh-204)<k && abs(hasilb-210)<k){
//    Serial.println(" -> WARNA KUNING MUDA!\n");
//     myservo.write(180); } else
    Serial.println(" -> ???\n");     
    
  delay (2000);
}

---



90 comments:

Fajar said...

wah, Inovasinya oke punya nih..

kira" total biaya pembuatan sensornya brp ya pak?

terima kasih sebelumnya

Fajar, Elektro UKM

Aan Darmawan H said...

Kalau hanya sensornya saja di bawah 20rb... :-), komponen inti yang lain: mikrokontroler (saya menggunakan arduino elmarino) dan servo motor

Franzy said...

pak...
bukan nya LDR tuh cmn ngebaca intensitas cahaya ya..??

Aan Darmawan H said...

Betul, tapi nilai resistansi yang dihasilkan juga dipengaruhi oleh panjang gelombang (dalam hal ini warna)dari cahaya tersebut, jadi dipengaruhinya oleh intensitas cahaya dan panjang gelombangnya....

Anonymous said...

schematic arduino mana mas sekalian code nya donk...!!!

edysersan said...

keren idenya pak Aan,,wah mau dicoba dirumah ni, kebetulan pernah beli severino sama bapak...hehehe

PPI_Kota_Sukabumi said...

cara kerja sesornya gimana tu pa masih bingung maklum nubi,,,

go hye jo fans said...

jika warna kertas uji sama dengan warna led yg menyala berarti intensitas cahaya yang terpantul ke LDR akan berbeda, kurang lebih begitu ya pak konsepnya?? sebelumnya bpak mengukur besar intensitas nya dulu ya baru mengkalibrasinya sedemikian hingga bisa dideteksi ya pak? idenya mantap pak, tapi jarak kertas uji ama led RGB gak bisa jauh ya pak? dan clo memakai bahan uji lain seperti kain butuh kalibrasi ulang ya pak?

Aan Darmawan H said...

@Sandy, betul sekali semua apa yang anda tulis, betul juga karena ldr peka terhadap cahaya, agar tidak "terganggu" cahaya sekitarnya,maka jarak pengukuran tidak bisa jauh,dan pengukuran dilakukan pada ,"ruang tertutup" sehingga hanya pantulan cahaya Led RGB terhadap "benda berwarna" saja yang mempengaruhinya...

Unknown said...

Pak Aan, apakah ini bisa digunakan untuk jenis arduino lain? saya menggunakan Arduino Uno.
apakah ada perbedaan skema dan list programny?

Aan Darmawan H said...

@Helmi,rangkaian ini bisa menggunakan arduino uno,duemilanov ataupun lainnya,skema dan list programnya sama,kecuali angka2 RGB untuk pembanding tiap warna,harus dikalibrasi sendiri,disesuaikan dengan sensor yg digunakan..

Ayah Fina said...

menarik sekali mas.. jadi pengen mencobanya

Aan Darmawan H said...

@Ayah Fina:silahan bereksperimen mas... Skema rangkaian sudah saya share di atas....;)

Ayah Fina said...

oya mas, saya sudah lama merencanakan eksperimen bikin shutter speed tester untuk kamera analog (sebuah hobi di waktu senggang). karena akses terhadap komponen elektronika yg agak susah di sini, ide saya memanfaatkan sensor mouse-wheel dan duemilanove yg saya punya (btw, saya hanya tahu elektronika sebatas hobi).

saya langsung saja hubungkan optoelektrik bekas mouse tersebut, yg bening saya anggap LED dan yg hitam saya anggap sensornya. Led saya beri input dan kemudian saya baca di sensor tidak ada apa2, baik ketika bebas maupun saya beri penghalang. polaritas LED dan sensor saya anggap benar dengan melihat jalurnya pada mouse karena saya tidak punya datasheetnya.

pertanyaan saya:
- apakah bisa sensor mouse tersebut saya gunakan untuk keperluan di atas?
- seandainya bisa, apakah cukup berdaya untuk menguji kecepatan shutter speed hingga 1/1000 atau 1/2000 detik

kiranya Mas Aan mau berbaik hati memberikan petunjuk atau syukur2 ulasan teknis utk saya coba... hehehehe

Aan Darmawan H said...

Saya belum pernah mencoba IR dari bekas mouse, tapi untuk memastikan pemancar IR (betul, yang berwarna putih bening umumnya),coba beri tegangan selanjutnya lihat melalui kamera HP, kalau berfungsi baik, coba anoda dan katoda IR penerima (yang berwarna gelap) dibalik polaritasnya.

untuk menguji kecepatan shutter 1/2000 detik, berarti sensor harus mampu merespon <=0,5ms itu harus lihat pada datasheet IR nya, kalau arduino duemilanove nya rasanya masih mampu..

mudah2an membantu...

Anonymous said...

mas sy mau tanya nilai warna RGB nya ko ga stabil ya ketika membaca warna merah harusnya kan nilai RGB nya itu (R=255 G=0 B=0) ko disini nilai nya sama semua ya,mohon info nya...tq

Aan Darmawan H said...

r=255,g=0 dan b=0, itu setting warna merah pada tampilan layar monitor komputer,sedangkan sensor cahaya (misal LDR) baca panjang gelombang merah yang dikonversi menjadi tegangan selanjutnya melalui ADC kecil kemungkinannya menghasilkan angka 255 pada r dan 0 pada lainnya, sangat tergantung rangkaian sensornya, dan kenyataannya kertas yang disensor hasil komposisi warna r,g dan b yang r nya dominan, jadi kecil sekali kemungkinannya seperti yang anda maksud.

Ayi said...

PAk kalau boleh tahu, bapak pakai servo standar merek apa ya pak...
soalnya saya sudah mencoba program ini tetapi gerakakan servonya tidak sesuai, misalnya saya arahkan ke arah 10 atau 45 derajat servo malah bergerak ke sudut 0 derajat..
tolong bantuannya pak...

Aan Darmawan H said...

Servo yang saya gunakan adalah MG946R
atau MG995 juga bisa

Unknown said...

Pak kotak kecil yang tempat LDR dan RGB itu penempatsn posisinya bagaimana ya? Bisa ditunjukkan tidak gambarnya?

Aan Darmawan H said...

@Beby: silahkan simak video demonya, pada saat awal video/tampilan judul latarnya adalah tampilan penempatan led RGB dan LDR nya .. :-)

Unknown said...

Pak maaf sebelumnya,saya boleh minta nomor yang bisa dihubungi ga?saya mau bertanya lebih lanjut.kalo boleh bisa dkirim lewat email saya,bebymauliahputri@yahoo.com
Terimakasih :)

Aan Darmawan H said...

Silahkan email ke valfa007@gmail.com ... welcome

Unknown said...

Pak mau tanya, itu fungsi map(n, a, b, c, d) untuk apa ya?
Lalu bisa tidak pak jika LDR nya saya ganti dengan photo dioda?

Aan Darmawan H said...

@Galang: m=map(n,a,b,c,d) berfungsi untuk memetakan suatu nilai n pada rentang nilai tertentu (nilai terkecil a sd nilai terbesar b) menjadi nilai m pada rentang nilai yang baru ( nilai terkecil c sd nilai terbesar d), contoh , diketahui n=512 ; maka m=map(n,0,1023,0,255); akan menghasilkan m= 128
perhitungannya
m= (d-c)/(b-a)*n

Unknown said...

Makasih Pak Jawabannya, jadi nambah ilmu baru. :) Ini untuk mengatasi input analog yang punya rentang berbeda dari PWM ya Pak? Selama ini saya pakai rumus yang bawah Pak. Hehehe,,

Oh iya Pak, bisa tidak itu diganti dengan photodioda. Sekalian mau tanya, kenapa kok robot line follower kebanyakan menggunakan photodioda, padahal dengan LDR kan juga bisa? Apakah ada hubungannya dengan kepresisian pembacaan intensitas cahaya? Terima Kasih untuk ilmu barunya Pak Darmawan,,

Aan Darmawan H said...

@Galang: LDR diganti dengan Photodioda prinsipnya bisa saja, hanya rentang sensitivitas photodioda terhadap panjang gelombang cahaya sempit/selective (maka dari itu lebih cocok digunakan untuk deteksi cahaya pada robot line follower, karena tidak terlalu terpengaruhi oleh cahaya sekitarnya) ,ada kemungkinan sulit pengukuran/kalibrasi terhadap berbagai intensitas warna cahayanya, tapi patut di coba tuh.... :-)

success said...

pak. nilai kalibrasi sebagai referansi warnanya itu diambil dari mana? apa tegangan ldr, tahanan atau nilai apanya? terus bagaimana cara mendapatkan nilai tersebut?

Aan Darmawan H said...

@success, prinsipnya sbb: siapkan kertas warna yg akan dikalibrasi warnanya,kemudan letakan sensor di atasnya,nyalakan led merah dan catat nilai responnya (melalui serial monitor),demikian pula lakukan thd respon nyala led hijau dan biru dan catat masing2 nilainya. Jadi akan diperoleh 3 nilai respon dari mading masing sinar led per tiap kertas warna, itulah nilai kalibrasinya

ramadhan said...

untuk menggambar rangkaian itu(yg warna) pake apa mas???

Aan Darmawan H said...

@Ramadhan: Gunakan Fritzing bisa download via internet,sotware-nya open source

ramadhan said...

wah,,, makasih infonya mas,.. mau tanya lagi boleh?? hehehe.. tolong jelasin yg (int k=8; // toleransi warna) itu mksdnya gimana mas?

Aan Darmawan H said...

@Ramadhan: hasil pengukuran respon cahaya oleh LDR kadang kurang stabil tetapi berkisar diantaranya, misal hasil suatu pengkuran cahaya kadang tercatat 200,kadang 204 kadang 195,maka hal ini dikompensasi dengan variabel k tersebut, sedangkan angka 8 diperoleh dari hasil coba-coba saja.

Unknown said...
This comment has been removed by the author.
Unknown said...
This comment has been removed by the author.
Unknown said...

how i should calibrate this please ?
what should i do ?
and can you please tell me how did you find the numbers ? 208, 203, 177 :/
please help me !

if(abs(hasilm-208)<k && abs(hasilh-203)<k && abs(hasilb-177)<k){

Aan Darmawan H said...

for calibration: prepare colored paper that will be calibrated color, then put a sensor on it, turn on the red LED and record the value of the response (you can monitoring the value via serial monitor), so too did the response of the green and blue LED flash and record each value. So be obtained 3 response value of each LED light per each paper color (such the value 208,203 and 177 ).

Unknown said...

ijin copy programnya pak

Aan Darmawan H said...

@Agus, silahkan copy, saya publish secara free.... mudah2an bermanfaat... :-)

Unknown said...

Pak saya mao nanya ni , yang warna biru apa ya ?

Aan Darmawan H said...

@Irfan, yang kotak biru itu hanyalah sebuah kotak untuk menyimpan rangkaian sensor, berisi pcb LDR dan Led RGB (lihat video dan baca komentar2 sebelumnya)

Unknown said...

Ow iya iya , tapi saya nyoba engga bisa pak , engga bisa kedeteksi , motor servonya juga engga bergerak

Unknown said...

Kalo pake motor servo mg 996r bisa gak pak ?

Aan Darmawan H said...

Bisa Pake Motor servo MG996R, ga masalah. Coba kalibrasi dulu sensornya, caranya silahkan baca komentar2 sebelumnya, sudah ada pembahasannya.

Unknown said...

Pak maaf ne saya mao tanya lagi , mencari nilai kalibrasinya kemaren udah saya coba tapi ko beda beda ya pak engga stabil dan lagi nilainya pun rendah pak

Aan Darmawan H said...

@Irfan, apakah LDR yang digunakan yang ukuran sedang/besar? jangan pakai LDR yang berukuran kecil. penyolderan rangkaiannya harus benar-benar mantap,rangkaian Sensor (LDR dan LED RGB pada ruang tertutup, sedapat mungkin tidak dipengaruhi cahaya luar).

Unknown said...

sangat bermanfaat banget ilmunya pak darmawan. saya mau bertanya apakah bisa pak, ini dikembangkan sehingga bisa membaca 2 warna atau lebih pada 1obyek ???

Aan Darmawan H said...

@Rio, terima kasih, sepertinya tidak mudah kalau kelaigus bisa baca 2 warna atau lebih, apalagi kalau posisi warnanya acak/random, mungkin sensor yang lebih tepat adalah camera/webcam dan kemudian diolah melalui image proccessing, saran saya kalau sudah image proccessing sebaiknya pakai rasppi atau sejenisnya.

Unknown said...

pak kalo boleh saya minta review tentang ADC nya kalo dibuat ke digital berapa volt setiap warna
maaf pak soalnya dosen saya nanyain rumusnya buat konversiin ke digitalnya

Aan Darmawan H said...

ADC pada arduino UNO yg sebenarnya core nya adalah microcontroler ATMEGA 328, mempunyai resolusi 10bit, mempunyai rentang pengukuran nilai digital 0- 1023, apabila sumber teg referensi ADC 5V, maka keluaran hasil pengukuran teg pada ADC y dalam nilai digitalnya (nd) akan memenuhi pers nd=Vin/5x1023

Unknown said...

makasih atas penjelasannya pah sangat membantu

arfai said...

mas itu fungsi map codenya gimana? yang hasil sama hasilb juga seperti apa fungsinya?

Aan Darmawan H said...

@Arfai, baca postingan comment sebelumnya, fungsi map sudah dibahas

Unknown said...

klo menggunakan image proccessing itu cara kerjanya bagaimana pak? dan menurut pak darmawan apakah berhasil membaca lebih dari satu warna menggunakan camera/webcam? izin sharing yak pak darmawan hehehe...

Aan Darmawan H said...

@Rio, banyak cara untuk mendapatkan informasi warna pada suatu citra, silahkan berselancar di internet, mungkin kata kunci yang bisa membantu "color detection"

Unknown said...

Om klo ntar output nya bisa di tambahkan berupa text di lcd (Jika merah = di lcd misal lcd 16x4 muncul text "Merah" dll) ntar edit sricpt nya gmn >.<

Aan Darmawan H said...

@Ramdan, silahkan pelajari penggunaan LCD 16x4 di Arduino (contohnya http://web.alfredstate.edu/weimandn/programming/lcd/ATmega328/LCD_code_ino_4d.html ), kemudian gabungkan dengan rangkaian ini...
Selamat bereksperimen.....

Unknown said...

mas kalo untuk mendeteksi warna cairan akurat gak ya?

Aan Darmawan H said...

@Halida,ditinjau dari jenis sensor, tidak akan bisa mencapai keakuratan yang tinggi tetapi sangat relatif, tergantung teknik penempatan sensor dan cairannya serta keinginan keakuratannya sampai berapa besar? saya rasa kalau untuk cairan yang transparan akan sulit kalibrasinya, tapi kalau cairan yang tidak transparant (seperti air susu, coklat) masih memungkinkan.

Unknown said...

Pak motor servo yg bapak gunakan itu tipe apa ya?

Unknown said...

Oh iya kalo arduino disambungkan dengan labview bagaimana caranya pak sehingga led rgb nya dihidupkan menggunakan labview, dan juga ada tampilan warna di labview yg terbaca oleh led nya?

Aan Darmawan H said...

@Isal Basya, silahkan baca pada diskusi sebelumnya,krn sudah saya infokan type servo nya, mengenai koneksi dengan labview, saya belum pernah mencobanya ... silahkan cari melalui google....:-)

Unknown said...

maaf mau nanya pak, untuk mendeteksi warna kaca apakah bisa?

Aan Darmawan H said...

@Edwin, kalau yang dimaksud kaca berwarna transparant secara teoritis memungkinkan,proses penyensorannya untuk rangkaian di atas, urutannya adalah : sumber cahaya (Led RGB) - Kaca - Sensor LDR; jadi kaca seolah-olah merupakan filter warna cahaya thd sensor. Itu ide nya.
Selamat bereksperimen..

Unknown said...

Ldrnya lebih tinggi dari lednya apa lednya yg lebih tinggi yah ?

Aan Darmawan H said...

@okta,LDR nya lebih bawah dari LED nya

Unknown said...

pak,,numpang nanya jg ya,kalau misalnya kita gak gunakan LDR ,apa masih bisa sensor RGB berkerja pak?

Aan Darmawan H said...

Dalam rangkaian di atas, LDR adalah komponen sensor, kalau tidak digunakan, ga ada komponen sensornya.... mau menyensor pakai apa?

Unknown said...

Can I make it using pic microcontroller? If yes then plzz give me some idea.i am from india.

Aan Darmawan H said...

of course, you can use PIC18F4550 (with built-in ADC) for this project, but unfortunately I never using PIC micro controller for my Project.

Unknown said...
This comment has been removed by the author.
Unknown said...

Itu yang sensor pembacanya? Gmn buat nya?

Aan Darmawan H said...

@Maulana: lihat skematik dan contoh videonya...

Unknown said...

Mau tanya cara kalibrasi angka2 RGB untuk pembanding tiap warna gmn?

Unknown said...

Mau tanya cara kalibrasi angka2 RGB untuk pembanding tiap warna gmn?

Aan Darmawan H said...

@Maulana, cara kalibrasi sudah pernah dibahas dalam forum diskusi ini, silahkan baca diskusi2 di atas, trims

Arek_Njuwet said...

Apakah untuk mendeteksi warna barang cair bisa..

Aan Darmawan H said...

@Agus , barang cair yang tidak tembus pandang (misal susu,coklat) mungkin bisa , hanya saja perlu dipikirkan peletakan sensornya, untuk barang cair tembus pandang (misal:sirop) saya tidak yakin dapat berhasil dengan baik.

Unknown said...

asalamualiakum
bang cara untuk kalibrasi warna nya gimana

butuh banget bimbingan nya

makasih

Aan Darmawan H said...

@Andi, silakan baca diskusi - diskusi seblumnya, sudah dibahas sebelumnya

Terima kasih

Unknown said...

Maaf pak mau tanya, kenapa LDR sama servonya responya lama.?

Unknown said...

Sensornya apa pak? Trus mengetahui nilainya dimonitor?melalui aplikasi apa pak?

Unknown said...

permisi pak, bedanya pakai led rgb dengan sensor tcs230 itu apa ya? dari program dan skematiknya apa ada yg di ubah?

Aan Darmawan H said...

tentu saja beda led rgb dengan sensor tcs230, led rgb adalah LED bukan sensor, kalau tcs230 itu IC Sensor yang dapat mengkonversi warna cahaya menjadi frekuensi, perubahannya cukup banyak silahkan pelajari datasheet tcs230

ALVIN NUGROHO said...

Pak aan maksud dari angka hasilm=map(hasil,0,1023,0,255);
Itu apa ya?

Aan Darmawan H said...

silahkan baca refensi nya di https://www.arduino.cc/reference/en/language/functions/math/map/

Khoerul said...

Bila alat ujinya di ganti dgn monitor bisa ga

Unknown said...

We ayudame con mi proyecto esq no funciona y lo hice con un do wile

Aan Darmawan H said...

Pertanyaan: Bila alat ujinya di ganti dgn monitor bisa ga ?
jawab: bisa, tetapi harus di kalibrasi lagi

syah said...

salam,ada tak video cara membuat rgb+ldr? saya mahu membuat untuk final projek