25 September 2011

Analog Input dan Output pada Arduino

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:
  1. analogRead(pin): berfungsi untuk membaca nilai analog pada input pin yang akan menghasilkan nilai integer antara 0-1023.
  2. 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:

Tidak ada komentar:

25 September 2011

Analog Input dan Output pada Arduino

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:
  1. analogRead(pin): berfungsi untuk membaca nilai analog pada input pin yang akan menghasilkan nilai integer antara 0-1023.
  2. 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:


Related Post:

Tidak ada komentar: