Arduino Module
Arduino Module
MODUL 1
MIKROKONTROLER
Modul Pembelajaran Untuk Pemula
Dalam setiap bahasan, kami akan menyajikan konsep singkat dari apa yang sedang
dibahas dalam bahasan tersebut. Misal, ketika kita membahas tentang rangkaian sensor suhu,
maka akan dibahas pula tentang komponen sensor suhu, cara kerja, cara merangkai, dan cara
memprogramnya. Hal tersebut dimaksudkan agar pembaca bisa dengan mudah mengikuti dan
memahami apa yang kami sajikan serta sedikit demi sedikit mempelajari tentang elektronika
(mikrokontroller) dan bahasa pemrograman.
Menurut wikipedia:
PAGE \* MERGEFORMAT 20
Gambar 1.1 Board Arduino Uno
Dalam Module ini kita akan menggunakan board Arduino Uno (Gambar 1.1). Board Arduino
terdiri dari hardware / modul mikrokontroller yang siap pakai dan software IDE yang
digunakan untuk memprogram sehingga kita bisa belajar dengan mudah. Kelebihan dari
Arduino yaitu kita tidak direpotkan dengan rangkaian minimum sistem dan programmer
karena sudah built in dalam satu board. Oleh sebab itu kita bisa fokus ke pengembangan
sistem.
Untuk praktek, kita akan menggunakan project board (ada yang menyebutnya dengan istilah
bread board) dan beberapa kabel jumper untuk menghubungkan antara komponen dan
Arduino (Gambar 1.2). Dengan project board kita tidak perlu menyolder rangkaian sehingga
relatif mudah dan cepat dalam merangkai. Project board memungkinkan kita untuk
membangun dan membongkar rangkaian dengan cepat sehingga sangat cocok untuk
eksperimen. Tapi jika kita ingin membuat rangkaian yang permanen, maka kita harus
menggunakan PCB.
PAGE \* MERGEFORMAT 20
Gambar 1.3 Peta Jalur pada project board
Yang terpenting adalah, kita harus memahami jalur-jalur pada project board. Project board
terdiri dari jalur vertikal dan jalur horisontal. Jalur vertikal ada di bagian tengah yang terdiri
dari 2 x 64 jalur. Masing-masing jalur terdiri dari 5 titik vertikal, misal jalur 1A-1B-1C- 1D-
1E dan jalur 1F-1G-1H-1I-1J yang kedua tidak saling tersambung. Jalur horisontal sebanyak 8
jalur, 4 jalur ada di bagian atas dan 4 jalur lagi di bagian bawah. Jalur ini bisa digunakan
untuk power supply (VCC dan GND) untuk rangkaian. Untuk lebih jelasnya, silakan
perhatikan Gambar 1.3. Garis merah menunjukkan bahwa lubang tersebut terhubung secara
fisik.
Anda bisa mendownload Arduino IDE di website Arduino2. Pada saat tulisan ini
dibuat (30/06/2015), Arduino IDE sudah versi 1.6.5. Software Arduino ada yang versi
installer (hanya untuk Windows) dan versi terkompres dalam zip. Jika memilih versi tanpa
install (format.zip), maka Anda hanya perlu mengekstraknya di folder mana saja dan Anda
bisa langsung menjalankannya.
Jika Anda pengguna Linux, maka sedikit tantangan untuk Anda karena proses instalasi
tidak semudah instalasi di Windows dan Mac. Panduan untuk menginstall di Linux bisa
Anda pelajari di bagian instalasi Linux3. Sedangkan untuk pengguna Windows dan Mac,
Anda bisa menginstall dengan mengikuti instruksi dalam Module ini.
1. Pasang board Arduino Anda ke port USB pada komputer atau laptop, kemudian tunggu
hingga Windows mencoba untuk menginstall driver sendiri. Biasanya dia gagal
menginstall driver jika belum memiliki driver tersebut. (Silakan lanjutkan ke step
PAGE \* MERGEFORMAT 20
berikutnya)
2. Jika berhasil, berarti instalasi selesai. Tapi jika gagal, lanjutkan ke step selanjutnya.
3. Anda harus install dari device manager. Untuk masuk ke device manager, Anda bisa
melakukannya dengan dua cara:
- Jika Device Manager Anda sudah keluar, Anda bisa lanjut ke point 4, jika tidak, coba cara
berikut untuk menampilkan device manager
- Klik Start - pilih Control Panel. Di dalam Control Panel, pilih System and Security, lalu
pilih System. Selanjutnya pilih Device Manager.
PAGE \* MERGEFORMAT 20
Gambar 1.6 Device Manager
4. Pada Device Manager, perhatikan bagian Ports (COM & LPT), akan muncul device baru
dengan nama "Arduino UNO (COMxx)"
5. Klik kanan pada "Arduino UNO (COMxx)", kemudian pilih "Update Driver Software".
7. Cara folder software Arduino Anda, kemudian cari file arduino.inf (khusus untuk Arduino
UNO REF.3) pada folder Drivers. Jika Anda menggunakan versi IDE di bawah 1.0.3,
Anda bisa memilih driver dengan nama file ArduinoUNO.inf
9. Selanjut mari kita coba untuk mengupload sampel code yang ada pada software Arduino
10.Jalankan Aplikasi Arduino (arduino.exe), pada pojok kanan bawah akan ada tulisan
"Arduino UNO on COMxx". Berarti port yang digunakan Arduino adalah COMxx, jika
tulisan tersebut tidak muncul, berarti instalasi driver belum berhasil atau board Arduino
belum disambungkan ke komputer. Selanjutnya, silakan buka sampel led flip-flop dengan
cara Klik menu File > Examples > 1.Basic > Blink
11.Setting board Arduino dengan cara : Klik menu Tools > Board> Arduino UNO
12.Pilih port yang digunakan Arduino dengan cara mengklik menu Tools > Ports > (pilih
yang ada Arduino-nya)
14.Setelah berhasil diupload, akan muncul tulisan "Done uploading" di bagian bawah. Jika
berhasil, maka LED dengan tulisan "L" pada board Arduino akan kelap-kelip.
PAGE \* MERGEFORMAT 20
1.2.2 Instalasi pada Mac
4. Jalankan aplikasi
5. Bukan sampel aplikasi pada menu File > Example > 1.Basics > Blink
7. Pilih Port yang yang digunakan Arduino pada menu Tools > Ports
9. Setelah muncul pesan "Done Uploading", maka led "L" pada board Arduino akan
berkedip.
Untuk memprogram board Arduino, kita butuh aplikasi IDE (Integrated Development
Environment) bawaan dari Arduino. Aplikasi ini berguna untuk membuat, membuka, dan
mengedit source code Arduino (Sketches, para programmer menyebut source code arduino
dengan istilah "sketches"). Selanjutnya, jika kita menyebut source code yang ditulis untuk
Arduino, kita sebut "sketch" juga ya :). Sketch merupakan source code yang berisi logika
dan algoritma yang akan diupload ke dalam IC mikrokontroller (Arduino).
PAGE \* MERGEFORMAT 20
Gambar 1.7 Interface Arduino IDE
Interface Arduino IDE tampak seperti gambar 1.7. Dari kiri ke kanan dan atas ke
bawah, bagian-bagian IDE Arduino terdiri dari:
- Verify : pada versi sebelumnya dikenal dengan istilah Compile. Sebelum aplikasi
diupload ke board Arduino, biasakan untuk memverifikasi terlebih dahulu sketch
yang dibuat. Jika ada kesalahan pada sketch, nanti akan muncul error. Proses
Verify / Compile mengubah sketch ke binary code untuk diupload ke
mikrokontroller.
- Upload : tombol ini berfungsi untuk mengupload sketch ke board Arduino.
Walaupun kita tidak mengklik tombol verify, maka sketch akan di-compile,
kemudian langsung diupload ke board. Berbeda dengan tombol verify yang
hanya berfungsi untuk memverifikasi source code saja.
- New Sketch : Membuka window dan membuat sketch baru
- Open Sketch : Membuka sketch yang sudah pernah dibuat. Sketch yang dibuat
dengan IDE Arduino akan disimpan dengan ekstensi file .ino
- Save Sketch : menyimpan sketch, tapi tidak disertai mengcompile.
- Serial Monitor : Membuka interface untuk komunikasi serial, nanti akan kita
diskusikan lebih lanjut pada bagian selanjutnya
- Keterangan Aplikasi : pesan-pesan yang dilakukan aplikasi akan muncul di sini,
misal "Compiling" dan "Done Uploading" ketika kita mengcompile dan
mengupload sketch ke board Arduino
- Konsol : Pesan-pesan yang dikerjakan aplikasi dan pesan-pesan tentang sketch
PAGE \* MERGEFORMAT 20
akan muncul pada bagian ini. Misal, ketika aplikasi mengcompile atau ketika ada
kesalahan pada sketch yang kita buat, maka informasi error dan baris akan
diinformasikan di bagian ini.
- Baris Sketch : bagian ini akan menunjukkan posisi baris kursor yang sedang
aktif pada sketch.
- Informasi Port : bagian ini menginformasikan port yang dipakah oleh
board Arduino.
Ketika belajar pemrogaman, program pertama yang harus dicoba pertama kali adalah
memunculkan pesan "Hello World!". Dalam belalajar mikrokontroller ternyata juga ada,
yang pertama kali harus dibuat adalah membuat lampu LED berkedip, LED berkedip
maksudnya adalah flip-flop, hehe.
LED merupakan kependekan dari Light Emiting Diode, yaitu diode yang mampu
mengubah listrik menjadi cahaya. Sebagaimana sifat diode, lampu LED memiliki
kaki positif dan negatif. Sehingga
Pemasangannya tidak boleh terbaik, jika dipasang terbalik maka tidak akan ada arus
yang mengalir dan LED pun tidak akan menyala.
Arduino bekerja pada tegangan 5-12 volt dengan arus yang relatif besar yang sanggup
memutuskan LED. Sehingga jika kita ingin menyambungkan LED, maka kita butuh
tahanan (resistor) untuk membatasi arus yang masuk ke LED. LED memiliki tegangan
kerja yang disebut dengan forward voltage (vf) yang mana tegangan ini adalah tegangan
yang dibutuhkan LED untuk bisa menyala dengan baik.
Ukuran resistor yang bisa dipakai adalah 100Ω hingga 1KΩ (Ω dibaca ohm, satuan
dari resistansi/hambatan), makin besar nilai resistor maka nyala LED akan semakin redup.
Pada Arduino, tegangan yang keluar dari pin-pinnya adalah 0-5 volt. Sementara catu daya
PAGE \* MERGEFORMAT 20
untuk Arduino antara 5-12 volt. Oleh sebab itu, pemilihan resistor tergantung tegangan
mana yang akan kita gunakan.
2. Setelah itu, hubungkan salah satu kaki resistor pada lubang J3, kemudian kaki
satunya ke lubang di kolom pertama dari kanan,
3. Ambil kabel jumper, lalu sambungkan lubang J4 ke lubang di kolom kedua dari
kanan,
4. Ambil kabel jumper, sambungkan salah satu lubang di kolom pertama ke socket
GND pada board Arduino,
5. Ambil kabel jumper, sambungkan salah satu lubang di kolom kedua ke socket 5V di
board Arduino
Jika memasangnya dengan benar, maka LED akan menyala. Jika tidak, mungkin
kaki dipasang terbalik, silakan diperbaiki.
Program pertama adalah membuat kedipan LED. Untuk itu, yang pertama harus
dilakukan adalah mengubah Rangkaian 1.1, setelah itu kita bisa membuat program pada
Arduino IDE. Logika untuk program pertama seperti berikut:
Kedipan LED (hidup-matinya LED) akan dikontrol oleh salah satu kaki Arduino (kita
pilih kaki/pin 8). Dengan demikian, logika pada pin 8 akan menjadi output untuk
mengontrol LED. Ingat, logika 1 berararti LED akan nyala, logika 0 berarti LED mati.
PAGE \* MERGEFORMAT 20
Rubahlah rangkaian sehingga tampak seperti Rangkaian 1.2. Kabel jumper dari 5V ke
kolom pertama dilepas. Kemudian kabel di kolom kedua dilepas dan disambungkan ke pin
8 pada board Arduino.
1 void setup() {
2 // put your setup code here, to run once:
3
4 }
5
6 void loop() {
7 // put your main code here, to run repeatedly:
8
9 }
Fungsi setup() dan fungsi loop() merupakan fungsi wajib dan harus ada. Fungsi
setup() digunakan untuk inisialisasi program, fungsi ini hanya dijalankan sekali yaitu ketika
program pertama kali dijalankan (ketika arduino pertama kali dihidupkan). Sedangkan fungsi
loop() akan dijalankan terus-menerus (looping forever) hingga Arduino dimatikan.
Program di atas sudah bisa diupload ke Arduino dengan cara meng-klik tombol
Upload. Hanya saja, ketika program tersebut diupload, Arduino tidak akan melakukan apa-
apa sebab dalam sketch tersebut memang tidak ada perintah yang harus dikerjakan.
Dalam Module ini, jika ada sketch yang harus Anda coba, maka kami akan
menampilkan sketch terlebih dahulu, setelah itu akan kami jelaskan fungsi dan logika dari
sketch tersebut. Untuk mengawali primordial dalam belajar mikrokontroller, maka Anda
harus mencoba sketch ini. Berikut ini adalah sketch untuk membuat kedipan LED.
PAGE \* MERGEFORMAT 20
1
const int pinLED = 8;
2
3
void setup()
4
{ pinMode(pinLED,
5
OUTPUT);
6
}
7
11 void loop()
{ digitalWrite(pinLED, HIGH);
12
delay(500);
13 digitalWrite(pinLED, LOW);
delay(500);
14
}
15
Mari kita ulas satu-persatu baris skecth
Nama-nama pin pada Arduino sama seperti yang tertera di board. Pada salah satu sisi
board, nama-nama pinnya adalah 0 hingga 13, kemudian di sisi lain nama-nama pinnya A0
hingga A5, dst. Perintah pada baris 5 artinya : Variabel pinLED merupakan konstanta dalam
bentuk integer yang merujuk pada pin 8 board Arduino.
Void setup(){
pinMode(pinLED,OUTPUT);
}
Fungsi pinMode() memberi tahu bahwa pinLED adalah Output. Dengan
demikian mikrokontroller tidak akan “membaca” logika pin tersebut, akan tetapi dia
hanya akan “menulis” logika pada pin tersebut. Dengan kata lain, jika kita ingin
mendefinisikan bahwa pin ini adalah input, maka kita tinggal mengubah OUTPUT
menjadi INPUT.
Void loop() {
Digitalwrite(pinLED,HIGH);
Delay(500);
Digitalwrite(pinLED,LOW);
Delay(500);
}
PAGE \* MERGEFORMAT 20
Baris ini adalah inti dari program yang akan dieksekusi selama Arduino tersambung
dengan listrik atau selama Arduino tidak direset. pinLED diset HIGH berarti LED akan diberi
tegangan 5 volt, sedangkan LOW berarti LED akan diberi tegangan 0 volt. Oleh sebab itu,
rangkaian LED di atas akan menyala ketika diberi HIGH dan akan mati ketika diberi LOW.
Fungsi delay() digunakan untuk berhenti selama sekian milidetik. Karena 1 detik =
1000 milidetik, maka pemberian nilai 500 berarti Arduino akan jeda selama ½ detik ketika
LED nyala dan ½ detik ketika LED padam. Lalu bagaimana jika program yang Anda coba
tidak berjalan dan error? Begini, ada beberapa yang perlu diperhatikan ketika Anda
memprogram:
1.Penulisan sketch itu case sensitive, artinya, tulisan “pinLED” tidak sama dengan
“PinLED”. Jika terjadi error, coba perhatikan apakah ada penulisan yang keliru?
2.Jika Anda copy-paste sketch dari file PDF ke Arduino IDE, maka kemungkinan akan ada
perubahan whitespace (spasi, tab, blank line). Jika spasi tergantikan denan karakter tab
atau blank line, maka sketch akan error. Silakan Anda cek setiap spasi, jika ukuran space-
nya berbeda dengan spasi yang lain, silakan dihapus dan ganti dengan spasi.
3. Setiap blok kode harus diapit dengan kurung kurawal „{‟ dan„}‟. Jika kurungnya
kurang satu, maka akan error.
4.Setiap ada kurung buka „(‟, harus ada kurung tutup „)‟. Jadi jika ternyata kurungnya
kurang, itu bisa menyebabkan error.
5. Penulisan angka tanpa embel-embel koma. Misal Anda ingin menulis 1000, maka tidak
perlu menulis dengan 1,000 atau 1.000. Penulisan dengan 1,000 akan terjadi error,
sedangkan jika Anda menulis dengan 1.000 akan dianggap 1, bukan 1000.
6. Setiap baris kode akan ditutup dengan titik koma (semicolon) „;‟, kecuali di akhir
blokkode yang ditutup dengan kurung kurawal „}‟.
Dalam membuat kode program, kita kadang butuh untuk menyisipkan keterangan
tambahan pada fungsi kode tersebut. Misal, keterangan fungsi, keterangan pin, atau
keterangan lainnya.
PAGE \* MERGEFORMAT 20
Pada Arduino, komentar bisa kita sisipkan dengan dua cara:
1. Menggunakan double slash “//”, cara ini hanya bisa digunakan perbaris. Jadi jika banyak
baris yang ingin kita jadikan komentar, Anda bisa menggunakan cara yang kedua.
Jadi, jika sketch kedipan led tadi kita tambahin keterangan untuk setiap baris kodenya,
maka setidaknya akan seperti dibawah ini.
1
2 /*
3 Program untuk membuat LED berkedip
4 ½ detik nyala ½ detik mati
5 */
6
7 // inisialisasi pin untuk mengontrol LED, yaitu pin 8
8 const int pinLED = 8;
9
10 /*
11 Bagian ini akan dieksekusi sekali ketika Arduino pertama kali
12 Dinyalakan atau ketika Arduino direset
13 */
14 void setup() {
15 // pin 8 diset sebagai OUTPUT
16 pinMode(pinLED, OUTPUT);
17 }
18
19 /*
20 Bagian ini akan dieksekusi selama listrik tersambung
21
22
23
27 // nyalakan LED
28 digitalWrite(pinLED, HIGH);
PAGE \* MERGEFORMAT 20
Selanjutnya, kita akan lebih mendalami beberapa perintah dasar dan fungsi-fungsi logika
untuk membuat program Arduino.
Animasi LED
Sebelumnya kita sudah belajar tentang membuat LED berkedip, saat ini kita akan
lebih memahami lebih dekat tentang bahasa pemrograman dan fungsi-fungsi logika yang
umum dipakai. Implementasi dari pembelajaran fungsi logika tersebut akan diterapkan pada
beberapa model Animasi LED seperti running LED atau yang lainnya.
Perintah IF memiliki beberapa kombinasi, bisa IF saja, IF-ELSE, IF-ELSE IF-ELSE, dan
seterusnya. Semakin kompleks tentu logika yang dipakai akan tampak semakin “rumit”.
PAGE \* MERGEFORMAT 20
2.1.1 Perintah IF
1
2 // Pin 8 untuk LED
3 const int pinLED = 8;
4
5 void setup() {
6 // pin LED sebagai output
7 pinMode(pinLED, OUTPUT);
8 }
9
10 // awal time delay 1000 | 1 detik
11 int timeDelay = 1000;
12
13 void loop() {
14 // Setiap looping, nilai timeDelay dikurangi 100
15 timeDelay = timeDelay - 100;
16
17
19
20 /* Jika timeDelay bernilai 0 atau negatif
21 maka nilai timeDelay direset ke 1000
22 */
23 if(timeDelay <= 0){
24 timeDelay = 1000;
25 }
26
27 //Nyalakan dan matikan LED selama timeDelay
28 digitalWrite(pinLED, HIGH);
29 delay(timeDelay);
30 digitalWrite(pinLED, LOW);
31 delay(timeDelay);
32 }
Apakah Anda bisa membayangkan apa yang akan terjadi dengan LED tersebut? LED
tersebut awalnya akan berkedip pelan, lama-lama akan berkedip cepat, dan akan akhirnya
akan berkedip pelan lagi. Percayakah Anda? Jika tidak, silakan dicoba.
Ketika awal dinyalakan, maka timeDelay adalah 1000. Nilai tersebut diinisialisasi
pada baris 14. Baris ini tidak dijadikan konstanta (const) sebagaimana pinLED karena nilai
timeDelay akan diubah-ubah.
Setelah masuk ke bagian utama aplikasi, pada baris 18 nilai timeDelay dikurangi 100.
Sehingga timeDelay pertama yang digunakan untuk menyalakan dan mematikan LED adalah
900. Pada perulangan selanjutnya, timeDelay kembali dikurangi 100, sehingga perulangan ke
dua menggunakan timeDelay 800 (lebih singkat dari timeDelay yang awal), begitu seterusnya
hingga pada timeDelay 100.
Pada waktu melewati timeDelay 100, ketika dikurangi dengan 100, maka timeDelay bernilai
PAGE \* MERGEFORMAT 20
0. Kondisi ini cocok dengan baris ke 23,
Jika (IF) timeDelay lebih kecil atau sama dengan 0, maka timeDelay akan diisi dengan
1000. Sehingga nilai timeDelay tidak akan pernah negatif dan hal tersebut akan berulang
terus-menerus. Hal ini lah yang membuat durasi nyala hidup-mati LED bisa berubah lebih
cepat.
Beberapa operator matematika yang dibutuhkan dalam bahasa pemrograman yaitu:
Operator Arti
= Operator assignment, untuk memberi nilai pada variabel
+ Operator penambahan
- Operator pengurangan
* Operator perkalian
/ Operator pembagian. Sebagai catatan:
- Jika tipe data yang digunakan adalah integer (int),
maka hasil bagi adalah nilai asli, bukan desimal.
Misal 5/2 = 2, bukan 2.5 atau 3. Tapi jika tipe data
yang digunakan adalah double/float, maka hasil bagi
adalah angka desimal. Misal, 5/2 = 2.5
% Operator modulo (sisa pembagian). Misal:
- 10%2 = 0, 10 dibagi 2 = 5 + 0
- 10%3 = 1, 10 dibagi 3 = 3 + 1
- 10%4 = 2, 10 dibagi 4 = 8 + 2
- 10%5 = 0, 10 dibagi 5 = 2 + 0
Perintah IF pasti akan diikuti dengan kondisi yang bernilai True yang diapit dengan
tanda kurung, if (kondisi). Pada Sketch 2.1 di atas kondisi yang digunakan adalah timeDelay
<= 0, timeDelay lebih kecil atau sama dengan nol. Artinya, jika timeDelay bernilai 0 atau
lebih kecil dari 0, maka blok kode dalam if akan dieksekusi.
Selain operator <=, maka berikut ini adalah beberapa operator yang sering digunakan:
Operator Arti
== Sama dengan
!= Tidak sama dengan
< Lebih kecil
> Lebih besar
<= Lebih kecil atau sama dengan
>= Lebih besar atau sama dengan
Yap, begitulah cara kerja IF dan beberapa operator yang bisa digunakan untuk memeriksa
kondisi dalam IF. Simpel sekali bukan?
1 Main;
2 jika (sekarang == jam 10)
3
4
{ Makan;
5 }
6
7
8 Jika (sekarang == jam 10){
9 Makan;
10 }jika tidak{
11 Main;
12 }
Pada baris 1 sampai 5, maka Main akan terus dieksekusi. Jika sekarang sama dengan
jam 10, maka yang dilakukan adalah Main sambil Makan. Jadi kedua kegiatan atau statemen
akan dieksekusi.
Berbeda dengan baris 8 sampai 12, jika jam 10 Makan, jika tidak jam 10, Main.
Begitulah logika IF-ELSE.
Berikut ini adalah Sketch 2.2 yang merupakan hasil modifikasi dari Sketch 2.1 dengan
tambahan ELSE dan pemindahan proses pengurangan:
Sketch 2.2 Perubahan IF-ELSE
Pada Sketch 2.2, jika timeDelay bernilai lebih kecil sama dengan 100, maka akan LED
akan diam selama 3 detik lalu nilai timeDelay akan direset ke 1000, jika tidak maka akan
PAGE \* MERGEFORMAT 20
dilakukan pengurangan terhadap timeDelay sebanyak 100. Perhatikan, peroses reset dan
pengurangan tidak pernah dilakukan bersama-sama. Silakan dicoba dan cek hasilnya!
Setelah membahas tentang IF dan IF-ELSE, kita akan mebahas tentang While. While
merupakan salah satu model perulangan dengan karakteristik tertentu. Untuk lebih jelasnya,
silakan lanjut ke pembahasan selanjutnya.
Perintah WHILE merupakan perintah untuk melakukan perulangan berdasarkan suatu kondisi,
jadi banyaknya perulangan tidak bisa ditentukan dengan pasti. Dalam WHILE seakan ada
pengecekan kondisi seperti perintah IF untuk melakukan perulangan. Bentuk umum dari
perintah WHILE yaitu :
1 while( kondisi ){
2 // eksekusi code
3
4 }
Jika kondisi sesuai, maka perintah atau source code yang ada dalam kurung kurawal
“{}” tersebut akan dieksekusi. Untuk lebih memahami tentang perintah WHILE, mari kita
modifikasi Sketch 2.2 dengan penambahan WHILE dan beberapa perubahan lainnya.
1
2 // Pin 8 untuk LED
3 const int pinLED = 8;
4
5 void setup() {
6 // pin LED sebagai output
7 pinMode(pinLED,
8 OUTPUT);
9 }
10
11 // awal time delay 1000 | 1 detik
12 int timeDelay = 1000;
13
14 void loop() {
15
16 // selama nilai timeDelay > 0
17 // eksekusi blok program
18 ini
19 while(timeDelay > 0){
20 // LED hidup mati dengan durasi 500 milisekon
21 digitalWrite(pinLED, HIGH);
22 delay(500);
23 digitalWrite(pinLED,
24 LOW); delay(500);
25
26 // kurangi timeDelay dengan 100
27
PAGE \* MERGEFORMAT 20
28 timeDelay = timeDelay - 100;
29 }
30
31 // setelah timeDelay dikurangi terus-menerus
32 // maka pada akhirnya akan bernilai minus atau < 0
33 // maka while di atas akan berhenti
34
35 // selama nilai timeDelay < 1000
36 // eksekusi blok program ini
37 while(timeDelay < 1000){
38 // LED hidup mati dengan durasi 100 milisekon
39 digitalWrite(pinLED, HIGH);
40 delay(100);
41 digitalWrite(pinLED,
42 LOW); delay(100);
43
44 // tambahkan timeDelay dengan 100
45 timeDelay = timeDelay + 100;
46 }
47 }
Program pada Sketch 2.3 akan mengedipkan LED dengan durasi yang berbeda.
Awalnya LED akan berkedip dengan durasi ½ detik sebanyak 10 kali, selanjutnya LED akan
berkedip lebih cepat dengan durasi 1/10 detik sebanyak 10 kali.
Secara teori, True berarti 1 dan False berarti 0. Dalam pemrograman yang ini, kondisi
False memang selalu 0, tapi True tidak selalu 1. Kondisi True adalah selain 0, ingat selain nol
(0) akan dianggap True. Coba perhatikan kode di bawah ini:
while(1){
digitalWrite(pinLED, HIGH);
delay(100);
digitalWrite(pinLED, L OW);
delay(100);
Program di atas akan dijalankan selamanya (looping forever) selama Arduino belum
direset atau listrik tidak diputus. Kenapa? Sebab 1 berarti True. Secara harfiah, baris
while(1) dapat diartikan “selama bernilai benar, maka eksekusi kode ini”.
PAGE \* MERGEFORMAT 20
Ingat, penulisan operator logika “sama dengan” tidak hanya menggunakan satu tanda
sama dengan “=”, tapi menggunakan dua sama dengan “==”. Jika hanya menggunakan “=”,
maka pertanyaan tersebut bukan untuk logika, tapi untuk operator penetapan isi variabel
(assignment). Penulisan yang benar adalah:
while( timeDelay == 1000 ){
//
//
Bukannya,
while( timeDelay = 1000 ){ // penulisan yang SALAH!
//
//
//
Perhatikan disana ada tanda && yang berarti AND. Penambahan tanda kurung untuk
memperjelas bahwa ada dua kondisi yang berbeda dan dihubungkan oleh operator &&.
Silakan diingat kembali bahwa operator logika AND akan menghasilkan nilai True jika
semua kondisi bernilai True. Selain operator AND, ada juga operator OR dan NOT.
Perhatikan tabel berikut:
PAGE \* MERGEFORMAT 20
|| (A < 10) && (B >10) Logika OR akan menghasilkan
True apabila salah satu dari A, B,
atau semuanya sesuai (True), tapi
jika keduanya False, maka akan
bernilai False
! ! (A < 10) Logika NOT akan menghasilkan
True jika kondisi tidak sesuai
(False), sebab NOT adalah
kondisi sebaliknya.
Jika Anda masih bingung dengan NOT, maka perhatikan kode berikut ini:
int status = HIGH;
int led = !status; // artinya, led TIDAK high (LOW)
Jika status = HIGH atau True, maka !status = LOW (tidak HIGH) atau False (tidak True).
Penggunaan juga sering digunakan, jadi tolong diingat-ingat.
Berbeda dengan WHILE, dengan FOR kita bisa menentukan jumlah perulangan dengan pasti.
Pada Sketch 2.3, masing-masing WHILE akan melakukan perulangan sebanyak 10 kali
dengan cara mengurangi angka 1000 dengan 100 secara bertahap. Jika menggunakan FOR,
kita bisa melakukan perulangan tersebut lebih sederhana. Format dasar dari FOR adalah :
Statemen yang pertama berisi tentang kondisi awal, biasanya inisialisasi suatu variabel atau
data (misal, a=0). Sedangkan statemen yang terakhir adalah perubahan yang akan terjadi pada
variabel pada statemen awal (misal a=a+1). Sedangkan kondisi merupakan kondisi dimana
perulangan akan terjadi, ketika kondisi sudah tidak sesuai, maka perulangan akan berhenti.
untuk lebih jelasnya tentang FOR, berikut contoh sederhananya:
PAGE \* MERGEFORMAT 20
1 // Arduino
2 // code
3
4 // Pin 8 untuk LED
5 const int pinLED = 8;
6
7 void setup() {
8 // pin LED sebagai output
9 pinMode(pinLED, OUTPUT);
10 }
11
12 // awal time delay 1000 | 1 detik
13 int timeDelay = 3000;
14
15 void loop() {
16 // perulangan sebanyak 10 kali dari 1 hingga 10
17 for(int i=1; i<=10; i++){
18 // LED hidup mati dengan durasi 500 milisekon
19 digitalWrite(pinLED, HIGH);
20 delay(500);
21 digitalWrite(pinLED,
22 LOW); delay(500);
23 }
24 // diam selama 3 detik
25 delay(tim eDelay);}
Ketika program tersebut diupload, maka LED akan berkedip dengan durasi ½ detik sebanyak
10 kali, kemudian LED akan diam (mati) selama 3 detik (perhatikan, nilai timeDelay diganti 3000),
dan melanjutkan berkedip lagi.
Pada baris 18 menunjukkan FOR dengan kondisi nilai awal i=1, i akan terus-menerus ditambah
dengan 1 (i++) selama perulangan selama i <= 10. Sederhananya, nilai i akan berubah dari 1, 2, 3, 4,
…hingga 10.
Bagian penting yang perlu dipahami adalah i++, i++ sama dengan i = i + 1;
Selain i++, ada juga ++i, i--, dan --i. Penulisan i-- sama dengan i++, hanya saja i-- berarti i=i-
1, atau i akan berkurang 1 terus-menerus selama perulangan.
Penempatan ++ di depan atau di belakang i berarri bahwa : jika ++ nya ada di belang, maka
proses penambahannya dilakukan setelah blok kode dalam for dijalankan. Tapi jika ++ nya ada di
depan, maka proses penambahan akan dilakukan sebelum proses dijalankan. Begini contohnya:
int i = 1;
// i = 2
Perhatikan, pada baris ke-6, j bernilai 3 karena 3 dikali dengan nilai i = 1. Setelah
proses pada baris ke-4, maka nilai i akan berubah menjadi 2 karena ada statemen i++ (i =
PAGE \* MERGEFORMAT 20
i+1).
Sedangkan pada baris ke-10, j bernilai 9 (bukan 6) karena i tidak bernilai 2 lagi, tapi i
bernilai 3 sebab sebelum baris tersebut dieksekusi i terlebih dahulu ditambahkan dengan 1 (+
+1). Jadi penambahan i tidak dilakukan setelah eksekusi baris 10 baris tersebut, tapi sebelum
mengeksekusi baris ke-10.
Semoga sekilas penjelasan ini bisa memberikan gambaran tentang perbedaan FOR dan
WHILE. Jika ada penjelasan yang membingungkan, setelah ini kita akan merangkai
kombinasi LED lebih dari satu karena kita akan mencoba belajar tentang Array.
Silakan update rangkaian Arduino Anda seperti rangkain 2.1. Siapkan 4 buah resistor
dan 4 buah LED. Siapkan kabel jumper untuk menyuplai GDN pada project board. Masing-
masing kaki negatif LED dihubungkan ke GND dengan resistor. Sedangkan keempat LED
tersebut dihubungkan berturut-turut dengan pin 8, 9, 10, dan 11 pada board Arduino.
PAGE \* MERGEFORMAT 20
Jika Anda tidak memiliki banyak resistor untuk dicoba, maka Anda bisa menggukaan
1 resistor saja dengan rangkaian seperti Rangkaian 2.2, tapi dengan konsekuensi : suplai arus
akan dipakai bersama sehingga nyala LED akan semakin redup (atau mungkin LED tidak
akan menyala, tergantung pada LED yang Anda gunakan).
Pada rangkaian 2.2, keempat resistor digantukan dengan kabel jumper, kemudian
pasang 1 resistor untuk menghubungkan kolom GND pada project board ke GND pada board
Arduino.
Untuk sekedar percobaan, cara seperti Rangkaian 2.2 bisa Anda gunakan. Tapi Anda
tidak disarankan mengaplikasikan cara yang kedua ketika menggunakan sensor sebab sedikit
banyak akan mempengaruhi kinerja sensor tersebut.
PAGE \* MERGEFORMAT 20
digitalWrite(pinLED4, LOW);
}
// delai selama 5 detik
delay(5000);
}
}
Program di atas akan membuat LED menyala bergantian sebanyak 5 animasi
(perulangan sebanyak 5 kali). Pertama, semua LED
akan mati selama 5 detik. Kedua, LED 1 akan menyala. Ketiga, LED 1 dan 2 akan
menyala. Keempat, LED 1, 2, dan 3 akan menyala. Kelima, semua LED akan menyala.
Animasi tersebut ditentukan berdasarkan nilai i, nilai i diperiksa dengan perintah IF.
Jika nilai i=0, maka semua LED mati, jika i=1 maka satu LED nyala, dan seterusnya.
Selain menggunakan IF, ada cara lain yang lebih simpel untuk membuat animasi LED
seperti program pada Sketch 2.5. perhatikan Sketch 2.6:
void setup() {
// pin LED sebagai output
pinMode(pinLED1, OUTPUT);
pinMode(pinLED2, OUTPUT);
pinMode(pinLED3, OUTPUT);
pinMode(pinLED4, OUTPUT);
}
void loop() {
digitalWrite(pinLED1, LOW);
digitalWrite(pinLED2, LOW);
PAGE \* MERGEFORMAT 20
digitalWrite(pinLED3, LOW);
digitalWrite(pinLED4, LOW);
delay(1000);
digitalWrite(pinLED1, HIGH);
delay(1000);
digitalWrite(pinLED2, HIGH);
delay(1000);
digitalWrite(pinLED3, HIGH);
delay(1000);
digitalWrite(pinLED4, HIGH);
delay(1000);
}
Dengan memanfaatkan delay, program pada Sketch 2.6 lebih simple daripada Sketch
2.5. Kira-kira, apakah ada cara yang lebih simpel lagi? Ada! Kita bisa menggunakan Array.
Apa itu Array?
Array merupakan variabel yang bisa menampung banyak data, masing-masing data
bisa diambil dengan alamat indeks (posisi) data dalam Array tersebut. Alamat indeks pada
array standarnya adalah angka integer yang diawali dari angka 0. Jadi, jika kita punya data 5
dalam variabel Array, maka data pertama pada alamat indeks ke-0, data ke-2 pada alamat
indeks ke-1, dan data ke-5 pada alamat indeks ke-4.
Untuk lebih memahami tentang Array, program pada Sketch 2.7 merupakan versi
lebih simpel daripada Sketch 2.6 dengan memanfaatkan perulangan FOR dan Array.
void setup() {
PAGE \* MERGEFORMAT 20
// Inisialisasi semua pin LED sebagai OUTPUT
for(int i=0; i<4; i++){
pinMode(pinLED[i], OUTPUT);
}
}
void loop() {
// Matikan semua LED
for(int i=0; i<4; i++){
digitalWrite(pinLED[i], LOW);
}
delay(1000);
Pada Sketch 2.7, keempat LED dimuat dalam satu variabel yaitu variabel Array
pinLED. Masing-masing LED bisa diakses berdasarkan alamat indeks. Perhatikan pada baris
9.
Secara otomatis, alamat indeks untuk masing-masing LED tergantung pada urutan pin
tersebut. Pin 8 ada pada alamat indeks ke- 0, pin 9 ada pada indeks ke 1, pin 10 ada di indeks
ke 2, dan pin 11 ada pada indeks ke 3. Sehingga untuk mengakses pin 8, kita bisa
menambahkan kurung siku dan alamat indeks ke-0, seperti berikut:
Pin8 = pinLED[0]
Karena indeks tertinggi adalah angka 3, maka di setiap perulangan LED tidak boleh
lebih dari 3 atau < 4, perhatikan perintah FOR berikut:
Semoga penjelasan Array di atas mudah dipahami. Jika ada yang membingungkan,
PAGE \* MERGEFORMAT 20
silakan tanya-tanya di website, dengan senang hati penulis akan menjawab. Baik, selanjutnya
kita akan lebih mengembangkan Sketch 2.7 agar sedikit lebih kompleks dan animasinya lebih
menarik. Penulis memberikan Sketch 2.8 dan Sketch
void setup() {
// Inisialisasi semua pin LED sebagai OUTPUT
for(int i=0; i<4; i++){
pinMode(pinLED[i], OUTPUT);
}
}
void loop() {
// Hidupkan semua LED bertahap dg jeda 1 detik
for(int i=0; i<4; i++){
digitalWrite(pinLED[i], HIGH);
delay(500);
}
PAGE \* MERGEFORMAT 20
// Inisialisasi Jumlah LED
const int numLED = 4;
// LED 1,2,3,&4 jadi 1 varibel
// dengaan alamat index 0,1,2,3
const int pinLED[numLED] = {8,9,10,11};
void setup() {
// Inisialisasi semua pin LED sebagai OUTPUT
for(int i=0; i<4; i++){
pinMode(pinLED[i], OUTPUT);
}
}
void loop() {
// hidupkan led indeks 0 hingga 2 satu-persatu
for(int i=0; i<3; i++){
digitalWrite(pinLED[i], HIGH);
delay(200);
digitalWrite(pinLED[i], LOW);
}
// hidupkan led indeks 3 hingga 1 satu-persatu
for(int i=3; i>0; i--){
digitalWrite(pinLED[i], HIGH);
delay(200);
digitalWrite(pinLED[i], LOW);
}
}
PAGE \* MERGEFORMAT 20
Input
Sebelumnya kita telah belajar tentang bagaimana mengendalikan LED. Untuk
mengendalikan LED kita menjadi pin pada Arduino sebagai OUTPUT. Pada bagian ini kita
akan membahas tentang bagaimana menjadikan pin Arduino sebagai INPUT dan sebagai
aplikasinya, kita akan menggunakan komponen pushbotton dan potensiometer sebagai input
untuk mengendalikan LED. Bagian ini akan menjadi dasar agar Anda memahami bagaimana
membuat Arduino bisa membaca sensor untuk mendeteksi kondisi lingkungan sekitar.
3.1 Pushbutton
Pertama kita akan bermain dengan tombol pushbutton (tactile) atau tombol push on.
Ketika tombol ini ditekan, maka jalur akan tertutup (ON), ketika dilepas jalur akan kembali
terbuka (OFF). Tombol banyak digunakan untuk peralatan seperti remote, keypad, keyboard,
atau tombol untuk pengaturan TV, ld atau sejenisnya.
Gambar 3.1 merupakan bentuk fisik pushbutton dan salah satu simbol pushbotton jenis
NO (Normally Open) dalam rangkaian elektronik. Berdasarkan simbol tersebut, Normally
Open berarti kondisi normal (sebelum ditekan), maka terminal dalam kondisi tidak
tersambung (open, terbuka). Tapi ketika ditekan, maka masing-masing terminal akan
terhubung.
PAGE \* MERGEFORMAT 20
Selain jenis NO, ada juga pushbutton jenis NC (Normally Close), artinya ketika
kondisi normal (sebelum ditekan), kaki terminal dalam keadaan terturup / tersambung (Close),
tapi ketika ditekan, kaki terminalnya terbuka (tidak tersambung). Dalam Module ini, kita akan
menggunakan jenis pushbutton NO.
Percobaan kali ini adalah untuk mengendalikan hidup/matinya- nya LED dengan
tombol pushbutton. Jika tombol ditekan, LED akan menyala, jika dilepas, LED kembali
padam.
Untuk melakukan percobaan ini, siapkan sebuah pushbutton, sebuah LED, dan sebuah
resistor. Siapkan juga beberapa kabel jumper untuk merangkai komponen-komponen
tersebut.
3.1.1.1 Rangkaian
1. Siapkan LED dan pushbutton pada project board. Karena karena pushbutton memiliki 4
buah kaki yang masing-masing terpisah, maka silakan tancapkan pushbutton di tengah-
tengah lajur project board sehingga kaki-kainya tidak tersambung.
2. Salah satu kaki pushbutton dihubungkan ke GDN di project board, sedangkan kaki
pasangannya disambungkan ke pin 2 pada board Arduino. Bagaimana cara mengetahui
PAGE \* MERGEFORMAT 20
pasangan kaki-kaki pada pushbutton? Anda bisa mengeceknya dengan AVO meter.
- Setting AVO meter untuk menghitung resistansi, kemudian cek masing-masing pin
pushbutton dengan probe. Jika tombol ditekan jarum AVO meter bergerak
menyimpang, berarti kaki-kaki tersebut sepasang.
3. Untuk LED, sambungkan kaki negatif (pin yang lebih pendek) ke GND dengan resistor
4. Kaki positif (kaki yang lebih panjang) disambungkan ke pin 8 pada board Arduino dengan
jumper.
3.1.1.2 Program
void setup() {
pinMode(pinButton, INPUT);
pinMode(pinLED, OUTPUT);
Pertama kali dijalankan, maka awalnya LED akan padam. ketika kita menekan
tombol pushbutton, maka LED akan menyala. LED akan kembali padam ketika tekanan
tombol dilepas. Pada Sketch 3.1 di atas ada beberapa baris kode baru:
PAGE \* MERGEFORMAT 20
pinMode(pinButton, INPUT);
pinMode(pinLED, OUTPUT);
// aktifkan pull-up resistor
digitalWrite(pinButton, HIGH);
Baris 6 berfungsi untuk mengeset pinButton sebagai INPUT. Jika sebuah pin diset
sebagai INPUT, maka mikrokontroller akan mengambil data dari pin tersebut. Jika sebuah pin
diset sebagai OUTPUT, maka mikrokontroller akan menuliskan data pada pin tersebut. dalam
hal ini, mikrokontroller akan mengambil data yang dari pushbutton.
Perhatikan baris ke-14. Nilai pinButton awalnya diset HIGH. Kenapa diset HIGH?
Kenapa bisa diset nilai pinnya menjadi HIGH, padahal pin tersebut tidak terhubung dengan
+5V?
pinButton tergantung pada rangkaian yang akan digunakan. Rangkaian 3.1 menghubungkan
pinButton (pin 8) ke GND, artinya, ketika pushbutton ditekan maka pinButton (pin 8) akan
menjadi 0 (LOW). Padahal defaultnya, setiap pin bernilai LOW. Jika pin awalnya bernilai
LOW, kemudian ditekan tetap bernilai LOW, lalu apa gunanya pushbutton?
Padahal, fungsi utama dari saklar (dalam hal ini adalah pushbutton) adalah mengubah
nilai yang awalnya LOW menjadi HIGH, atau sebaliknya. Nah, karena ketika pushbutton
ditekan akan bernilai LOW (ke GND), maka awalnya harus kita set menjadi HIGH.
Sehingga logika untuk pushbutton tersebut adalah: ketika tidak ditekan HIGH, ketika ditekan
LOW.
Kondisi tersebut yang akan digunaka untuk mendeteksi apakah pushbutton tersebut
ditekan atau tidak. Silakan perhatikan baris ke-18.
if(digitalRead(pinButton) == LOW){
digitalWrite(pinLED, HIGH);
}else{
digitalWrite(pinLED, LOW);
}
PAGE \* MERGEFORMAT 20
Pada baris 18, fungsi digitalRead() untuk membaca logika pada pinButton. Jika
pinButton ditekan (LOW), maka hidupkan LED dengan perintah
digitalWrite(pinLED,HIGH). Ketika pinButton bernilai HIGH, matikan LED. Sederhana
bukan?
Untuk pertanyaan yang kedua, kenapa pin INPUT bisa diset HIGH?
Ketika kita menjadi pin INPUT sebagai HIGH, maka secara internal Arduino akan
menghubungkan pin tersebut pada resistor pull- up bernilai 20k ohm. Apa itu pull-up resistor?
Jika ada pull-up, apakah juga ada pull-down resistor?
Begini, dalam elektronika digital, jika sebuah pin diset sebagai INPUT, kemudian pin
tersebut belum tersambung ke VCC atau GND, maka logika pada pin tersebut masih
mengambang (floating). Oleh sebab itu, pin tersebut harus ditentukan apakah akan diberi
resistor pull-up (sehingga bernilai HIGH) atau diberi pull-down (sehingga bernilai LOW).
Jika pin tersebut diset HIGH, dalam internal mikrokontroller pin tersebut akan
disambungkan ke VCC dengan pengaman sebuah resistor yang diistilahkan sebagai resistor
pull-up. Begitu juga jika pin tersebut diset LOW, maka pin tersebut akan dihubungkan ke
GND dengan pengaman resistor kemudian diistilahkan dengan resistor pull- down. Gambar
3.2 adalah rangkaian dasar pull-up resistor untuk rangkain di atas tanpa LED.
Semoga penjelasan tentang pull-up resistor bisa dipahami. Jika ada yang kurang jelas,
PAGE \* MERGEFORMAT 20
mari kita diskusikan di website.
Sebelumnya kita sudah membahas tentang cara menghidupkan dan mematikan LED
dengan sebuah pushbutton. Selanjutnya, kita akan menggunakan dua buah pushbutton dengan
ketentuan : pushbutton yang pertama untuk menaikkan kecerahan LED hingga paling terang,
sedangkan pushbutton yang kedua untuk menurunkan kecerahan LED hingga LED padam.
Fungsi kedua pushbutton ini mirip dengan volume-up dan volume- down. Yang satu
untuk meningkatkan volume (kecerahan), sedangkan satunya lagi untuk menurunkan volume
(kecerahan). Yak, setidaknya Anda paham apa yang saya maksudkan.
Setidaknya ada dua cara untuk menaikkan atau menurunkan tingkat kecerahan LED:
1. Mengubah arus yang masuk ke LED, cara ini bisa diaplikasikan dengan mengubah
nilai resistor
2. Menghidup-matikan LED dengan cepat atau lambat. Begini, ketika kita menghiup-
matikan LED dengan cepat, maka mata manusia tidak bisa mengetahuinya. Yang
ditangkap oleh mata adalah terang atau redupnya saja. Jika kita menghidup-
matikan led dengan cepat, maka LED tersebut akan terlihat terang, tapi kalau kita
menghidup matikan LED dengan lebih lambat, maka LED akan terlihat lebih redup.
Dalam elektronika digital, konsep yang kedua dikenal dengan istilah PWM (Pulse
Width Modulation). Apa itu PWM?
Sebagian kaki / pin Arduino support PWM, kaki yang support PWM ditandai dengan
adanya tanda tilde (~) di depan angka pinnya, seperti 3, 5, 6, dan seterusnya. Frekuensi yang
digunakan dalam Arduino untuk PWM adalah 500Hz (500 siklus dalam 1 detik). Jadi,
Arduino bisa menghidup-matikan LED sebanyak 500 kali dalam 1 detik.
Untuk menggunakan PWM, kita bisa menggunakan fungsi analogWrite(). Nilai yang
bisa dimasukkan pada fungsi tersebut yaitu antara 0 hingga 255. Nilai 0 berarti pulsa yang
diberikan untuk setiap siklus selalu 0 volt, sedangkan nilai 255 berarti pulsa yang diberikan
selalu bernilai 5 volt.
PAGE \* MERGEFORMAT 20
Gambar 3.3 Siklus Pulsa PWM
Jika kita memberikan nilai 127 (kita anggap setengah dari 0 hingga 255, atau 50% dari
255), maka setengah siklus akan bernilai 5 volt, dan setengah siklus lagi akan bernilai 0 volt.
Sedangkan jika jika memberikan 25% dari 255 (1/4 * 255 atau 64), maka 1/4 siklus akan
bernilai 5 volt, dan 3/4 sisanya akan bernilai 0 volt, dan ini akan terjadi 500 kali dalam 1
detik. Untuk visualisasi siklus PWM, bisa Anda lihat Gambar 3.3.
3.1.2.1 Rangkaian
PAGE \* MERGEFORMAT 20
Rangkaian 3.2 Intensitas cahaya LED
Buatlah rangkaian seperti gambar Rangkaian 3.2. Rencananya, pushbutton yang atas
untuk menyalakan dan meningkatkan kecerahan LED, sedangkan pushbutton yang bawah
untuk menurunkan tingkat kecerahan LED dan memadamkannya:
3. Siapkan dua buah pushbutton. Pushbutton yang pertama (atas) disambunkan ke GND
dan ke pin 2 pada board Arduino.
4. Lalu pushbutton yang kedua (bawah) disambungkan ke GND dan pin 3 pada board
Arduino.
3.1.2.2 Program
void setup() {
pinMode(pinBt1, INPUT);
pinMode(pinBt2, INPUT);
pinMode(pinLED, OUTPUT);
digitalWrite(pinBt1, HIGH);
digitalWrite(pinBt2, HIGH);
}
int brightness = 0;
void loop() {
PAGE \* MERGEFORMAT 20
if(digitalRead(pinBt1) == LOW){
// jika pushbutton ditekan
// tambahkan nilai brightness
brightness++;
}else if(digitalRead(pinBt2) == LOW){
// jika pushbutton2 ditekan
// kurangi nilai brightness
brightness--;
}
// brightness dibatasi antara 0 - 255
// jika di bawah 0, maka ganti dengan 0
// jika di atas 255, maka ganti dengan 255
brightness = constrain(brightness, 0, 255);
Ada 3 bagian pada Sketch 3.2 yang perlu dijelaskan lebih detail, yaitu:
// brightness dibatasi antara 0 - 255
// jika di bawah 0, maka ganti dengan 0
// jika di atas 255, maka ganti dengan 255
brightness = constrain(brightness, 0, 255);
Pada baris 36, kita menemukan satu fungsi baru, yaitu constrain(). Fungsi constrain()
digunakan untuk menjaga agar nilai tetap pada range yang ditentukan. Pada kasus ini, range
yang ditentukan adalah antara 0 – 255. Misal nilai brightness lebih kecil dari 0, maka
akan dirubah menjadi 0, tapi jika nilai brightness lebih besar dari 255, maka akan dirubah
menjadi 255.
Untuk lebih memahami tentang fungsi constrain(), silakan perhatikan isi dari fungsi
constrain() di bawah ini:
PAGE \* MERGEFORMAT 20
int constrain(int value, int min, int max){
if(value > max){ value = max;
}
if(value < min){ value = min;
}
return value;
}
Tipe dari fungsi tersebut adalah int (integer), artinya fungsi tersebut akan
mengembalikan nilai integer ketika dieksekusi disesuaikan dengan nilai value (return value).
Jika diperhatikan fungsi loop() dan fungsi setup() bukanlah int, tapi void. Tipe fungsi
void berbeda dengan tipe int, fungsi void tidak mengembalikan nilai apa pun, sehingga jika
diperhatikan, tidak ada perintah return pada fungsi dengan tipe void. Yap, demikian sekilas
tentang tipe fungsi integer dan void.
Selanjutnya, karena nilai brightness selalu antara 0-255, maka ketika dituliskan ke
pinLED juga akan selalu selang antara 0-255.
Lalu bagaimana jika kita menekan kedua tombol pushbutton dengan bersamaan? Apa
yang akan terjadi dengan LED? Silakan cari jawaban dan penjelasannya.
3.2 Potensiomenter
PAGE \* MERGEFORMAT 20
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.
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 3.3 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 3.4 adalah contoh salah satu trimmer.
PAGE \* MERGEFORMAT 20
Gambar 3.4 Potensiometer jenis trimmer
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
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?
3.2.1 Rangkaian
Untuk membuat Rangkaian 3.4, siapkan LED, resistor, dan potensiometer. Anda juga
bisa menggunakan trimmer.
PAGE \* MERGEFORMAT 20
1. Sambungkan kaki positif LED ke pin 9 pada board Arduino, pin tersebut support PWM
3. 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.
4. 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:
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.
3.2.2 Program
PAGE \* MERGEFORMAT 20
// 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 3.3 diupload, maka kita bisa mengatur brightness dan
hidup-mati LED dengan sempurna, berbeda dengan cara manual seperti Rangkaian 3.3. Pada
Sketch 3.3, 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. 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()
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 ½ dari
PAGE \* MERGEFORMAT 20
1024), maka nilai tersebut akan dirubah menjadi 127 (anggap saja ½ 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.
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 3.4 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.
PAGE \* MERGEFORMAT 20
3.2.3 Menghilangkan Delay
long lastTime = 0;
int sensor = 0;
int ledValue;
void loop() {
// baca nilai kaki A0 (sensor, potensiometer)
sensor = analogRead(pinPot);
PAGE \* MERGEFORMAT 20
Program pada Sketch 3.5 mempunyai fungsi yang sama dengan Sketch 3.4, bedanya,
yang Sketch 3.5 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 3.5,
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.
Pada Gambar 3.5, 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
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
PAGE \* MERGEFORMAT 20
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.
Pada baris 15 lastTime bukan int (integer). Tipe data lastTime adalah long (long
integer). Apa bedanya dengan integer tanpa long?
Long lastTime=0;
Untuk menjelaskan itu, berikut ini adalah tabel bilangan dan kapasitasnya:
Tipe Kapasitas
boolean Hanya bisa TRUE & FALSE
char -128 – 127
unsigned char 0 – 255
byte (sama dengan unsigned char)
int -32.768 – 32.767
unsigned int 0 – 65.535
word (sama dengan unsigned int)
long (long int) -2.147.483.648 – 2.147.483.647
unsigned log 0 – 4.294.967.295
float -3.4028235E+38 – 3.4028235E+38
double (sama dengan float)
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
PAGE \* MERGEFORMAT 20