Sinyal Digital, Analog, dan PWM pada Arduino

Arduino memiliki dua jenis utama sinyal listrik: digital dan analog. Sinyal digital hanya memiliki dua tingkat diskrit, biasanya HIGH (5V) dan LOW (0V), sehingga mewakili logika 1 dan 0. Sebaliknya, sinyal analog bersifat kontinu, dengan nilai tegangan yang bisa bervariasi di antara 0–5V secara mulus (misal suara manusia adalah sinyal analog yang fluktuatif). Karena mikrokontroler Arduino berbasis digital, Arduino tidak mempunyai output analog murni. Namun, Arduino dapat meniru keluaran analog dengan menggunakan teknik PWM (Pulse Width Modulation), yaitu mengeluarkan pulsa digital berulang dengan durasi HIGH yang bervariasi.
Sinyal Digital
Sinyal digital hanya berisi nilai logika 0 atau 1. Pada Arduino, kondisi HIGH berarti tegangan tinggi (~5V) dan LOW berarti tegangan rendah (0V). Keunggulan sinyal digital adalah ketahanannya terhadap gangguan dan kesederhanaannya: data dikodekan sebagai 0 dan 1. Pada Arduino Uno terdapat 14 pin digital (nomor 0–13) yang dapat dikonfigurasi sebagai input atau output digital.
- Digital Output: Untuk mengirim sinyal digital, gunakan fungsi pinMode(pin, OUTPUT) lalu digitalWrite(pin, HIGH/LOW). Misal, menyalakan atau mematikan LED pada pin digital 13:
const int LED_PIN = 13; void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); // LED menyala (5V) delay(1000); digitalWrite(LED_PIN, LOW); // LED mati (0V) delay(1000); }
Pada contoh di atas, digitalWrite(LED_PIN, HIGH) mengatur pin menjadi logika tinggi (5V), sedangkan LOW menghasilkan 0V. LED yang terhubung akan menyala/mati sesuai logika ini.
- Digital Input: Untuk membaca sinyal digital (misal tombol atau sensor digital), gunakan pinMode(pin, INPUT) lalu digitalRead(pin). Fungsi ini mengembalikan HIGH atau LOW sesuai keadaan pin. Contoh membaca tombol:
const int BUTTON_PIN = 2; void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); // aktifkan pull-up internal pinMode(LED_PIN, OUTPUT); } void loop() { int state = digitalRead(BUTTON_PIN); if (state == LOW) { // tombol ditekan (pull-up membuat kondisi tidak ditekan = HIGH) digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } }
Konfigurasi dengan INPUT_PULLUP memastikan pin tetap HIGH saat tombol tidak ditekan. Jika tombol ditekan, pin menjadi LOW dan LED menyala.
Aplikasi Umum (Digital): Menyalakan/mematikan LED, membaca tombol (switch), mengendalikan relay, membaca sensor digital (misal sensor gerak PIR, sensor ultrasonik “echo” output), dan mengontrol komponen on/off lainnya. Semua ini hanya memerlukan logika HIGH/LOW pada pin digital.
Sinyal Analog
Sinyal analog adalah sinyal kontinu, nilainya bisa berupa tekanan yang diubah menjadi tegangan kontinu (misal output sensor LDR, sensor suhu). Arduino Uno memiliki beberapa pin input analog (A0–A5) yang tersambung ke ADC 10-bit. Fungsi analogRead(pin) membaca tegangan pada pin analog dan mengembalikannya sebagai nilai integer 0–1023. Nilai 0 merepresentasikan 0V, sedangkan 1023 ~ mewakili tegangan referensi (default 5V).
Membaca Sinyal Analog: Misalnya membaca sensor LDR atau potentiometer:
const int SENSOR_PIN = A0; void setup() { Serial.begin(9600); } void loop() { int value = analogRead(SENSOR_PIN); // nilai 0–1023 float voltage = value * (5.0 / 1023.0); Serial.print("Nilai ADC: "); Serial.println(value); Serial.print("Tegangan kira-kira: "); Serial.print(voltage); Serial.println(" V"); delay(500); }
Hasil analogRead berupa skala 0–1023 karena ADC 10-bit. Contoh: pembacaan 512 berarti kira-kira 2.5V.
Karena output analog sejati tidak tersedia di Arduino, semua sinyal keluaran analog (misal pengaturan intensitas) disimulasi dengan PWM seperti dijelaskan selanjutnya. Namun, input analog (membaca sensor) sering digunakan dalam proyek: sensor LDR (cahaya), sensor suhu (LM35), potensiometer, sensor gas, dan lain-lain menghasilkan nilai tegangan kontinu yang dibaca dengan analogRead.
Aplikasi Umum (Analog): Pengukuran nilai variabel dari sensor analog seperti LDR untuk kontrol kecerahan lampu otomatis, sensor suhu untuk mengontrol kipas/pemanas, pengaturan volume audio sederhana, pembacaan posisi joystick atau potensiometer, dll. Intinya, bila proyek membutuhkan data voltase yang terus-menerus berubah, gunakan sinyal analog.
PWM (Pulse Width Modulation)
PWM adalah teknik untuk menghasilkan keluaran mirip analog menggunakan pulsa digital. Arduino menghasilkan PWM dengan memodulasi lebar pulsa sinyal digital: pin PWM dinyalakan (HIGH) dan dimatikan (LOW) secara bergantian dalam satu siklus. Fraksi waktu HIGH terhadap satu periode penuh disebut duty cycle. Misalnya, duty cycle 50% berarti pin HIGH setengah periode dan LOW setengahnya, menghasilkan efek tegangan rata-rata setengah dari 5V. Karena frekuensi PWM (~500 Hz) cukup tinggi, LED atau motor yang dikendalikan PWM terlihat menyala dengan kecerahan/kecepatan proporsional terhadap duty cycle.
Pada Arduino Uno, pin yang mendukung PWM ditandai dengan simbol “~”: yaitu pin 3, 5, 6, 9, 10, dan 11. Untuk mengeluarkan PWM, gunakan fungsi analogWrite(pin, value). Nilai value adalah integer 0–255 (8 bit) yang menentukan duty cycle (0 berarti duty cycle 0%, 255 berarti 100%). Sebagai contoh, analogWrite(ledPin, 128) menghasilkan sekitar 50% duty cycle (~2.5V rata-rata), membuat LED menyala setengah terang dibanding penuh.
Contoh Kode PWM: Menerapkan gradien kecerahan LED dengan PWM:
int ledPin = 3; // pin PWM (terdapat tanda ~) void setup() { pinMode(ledPin, OUTPUT); } void loop() { // Naikkan kecerahan for (int val = 0; val <= 255; val += 5) { analogWrite(ledPin, val); // nilai 0-255 delay(30); } // Turunkan kecerahan for (int val = 255; val >= 0; val -= 5) { analogWrite(ledPin, val); delay(30); } }
Program di atas membuat LED dari redup ke terang dan sebaliknya dengan memodulasi pulsa PWM. Perhatikan bahwa analogWrite sebenarnya mengeluarkan gelombang kotak, tetapi efek rata-ratanya mengatur intensitas cahaya.
Aplikasi Umum (PWM): PWM banyak dipakai untuk mengontrol perangkat yang membutuhkan pengaturan intensitas. Contohnya:
- Pengaturan kecerahan LED: Lampu taman, lampu latar, lampu indikator dapat diredupkan atau dinaikkan kecerahannya menggunakan PWM.
- Kontrol kecepatan motor DC: Mengubah duty cycle PWM mengatur voltase rata-rata sehingga kecepatan motor berubah.
- Posisi servo motor: Servo menerima pulsa lebar tertentu (PWM khusus) untuk mengatur sudutnya.
- Pemanas atau pengatur suhu: Elemen pemanas diaktifkan dalam rasio tertentu untuk mengontrol suhu secara lebih halus.
- Audio sederhana: Menjalankan speaker dengan PWM dapat menghasilkan nada atau suara (meski sering memerlukan filtering lebih lanjut).
Tabel Perbandingan
Aspek | Sinyal Digital | Sinyal Analog | Sinyal PWM (Analog Semu) |
Tipe sinyal | Diskrit (biner: 0 atau 1) | Kontinu (bervariasi sepanjang waktu) | Diskrit (gelombang kotak) yang dikendalikan rasio waktu |
Nilai/Vrentang | 0 atau 1 (0V atau ~5V) | 0–5V kontinu (dibaca 0–1023) | Duty cycle digital dengan 256 level (0–255) |
Pin Arduino | Semua pin digital (0–13) | Pin analog input (A0–A5) | Pin digital khusus PWM (~3,5,6,9,10,11) |
Fungsi Arduino | digitalWrite(pin, HIGH/LOW), digitalRead(pin) | analogRead(pin) | analogWrite(pin, value) (simulasi output analog) |
Resolusi | 1 bit (dua kondisi) | 10 bit pada ADC (nilai 0–1023) | 8 bit (nilai 0–255) |
Aplikasi Umum | On/off LED, tombol, relay, sinyal sensor digital (PIR, limit switch) | Pembacaan sensor (LDR, temp, potensiometer), voltmeter sederhana | Dimming LED, kecepatan motor DC, kendali servo, dimmer lampu, kontrol pemanas |
Tabel di atas merangkum karakteristik teknis ketiga jenis sinyal. Misalnya, digital hanya mengenal logika 0/1 dengan keluaran 0V atau 5V, diolah melalui digitalWrite/digitalRead. Analog bersifat kontinyu di antara 0–5V, dibaca dengan ADC 10-bit (analogRead). PWM menggunakan pulsa digital dengan lebar beragam untuk meniru keluaran analog – analogWrite menetapkan lebar pulsa dalam skala 0–255.
Secara praktik, pemilihan jenis sinyal tergantung kebutuhan: jika hanya butuh on/off gunakan digital. Untuk membaca nilai variabel, gunakan analog input. Jika ingin mengatur intensitas/perubahan bertahap dari keluaran, gunakan PWM. Keterampilan mengintegrasikan ketiganya penting dalam projek mikrokontroler, seperti membaca sensor analog (misal LDR, potensiometer), mengontrol LED/motor dengan PWM, atau menggunakan sinyal digital untuk kendali on/off.