PANDUAN PRAKTIKUM DASAR ARDUINO - belajarbikinrobot.weebly.com

Praktikum 11 Belajar Arduino Blink LED (Tanpa Fungsi Delay()) Pada praktikum kita kali ini, kita akan mencoba kembali praktikum blink LED. Namun, kali...

51 downloads 602 Views 800KB Size
BBROBOTINDONESIA

PANDUAN PRAKTIKUM DASAR ARDUINO

www.BELAJARBIKINROBOT.WEEBLY.com

Praktikum 11 Belajar Arduino Blink LED (Tanpa Fungsi Delay()) Pada praktikum kita kali ini, kita akan mencoba kembali praktikum blink LED. Namun, kali ini dengan metode yang sangat berbeda. Saya yakin, metode ini akan membuka pola pikir kita bahwa “ada banyak jalan menuju Roma”—“ada banyak cara menuju blinking LED”.  Ingat kembali, pada praktikum 1 tentang Blinking LED, kita menggunakan fungsi delay() di antara fungsi digitalWrite() yang kita gunakan untuk menunda lama program digitalWrite() dieksekusi sebelum melanjutkan eksekusi kode berikutnya. Inilah yang menyebabkan LED menyala dalam kurun waktu satu detik dan kemudian padam pada detik berikutnya. Baiklah, sekarang kita sudah paham bahwa fungsi delay() bekerja dengan baik, lalu mengapa kita perlu memperbaikinya?!. Benar, fungsi delay() memang bekerja sangat baik, namun di sini, kita memiliki metode alternative yang saya rasa perlu untuk kita ketahui dan tentunya, saya akan coba jelaskan alasannya. Salah satu alasan utama untuk TIDAK menggunakan fungsi delay() adalah karena, fungsi ini akan menghentikan seluruh alur track program kecuali hanya program yang sedang di delay olehnya. Katakanlah, kita mencoba untuk membaca informasi dari port serial atau menerima input dari pin Analog— maka semua hal yang kita coba lakukan itu tidak akan dieksekusi selama delay sedang berlangsung. Kita coba analogikan. – Saya yakin, Anda sudah pernah mengikuti lomba cerdas cermat di sekolah dulu. Setidaknya, pernah menonton perlombaannya. Dalam lomba cerdas cermat tersebut, ada bel yang disediakan untuk masing-masing regu. Jika salah satu regu sudah menekan bel untuk menjawab pertanyaan rebutan, maka bel pada regu yang lainnya tidak akan berfungsi.—Nah, kira-kira seperti itulah fungsi delay() bekerja. Semoga Anda paham analoginya.  Untuk itulah, pada praktikum kali ini, kita akan mencoba untuk mengeksplor salah satu metode yang menggunakan clock builtin yang ada pada Arduino untuk mengatur timing tanpa harus menghentikan jalannya alur program yang lainnya. Sekarang, kita langsung ke praktikumnya.

Komponen yang Dibutuhkan

Arduino Uno 1x

Protoboard 1x

LED5mm 1x

Resistor 330--1kOhm 1x

Kabel Jumper Male 2x

Langkah-Langkah Praktikum

Susunlah komponen-komponen praktikum seperti gambar di atas, caranya : 1. hubungkanlah kaki + Anoda LED ke Pin 13 Arduino menggunakan kabel jumper Male (warna kuning, saya gunakan untuk membedakan saja. Bisa menggunakan warna apa saja) 2. hubungkan kaki - Katoda LED dengan kaki 1 Resistor (resistor tidak ada kaki + atau - nya). 3. hubungkan kaki 2 Resistor dengan Pin Gnd Arduino menggunakan kabel jumper Male (warna hitam, biasa digunakan untuk Gnd atau 0 Volt. Sedangkan Merah, biasa digunakan untuk Voltase +). 4. hubungkan board Arduino Uno dengan Komputer menggunakan kabel USB. 5. Bukalah IDE Arduino, kemudian ketikkan kode program/sketch berikut: const int pinnyaLED = 13; int kondisiLED = LOW; long MillisSebelumnya = 0; long intervalWaktu = 1000; void setup() { pinMode(pinnyaLED, OUTPUT); } void loop() { unsigned long MillisSaatIni = millis(); if (MillisSaatIni - MillisSebelumnya > intervalWaktu) { MillisSebelumnya = MillisSaatIni;

if (kondisiLED = LOW) { kondisiLED = HIGH; } else { kondisiLED = LOW; } digitalWrite(pinnyaLED, kondisiLED); } } 6. compile menggunakan verify button (tanda ceklist pada IDE arduino) untuk mengecek ada atau tidaknya error/kesalahan dalam pengetikan. 7. upload program ke arduino dengan cara, pilih File > Upload to I/O board, atau tekan tombol tanda panah pada jendela IDE arduino. Amati hasilnya. Jika program yang anda ketikkan benar maka, hasilnya adalah LED akan berkelap-kelip dengan durasi nyala 1 detik kemudian padam 1 detik dan terus berulang-ulang seperti pada praktikum 1 blinking LED.

Diskusi dan Pembahasan Sketch Baiklah, kali ini saya akan mencoba menjelaskan alur program/sketch yang tadi sudah diketikkan, dicompile dan di Upload ke arduino. Silahkan perhatikan kembali program/sketch yang tadi sudah kita ketikkan untuk kita bahas satu-persatu.

Blok Pertama Kode program kita pada blok pertama ini, dimulai dengan mendeklarasikan dan menginisialisasikan variablevariable yang kita butuhkan. Berikut inilah variable-variable tersebut. const int pinnyaLED = 13; int kondisiLED = LOW; long MillisSebelumnya = 0; long intervalWaktu = 1000; variable yang pertama adalah variable “pinnyaLED” yang kita gunakan untuk mengunci pin 13 sebagai pin untuk LED. Penggunaan constanta pada variable ini, bertujuan agar variable ini tidak dapat diubah oleh-kodekode program berikutnya. Variable yang selanjutnya, yaitu variable “kondisiLED”. Variable ini bertipe integer dan kita gunakan untuk menyimpan kondisi dari LED.—Apakah LED menyala atau padam. Untuk setting awalnya, LED kita kondisikan padam. Itulah mengapa pada deklarasi variable ini, kita inisialisasikan sebagai LOW.

Dua variable selanjutnya yang kita perlukan yaitu variable “MillisSebelumnya” dan “intervalWaktu”. Berbeda dari variable-variable sebelumnya, tipe data yang digunakan pada variable ini adalah tipe data long. Tipe data ini dapat menyimpan data yang lebih besar dari pada tipe integer. Namun, dampak dari penggunaan tipe data long akan memakan lebih banyak memory yang dimiliki Arduino. Sebagai perbandingan, tipe data integer dapat menyimpan nilai dari (-)32,767 sampai (+)32,767. Sedangkan tipe data long dapat menyimpan jauh lebih bersar yaitu dari (-)2,147,483,647 sampai (+)2,147,483,647. Itulah mengapa dalam praktikum kita yang lalu, kita lebih sering menggunakan tipe data integer. Tipe long ini, kita gunakan hanyalah pada saat kita membutuhkan nilai yang tidak mampu ditampung oleh tipe data integer. Jadi mengapa kali ini kita menggunakan tipe data long ini?. Tipe ini kita gunakan karena dalam praktikum ini, kita akan menyimpan nilai dari sebuah fungsi yang bernama fungsi millis(). Fungsi ini, akan membaca nilai waktu Arduino mengeksekusi program setiap mili detik. Setiap mili detik fungsi ini akan terus bertambah nilainya. karena nilai ini terus bertambah, maka kita membutuhkan tipe data yang cukup besar untuk menampung pertambahan nilai tersebut. Itulah alasan kita menggunakan tipe data long pada praktikum kali ini. Baiklah, sekarang kita lanjutkan terlebih dahulu pembahasan kita ke blok yang berikutnya.

Blok Kedua Setelah sebelumnya kita sudah membahas tentang deklarasi variable, sekarang kita lanjutkan kembali ke blok yang selanjutnya yaitu routine setup ( ). Pada routine ini, tidak banyak yang kita lakukan, kita hanya mengatur mode dari pin 13 atau “pinnyaLED” menjadi OUTPUT. Tentunya Anda sudah sangat mengenal kode seperti berikut. void setup ( ) { pinMode ( pinnyaLED , OUTPUT ) ; } Apabila Anda mengikuti praktikum-praktikum sebelumnya, saya rasa sudah tidak ada yang perlu diperjelas lagi untuk kode pada routine setup() di atas. Untuk itu, mari kita lanjutkan saja ke blok program yang ketiga.

Blok Ketiga Blok kita selanjutnya yaitu routine loop(). Seperti yang telah kita pahami bersama, routine inilah yang biasanya kita gunakan untuk meletakkan program atau sketch utama kita. Sekarang, kita bahas apa yang ada pada routine loop() kita kali ini. Barisan kode pada routine loop() ini, kita buka dengan sebuah deklarasi variable yang kita berinama “MillisSaatIni” dan menginisialisasikannya dengan nilai dari sebuah fungsi yang bernama millis(). Berikut ini kodenya. unsigned long MillisSaatIni = millis ( ) ; Ada hal baru di sini, pertama kita coba perhatikan pada tipe variablenya. Di situ tertulis unsigned long.— apakah itu? Unsigned adalah sebuah qualifier yang gunanya untuk membatasi sebuah variable menyimpan nilai negative. Contohnya, sebuah tipe data long secara default dapat menyimpan nilai dari (-)2,147,483,647 sampai (+)2,147,483,647. Nah, apabila kita menggunakan unsigned long, maka nilai yang akan kita simpan

akan bernilai positif yaitu dari 0 sampai (+)4,294,967,295. -- Intinya, lebar data yang dapat disimpan tetap sama, hanya saja semuanya bernilai positif. Seperti telah kita bahas di atas, bahwa variable ini akan menyimpan nilai dari fungsi millis(). Fungsi millis() ini bekerja dengan menghitung waktu yang digunakan oleh Arduino untuk mengeksekusi setiap program yang berjalan. Jadi, setiap mili detik Arduino bekerja, maka setiap mili detik tersebut pula nilainya akan dibaca oleh fungsi millis() ini. Fungsi ini sebenarnya membaca nilai yang berasal dari internal clock yang ada pada ic mikrokontroler yang ada pada Arduino kita. Secara sederhananya, jika kita menyalakan atau me-reset Arduino, maka satu detik kemudian fungsi millis() ini akan membaca nilai 1000. Jika kita Arduino telah bekerja selama 5 detik, maka fungsi ini akan membaca nilai 5000. Semoga Anda paham maksud saya.  Baiklah,-- sekarang pertanyaannya, untuk apa kita menghitung lamanya Arduino bekerja?—dengan memiliki nilai lamanya Arduino bekerja, kita bisa menggunakan nilai tersebut, untuk kita bandingkan dengan variable yang telah kita buat mengatur lama LED kita nyalakan atau kita padamkan. Dalam hal ini kita akan bandingkan dengan variable “intervalWaktu” yang telah kita deklarasikan dan kita inisialisasikan dengan nilai 1000. Untuk membandinkannya, kita gunakan fungsi if. Berikut ini kode keseluruhan yang ada pada routine loop(). unsigned long MillisSaatIni = millis(); if (MillisSaatIni - MillisSebelumnya > intervalWaktu) { MillisSebelumnya = MillisSaatIni; if (kondisiLED = LOW) { kondisiLED = HIGH; } else { kondisiLED = LOW; } digitalWrite(pinnyaLED, kondisiLED); } Kita akan coba membahasnya secara perlahan. Kita mulai dari kode berikut. if (MillisSaatIni - MillisSebelumnya > intervalWaktu) Ingat, pada awal program kita telah memberikan nilai untuk variable “MillisSebelumnya” dengan nilai awal 0 dan variable “intervalWaktu” dengan nilai 1000. Kita juga telah membahas bahwa nilai pada variable “MillisSaatIni” nilainya diambil dari fungsi millis() yang membaca lamanya Arduino bekerja. Jadi, saat Arduino mulai bekerja kira-kira seperti inilah kondisi yang diperiksa oleh fungsi if. if (0 - 0 >1000) //kondisi belum terpenuhi, program dalam kurung kurawal fungsi if tidak di eksekusi. Jika kita tunggu kira-kira 1 detik berikutnya, maka nilai ini akan menjadi, if (1001 - 0 >1000) //kondisi terpenuhi, program dalam kurung kurawal akan di eksekusi.

Baiklah, sekarang kondisi pada fungsi if sudah terpenuhi, kemudian apa yang akan dilakukan oleh program pada fungsi if ini. Hal yang kita lakukan adalah meng-update nilai dari variable “MillisSebelumnya” menjadi sama dengan “MillisSaatIni”. Berikut ini kodenya. MillisSebelumnya = MillisSaatIni; Ini dilakukan, agar saat fungsi if telah selesai di eksekusi dan program kembali membaca kode dari routine loop(), maka nilai dari “MillisSebelumnya” tidak lagi bernilai 0. Namun, nilainya menjadi 1001. Kira-kira kondisi pada fungsi if pada putaran kedua, setelah Arduino bekerja lebih dari 2,2 detik yaitu akan terbaca seperti ini. if (2002 -1001 >1000) Oke, sekarang kita lanjutkan terlebih dahulu membahas apa yang ada pada fungsi if selanjutnya. Setelah kita meng-update nilai pada variable “MillisSebelumnya”, kita akan mengatur kondisi LED—apakah menyala atau padam. Untuk melakukannya, kita menggunakan kode-kode berikut. if (kondisiLED = LOW) { kondisiLED = HIGH; } else { kondisiLED = LOW; } digitalWrite(pinnyaLED, kondisiLED); Pada kode di atas, kita menggunakan sebuah fungsi if lainnya untuk memeriksa nilai dari variable “kondisiLED”. Karena pada blok pertama program variable ini sudah kita berikan inisialisasi awal LOW maka untuk putaran pertama kondisi fungsi if ini terpenuhi. Kemudian, kita meng-update “kondisiLED” menjadi HIGH menggunakan kode berikut, kondisiLED = HIGH; Sehingga pada putaran kedua, kondisi pada fungsi if tidak terpenuhi, karena nilai dari “kondisiLED” sudah berubah menjadi HIGH. Itulah mengapa, pada putaran kedua fungsi else lah yang dieksekusi. Pada fungsi else kita meng-update kembali nilai dari variable “kondisiLED” menjadi LOW dengan kode berikut. kondisiLED = LOW; Sekarang sebaliknya, kondisi fungsi if akan terpenuhi lagi karena fungsi else telah meng-update “kondisiLED” menjadi LOW kembali. Selanjutnya akan terus bergilir seperti apa yang terjadi pada pembahasan di atas. Semoga Anda paham maksud saya..  Baiklah, sekarang setidaknya kita sudah paham bahwa variable “kondisiLED” akan berubah secara bergiliran dari LOW kemudian HIGH dan kembali lagi. Nah, perubahan dari variable “kondisiLED” inilah, yang kita

manfaatkan untuk mengatur LED pada pin 13 menyala dan padam secara bergantian. Untuk itu, kita gunakan fungsi digitalWrite() untuk melakukannya. Berikut kode yang kita gunakan. digitalWrite(pinnyaLED, kondisiLED); Seperti telah kita pahami bersama, fungsi digitalWrite() membutuhkan dua parametert.—nomor pin yang digunakan dan hasil yang diinginkan—pada kode di atas, kedua parametert yang dibutuhkan tersebut kita isi dengan menggunakan variable. Variable “pinnyaLED” untuk nomor pin dan “kondisiLED” untuk hasil yang diinginkan. Mungkin bagi Anda cara ini terlihat cukup rumit. Padahal, kita hanya membuat blink LED saja. – ya benar, tapi dengan metode ini, sekarang kita bisa dengan bebas memasukkan kode-kode program lainnya, tanpa perlu mengganggu LED kita tetap berkelap-kelip. Nah, selesai sudah pembahasan kita pada diskusi sketch kita kali ini. Sampai jumpa lagi di praktikum berikutnya dan terimakasih.. 

Latihan Mandiri Untuk meningkatkan kemampuan dan pemahaman Anda, coba kerjakan latihan mandiri berikut. 1. Ubahlah lama kedipan nyala-padam LED menjadi 3 detik sekali. 2. Tambahkan sebuah potensiometer pada rangkaian seperti praktikum 4 (Membaca Nilai Analog). Kemudian, sisipkan kode tersebut kedalam praktikum ini. Pastikan program tersebut bisa tetap di eksekusi dan berjalan tanpa mengganggu kedipan LED di praktikum ini.

www.BELAJARBIKINROBOT.WEEBLY.com