Bab 12 · Arduino Uno R3
Mengatur Terang LED dengan PWM dan Waktu dengan millis
Bedakan PWM dan tegangan analog, lalu buat LED berubah terang sambil tetap membaca tombol tanpa delay.
PWM untuk mengatur terang LED
Pada Uno R3, analogWrite() mengatur pulsa digital yang hidup dan mati dengan cepat. Nilai 0 berarti padam dan 255 berarti menyala penuh. Nilai di antaranya mengubah bagian waktu saat pulsa menyala. Jadi, pin ini tidak menghasilkan tegangan analog stabil seperti keluaran pengatur tegangan.
Rangkai pin 9 → resistor 330 Ω → anoda LED, lalu katoda LED → GND. Hubungkan tombol antara pin 2 dan GND. Gunakan pin 9 karena mendukung PWM.
Mengapa mulai memakai millis?
delay(1000) menahan alur program selama satu detik. Untuk latihan Blink itu cukup, tetapi tombol tidak diperiksa selama menunggu. millis() memberi jumlah milidetik sejak board mulai berjalan. Kita dapat memeriksa apakah waktunya tiba, lalu meneruskan pekerjaan lain.
Contoh utuh: LED meredup dan tombol pemadam
const int PIN_LED = 9;
const int PIN_TOMBOL = 2;
unsigned long sebelumnya = 0;
const unsigned long SELANG = 20;
int terang = 0;
int langkah = 5;
void setup() {
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_TOMBOL, INPUT_PULLUP);
}
void loop() {
unsigned long sekarang = millis();
if (digitalRead(PIN_TOMBOL) == LOW) {
analogWrite(PIN_LED, 0);
sebelumnya = sekarang;
return;
}
if (sekarang - sebelumnya >= SELANG) {
sebelumnya = sekarang;
terang += langkah;
if (terang >= 255) {
terang = 255;
langkah = -5;
} else if (terang <= 0) {
terang = 0;
langkah = 5;
}
analogWrite(PIN_LED, terang);
}
}LED perlahan menjadi terang lalu redup. Menahan tombol memadamkan LED; melepasnya melanjutkan perubahan terang dari nilai terakhir. return mengakhiri pemanggilan loop saat itu, lalu Arduino memanggil loop lagi. Ini bukan perintah untuk mematikan board.
Membandingkan selisih waktu
Gunakan unsigned long untuk waktu dan bentuk sekarang - sebelumnya >= SELANG. Penghitung millis() akhirnya kembali ke nol setelah sekitar 50 hari; pengurangan bilangan unsigned tetap bekerja melintasi pergantian tersebut untuk selang pendek seperti contoh ini. Hindari menyimpan hasil millis() ke int.
Latihan dan rujukan
Ubah SELANG dari 20 menjadi 50 untuk memperlambat perubahan terang. Lalu coba langkah sebesar 1, termasuk nilai baliknya −1. Satu perubahan setiap percobaan akan membuat pengaruhnya lebih mudah diamati. Lihat panduan PWM Arduino untuk daftar pin pada board lain.
Duty cycle: kunci memahami PWM
PWM singkatan dari Pulse Width Modulation. Pulsa dikirim berulang-ulang, dan yang diubah adalah persentase waktu pulsa berada pada keadaan HIGH dalam satu siklus, disebut duty cycle. Nilai analogWrite(pin, 64) menghasilkan duty cycle sekitar 25 persen, nilai 128 sekitar 50 persen, dan 255 sebesar 100 persen. Karena siklusnya sangat cepat, mata melihat rata-rata cahaya, bukan kedipan.
Tegangan rata-rata dapat dihitung kasar sebagai 5 V dikali duty cycle. Pada nilai 128, rata-ratanya sekitar 2,5 V. Meski begitu, tegangan yang sebenarnya muncul pada pin tetap 0 V atau 5 V bergantian. Multimeter murah mungkin menunjukkan angka rata-rata, namun jangan menganggapnya sama seperti keluaran pengatur tegangan.
Pin PWM pada Uno R3
Hanya enam pin yang mendukung analogWrite pada Uno R3, yaitu 3, 5, 6, 9, 10, dan 11. Papan menandainya dengan simbol tilde (~). Pin 5 dan 6 berfrekuensi sekitar 980 Hz, sedangkan pin lainnya sekitar 490 Hz. Jika memanggil analogWrite pada pin tanpa tilde, seperti pin 8, hasilnya hanya LOW untuk nilai di bawah 128 dan HIGH untuk nilai 128 ke atas. Pin 9 dan 10 tidak dapat dipakai untuk PWM ketika library Servo aktif, jadi pilih pin lain bila nanti memakai servo.
Mengapa resistor LED bernilai 330 ohm?
Pin Uno mengeluarkan 5 V, sedangkan LED merah biasa memerlukan sekitar 2 V untuk menyala. Selisih 3 V harus ditanggung resistor. Dengan hukum Ohm, arus sama dengan 3 V dibagi 330 ohm, yaitu sekitar 9 mA. Ini cukup terang dan jauh di bawah batas aman 20 mA per pin yang dianjurkan. Resistor 220 ohm sampai 1 kiloohm masih aman untuk latihan; semakin besar nilainya, semakin redup LED. Jangan pernah menyambung LED langsung ke pin tanpa resistor karena LED atau pin Arduino dapat rusak.
Contoh kedua: kecerahan dikendalikan potensiometer
const int PIN_LED = 9;
const int PIN_POT = A0;
void setup() {
pinMode(PIN_LED, OUTPUT);
}
void loop() {
int bacaan = analogRead(PIN_POT);
int terang = map(bacaan, 0, 1023, 0, 255);
analogWrite(PIN_LED, terang);
}Kaki kiri potensiometer ke 5V, kaki kanan ke GND, dan kaki tengah ke A0. analogRead mengembalikan 0 sampai 1023 sedangkan analogWrite hanya menerima 0 sampai 255, sehingga map() menyesuaikan rentangnya. Memutar kenop ke kanan menaikkan terang LED secara halus. Sketch ini tidak memakai delay, jadi LED bereaksi hampir seketika.
Contoh ketiga: dua LED berkedip dengan laju berbeda
const int LED_A = 8;
const int LED_B = 7;
unsigned long waktuA = 0;
unsigned long waktuB = 0;
bool statusA = false;
bool statusB = false;
void setup() {
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
}
void loop() {
unsigned long kini = millis();
if (kini - waktuA >= 300) {
waktuA = kini;
statusA = !statusA;
digitalWrite(LED_A, statusA);
}
if (kini - waktuB >= 1000) {
waktuB = kini;
statusB = !statusB;
digitalWrite(LED_B, statusB);
}
}Setiap LED punya penanda waktunya sendiri. LED_A berganti keadaan setiap 300 milidetik, LED_B setiap 1000 milidetik. Tanda seru membalik nilai bool: true menjadi false dan sebaliknya. Dengan delay, dua pola berbeda seperti ini hampir mustahil dijalankan bersamaan. Hubungkan masing-masing LED lewat resistor 330 ohm ke GND.
Kesalahan yang sering terjadi
- LED tidak meredup. Periksa apakah pin yang dipakai memiliki tilde. Pin 8 atau 12 hanya akan menyala atau mati.
- LED terpasang terbalik. Kaki panjang (anoda) menuju resistor dan pin, kaki pendek (katoda) menuju GND. Pemasangan terbalik membuat LED tidak menyala, tetapi biasanya tidak langsung rusak pada tegangan 5 V.
- Menyimpan millis() pada int. Nilainya akan melewati batas 32767 setelah sekitar 33 detik, sehingga selisih waktu menjadi negatif dan pola berkedip kacau.
- Mencampur delay besar dengan millis. Satu delay(2000) di dalam loop() menghilangkan semua keuntungan millis.
Ringkasan
PWM mengatur terang LED dengan mengubah duty cycle. Hanya pin bertanda tilde yang mendukungnya. millis() memungkinkan program memantau waktu tanpa menahan alur, sehingga banyak pekerjaan dapat berjalan hampir bersamaan.
Soal latihan
- Kira-kira berapa duty cycle untuk analogWrite(pin, 51)?
Lihat jawaban
51 dibagi 255 sama dengan 0,2, jadi sekitar 20 persen.
- Sebutkan semua pin PWM Arduino Uno R3.
Lihat jawaban
Pin 3, 5, 6, 9, 10, dan 11.
- Mengapa map(bacaan, 0, 1023, 0, 255) diperlukan pada contoh potensiometer?
Lihat jawaban
analogRead menghasilkan 0 sampai 1023, sedangkan analogWrite hanya menerima 0 sampai 255. map() mengonversi skala agar sesuai.
- Ubah contoh dua LED agar LED_B berkedip setiap 2 detik. Bagian mana yang diubah?
Lihat jawaban
Ganti angka 1000 pada pemeriksaan waktuB menjadi 2000.