Pada saat kita menggunakan tombol sebagai sinyal input/masukan pada
pin input Arduino maka sebenarnya kita hanya memberikan dua kemungkinan
kondisi sinyal masukan yaitu tombol tertekan atau tombol tidak tertekan.
Pada saat tombol tertekan kita menghubungkan atau memberikan tegangan 5
volt pada masukan sedangkan sebaliknya pada saat tombol dilepas hanya
memberikan tegangan 0 volt.
Kondisi input yang demikian dikenal
sebagai digital input dengan logika 1 dan 0, dimana 1 untuk tegangan
HIGH atau 5 volt dan 0 untuk tegangan LOW atau 0 volt. Begitu juga
halnya pada sisi output, jika hanya melibatkan dua kondisi keluaran
seperti misalnya saat menghidupkan dan memadamkan led pada suatu saat
tertentu maka kita hanya melibatkan dua kondisi output digital. Output
digital 1 atau HIGH dengan output tegangan 5 volt dan output digital 0
atau LOW dengan output tegangan 0 volt.
Pada beberapa sistim kontrol, pengolahan input dan output secara digital
mungkin sudah memenuhi kinerja yang dibutuhkan. Akan tetapi pada
kondisi tertentu ada kemungkinan dihadapkan pada kondisi input dan
output yang membutuhkan besaran yang berubah-ubah dengan nilai yang
kontinyu dan tidak lagi hanya dengan dua keadaan seperti halnya sinyal
digital. Sinyal semacam ini disebut sebagai sinyal analog,
sebagai contoh saat kita menghubungkan sensor yang tegangan keluarannya
bervariasi dalam kisaran dari 0 volt sampai 5 volt. Maka dalam hal ini
Arduino sebagai kontroler harus mampu mengidentifikasi/mengolah semua
variasi tegangan keluaran dari sensor yang dihubungkan pada pin inputnya
tersebut. Begitu juga halnya saat diperlukan tegangan output yang
membutuhkan nilai tegangan yang bervariasi, seperti misalnya saat kita
menginginkan mengatur tingkat keterangan sebuah led atau berubahnya
kecepatan sebuah motor.
ANALOG INPUT
Arduino khusus menyediakan 6 kanal (8 kanal pada model Mini dan Nano,
dan 16 pada model Mega) untuk difungsikan sebagai analog input. Analog
ke digital converternya menggunakan resolusi 10 bit yang berarti range
nilai analog dari 0 volt sampai 5 volt akan dirubah kenilai integer 0
sampai 1023, atau resolusinya adalah 5 volt/1024=4,9mV per unit dimana
itu berarti nilai digital yang dihasilkan akan berubah setiap perubahan
4,9mV dari tegangan input analognya. Akan tetapi range input analog dan
resolusi tersebut dapat dirubah dengan fungsi analogReference().
Perintah yang digunakan untuk fungsi analog input ini adalah:
- analogRead(pin): berfungsi untuk membaca nilai analog pada input pin yang akan menghasilkan nilai integer antara 0-1023.
- analogReference(parameter): berfungsi untuk menentukan referensi yang digunakan. Parameternya meliputi:
- DEFAULT: default analog reference yaitu 5V (pada board Arduino 5V) atau 3,3 volt (pada board Arduino 3,3 V)
- INTERNAL: built-in referensi internal tergantung pada jenis
mikrokontroler yang terpasang pada board Arduino, 1.1 volt pada
ATmega168 atau ATmega328 dan 2.56 volt pada ATmega8.
- INTERNAL1V1: a built-in referensi internal 1.1V (khusus Arduino Mega)
- INTERNAL2V56: a built-in referensi internal 2,56V (khusus Arduino Mega)
- EXTERNAL: pilihan referensi yang tergantung pada tegangan yang diberikan pada pin AREF(hanya dengan range tegangan 0 sampai 5V).
Perlu untuk diperhatikan, jangan menggunakan referensi dibawah 0 volt
atau lebih dari 5 volt dan pastikan memilih referensi external sebelum
perintah analogRead() jika menghubungkan pin AREF dengan referensi
eksternal karena jika tidak akan bisa merusak mikrokontrol.
ANALOG OUTPUT
Secara teori suatu analog output akan mengeluarkan output tegangan
bervariasi sesuai dengan nilai yang dikehendaki, maka seharusnya pin
output analog Arduino seharusnya mampu mengeluarkan tegangan output
dengan kisaran tegangan dari 0 V sampai 5V. Akan tetapi tidak demikian
adanya, karena pin-pin Arduino yang difungsikan sebagai output
sebenarnya hanya mampu sebagai digital output yaitu hanya mampu
mengeluarkan tegangan 0V atau 5V. Lalu bagaimana Arduino menangani
Analog Output tersebut? Arduino menggunakan cara Pulsa Wide Modulasi
(PWM) atau modulasi lebar pulsa untuk menghasilkan analog output yang
dikehendaki. Metode PWM ini menggunakan pendekatan perubahan lebar pulsa
untuk menghasilkan nilai tegangan analog yang diinginkan. Pin yang
difungsikan sebagai PWM analog output akan mengeluarkan sinyal pulsa
digital dengan frekwensi 490 Hz dimana nilai tegangan analog diperoleh
dengan merubah Duty Cycle atau perbandingan lamanya pulsa HIGH terhadap
periode (T) dari sinyal digital tersebut. Jika pulsa HIGH muncul selama
setengah dari periode sinyal maka akan menghasilkan duty cycle 5o% yang
berarti sinyal analog yang dihasilkan sebesar setengah dari tegangan
analog maksimal yaitu 1/2 dari 5 V atau sama dengan 2,5 V begitu juga
halnya jika pulsa HIGH hanya seperempat bagian dari periode sinyal maka
tegangan analog identik yang dihasilkan adalah 1/4 dari 5V = 1,25 V dan
seterusnya.
Perintah yang digunakan untuk output analog adalah analogWrite (pin,value), dimana:
- Pin: nomor pin Arduino yang akan digunakan sebagai analog output
- value: nilai duty cycle yang diinginkan dengan nilai 0-255, yang
berarti nilai 0 untuk 0Volt dan 255 untuk tegangan keluaran maksimum
atau 5Volt.
Berikutnya mari kita mencoba aplikasi input output analog ini secara
langsung pada Arduino. Untuk yang pertama saya menggunakan potensiometer
yang dihubungkan pada analog pin 0 seperti pada gambar berikut ini:
Pada latihan ini akan menampilkan pada serial monitor nilai
input analog yang dihasilkan dengan merubah posisi potensiometer.
Sketchnya sebagai berikut:
int analogPin = 0;
int val = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
val = analogRead(analogPin);
Serial.println(val,DEC); //tampilkan pada serial monitor dalam desimal
Serial.println(val,BIN); //tampilkan pada serial monitor dalam biner
delay(1000); //merefresh tampilan setiap 1 detik
}
Dan berhasil…posisi potensio mentok minimal akan menghasilkan nilai 0
dan posisi potensio mentok maksimal menghasilkan nilai 1023 atau
1111111111(biner).
Lanjut berikutnya mencoba analog output dengan mengeluarkan sinyal
analog ke pin 9 yang dihubungkan dengan rangkaian seri resistor dan led
seperti rangkaian berikut:
sketchnya adalah:
int kecerahan = 0;
int levelperubah = 5;//step perubahan kecerahan
void setup() {
Serial.begin(9600);
}
void loop() {
analogWrite(9, kecerahan);
Serial.println(kecerahan);//tampilkan kecerahan di serial monitor
kecerahan = kecerahan + levelperubah;//perbaharui nilai kecerahan
if (kecerahan == 0 || kecerahan == 255) {//jika mencapai nilai batas
levelperubah = -levelperubah ; //berubah kenilai sebaliknya
}
delay(500);
}
Hasilnya kecerahan led akan berubah setiap 1/2 detik dengan step
perubahan 5 digit, setelah mencapai kecerahan maksimum (tampilan pada
serial monitor 255) akan meredup kembali sampai led padam (tampilan pada
serial monitor 0) dan akan terus berulang kembali begitu seterusnya.
Terakhir mengkombinasikan analog input dari potensiometer untuk
mengatur analog output mengatur kecerahan dari led, berikut gambar:
Sketchnya sebagai berikut:
const int analogInPin = 0; // analog input pada pin analog 0
const int analogOutPin = 9; // analog output pada pin 9/terpasang led
int sensorValue = 0; // variable input analog
int outputValue = 0; // variable output analog
void setup() {
// inisialisasi komunikasi serial pada 9600 bps:
Serial.begin(9600);
}
void loop() {
// membaca nilai analog in:
sensorValue = analogRead(analogInPin);
// memetakan kedalam kisaran output analog:
outputValue = map(sensorValue, 0, 1023, 0, 255);
// merubah nilai analog output:
analogWrite(analogOutPin, outputValue);
// mencetak pada serial monitor:
Serial.print("sensor = " );
Serial.print(sensorValue);
Serial.print(" output = ");
Serial.println(outputValue);
// tunggu 20 milidetik sebelum lanjut ke pembacaan berikutnya
delay(20);
}
Pada sketch diatas digunakan function “map()” untuk memetakan input
analog yang resolusinya 1024 ke output analog yang resolusinya hanya
256.
Referensi: