ESP32 : Inputs and Outputs
Kali ini kita kembali membahas tentang ESP32 Development Board. Pada kesempatan kali ini, saya melakukan eksperimen mengenai Input dan Output pada ESP32. Pada gambar di atas, kita dapat melihat bahwa ESP32 memiliki pin sebagai interface untuk berkomunikasi dengan dunia luar. Pin tersebut disebut sebagai General Purpose Input Output (GPIO). GPIO tersebut terdiri atas:
- 18 buah kanal Analog-to-Digital Converter (ADC)
- 3 buah antarmuka Serial-Parallel Interface (SPI)
- 3 buah antarmuka UART
- 2 buah antarmuka I2C
- 16 kanal output PWM
- 2 Digital-to-Analog Converter (DAC)
- 2 buah antarmuka I2S
- 10 buah GPIO Capacitive Sensing
ESP32 sendiri memiliki pin-pin yang bersifat default untuk setiap interfacenya. Beberapa pin lebih cocok untuk digunakan sebagai keperluan tertentu daripada pin lainnya. Mengacu kepada Gambar 1, terdapat pin yang memiliki suatu fitur spesial yang membuatnya cocok untuk digunakan pada suatu proyek.
Beberapa di antaranya adalah pada GPIO 34, 35, 36, dan 39 yang merupakan input-only pins, dimana GPIO tersebut hanya berfungsi sebagai input dan tidak dapat digunakan sebagai output. Ada juga GPIO yang memiliki capacitive touch sensors, yaitu fitur yang dapat mendeteksi apapun yang memiliki muatan listrik, seperti kulit manusia. Kemudian ada GPIO yang dapat mengonversi sinyal digital menuju sinyal analog (digital-to-analog converter/DAC) ataupun sebaliknya (analog-to-digital converter/ADC). Selain itu, ada juga GPIO yang dapat menghasilkan sinyal PWM dan berfungsi sebagai output pin.
GPIO dapat menerima sinyal digital ataupun sinyal analog, dan ia juga dapat menghasilkan output berupa sinyal digital ataupun sinyal analog. Pada sinyal digital, hanya ada 2 kondisi yang berlaku, yaitu ON(tegangan mengalir sebesar 3,3 volt) atau OFF(tegangan tidak mengalir sama sekali/0 volt). Di lain sisi, sinyal analog di sini tidak sesederhana itu. Pada sinyal analog, nilainya bervariasi dari kondisi OFF(0 volt), ON(3,3 volt) dan di antara keduanya(0 < x < 3,3). Ilustrasi sederhana untuk membedakan sinyal digital dan analog adalah pada ilustrasi menyalakan lampu. Jika kita menggunakan sinyal digital, hanya ada kondisi bahwa lampu mati(OFF) atau lampu menyala(ON). Sedangkan, jika kita menggunakan sinyal analog, maka kita bisa membuat lampu mati, menyala, ataupun menyala dengan kondisi terang yang bervariasi (terang, redup).
DIGITAL INPUT AND OUTPUT
Pada percobaan kali ini, saya mencoba menggunakan sinyal digital untuk menyalakan dan mematikan lampu. Adapun alat dan bahan yang dibutuhkan untuk percobaan ini adalah sebagai berikut:
- ESP32 Development Board
- Breadboard 800 titik
- Kabel USB micro
- Lampu LED mini sebanyak 2 buah
- Kabel jumper male-to-female
- Kabel jumper male-to-male
- Push Button
- Resistor 330 Ohm
- Resistor 10.000 Ohm
Bahan-bahan di atas akan dirangkai menjadi seperti diagram di bawah ini.
Seperti yang terlihat pada diagram tersebut, lampu dihubungkan pada GPIO 5 dan 18. GPIO 4 terhubung pada push button. 2 kabel lain yang terhubung pada ESP32 adalah pemberi tegangan 3,3 volt dan ground. Selanjutnya, kabel pemberi tegangan 3,3 volt dihubungkan pada push button. Pada push button juga dipasangkan resistor 10.000 Ohm. Selain itu, masing-masing lampu LED juga dihubungkan pada resistor 330 Ohm.
Setelah rangkaian siap, mari kita lihat kode yang diimplementasikan.
Pertama-tama kita memberi tahu pada GPIO berapa masing-masing komponen lampu LED dan push button berada. Seperti terlihat pada kode tersebut, push button terhubung pada GPIO 4 dan lampu LED masing-masing terhubung pada GPIO 5 dan GPIO 18. Kemudian, kita menetapkan suatu variabel buttonState, yang berfungsi mencatat nilai pada push button. Perhatikan bahwa buttonState bernilai 0 yang berarti push button tidak ditekan.
Selanjutnya, kita akan mengatur masing-masing peran dari lampu LED dan push button. Alur kerja rangkaian adalah kita menerima masukan dari push button (push button ditekan/tidak) dan sebagai konsekuensinya, lampu akan berada dalam suatu kondisi. Maka dari itu, disini kita mengatur push button sebagai input dan kedua LED sebagai output.
Program akan mengecek nilai dari push button. Jika push button ditekan, maka “nilai”-nya akan lebih dari 0. Sebaliknya, jika push button tidak ditekan, maka nilainya tetap 0. Karena sinyal yang digunakan untuk menyalakan lampu adalah sinyal digital, maka digunakan fungsi digitalWrite(). Apabila push button ditekan, maka lampu LED pertama (yang terhubung pada GPIO 5) akan menyala, sedangkan lampu LED kedua (yang terhubung pada GPIO 18) akan mati. Sebaliknya, apabila push button tidak ditekan, maka lampu LED pertama (yang terhubung pada GPIO 5) akan mati, sedangkan lampu LED kedua (yang terhubung pada GPIO 18) akan menyala.
Berikut demo dari percobaan di atas.
ANALOG INPUT
Jika percobaan menggunakan sinyal digital hanya menghasilkan lampu yang mati atau menyala, lain halnya dengan percobaan menggunakan sinyal analog. Pada percobaan ini, kita akan menggunakan potensiometer yang dapat mengatur sebesar apakah tegangan yang mengalir pada rangkaian.
Alat dan bahan yang digunakan untuk percobaan ini adalah sebagai berikut.
- ESP32 Development Board
- Breadboard 800 titik
- Kabel USB micro
- Kabel jumper male-to-female
- Kabel jumper male-to-male
- Potensiometer
Bahan-bahan di atas akan dirangkai menjadi seperti diagram di bawah ini.
Rangkaian pada percobaan kali ini cukup simpel. Kita hanya perlu menghubungkan GPIO 34, pemberi tegangan 3,3 volt, serta ground pada potensiometer. GPIO 34 dipilih karena pada GPIO 34 merupakan salah satu pin yang dapat mengonversi sinyal analog menjadi digital.
Setelah rangkaian siap, mari kita lihat kode yang diimplementasikan.
Pertama-tama, kita mendeklarasikan pada kode GPIO pin berapa potensiometer terhubung. Selanjutnya kita perlu menciptakan suatu variabel yang akan menampung bacaan nilai dari potensiometer.
Kita kemudian mengatur serial communication dengan baud rate sebesar 115200. Karena sinyal yang digunakan adalah sinyal analog, maka untuk membaca nilainya, digunakan fungsi analogRead(). Setiap 0.5 detik, nilai pada potensiometer tercatat dan akan ditampilkan pada serial monitor.
Berikut demo dari percobaan di atas.
GPIO yang digunakan, GPIO 34, adalah suatu analog input pin. Analog input-pin ini memiliki resolusi sebesar 12 bit. Sehingga, saat menerima input analog, pin tersebut membaca nilainya dengan rentang 0–4095 (atau ²¹²- 1). Ini berarti bahwa saat nilainya 0, tidak ada tegangan yang dialirkan. Saat nilainya sebesar 4095, maka tegangan yang dialirkan sebesar 3,3 volt.
ANALOG OUTPUT
Percobaan kali ini adalah menyalakan lampu menggunakan sinyal analog. Dalam percobaan kali ini, lampu dapat menyala dengan tingkat keterangan yang bervariasi berkat kemampuan pin GPIO yang dapat menghasilkan sinyal PWM dengan jumlah yang berbeda-beda.
PWM, singkatan dari pulse width moderator, adalah suatu teknik modulasi yang mengubah lebar pulsa (pulse width) dengan nilai frekuensi dan amplitudo yang tetap. PWM dapat dianggap sebagai kebalikan dari ADC (Analog to Digital Converter) yang mengkonversi sinyal Analog ke Digital, PWM atau Pulse Width Modulation ini digunakan menghasilkan sinyal analog dari perangkat Digital (contohnya dari Mikrokontroller).
Ada beberapa istilah yang digunakan terkait dengan PWM. TON adalah durasi dimana posisi sinyal berada pada posisi tinggi (dalam hal ini, sinyal berada pada tegangan 3,3 volt). TOFF adalah durasi dimana posisi sinyal berada pada posisi bawah (dalam hal ini, sinyal berada pada tegangan 0 volt). Sehingga, pada dasarnya sinyal PWM akan ON untuk suatu periode tertentu dan OFF untuk sisa periodenya. Persentase waktu dimana TON terjadi disebut dengan duty cycle.
Untuk lebih memahami tentang duty cycle, mari kita perhatikan contoh berikut ini.
Suatu rangkaian lampu LED bekerja dengan duty cycle sebesar 50% dan frekuensi 1 hz. Kita dapat mengartikan bahwa dalam 1 detik, lampu LED akan menyala selama 0.5 detik dan mati untuk sisa waktunya. Jika frekuensi dinaikkan menjadi 20 hz (yang berarti lampu menyala dan mati sebanyak 20 kali per detik), maka yang terlihat pada mata kita adalah lampu LED tersebut menyala lebih redup.
Resolusi dari duty cycle sendiri adalah sebesar 8 bit. Artinya, nilai yang tercatat pada serial monitor berada pada rentang 0–255, dengan 0 sebagai duty cycle 0%, dan 255 sebagai duty cycle 100%.
Pada percobaan kali ini, GPIO ESP32 mengeluarkan tegangan 3.3 volt (HIGH) atau 0 volt (LOW) membentuk suatu sinyal square wave, dengan frekuensi dan amplitudo yang tetap. Untuk mengatur tingkat keterangan dari lampu LED, kita dapat mengatur waktu sinyal ON dan OFF nya.
Alat dan bahan yang akan digunakan untuk percobaan ini adalah sebagai berikut:
- ESP32 Development Board
- Breadboard 800 titik
- Kabel USB micro
- Lampu LED mini sebanyak 2 buah
- Kabel jumper male-to-female
- Kabel jumper male-to-male
- Resistor 330 Ohm
Peralatan di atas akan disusun menjadi seperti diagram berikut ini.
Seperti yang terlihat pada diagram tersebut, lampu LED terhubung pada GPIO 16 dan 17, dan masing-masing lampu dirangkai dengan resistor 330 ohm secara seri. Breadboard juga dihubungkan kepada ESP32.
Setelah rangkaian siap, mari kita lihat kode yang diimplementasikan.
Pertama-tama, kita mendeklarasikan pada GPIO berapa kedua lampu LED tersebut terhubung. Selanjutnya, kita menyunting properti untuk sinyal PWM. Kita mengatur sinyal tersebut akan berjalan pada frekuensi berapa hz, ledChannelnya, dan resolusi sinyal PWM. Ketiga properti tersebut akan direalisasikan dalam fungsi ledcSetup(). Selanjutnya, kita mengatur sinyal PWM tersebut akan digunakan pada GPIO berapa, dalam hal ini menggunakan fungsi ledcAttachPin().
Pada dasarnya, fungsi loop() disini mengatur tentang bagaimana lampu mnejadi terang dan redup. Pada algoritma pengulangan pertama, kita mengatur lampu yang semula mati (duty cycle 0) agar seiring berjalannya waktu menjadi terang(duty cycle 255/ duty cycle 100%). Setiap 10 ms, duty cycle dari sinyal PWM untuk lampu LED tersebut akan bertambah sebanyak 1 digit hingga mencapai duty cycle 255, dalam kode hal ini direalisasikan menggunakan fungsi ledcWrite().
Sebaliknya, pada algoritma pengulangan kedua, kita mengatur lampu yang semula menyala terang (duty cyclenya 255) seiring berjalannya waktu menjadi mati total (duty cyclenya menjadi 0). Setiap 10 ms (delay(10)), duty cycle dari sinyal PWM akan berkurang sebanyak 1 digit hingga mencapai duty cycle 0, direalisasikan menggunakan fungsi ledcWrite().
Demo dari percobaan berikut adalah seperi di bawah ini.
Pada kesempatan ini, saya telah mencoba dan mengeksplore mengenai interface input dan output pada board ESP32. Ada yang menggunakan sinyal analog dan juga sinyal digital. Saya tidak sabar untuk percobaan fitur-fitur lain yang ada pada ESP32 ini.