📈
Ween's Lab
UdemyYouTubeTikTok
  • Welcome
  • 📻FPGA Tutorials
    • FPGA Boards: Getting Started
      • Getting Started with PYNQ on Kria KV260 Vision AI Starter Kit
      • Getting Started with PYNQ on Red Pitaya STEMlab 125-14
      • Getting Started with PYNQ on ZYBO
    • FPGA Ethernet Tutorial
      • FPGA Tutorial Ethernet 1: Simple TCP Server
    • PYNQ FPGA Tutorial 101
      • Part 0: Introduction
      • Part 1: GPIO
      • Part 2: Custom IP
      • Part 3: Memory
      • Part 4: ANN Processor
    • PYNQ FPGA Tutorial 102
      • Part 0: Introduction
      • Part 1: Memory Mapped
      • Part 2: Direct Memory Access
      • Part 3: AXI-Lite Multiplier
      • Part 4: AXI-Stream Multiplier with DMA
      • Part 5: AXI-Lite GCD
      • Part 6: AXI-Stream GCD with DMA
      • Part 7: Access to DDR from PL
    • ZYNQ FPGA Tutorial
      • Part 1: Gate-Level Combinational Circuit
      • Part 2: RT-Level Combinational Circuit
      • Part 3: Regular Sequential Circuit
      • Part 4: FSM Sequential Circuit
      • Part 5: ZYNQ Architecture
      • Part 6: ARM CPU and FPGA Module
      • Part 7: FPGA Memory
      • Part 8: Hardware Accelerator for Neural Networks
    • ZYNQ FPGA Linux Kernel Module
      • Cross Compiling Kernel, Kernel Module, and User Program for PYNQ
      • Configure PL to PS Interrupt in Kernel Module
      • Configure AXI DMA in Kernel Module
  • 📟Proyek Arduino
    • Kumpulan Proyek
      • Rangkaian LED
      • LED Berkedip Nyala Api
      • LED Chaser
      • LED Binary Counter
      • OLED 128x4 Bitcoin Ticker
      • Rangkaian Button
      • Button Multifungsi
      • Button Interrupt
      • Button Debouncing
    • Pelatihan Mikrokontroler Arduino ESP32
      • Bab 1 Pengenalan Mikrokontroler
      • Bab 2 Pengenalan Arduino
      • Bab 3 Pengenalan Bahasa C
      • Bab 4 Digital Output
      • Bab 5 Digital Input
      • Bab 6 Serial Communication
      • Bab 7 Analog-to-Digital Conversion
      • Bab 8 Interrupt
      • Bab 9 Timer
      • Bab 10 Pulse-Width Modulation
      • Bab 11 SPI Communication
      • Bab 12 I2C Communication
  • 💰Finance
    • Coding for Finance
      • Build a Bitcoin Price Alert with Google Cloud and Telegram
      • Build a Bitcoin Ticker with ESP32 and Arduino
      • Stock Price Forecasting with LSTM
    • Trading dan Investasi
      • Istilah Ekonomi, Keuangan, Bisnis, Trading, dan Investasi
      • Jalan Menuju Financial Abundance
      • Memahami Korelasi Emas, Oil, Dollar, BTC, Bonds, dan Saham
      • Mindset Trading dan Investasi
      • Rangkuman Buku: Rahasia Analisis Fundamental Saham
      • Rangkuman Buku: The Psychology of Money
      • Rangkuman Kuliah: Introduction to Adaptive Markets
      • Rumus Menjadi Orang Kaya
  • 📝Life
    • Life Quotes
Powered by GitBook
On this page
  • 1. General Purpose I/O
  • 2. Level Tegangan
  • 3. Digital Output
  • 4. Library Digital Output
  • 5. LED
  • 6. Rangkaian LED
  • 6.1. Rangkaian LED Active-High
  • 6.2. Rangkaian LED Active-Low
  • 6.3. Menghitung Nilai Resistor
  • 7. Contoh Program
  • 7.1. Program LED Active-High
  • 7.2. Program LED Active-Low
  • 8. Repository Kode Program
  1. Proyek Arduino
  2. Pelatihan Mikrokontroler Arduino ESP32

Bab 4 Digital Output

PreviousBab 3 Pengenalan Bahasa CNextBab 5 Digital Input

Last updated 1 year ago

1. General Purpose I/O

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.

2. Level Tegangan

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.

  • VOHV_{OH}VOH​: tegangan OUTPUT minimum yang akan dihasilkan ketika memberikan logika HIGH.

  • VIHV_{IH}VIH​: tegangan INPUT minimum agar terbaca sebagai logika HIGH.

  • VILV_{IL}VIL​: tegangan INPUT maksimum agar terbaca sebagai logika LOW.

  • VOLV_{OL}VOL​: tegangan OUTPUT maksimum yang akan dihasilkan ketika memberikan logika LOW.

Tegangan output minimum untuk logika HIGH VOHV_{OH}VOH​adalah 2.64V2.64V2.64V. Ini berarti ketika ESP32 mengeluarkan logika HIGH, maka tegangannya selalu lebih besar dari 2.64V2.64V2.64V sampai 3.3V3.3V3.3V. Tegangan input minimum untuk logika HIGH VIHV_{IH}VIH​ adalah 2.475V2.475V2.475V. Ini berarti nilai tegangan lebih besar dari 2.475V2.475V2.475V sampai 3.3V3.3V3.3V akan terbaca sebagai logika HIGH.

Tegangan output maksimum untuk logika LOW VOLV_{OL}VOL​ adalah 0.33V0.33V0.33V. Ini berarti ketika ESP32 mengeluarkan logika LOW, maka tegangannya selalu lebih kecil dari 0.33V0.33V0.33V sampai 0V0V0V. Tegangan input maksimum untuk logika LOW VIHV_{IH}VIH​ adalah 0.825V0.825V0.825V. Ini berarti nilai tegangan lebih kecil dari 0.825V0.825V0.825V sampai 0V0V0V akan terbaca sebagai logika LOW.

Ada perbedaan tegangan sebesar 0.165V0.165V0.165V antara tegangan output dan tegangan input HIGH. Ini biasanya disebut sebagai noise margin. Noise margin pada tegangan output dan tegangan input LOW yaitu sebesar 0.495V0.495V0.495V.

Kemudian, apa yang akan terjadi jika tegangannya berada di antara 0.33V0.33V0.33V dan 2.475V2.475V2.475V? 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.

3. Digital Output

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.

4. Library 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.

void pinMode(uint8_t pin, uint8_t mode);

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.

void digitalWrite(uint8_t pin, uint8_t val);

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.

5. LED

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.

6. Rangkaian LED

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.

6.1. Rangkaian LED Active-High

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.

6.2. Rangkaian LED Active-Low

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.

6.3. Menghitung Nilai Resistor

Rumus untuk menghitung nilai resistor LED baik pada rangkaian active-high maupun active-low yaitu seperti berikut ini.

R=VS−VFIFR=\frac{V_S-V_F}{I_F}R=IF​VS​−VF​​

Dimana:

  • RRR adalah nilai resistor yang dicari,

  • VSV_SVS​ adalah tegangan supply,

  • VFV_FVF​ adalah tegangan forward LED (dari datasheet), dan

  • IFI_FIF​ 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?

R=VS−VFIF=3.3−20.02=65Ω≈68ΩR=\frac{V_S-V_F}{I_F}=\frac{3.3-2}{0.02}=65\Omega\approx68\OmegaR=IF​VS​−VF​​=0.023.3−2​=65Ω≈68Ω

Nilai resistor yang diperlukan adalah 65Ω65\Omega65Ω 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 68Ω68\Omega68Ω. Ataupun jika kita ingin menggunakan nilai yang lebih besar dari 68Ω68\Omega68Ω pun tidak masalah, yang terjadi yaitu hanya akan mengurangi brightness-nya saja.

7. Contoh Program

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.

7.1. Program LED Active-High

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.

led-active-high.ino
// LED pin
const int ledPin = 4;

void setup()
{
    // Konfigurasi GPIO pin sebagai output untuk LED
    pinMode(ledPin, OUTPUT);
    // Nyalakan LED active-high
    digitalWrite(ledPin, HIGH);
}

void loop()
{
}

7.2. Program LED Active-Low

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.

led-active-low.ino
// LED pin
const int ledPin = 4;

void setup()
{
  // Konfigurasi GPIO pin sebagai output untuk LED
  pinMode(ledPin, OUTPUT);
  // Nyalakan LED active-low
  digitalWrite(ledPin, LOW);
}

void loop()
{
}    

Kedua program tersebut akan memberikan hasil yang sama yaitu LED-nya menyala.

8. Repository Kode Program

Kode program untuk LED active-high dan active-low dapat didapatkan di repository ini: dan .

📟
led-active-high
led-active-low
Gambar 1. Ilustrasi penggunaan GPIO
Gambar 2. Level tegangan 3.3V
Gambar 3. Detail level tegangan 3.3V
Gambar 4. Digital output dapat digunakan untuk mengontrol komponen secara digital
Gambar 7. Rangkaian LED active-high
Gambar 8. Rangkaian LED active-low
Gambar 9. Rangkaian breadboard untuk program LED active-high
Gambar 10. Rangkaian breadboard untuk program LED active-low
Gambar 5. Pin pada board DOIT ESP32 DevKit v1 (versi 30 pins). Sumber:
Gambar 6. Berbagai macam jenis LED berdasarkan package. Sumber:
https://randomnerdtutorials.com/getting-started-with-esp32/
https://en.wikipedia.org/wiki/Light-emitting_diode