Bab 4 Digital Output
Last updated
Last updated
GPIO memiliki kepanjangan General Purpose Input Output. GPIO merupakan interface paling sederhana yang bisa dihubungkan dengan sensor atau aktuator. GPIO bisa difungsikan sebagai input atau output. Ketika GPIO difungsikan sebagai input, maka GPIO bisa digunakan untuk membaca nilai digital (0 atau 1) dari sensor. Ketika GPIO difungsikan sebagai output, maka GPIO bisa digunakan untuk mengontrol aktuator dengan nilai digital.
Gambar 1 mengilustrasikan GPIO yang dihubungkan dengan LED dan button. GPIO difungsikan sebagai input untuk membaca nilai button, sedangkan untuk mengontrol LED, maka GPIO difungsikan sebagai output.
GPIO bekerja dalam dua level diskrit yaitu logika low (0) dan high (1). Kedua logika tersebut direpresentasikan oleh dua level tegangan yang berbeda atau disebut juga sebagai level tegangan. Level tegangan yang paling sering digunakan yaitu 0V untuk logika 0 dan 5V untuk logika 1. Salah satu contoh board yang menggunakan level tegangan ini yaitu Arduino Uno.
Ada juga level tegangan lain yang sering digunakan yaitu 0V untuk logika 0 dan 3.3V untuk logika 1 seperti pada Gambar 2. Board-board berbasis ESP32 menggunakan level tegangan ini. Level tegangan sangat penting karena berhubungan tegangan kerja dari sensor atau actuator kita. Sensor yang bekerja pada 5V tidak bisa dihubungkan secara langsung ke mikrokontroler yang bekerja pada 3.3V, karena dapat merusak mikrokontroler tersebut.
Sebelum kita menggunakan suatu board mikrokontroler, sebaiknya kita mengetahui level tegangan yang digunakan oleh board tersebut agar tidak terjadi kesalahan yang dapat merusak board tersebut.
Gambar 2 hanya menggambarkan level tegangan secara sederhana. Pada kenyataannya level tegangan yang merepresentasikan nilai HIGH dan LOW itu berupa range tegangan seperti pada Gambar 3. Gambar tersebut merupakan detail level tegangan 3.3V pada ESP32.
: tegangan OUTPUT minimum yang akan dihasilkan ketika memberikan logika HIGH.
: tegangan INPUT minimum agar terbaca sebagai logika HIGH.
: tegangan INPUT maksimum agar terbaca sebagai logika LOW.
: tegangan OUTPUT maksimum yang akan dihasilkan ketika memberikan logika LOW.
Tegangan output minimum untuk logika HIGH adalah . Ini berarti ketika ESP32 mengeluarkan logika HIGH, maka tegangannya selalu lebih besar dari sampai . Tegangan input minimum untuk logika HIGH adalah . Ini berarti nilai tegangan lebih besar dari sampai akan terbaca sebagai logika HIGH.
Tegangan output maksimum untuk logika LOW adalah . Ini berarti ketika ESP32 mengeluarkan logika LOW, maka tegangannya selalu lebih kecil dari sampai . Tegangan input maksimum untuk logika LOW adalah . Ini berarti nilai tegangan lebih kecil dari sampai akan terbaca sebagai logika LOW.
Ada perbedaan tegangan sebesar antara tegangan output dan tegangan input HIGH. Ini biasanya disebut sebagai noise margin. Noise margin pada tegangan output dan tegangan input LOW yaitu sebesar .
Kemudian, apa yang akan terjadi jika tegangannya berada di antara dan ? Tegangan tersebut tidak memiliki nilai logika yang terdefinisi atau disebut juga sebagai floating. Ketika suatu pin dalam keadaan floating, maka tidak ada kepastian nilai logikanya apakah HIGH atau LOW, karena bisa saja nilai logikanya sedang berosilasi antara HIGH dan LOW yang diakibatkan oleh noise eksternal.
Digital output merupakan cara paling sederhana yang bisa dilakukan mikrokontroler untuk mengontrol komponen lain. Kita bisa menggunakan GPIO sebagai digital output untuk mengontrol (meyalakan atau mematikan) LED, buzzer, relay, motor DC, dll.
Sebagai catatan, untuk mengontrol komponen tersebut mungkin diperlukan rangkaian tambahan atau disebut juga driver. Hal ini diperlukan karena biasanya komponen tersebut membutuhkan arus dan tegangan yang lebih besar dari kemampuan GPIO dalam men-supply arus dan tegangan.
Gambar 5 memperlihatkan daftar pin pada board DOIT ESP32 DevKit v1 yang dapat digunakan sebagai GPIO untuk digital output.
Pada library Arduino sudah terdapat fungsi-fungsi untuk memudahkan kita menggunakan GPIO sebagai digital output. Dua fungsi utama yang penting yaitu pinMode
dan digitalWrite
.
Fungsi pinMode
memiliki dua input argument yaitu pin GPIO yang akan kita konfigurasi dan mode GPIO. Mode GPIO yang tersedia pada ESP32 yaitu OUTPUT
, INPUT
, INPUT_PULLUP
, dan INPUT_PULLDOWN
.
Fungsi digitalWrite
memiliki dua input argument yaitu pin GPIO yang akan kita atur nilainya dan nilai logika untuk pin tersebut. Nilai logika yang digunakan yaitu LOW
atau HIGH
.
Fungsi pinMode
biasanya dipanggil di dalam fungsi setup
, sedangkan fungsi digitalWrite
biasanya dipanggil di dalam fungsi loop
. Walaupun demikian, fungsi digitalWrite
juga bisa dipanggil di dalam fungsi setup
untuk men-set nilai awal GPIO output.
Light-emitting diode (LED) merupakan komponen elektronika yang memancarkan cahaya ketika arus listrik melewatinya. LED terbuat dari material semikonduktor. Elektron pada semikonduktor tersebut dapat melakukan rekombinasi dengan hole yang akan melepaskan energi dalam bentuk photon (partikel cahaya). Gambar 6 menampilkan berbagai macam jenis LED berdasarkan package-nya.
Ada dua jenis rangkaian dasar LED yang banyak digunakan yaitu rangkaian LED active-high dan rangkaian LED active-low. Perbedaan antara rangkaian active-high dan active-low yaitu pada nilai logika yang diperlukan untuk menyalakan LED tersebut.
Gambar 7 menampilkan rangkaian LED active-high. Pada rangkaian ini, pin GPIO output dihubungkan dengan resistor dan LED secara seri dan terhubung ke GND. Berikut ini cara kerja rangkaian LED active-high:
Ketika GPIO output di-set ke logika LOW (0V), maka GPIO output tersebut dan GND memiliki potensial yang sama, sehingga arus tidak bisa mengalir, maka LED tidak akan menyala.
Ketika GPIO output di-set ke logika HIGH (3.3V), maka GPIO output tersebut dan GND memiliki potensial yang beda, sehingga arus bisa mengalir dari GPIO output tersebut ke GND, maka LED akan menyala.
Kesimpulannya, untuk menyalakan LED pada rangkaian active-high, kita harus men-set GPIO output ke logika HIGH, dan sebaliknya untuk mematikan LED. Sesuai dengan namanya, active-high, kita membutuhkan logika HIGH untuk mengaktifkan komponen pada rangkaian tersebut.
Gambar 8 menampilkan rangkaian LED active-low. Pada rangkaian ini, supply 3.3V dihubungkan dengan resistor dan LED secara seri dan terhubung ke pin GPIO output. Berikut ini cara kerja rangkaian LED active-low:
Ketika GPIO output di-set ke logika HIGH (3.3V), maka GPIO output tersebut dan supply memiliki potensial yang sama, sehingga arus tidak bisa mengalir, maka LED tidak akan menyala.
Ketika GPIO output di-set ke logika LOW (0V), maka GPIO output tersebut dan supply memiliki potensial yang beda, sehingga arus bisa mengalir dari supply ke GPIO output tersebut, maka LED akan menyala.
Kesimpulannya, untuk menyalakan LED pada rangkaian active-low, kita harus men-set GPIO output ke logika LOW, dan sebaliknya untuk mematikan LED. Sesuai dengan namanya, active-low, kita membutuhkan logika LOW untuk mengaktifkan komponen pada rangkaian tersebut.
Rumus untuk menghitung nilai resistor LED baik pada rangkaian active-high maupun active-low yaitu seperti berikut ini.
Dimana:
adalah nilai resistor yang dicari,
adalah tegangan supply,
adalah tegangan forward LED (dari datasheet), dan
adalah arus forward LED (dari datasheet).
Sebagai contoh jika LED berwarna merah standar berukuran 5mm memiliki tegangan forward 2V dan arus forward maksimum 20mA. Berapa nilai resistor yang diperlukan jika supply yang digunakan adalah 3.3V?
Nilai resistor yang diperlukan adalah agar didapatkan brightness yang optimal. Akan tetapi, jika nilai tersebut sulit didapatkan, maka dapat digunakan nilai terdekat (yang lebih tinggi) yang lebih mudah didapatkan seperti . Ataupun jika kita ingin menggunakan nilai yang lebih besar dari pun tidak masalah, yang terjadi yaitu hanya akan mengurangi brightness-nya saja.
Pada bagian ini akan dibahas dua contoh program LED untuk rangkaian active-high dan active-low. Kedua program tersebut sangat mirip, hanya berbeda pada nilai logika yang digunakan untuk menyalakan LED.
Gambar 9 menampilkan rangkaian LED untuk program LED active-high. Pin GPIO yang digunakan sebagai output yaitu pin D4.
Kode berikut ini menampilkan contoh program LED active-high. Berikut ini penjelasan cara kerja program tersebut:
Pada line 2, kita membuat sebuah variable yang bernama ledPin
yang berisi pin yang terhubung ke LED tersebut. Keyword const
digunakan untuk membuat variable tersebut menjadi konstanta yang tidak bisa diubah nilainya setelah diinisialisasi.
Pada line 7, kita melakukan inisialisasi terhadap GPIO sebagai pin output dengan memanggil fungsi pinMode
.
Pada line 9, kita menulis nilai logika HIGH ke pin output dengan memanggil fungsi digitalWrite
. Nilai logika HIGH akan menyalakan LED pada rangkaian active-high.
Gambar 10 menampilkan rangkaian LED untuk program LED active-low. Pin GPIO yang digunakan sebagai output yaitu pin D4.
Kode berikut ini menampilkan contoh program LED active-low. Pada dasarnya program LED active-low mirip dengan program sebelumnya untuk LED active-high. Berikut ini penjelasan cara kerja program tersebut:
Pada line 2, kita membuat sebuah konstanta ledPin
yang berisi pin yang terhubung ke LED.
Pada line 7, kita melakukan inisialisasi terhadap GPIO sebagai pin output dengan memanggil fungsi pinMode
.
Pada line 9, kita menulis nilai logika LOW ke pin output dengan memanggil fungsi digitalWrite
. Nilai logika LOW akan menyalakan LED pada rangkaian active-low.
Kedua program tersebut akan memberikan hasil yang sama yaitu LED-nya menyala.
Kode program untuk LED active-high dan active-low dapat didapatkan di repository ini: led-active-high dan led-active-low.