BAB VI
EMBEDED SYSTEM
"ANALOG TO DIGITAL, DIGITAL TO ANALOG CONVERTER"
Disusun oleh :
Wandha Kartika
3.34.14.0.19
PROGRAM STUDI TEKNIK INFORMATIKA
JURUSAN TEKNIK ELEKTRO
POLITEKNIK NEGERI SEMARANG
2016
BAB VI : ANALOG TO DIGITAL, DIGITAL TO ANALOG CONVERTER
Tujuan :
Mahasiswa memahami input analog pada mikrokontroller Arduino.
Mahasiswa memahami perhitungan tegangan resolusi ADC mikrokontroller Arduino.
Mahasiswa memahami perintah input analog, analogRead(), analogReference(parameter).
Mahasiswa dapat memahami program Arduino untuk menampilkan data input analog.
Mahasiswa dapat memahami output analog dan PWM ( Pulse Width Modulation ).
Mahasiswa memahami perintah output analog, analogWrite().
Teori :
ADC (Analog to Digital Converter)
Pada dasarnya LCD hanya untuk menampilkan tampilan yang dihasilkan dari kode program saja, karena shield mempunyai keypad yang tujuannya untuk memilih tampilan yang sekaligus akan menentukan aksi yang akan dilakukan setelahnya.
Arduino khusus menyediakan 6 kanal (8 kanal pada model Uno, 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,9 mV per unit dimana itu berarti nilai digital yang dihasilkan akan berubah setiap perubahan 4,9 mV 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.
Gambar 6.1 Mockup rangkaian
Tapi tidak semua pin Arduino dapat digunakan untuk mengolah signal analog. Pada board Arduino Uno, terdapat enam pin analog, yakni mulai dari A0 hingga A5. Huruf A pada awal nama pin Arduino menandakan pin tersebut dapat digunakan untuk mengolah signal analog. Seberapa tepat nilai signal analog yang dipetakan secara digital, ditentukan oleh seberapa besar resolusi ADC. Semakin besar resolusi ADC, maka semakin mendekati nilai analog dari signal tersebut. Untuk resolusi ADC pada board Arduino Uno ialah 10 bit, yang berarti mampu memetakan hingga 1024 discrete analog level (2n = 210 = 1024). Beberapa jenis microcontroller lain memiliki resolusi 8 bit, 256 discrete analog level, bahkan ada yang memiliki resolusi 16 bit, 65536 discrete analog level.
Gambar 6.2 Rangkaian Potensio pada Arduino
Hubungan Nilai ADC dengan Tegangan
Nilai ADC menunjukkan ratio perbandingan dengan tegangan yang terbaca. Berikut persamaannya ialah nilai ADC terukur ialah nilai ADC maximum dikalikan tegangan terbaca, kemudian dibagi dengan nilai tegangan sumber. Nilai ADC tergantung dengan tegangan yang menjadi catu daya sistem mikrokontroler. Untuk board Arduino biasa menggunakan sumber tegangan 5 volt. Cara mencari nilai ADC, dengan menerapkan persamaan yang ada dan tegangan terbaca sebesar 2,12 volt pada board Arduino Uno.
Board Arduino Uno memiliki resolusi 10 bit, dengan nilai terbesar 1023
Tegangan sumber 5 volt dan tegangan terbaca ialah 2,12 volt
Nilai ADC terukur ialah nilai ADC maximum dikalikan tegangan terbaca, kemudian dibagi dengan nilai tegangan sumber
Sehingga diperoleh nilai ADC sebesar 434 Dengan demikian diperoleh nilai ADC sebesar 434 dari tegangan terukur 2,12 volt. Untuk setiap unit ADC tersebut memiliki perbandingan tegangan sebesar 4,9 mV. Selain dipengaruhi oleh besarnya nilai resolusi ADC, tepat tidaknya Pengukuran nilai ADC juga dipengaruhi oleh clock speed ADC tersebut. Untuk board Arduino Uno sendiri clock speed ADC maximum yang disarankan ialah 200 kHz. Nilai clock speed 200 kHz tersebut berdasarkan spesifikasi internal DAC (Digital to Analog Converter) pada rangkaian pengubahnya. Meski demikian, penggunaan clock speed pada 1 MHz mesalnya, tidak mengurangi kualitas resolusi ADC tersebut.
Input Analog
Menunjukkan input analog dengan membaca sensor analog pada analog pin 0 dan menghidupkan serta mematikan LED yang terhubung ke pin digital 13. Jumlah waktu LED akan on dan off tergantung pada nilai yang diperoleh oleh analogRead ().
Tutorial sederhana untuk belajar membaca nilai ADC dapat dilakukan dengan menggunakan potentiometer. Potentiometer bekerja dengan prinsip pembagi tegangan, dimana terdapat kaki untuk sumber tegangan dihubungkan ke Vcc 5 volt Arduino, ground dihubungkan ke ground Arduino, dan data tegangan dihubungkan ke pin analog A0 Arduino.
Konfigurasi rangkaian :
Potensiometer dihubungkan ke analog input 0
Pin tengah dari potensiometer ke pin analog Mikrokontroler Arduino
Satu sisi pin (salah satu) ke ground
Pin sisi lain untuk 5 V
LED anoda (kaki panjang) yang melekat pada keluaran digital 13
LED katoda (kaki pendek) yang melekat pada ground
Catatan: karena sebagian Arduinos memiliki built-in LED yang terpasang untuk pin 13 di papan, LED adalah opsional.
Alat dan Bahan :
Sebuah Komputer /Laptop
Arduino+Kabel data = 1 buah
Breadboard = 1 buah
LCD I2C = 1 buah
Kabel male-female = 12 buah
Kabel male-male = 12 buah
Potensio = 1 buah
Resistor 220 = 5 buah
LED = 5 buah
Resistor 1K = 2 buah
Push Button = 2 buah
Buzzer = 1 buah
Multi Seven Segment = 1 buah
Langkah Kerja :
Percobaan pertama
Kode Program :
// select the input pin for the potentiometer
int sensorPin = A0; int ledPin = 13;
// select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor void setup() {
// declare the ledPin as an OUTPUT: pinMode(ledPin, OUTPUT);
} void loop() {
// read the value from the sensor: sensorValue = analogRead(sensorPin);
// turn the ledPin on digitalWrite(ledPin, HIGH);
// stop the program for milliseconds: delay(sensorValue);
// turn the ledPin off: digitalWrite(ledPin, LOW);
// stop the program for for milliseconds:
delay(sensorValue);
}
Pembacaan program
int sensorPin = A0; digunakan untuk membuat pin A0 menjadi variabel sensorPin dan karena pin A0 adalah input analog, maka pada void setup tidak perlu dibuat program pinMode(sensorPin, INPUT); karena kalau pin analog sudah pasti INPUT, tidak bisa digunakan untuk OUTPUT.
Mengingat kembali fungsi dari sensorValue = analogRead(sensorPin); adalah untuk menyimpan nilai baca dari sensorPin kedalam variabel sensorValue.
delay(sensorValue); digunakan untuk memberikan waktu jeda berdasarkan nilai yang keluar dari sensorPin, jadi kecepatan lampu berkedip berdasarkan potensiometer.
Hasil dari eksekusi program diatas akan menghasilkan blink untuk LED pada pin 13 dengan delay yang disesuikan dengan menggunakan inputan dari Potensiometer.
Hasil praktikum :
Gambar di atas menunjukkan saat potensio diputar maksimal lampu LED pada Arduino menyala terang
Gambar di atas menunjukkan saat potensio diputar berkebalikan dengan arah sebelumnya maka lampu LED pada Arduino akan padam
Percobaan Kedua
Tambahkan LED pada Pin 9 (PWM)
Kode program :
// Analog input pin that the potentiometer is attached to const int analogInPin = A0;
// Analog output pin that the LED is attached to const int analogOutPin = 9; // value read from the pot int sensorValue = 0;
// value output to the PWM (analog out) int outputValue = 0;
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
} void loop() {
// read the analog in value: sensorValue = analogRead(analogInPin);
// map it to the range of the analog out: outputValue = map(sensorValue, 0, 1023, 0, 255);
// change the analog out value: analogWrite(analogOutPin, outputValue);
// print the results to the serial monitor:
Serial.print("sensor = " );
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
// wait 2 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(2);
}
Pembacaan Program
const int analogInPin = A0; program seperti sama seperti sebelumnya digunakan untuk membuat variabel, tambahan kode const sebelum int adalah untuk penetapan nilai.
Serial.begin(9600); berfungsi agar arduino bisa berkomunikasi dengan komputer, 9600 adalah salah satu nilai yang dipilih untuk komunikasi.
outputValue = map(sensorValue, 0, 1023, 0, 255); nilai yang dihasilkan dari sensorValue adalah 0-1023, nilainya akan dikonversi menjadi 0-225 pada variabel outputValue.
analogWrite(analogOutPin, outputValue); menyalakan LED menggunakan PWM (agar bisa diatur terang cahanya berdasarkan outputValue.
Serial.print("sensor = " ); berguna untuk menampilkan teks yang ada didalam tanda kutip "sensor=".
Serial.print(sensorValue); untuk menampilkan nilai yang ada pada sensorValue.
Serial.print("\t output = "); berguna untuk menampilkan teks yang ada didalam tanda kutip "\t output=".
Serial.println(outputValue); untuk menampilkan nilai yang ada pada outputValue.
Input analog yang ditampilkan secara serial lewat komponen serial monitor pada software editing Arduino.
Pada percobaan ADC ini dapat juga digabungkan dengan output analog yang berupa PWM (Pulse Width Modulation), kasus ini akan mengatur terang dan redupnya lampu LED yang terhubung pada pin 13 dari mikrokontroler Arduino.
int ledPin = 9; // LED connected to digital pin 9
void setup() {
// nothing happens in setup
} void loop() {
// fade in from min to max in increments of 5 points:
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255): analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
} delay(30);
// fade out from max to min in increments of 5 points:
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
// sets the value (range from 0 to 255): analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
} delay(30);
}
Hasil praktikum :
Latihan
Tampilkan hasil Output nilai dari potensiometer dari percobaan pertama dan percobaan kedua dengan :
Serial Monitor.
Percobaan pertama (tanpa LED)
Untuk menampilkan pada serial monitor, buat rangkaian yang sama seperti percobaan pertama.
Kode program :
Hasil praktikum :
Saat potensio diputar maksimum, maka pada serial monitor akan tampil seperti berikut.
Saat potensio diputar minimum, maka pada serial monitor akan tampil seperti berikut
Percobaan kedua (dengan LED)
Buat rangkaian yang sama seperti percobaan kedua.
Kode program :
Hasil praktikum :
Hasil praktikum akan sama seperti percobaan menampilkan pada serial monitor tanpa LED.
Saat potensio diputar maksimum, maka pada serial monitor akan menunjukkan angka sensor 1023 dengan output 255. Sedangkan saat potensio diputar minimum, maka pada serial monitor akan menunjukkan angka sensor 0 dengan output 0.
LCD I2C 16x2.
Percobaan pertama (tanpa LED)
Kode program :
Hasil praktikum :
Percobaan kedua (dengan LED)
Kode program :
Hasil praktikum :
Multi Seven Segment.
Percobaan pertama
Kode program :
Hasil praktikum :
Saat potensio diputar minimum, maka multi seven segment akan menampilkan angka 0000.
Saat potensio diputar perlahan, akan pada multi seven segment juga akan berubah.
Kendalikan nyala 5 LED disesuikan dengan nilai Output dari potensiometer semakin banyak nilai, LED yang menyala semakin banyak.
Gambar 6.3 Konfigurasi LED
Jawab :
Model rangkaian :
Kode program
Selesaikan skenario berikut :
Gunakan konfigurasi Arduino, LCD I2C, Potensiometer dan PushButton.
Jika tombol PushButton ditekan dan nilai Pin HIGH maka, nilai potensio bisa dimasukkan dan LCD akan menampilkan Nilai dari ADC Potensio, jika posisi LOW akan ditampilkan "Anda tidak punya Akses" (geser ke Kiri).
Buzzer akan berbunyi ketika potensio diputar dan pushbutton kondisi Low.
Jawab :
Buat rangkaian seemikian rupa.
Kode program :
Hasil :
Kesimpulan
Dari hasil praktikum dapat disimpulkan bahwa :
Saat menambah dan mengurangi nilai potensio harus diperhatikan dengan teliti untuk mencegah terbakarnya komponen.
Bila saat memutar potensio didapatkan akan melebihi perkiraan, maka hal itu disebabkan adanya noise. Sehingga perlu diputuskan hubungan komputer dengan Arduino lalu sambungkan kembali.