Sabtu, 04 Maret 2017

Tutorial Belajar Arduino Part 8: Input Potensiomenter

Potensiomenter
Setelah kita belajar mengatur intensitas cahaya LED dengan pushbutton, kali ini kita akan mengunakan potensiometer. Kelebihan menggunakan potensiometer yaitu kita lebih mudah sebab kita hanya butuh satu alat untuk membuat LED lebih redup atau lebih terang.
Kenapa kita harus melalui mikrokontroller? Kan bisa saja kita menghubungkan langsung ke LED untuk mengatur arus yang masuk? Betul sekali.

Rangkaian Mengatur intensitas cahaya LED dengan potensiometer

Jika kita langsung mengatur LED dengan potensiometer, kita harus memiliki potensiometer yang pas untuk LED tersebut. Jika hambatan potensiometer tidak sesuai, mungkin LED akan mati sebelum potensiometer habis, atau LED sudah full nyalanya ketika potensiometer baru kita naikkan setengah. Jadi, kita tidak bisa menggunakan satu putaran full potensiometer untuk menaikkan atau menurunkan intensitas cahaya LED tersebut. Butuh bukti?
Pada rangkaian menggunakan potensiometer 50k ohm jenis trimmer. Anda juga bisa mencobanya dengan menggunakan potensiometer putar. Yang digunakan di gambar adalah potensiometer trimmer yang ukurannya lebih kecil dan bisa ditancapkan ke project board. Gambar adalah contoh salah satu trimmer.

Gambar Potensiometer jenis trimmer
Berikut tahapan untuk membuat rangkaian tersebut:
1.      Sambungkan kaki negatif LED ke GND dengan jumper
2.      Kaki positif LED dihubungkan ke salah satu ujung kaki (kaki yang bawah) potensiometer dengan jumper
3.      Kaki tengah (kaki di sisi yang sendirian) dihubungkan dengan ujung kaki yang lainnya (kaki yang atas) dengan jumper
4.      Kaki yan atas dihubungkan ke +5v dengan resistor.
Jika Anda memutar kekiri atau ke kanan, maka LED akan menyala lebih terang, tapi LED tidak akan pernah padam. Hal tersebut disebabkan karena arus yang masuk ke LED tidak memungkinkan untuk membuat LED padam. Kenapa? Karena resistor yang dipilih tidak sesuai.
Solusinya, kita bisa menggukan teknik PWM seperti yang kita bahas sebelumnya. Hanya saja, untuk mengatur PWM kita menggunakan potensiometer, bukan pushbutton. Kebayang? ©
Rangkaian
Rangkaian Mengatur Brightness LED dengan potensiometer sama dengan yang di atas..
Untuk membuat Rangkaian siapkan LED, resistor, dan potensiometer. Anda juga bisa menggunakan trimmer.
1.      Kita akan mengontrol LED ke pin 10 pada board Arduino, pin tersebut support PWM
2.      Kedua ujung kaki trimmer yang satu sisi (sisi kanan) masing- masing disambungkan ke +5v dan GND. Jika Anda menggunakan potensiometer putar, yang disambungkan ke + 5v dan GND adalah pin yang paling pinggi.
3.    Pin yang satu (di sebelah kiri) disambungkan ke A0 pada board Arduino. Jika Anda menggunakan potensiometer putar,yang disambungkan ke A0 adalah pin yang tengah pada potensiometer.
Mungkin Anda akan bertanya, kenapa disambungkan ke A0? Begini, pada Arduino terdapat 3 kelompok pin dengan fungsi yang berbeda, yaitu:
·         Pin digital (pin 0 - 13)
·         Pin digital yang support PWM (ditandai dengan tilde “~”, yaitu pin 3, 5, 6, 9, 10, 11)
·         Pin Analog (A0 - A5)
Digital artinya hanya terdiri dari ON dan OFF, atau HIGH dan LOW. Digital dengan PWM artinya, frekuensi ON dan OFF bisa diatur berdasarkan siklus tertentu dalam frekuensi 500 Hz dengan selang antara 0 - 255. Hal ini sudah kita bahas sebelumnya, bukan?
Sedangkan pin Analog, berarti pin tersebut bisa ditulis mempunyai tegangan antara 0 — 5 volt dengan step kenaikan sebanyak 1024. Artinya angka 0 — 1023 akan dikonversi menjadi 0 — 5 volt pada pin tersebut. 0 berarti 0 volt, 1023 berarti 5 volt. Kenapa maksimal 1024?
Sebenarnya selang antara 0 — 5 volt bisa dicacah dengan jumlah tak terhingga. Akan tetapi, mikroposesor memiliki keterbatasan dalam mencacah angka, sehingga batas yang bisa dicacah hanya mencapai 1024 cacahan, yaitu dari 0 — 1023.
Itu sekilas tentang rangkaian yang akan kita buat dan karakteristik pin Analog pada Arduino.

Program
Sketch Mengatur kecerahan LED dengan potensiometer

// Sketch Mengatur kecerahan LED dengan potensiometer
// pin A0 adalah pin Analog
// pin 9 adalah pin digital support PWM
const int pinPot = A0;
const int pinLED = 9;
void setup() {
 pinMode(pinPot, INPUT);
 pinMode(pinLED, OUTPUT);
}
int sensor = 0;
int brightness = 0;
void loop() {
 // baca nilai kaki A0 (sensor, potensiometer)
 sensor = analogRead(pinPot);
 // konversi nilai 0-1023 (Analog) menjadi 0-255 (PWM)
 brightness = map(sensor, 0, 1023, 0, 255);
 
 // tentukan brightness LED dengan PWM
 analogWrite(pinLED, brightness);
}

Ketika program pada Sketch diupload, maka kita bisa mengatur brightness dan hidup- mati LED dengan sempurna, berbeda dengan cara manual seperti Rangkaian. Pada Sketch, ada dua bagian yang perlu diperhatikan:
1.      Pada baris 7, pinPot = A0. A0 adalah variabel untuk pin Analog ke 0. Sebenarnya A0 sama dengan pin 14. Kita juga bisa menggunakan pin tersebut sebagai pin digital. Tapi Anda tidak bisa menggunakan pin digital sebagai pin analog.
2.      Jadi, gunakan pin A0 - A5 jika akan dihubungkan dengan sensor analog.
3.      Pada baris 22, ada fungsi map(). Sebagaimana namanya, fungsi map() digunakan untuk memetakan suatu nilai dari range tertentu ke range yang lain. Berikut adalah parameter dalam fungsi map()
map(value, from_mm, from_max, to_min, to_max);
Maka pada baris 22 berfungsi untuk mengubah nilai sensor yang awalnya ada pada range 0-1024 menjadi nilai dengan range 0-255. Jika sensor benilai 512 (anggap saja V dari 1024), maka nilai tersebut akan dirubah menjadi 127 (anggap saja V dari 255).
Selanjutnya, mari kita coba untuk mengatur durasi kedipan LED berdasarkan nilai pada potensiometer. Jika ‘volume’ potensiometer rendah, durasi kedipan LED akan cepat. Jika ‘volume potensiometer tinggi, maka durasi kedipan LED akan lambat. Saya sebut ‘volume’ karena potensiometer identik dengan alat untuk mengatur volume. ©

Sketch Kedipan LED dengan potensiometer

// Sketch Mengatur kedipan LED dengan potensiometer
// pin A0 adalah pin Analog
// pin 10 adalah pin digital support PWM
const int pinPot = A0;
const int pinLED = 10;
void setup() {
 pinMode(pinPot, INPUT);
 pinMode(pinLED, OUTPUT);
}
int sensor = 0;
void loop() {
 // baca nilai kaki A0 (sensor, potensiometer)
 sensor = analogRead(pinPot);

// durasi kedipan sesuai nilai pada sensor 0-1023
 digitalWrite(pinLED, HIGH);
 delay(sensor);
 digitalWrite(pinLED, LOW);
 delay(sensor);
}


Kedipan LED pada Sketch di atas kurang responsive. Artinya, ketika potensiometer dimaksimalkan, maka delaynya akan lama. Tapi ketika potensiometer langsung diturunkan, paka kedipan LED tetap pada durasi yang lama tersebut. Kenapa? Karena mikrokontroller akan menyelesaikan nilai delay yang diberikan sebelumnya.
Setelah eksekusi semua delay dilakukan, baru potensiometer akan berubah ke durasi delay yang baru. Itulah yang saya sebut dengan kurang responsive. Harusnya, durasi kedipan LED akan segera berubah ketika potensiometer dirubah.


Menghilangkan Delay
Sketch Kedipan LED Responsive tanpa delay

// Sketch Mengatur kedipan Responsif LED dengan potensiometer
// pin A0 adalah pin Analog
// pin 9 adalah pin digital support PWM
const int pinPot = A0;
const int pinLED = 10;
void setup() {
 pinMode(pinPot, INPUT);
 pinMode(pinLED, OUTPUT);
}
long lastTime = 0;
int sensor = 0;
int ledValue;
void loop() {
 // baca nilai kaki A0 (sensor, potensiometer)
 sensor = analogRead(pinPot);

 // led akan hidup/mati dengan durasi = nilai sensor
 // jika nilai sensor 100 maka durasinya adalah 100ms
 if(millis() > lastTime + sensor){
 if(ledValue == LOW){
 ledValue = HIGH;
 }else{
 ledValue = LOW;
 }

 // set lastTime dg nilai millis() yang baru
 lastTime = millis();
 digitalWrite(pinLED, ledValue);
 }
}

Program pada Sketch di atas mempunyai fungsi yang sama dengan Sketch sebelumnya, bedanya, yang Sketch ini versi responsive. Jadi ketika potensiometer diputar, maka durasi kedipan LED segera berubah. Cara kerjanya seperti ini:
Ketika berbicara tentang delay, maka kita berbicara tentang waktu. Pada Sketch ini, waktu delay bersifat dinamis karena parameternya adalah waktu sekarang ( diambil dari millis() ). Sedangkan jeda waktu untuk perubahan adalah waktu perubahan terakhir + nilai dari potensiometer. Untuk lebih memahami yang saya maksudkan, perhatikan Gambar berikut.

Gambar Siklus perubahan status LED dan potensiometer

Pada Gambar diatas keempat tahap dari atas ke bawah tersebut adalah kondisi nyala atau tidaknya LED. Nilai lastTime dihitung sejak terjadinya perubahan pada potensiometer atau habisnya jeda berdasarkan nilai sensor yang ditentukan.
1.      Step pertama kondisi LED adalah ON, lastTime didapat dari perubahan terakhir atau pemanggilan terakhir millis(). Ketika nilai sensor (warna hijau) sudah habis, maka LED akan menjadi OFF, millis() akan dipanggil dan akan menjadi nilai lastTime pada step kedua.
2.      Step kedua, kondisi LED OFF selama nilai sensor milisekon, setiap saat nilai millis() akan diperiksa. Garis putus-putus menandakan waktu pemanggilan fungsi millis() dalam pengkondisian if(millis() > lastTime + sensor) jika nilai millis() sudah lebih besar daripada lastTime + sensor, maka waktu OFF LED sudah habis dan digantikan dengan waktu ON LED.
3.      Step ketiga menunjukkan bahwa nilai potensimeter dinaikkan sehingga durasi yang dibutuhkan untuk menyalakan LED lebih lama. Garis-garis putus menunjukkan bahwa proses pemanggilan millis() dalam IF masih separuh perjalanan. Tapi ditengah perjalanan, nilai potensiometer dikecilkan.
4.      Setelah potensiometer dikecilkan, maka durasi yang awalnya masih setengah perjalanan, kini tinggal sedikit dan LED masih dalam keadaan ON.

Semoga ilustrasi diatas bisa menjelaskan bagaimana cara kerja program pada Sketch 3.5.
Tapi sebentar, pada baris 15 lastTime bukan int (integer). Tipe data lastTime adalah long (long integer). Apa bedanya dengan integer tanpa longg?

Untuk menjelaskan itu, berikut ini adalah tabel bilangan dan kapasitasnya:

Perhatikan bahwa kapasitas long lebih besar daripada int. Tabel di atas hanya berlaku untuk Arduino saja, jadi jika untuk komputer lainnya bisa jadi akan berbeda tergantung arsitektur dan kemampuan komputer tersebut dalam mencacah.





Tidak ada komentar:

Posting Komentar