7. PROYEK LAIN-LAIN DENGAN MICROCONTROLLER ARDUINO
Pada bagian ini akan dibahas beberapa proyek yang mungkin tidak bisa dikelompokkan menjadi satu bagian khusus, sehingga dinamakan proyek Iain-Iain. Adapun pembahasannya meliputi sensor getaran (vibration sensor), potensiometer digital (rotary encoder) dan sensor pendeteksi warna (colorsensor). Semoga dari pembahasan ini bisa menjadi ide dasar untuk mengembangkan proyek lanjutan yang lebih kompleks.
7.1 Pendeteksi Getaran Dengan Sensor Vibration SW-420
Gambar 7.1 Sensor Getar SW-420
Skenario proyek yang akan dibuat sederhana saja, yaitu ketika sensor getar mendapat aksi getaran disekitarnya maka LED akan menyala dengan sendirinya.
Kebutuhan Bahan
Bahan | Jumlah | Nilai | Keterangan |
Sensor Vibration SW-420 | 1 pcs | ![]() ![]() |
|
Resistor | 1 pcs | 220 ohm | |
LED 5MM | 1 pcs |
Diagram Sketch
Rangkai module sensor getar seperti pada diagram sketch. Module sensor getar terdiri pin VCC yang dihubungkan ke VCC Arduino, pin GND dihubungkan ke GND Arduino dan pin DO (Digital Out) dihubungkan ke pin D9 Arduino.
Kode Program
int vib_pin = 9; // pin sensor vibration
int led_pin = 8; // pin LED void setup() { pinMode(vib_pin, INPUT); pinMode(led_pin, OUTPUT); } void loop() { int val = digitalRead(vib_pin); if(val ==1) { // Jika terdeteksi getaran digitalwrite(led_pin, HIGH); delay(1000); digitalwrite(1ed_pin, LOW); delay(1000); } else digitalwrite(1ed_pin, LOW); } |
Adapun hasil akhir proyek kurang lebih tampak pada Gambar 7.2
-
- Digital Potensiometer (Rotary Encoder)
Prinsip kerja rotary encoder serupa dengan potensiometer analog, tetapi rotary encoder berkerja secara digital. Rotary encoder dapat berputar ke kanan atau ke kiri tanpa batasan berhenti, tidak seperti potensiometer analog yang memiliki keterbatasan putaran (Gambar 7.5). Rotary encoder bisa pula difungsikan sebagai tombol push button. Untuk mengetahui lebih detil bagaimana prinsip kerja rotary encoder, silahkan kunjungi https://howtomechatronics.com/ tutorials/Arduino/rotary-encoder-works-use-Arduino/.
Terdapat dua macam encoder yang banyak beredar, yaitu rotary encoder itu sendiri dan modul rotary encoder yang telah disertai dengan resistor pull-up’ seperti tampak pada Gambar 7.3 dan Gambar 7.4.Jika Anda hanya menggunakan rotary encoder tanpa modul, maka Anda harus menambahkan dua resitor pull-up dengan skema seperti tampak pada Gambar 7.6
Gambar 7.4. Modul | Gambar 7.5. Modul | |
Gambar 7.3. Rotary Encoder | Rotary Encoder (Digital | Rotary Encoder (Analog |
(Digital Potensiometer) | Potensiometer) | Potensiometer) |
Gambar 7.6 Rotary Encoder Disertai 2 Resistor Pull-Up 10K Ohm
Rotary encoder memiliki 5 kaki yang terdiri dari CLD (Clock), DT (Data), SW (Switch/Skalar), VCC dan GND.
Skenario proyek adalah menghidupkan LED yang terkesan berjalan dari kiri ke kanan atau sebaliknya, dimana hanya satu LED dari enam LED yang bisa menyala. Jika LED yang menyala berada di posisi paling kanan (LED 6), sedangkan rotary terus diputar ke kanan, maka LED akan menyala dari urutan pertama lagi. Sebaliknya jika LED yang menyala di posisi paling kiri (LED 1), sedangkan rotary terus diputar ke kiri, maka LED akan menyala dari urutan keenam. Jika rotary encoder ditekan atau difungsikan sebagai tombol saklar, maka semua LED akan menyala secara berlahan dari kiri ke kanan dan mati secara berlahan dari kanan ke kiri.
Kebutuhan Bahan
Bahan | Jumlah | Nilai |
Keterangan |
Modul Rotary Encoder | 1 pcs | ![]() ![]() |
|
Res;stor | 6 pcs | 330 ohm | |
LED SMM | 6 pcs |
Diagram Sketch
Kode program membutuhkan library rotary encoder Rotary.h yang dapat di download di https://github.com/brianIow/Rotary dan library Button.h yang dapat di download https://github.com/JChristensen/JC_Button. Kemudian install kedua library dari menu Sketch Include Library Add .ZIP Library Arduino seperti cara sebelumnya.
Kode Program
#include <JC_Button.h>
#include <Rotary.h> #define pinCLK 2 #define pinDT 3 #define pinSW 4 Button tombolSW(pinSW); Rotary r= Rotary(pinCLK,pinDT); uint8_t urutan=1; void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); digitalwrite(5, HIGH); tombolsw.begin(); } void loop() { // Rotary encoder sebagai saklar push button tombolsw.read(); if (tombolSW.wasReleased()) { // Matikan semua LED for (int i = 5; i <= 10;i++) { digitalwrite(i, LOW); } delay(2000); } // Hidupkan semua LED dari kiri ke kanan for (int i =5; i<=10;i++){ digitalwrite(i, HIGH); delay(200); } delay(1000); // tunda 1 detik // Matikan semua LED dari kanan ke kiri for(int i=10;i>=5;i–){ digitalwrite(i, LOW); delay(200); } delay(1000); // tunda 2 detik // Hanya menghidupkan LED pertama digitalwrite(5, HIGH); urutan=1; } unsigned char result = r.process(); if (result m= DIR_CW){ // putar kanan if (urutan <= 6) { urutan++; // tambahkan urutan dengan 1 }else { urutan =1; // kembalikan ke urutan 1 } else if (result==DIR_CCW){ // putar kiri (DIR_CCW) if(urutan >=1){ urutan–; // kurangi urutan dengan 1 }else{ urutan = 6; // kembalika ke urutan 6 } } LEDHidup(urutan); // panggil fungsi LEDHidup } void LEDHidup(uint8_t item){ for(int i=5;i<=10;i++){ digitalwrite(i, LOW); // matikan semua LED } // item ditambah 4 karena pin LED dimulai dari 5 // hidupkan LED ini saja digitalwrite(item + 4, HIGH); } |
Hasil akhir proyek sepert tampak pada Gambar 7.7
Gambar 7.7 Hasil Akhir Proyek Rotary Encoder
7.3 Pendeteksi Warna Dengan Color Sensor TCS230/TCS3200
Sensor warna TCS230/TCS3200 bekerja dengan bantuan array 8×8 photodiodes. Kemudian dari pembacaan dioda tersebut dikonversi (arus-ke-frekuensi) menjadi gelombang digital dengan frekuensi berbanding lurus terhadap intensitas cahaya. Akhirnya Arduino akan membaca output gelombang persegi
tersebut menjadi warna yang dideteksi. Sebagai ilustrasi tampak pada Gambar 7.8
Gambar 7.8 Cara Kerja Sensor Warna TCS3200
Jika sensor TCS3200 dilihat dari dekat maka akan tampak sensor memiliki tiga jenis photodiode yang berbeda warna, terdiri dari 16 filter warna hijau, 16 filter warna biru, 16 filter warna merah serta 16 tak berwarna (tanpa filter) seperti tampak pada Gambar 7.9.
Gambar 7.9 Inti Sensor TCS3200 (Sumber: https://howtomechatronics.com/)
Setiap 16 photodiodes terhubung secara paralel, jadi dengan menggunakan dua pin kontrol S2 dan S3 kita dapat memilih mana dari mereka yang akan dibaca. Jika kita ingin mendeteksi warna merah, maKa kita bisa menggunakan 16 foto merah yang difilter dengan menyetel dua pin S2/S3 ke tingkat logika LOW sesuai dengan tabel di bawah ini.
S0 | S1 | Penskalaan Output Freq. |
LOW | LOW | Power Down |
LOW | HIGH | 2% |
HIGH | LOW | 20% |
HIGH | HIGH | 100% |
S2 | S3 | Jenis Photodiode |
LOW | LOW | Merah |
LOW | HIGH | Biru |
HIGH | LOW | Clear |
HIGH | HIGH | Hijau |
Sensor TCS3200 memiliki dua pin kontrol, SO dan Sl yang digunakan untuk menskalakan frekuensi output. Frekuensi dapat diskalakan ke tiga nilai preset yang berbeda dari 100%, 20% atau 2%. Fungsi penskalaan frekuensi ini
memungkinkan keluaran sensor dioptimalkan untuk berbagai penghitung frekuensi atau mikrokontroler.
Kita akan membuat proyek sensor warna TCS3200 sederhana yaitu bagaimana menampilkan nilai komposisi warna RGB (Merah, Hijau, Biru) dari warna yang terdeteksi dengan Skala 0 sampai 255, kemudian nilai tersebut akan ditampilkan ke Serial Monitor. Sebagai bahan pengujian, kita perlu mencetak beberapa warna berbeda pada kertas A4 untuk dideteksi oleh sensor warna TCS3200. Anda dapat memperolehnya di https://www.materialpalette.com/ seperti tampak pada Gambar 7.10.
Gambar 7.10 Contoh Warna (Sumber: https://www.materialpalette.com/)
Kebutuhan Bahan
Bahan | Jumiah | Nilai | Keterangan |
Modul Sensor Warna TCS3200 | 1 pcs | ![]() ![]() |
|
Modul LCD 16×2 | 1 pcs | ![]() ![]() |
Kode Program
#include <Wire.h>
#include <LiquidCrystal_I2C.h> #define S0 4 #define S1 5 #define S2 6 #define S3 7 #define sensorOut 8 // Inisialisasi library // Atur alamat LC pada 0x27 untuk tampilan LCD 16 karakter 2 baris LiquidCrystal_I2C lcd(0x27, 16, 2); unsigned int merahFreq = 0, hijauFreq = 0, biruFreq =0; void setup(){ lcd.init(); // Inisialisasi LCD lcd.backlight(); // Menghidupkan backlight pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(sensorOut,INPUT); // Pensklaan frekwensi menjadi 20% digitalwrite(Sø, HIGH); digitalwrite(S1, LOW); Serial.begin(9600); } void loop(){ // Pengaturan photodiode filter warna merah digitalwrite(S2, LOW); digitalwrite(S3, LOW); // Membaca frekwensi output merahFreq = pulseIn(sensorOut, LOW, 25000) / 2; // Pengaturan photodiode filter warna hijau digitalwrite(S2, HIGH); digitalwrite(S3, HIGH); // Membaca frekwensi output hijauFreq = pulseIn(sensorout, LOW, 25000) /2; // Pengaturan photodiode filter warna biru digitalwrite(S2, LOW); digitalwrite(S3, HIGH); // Membaca frekwensi output biruFreq = pulseIn(sensorout, LOW, 25000)/ 2; // Printing the value on the serial monitor Serial.println(“R=”+ String(merahFreq) +“ G=”+ String(hijauFreq)+“B=”+ String(biruFreq)); lcd.clear(); lcd.setCursor(0, 0); lcd.print(“Komposisi Warna”); Icd.setCursor(θ,1); lcd.print(“M=”+String(merahFreq)+“H=”+ String(hijauFreq)+“B=”+ String(biruFreq)); delay(1000); } |
Selanjutnya jalankan programnya untuk melakukan kalibrasi warna. Perhatikan hasil di layar Serial Monitor. Ambil contoh warna biru saja, maka akan terlihat nilai terendah dan tertinggi seiring dengan perubahan jarak antara sensor dengan objek warna yang dideteksi.
Dari sini Anda melakukan kalibrasi dan pengskalaan nilai frekwensi warna menjadi nilai RGB (0 sampai 255). Caranya dengan mengambil nilai terkecil mendekati 0 dan nilai terbesar mendekati 255 pada setiap warna dasar (RGB = merah, hijau, biru). Contoh: nilai frekwensi terbesar yaitu 193 berkorespondesi terhadap nilai 0 dan nilai frekwensi terkecil yaitu 93 berkorespondensi terhadap nilai 255, sehingga map-nya menjadi warnaBiru = map(biruFreq, 93, 193, 255, 0);
Lakukan cara yang sama untuk warna merah dan warna hijau, seperti tampak pada Gambar 7.13.
Berikut ini kode program setelah dilakukan mapping warna dari nilai frekwensi menjadi nilai RGB antara 0 sampai 255.
Kode Program
#include <Wire.h>
#include <LiquidCrystal_I2C.h> #define S0 4 #define S1 5 #define S2 6 #define S3 7 #define sensorOut 8 // Inisialisasi library // Atur alamat LC pada 0x27 untuk tampilan LCD 16 karakter 2 baris LiquidCrystal_I2C lcd(0x27, 16, 2); unsigned int merahFreq = 0, hijauFreq = 0, biruFreq = 0; unsigned int warnaMerah = 0, warnaHijau =0, warnaBiru = 0; void setup(){ lcd.init(); // Inisialisasi LCD lcd.backlight(); // Menghidupkan backlight pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(sensorout, INPUT); // Pensklaan frekwensi menjadi 20% digitalwrite(S0, HIGH); digitalwrite(S1, LOW); Serial.begin(9600); } void loop() { // Pengaturan photodiode filter warna merah digitalwrite(52, LOW); digitalwrite(S3, LOW); // Membaca frekwensi output merahFreq = pulseIn(sensorOut, LOW, 25000) / 2; // lakukan kalibrasi warna merah // nilai map pasti berbeda warnaMerah = map(merahFreq, 74, 250, 255,0); // Pengaturan photodiode flter warna hijau digitalwrite(S2, HIGH); digitalwrite(S3, HIGH); // Membaca frekwensi output hijauFreq = pulseIn(sensorout, LOW, 25000) / 2; // lakukan kalibrasi warna hijau // nilai map pasti berbeda warnaHijau = map(hijauFreq, 102, 245, 255, θ); // Pengaturan photodiode filter warna biru digitalwrite(S2, LOW); digitalwrite(S3, HIGH); // Membaca frekwensi output biruFreq = pulseIn(sensorOut, LOW, 25000) / 2; // lakukan kalibrasi warna biru // nilai map pasti berbeda warnaBiru = map(biruFreq, 127, 254, 255, θ); // Printing the value on the serial monitor Serial.println(“Ra” + String(warnaMerah) +“ G=” + String(warnaHijau) +“ B=” +String(warnaBiru)); lcd.clear(); lcd.setCursor(0, 0); lcd.print(“Komposisi Warna”); lcd.setCursor(0, 1); lcd.print(“M=”+ String(warnaMerah) +“ H=”+ String(warnaHijau)+“B=”+ String(warnaBiru)); delay(1000); } |
Adapun hasil akhir proyek tampak seperti pada Gambar 7.14