Selasa, 04 November 2014

Arduino Membuat Pencacah

Aplikasi pencacah (counter) biasa digunakan untuk mencacah suatu entitas yang ingin diketahui jumlahnya dalam suatu sistem. Untuk dapat mencacah jumlah entitas, maka diperlukan suatu sensor yang dapat mendeteksi keberadaan dari entitas tersebut. Salah satu project sederhana Arduino untuk aplikasi pencacah ialah dengan menggunakan limit switch, push button.

<img src="arduino_switch_button.png" alt="arduino_switch_button">


Penggunaan push button sebagai sebuah sensor, Arduino akan menerima data berapa kali push button tersebut ditekan. Berdasarkan gambar wiring diagram yang ada, pada saat push button tidak ditekan maka tidak ada arus (input signal) yang mengalir sebagai input ke pin Arduino. Sedangkan bila ditekan maka akan ada arus (input signal) yang mengalir ke Arduino. Untuk menghindari kondisi float (suatu kondisi antara high dan low), maka push button dihubungkan dengan resistor pull down, terhubung dengan ground. Dengan demikian bila rangkaian diubah, arus terputus, limit switch akan berada dalam kondisi low.
Berikut ini adalah source code (sketch) aplikasi pencacah sederhana dengan Arduino.

/*
Program pencacah sederhana
dengan push button

Loki Lang
*/

int buttonPin = 2;
int ledPin = 13;
int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;

void setup()
{
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  buttonState = digitalRead(buttonPin);
  if(buttonState != lastButtonState)
  {
    if(buttonState == HIGH)
    {
      buttonPushCounter++;
    }
  }
  lastButtonState = buttonState;
  if(buttonPushCounter % 7 ==0)
  {
    digitalWrite(ledPin, HIGH);
  }
  else
  {
    digitalWrite(ledPin, LOW);
  }
}

Penjelasan program sebagai berikut.
  • Digunakan variable global buttonPin, ledPin, buttonPushCounter, buttonState, dan lastButtonState
  • Variable buttonPin, untuk pin Arduino (pin 2) yang terhubung dengan input push button
  • Variable ledPin, untuk pin Arduino (pin 13) dimana terdapat LED indikator sebagai output
  • Variable buttonPushCounter, untuk mencacah berapa kali push button ditekan
  • Variable buttonState, untuk menampung kondisi push button tidak ditekan bernilai low, sedangkan bila ditekan bernilai high
  • Variable lastButtonState, untuk melihat kondisi push button sebelumnya
  • Pada setup(), dilakukan inisialisasi input dan output yang digunakan
  • Variable buttonPin, untuk pin Arduino yang terhubung dengan push button
  • Setiap kali push button ditekan (high), nilainya akan dibaca oleh Arduino, dan meningkatkan nilai variable buttonPushCounter
  • Bila saat menekan push button kemudian ditahan, nilainya hanya akan dibaca sekali oleh Arduino, karena kondisi buttonState dan lastButtonState harus berbeda untuk dapat mulai mencacah
  • Setelah push button dilepas, nilai buttonState kembali low demikian dengan lastButtonState
  • Proses pencacahan dimulai, nilai buttonPushCounter akan dibagi dengan 7 (bisa disesuaikan kebutuhan), bila hasil pembagiannya tanpa sisa (sisa 0), maka ledPin akan bernilai high
  • Pada saat ledPin bernilai high, maka LED indikator di Arduino akan menyala
  • Bila jumlah pencacahan buttonPushCounter bukan kelipatan 7 (sisa pembagiannya dengan 7 tidak sama dengan 0), maka ledPin akan tetap bernilai low
Dalam project sederhana aplikasi pencacah dengan Arduino ini, selama jumlah pencacahan input belum mencapai set point (kelipatan 7), indikator output tetap bernilai low. Dengan membandingkan kondisi buttonState dengan lastButtonState, dapat mengantisipasi bila push button tersebut ditekan dan kemudian ditahan, akan tetap dianggap sekali penekanan saja.
Penggunaan push button sebagai limit switch sensor dapat digantikan dengan sensor optocoupler untuk aplikasi yang sesuai.

Tutorial Arduino Seven Segment Serial

Setelah sebelumnya belajar tutorial Arduino seven segment display dan komunikasi serial, kali ini akan diulas mengenai menampilkan suatu nilai ke seven segment display dengan input keyboard komputer melalui komunikasi serial. Berikut ini adalah tutorial untuk belajar project dengan Arduino Uno bagi pemula dengan menggunakan seven segment display. Tutorial akan disusun secara bertahap mulai dari dasar hingga yang lebih rumit, semisal untuk project tugas akhir kuliah atau keperluan aplikasi lainnya. Adapun karena keterbatasan jumlah pin dalam board Arduino Uno, untuk menghemat resource, dapat digunakan IC 7447, decoder. Fungsi dari IC 7447 ialah sebagai decoder yang menerima input BCD 4 bit dari Arduino, dan menghasilkan output 8 bit untuk mengendalikan nyala dari seven segment display. Sehingga hanya dengan 4 pin saja (bila tanpa decoder membutuhkan 8 pin) pada Arduino Uno, sudah dapat mengendalikan nyala tampilan seven segment display. Berikut ini catatan untuk wiring diagram rangkaian.
  • Untuk pin Arduino pin 0 dan pin 1, digunakan untuk komunikasi serial dengan komputer, sehingga tidak dapat digunakan sebagai pin input atau output
  • Menyamakan konfigurasi pin yang digunakan antara wiring diagram dengan souce code
  • Untuk wiring diagram output Arduino sebagai input ke decoder IC 7447 ialah berturut-turut pin 2, pin 3, pin4, dan pin 5 masing-masing untuk input A, B, C, dan D
  • Perubahan konfigurasi wiring diagram harus disesuaikan juga dengan source code yang digunakan
  • Untuk wiring diagram dari decoder IC 7447 ke seven segment display dapat mengikuti gambar yang ada
  • Untuk decoder IC 7447, menghasilkan output active low, berkaitan dengan jenis seven segment display yang digunakan ialah common anode
Untuk source code (sketch), dituliskan dan upload ke Arduino Uno dengan menggunakan Arduino IDE.

<img src="bcd_seven_segment.png" alt="bcd_seven_segment">


Berikut ini adalah source code (sketch) seven segment display sederhana tanpa menggunakan library.

/*
Program seven segment display
dengan input serial

Loki Lang
*/

#include <SegDisplay.h>
#define A 2
#define B 3
#define C 4
#define D 5
#define Enable 6

SegNumbers lang(A, B, C, D, Enable);

int input;

void setup()
{
  Serial.begin(9600);
  lang.off();
}

void loop ()
{
  if(Serial.available())
  {
    input = Serial.read();
   
    if(input == 88, 120)
      lang.off();
   
    if(input == 48)
      lang.zero();
   
    if(input == 49)
      lang.one();
   
    if(input == 50)
      lang.two();
   
    if(input == 51)
      lang.three();
   
    if(input == 52)
      lang.four();
   
    if(input == 53)
      lang.five();
   
    if(input == 54)
      lang.six();
   
    if(input == 55)
      lang.seven();
   
    if(input == 56)
      lang.eight();
   
    if(input == 57)
      lang.nine();
  }
}

Berikut ini penjelasan source code (sketch) Arduino dengan menggunakan macro library seven segment display.
  • Penggunaan macro #include sebagai preprocessed directive untuk mencakup library SegDisplay.h yang digunakan dalam aplikasi seven segment display
  • Penggunaan macro #define sebagai preprocessed directive untuk mendefinisikan konstanta A, B, C, D, Enable dengan nilai masing-masing integer, dari class SegNumbers
  • Pada saat proses compile dilakukan macro A, B, C, D, dan Enable, akan diganti oleh nilai (alamat pin Arduino) yang direpresentasikannya
  • Proses inisialisasi memulai komunikasi serial dengan komputer menggunakan Serial.begin, dengan baud rate sebesar 9600
  • Selanjutnya dilakukan proses pemeriksaan apakah komunikasi serial antara komputer dengan Arduino dimungkinkan, melalui Serial.available, bila dimungkinkan maka akan dilanjutkan langkah selanjutnya
  • Setelah komunikasi dapat dilakukan selanjutnya ialah membaca input dari komputer melalui Serial.read, yang mana akan membaca nilai ASCII dari keyboard
  • Terdapat 11 definisi, yang mana 10 definisi untuk nilai 0 hingga 9 yang akan ditampilkan pada seven segment display, dan satu untuk mematikan tampilan
  • Untuk mematikan seven segment display dengan menekan tombol X atau x (yang mana karakter ASCII 88 dan 120), sedangkan untuk nilai 0 dengan ASCII code 48, hingga 9 dengan ASCII code 57
Sehingga dengan menekan satu tombol angka di keyboard komputer dapat menyalajkan tampilan seven segment display. Demikian tutorial penjelasan mengendalikan output seven segment display Arduino menggunakan komunikasi serial komputer. Lihat juga mengenai tutorial dan penjelasan mengenai project Arduino Uno LED blinking dan Arduino Uno LED animation.

Tutorial Arduino PWM

Setelah sebelumnya dibahas tentang tutorial dasar pemrograman Arduino, Arduino bitwise operation, Arduino komunikasi serial, dan akses LCD Arduino, bahasan selanjutnya ialah Pulse Width Modulation. Dalam pembahasan Pulse Width Modulation atau biasa disingkat PWM, akan dijelaskan istilah-istilah penting seperti duty cycle dan contohnya, juga contoh sederhana aplikasi PWM dengan menggunakan Arduino.

Pulse Width Modulation
Pulse Width Modulation (PWM) merupakan suatu teknik untuk mendapatkan hasil output analog dengan pendekatan secara digital. Teknik PWM ini mengendalikan lebar pulsa berdasarkan modulator. Meski bapat diterapkan dalam penyandian informasi komunikasi, penerapan utamanya lebih pada kendali daya perangkat listrik, semisal motor. Kendali digital digunakan untuk membentuk sebuah gelombang kotak (square wave), sebuah gelombang signal untuk switch antara kondisi on dengan off. Pola kondisi on dan off tersebut merepresentasikan suatu nilai full on pada Arduino (5 volt) dan kondisi off (0 volt) dengan mengubah perbandingan ratio antara waktu kondisi on dengan kondisi off dalam satu periode. Durasi waktu on disebut dengan istilah lebar pulsa, pulse width. Untuk mendapatkan suatu variasi hasil output nilai analog, dapat dilakukan dengan mengubah lebar pulsa tersebut. Perbandingan antara waktu signal on dengan waktu satu periode disebut dengan duty cycle.

Duty Cycle
Duty cycle dapat diartikan sebagai perbandingan antara waktu signal on dengan waktu keseluruhan untuk satu periode. Besarnya nilai duty cycle dinyatakan dalam percent. Nilai duty cycle dapat bervariasi mulai dari 0% tidak ada signal on, hingga 100% tidak ada signal off, atau selalu dalam kondisi signal on.



Sebagai contoh duty cycle 60% dengan durasi 1000 ms. Maka waktu saat signal on ialah 60% dari 1000 ms, yakni 600 ms. Sedangkan untuk waktu signal off ialah selisih antara durasi keseluruhan dengan waktu signal on, yakni 400 ms.

Implementasi
Dengan melakukan pengulangan pola duty cycle tersebut terus-menerus secara cepat pada sebuah LED, dapat digunakan untuk mengatur nyala terangnya. Pengulangan pola duty cycle tersebut seolah-olah membuat LED menyala dengan nilai tegangan yang tetap (steady) antara 0 volt hingga 5 volt. Padahal sebenarnya terjadi kondisi perubahan signal on-off secara cepat. Bila digunakan pada motor DC, semakin besar nilai PWM maka semakin cepat laju putaran motor DC tersebut, dan demikian sebaliknya.
Nilai rata-rata tegangan dan juga arus yang diberikan ke rangkaian beban dikendalikan melalui duty cycle tersebut. Semakin besar duty cycle (semakin lama waktu signal on) maka semakin besar nilai daya yang diberikan ke rangkaian beban.
Penerapan PWM dalam Arduino Uno dapat dilakukan dengan menggunakan analogWrite() dengan nilai antara 0 hingga 255, resolusi ADC 8 bit. Dimana analogWrite(255) memiliki nilai duty cycle 100% atau selalu menyala, analogWrite(127) memiliki nilai duty cycle 50%, dan lain sebagainya.

Tutorial Arduino Serial LCD

Dalam tutorial sebelumnya telah dibahas mengenai penampil LCD (Liquid Crystal Display) dan komunikasi serial dengan Arduino, dalam bahasan kali ini akan dijabarkan mengenai project Arduino sederhana bagaimana menampilkan karakter output pada LCD dari data input yang diberikan melalui komunikasi serial. Dalam hal ini dilakukan komunikasi antara komputer dengan Arduino, dimana input karakter dari keyboard akan ditampilkan kembali pada LCD.
Untuk memulai menggunakan penampil LCD, terlebih dahulu dilakukan pemetaan konfigurasi wiring diagram. Hal ini ditujukan agar pin yang digunakan pada source code dan wiring diagram sesuai. Berikut ini ialah wiring diagram yang digunakan antara Arduino dengan LCD pada uji coba awal. Untuk jenis LCD yang digunakan ialah 16 kolom dan 2 baris.

<img src="arduino_lcd.png" alt="arduino_lcd">


Berdasarkan gambar wiring diagram tersebut.
  • LCD RS pin dihubungkan ke digital pin 12
  • LCD Enable pin dihubungkan ke digital pin 11
  • LCD D4 pin dihubungkan ke digital pin 5
  • LCD D5 pin dihubungkan ke digital pin 4
  • LCD D6 pin dihubungkan ke digital pin 3
  • LCD D7 pin dihubungkan ke digital pin 2
Penggunaan potentiometer (variable resistor), ditujukan untuk mengatur tingkat gelap-terang dari tampilan LCD tersebut, berdasarkan fungsi pembagi tegangan. Berikut ini ialah source code (sketch) sederhana untuk menampilkan pesan text.

/*
Program LCD serial
dengan library LiquidCrystal.h

Loki Lang
*/

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  lang.begin(16, 2);
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available())
  {
    delay(100);
    lang.clear();
    while (Serial.available() > 0)
    {
      lang.write(Serial.read());
    }
  }
}

Dalam source code tersebut digunakan macro #include preprocessed directive yang memuat library LiquidCrystal.h, untuk penampil LCD. Berikut ini adalah penjelasan source code (sketch) tersebut.
  • Proses inisialisasi pin Arduino yang terhubung ke pin LCD RS, Enable, D4, D5, D6, dan D7, dilakukan dalam baris LiquidCrystal lang(12, 11, 5, 4, 3, 2); dimana lang merupakan variable yang dipanggil setiap kali instruksi terkait LCD akan digunakan. Catatan, untuk nama variable lang dapat diubah dengan lcd atau nama lainnya, selama dalam pemanggilan namanya sesuai
  • Untuk lang.begin(16, 2) digunakan dalam inisialisasi interface ke LCD dan mendefinisikan ukuran 16 kolom dan 2 baris LCD
  • Untuk Serial.begin(9600) digunakan dalam proses inisialisasi komunikasi serial dengan baud rate 9600
  • Jika kondisi Serial.available() terpenuhi (komunikasi serial dimungkinkan antara komputer dengan Arduino), maka baris program selanjutnya akan dijalankan
  • Untuk while (Serial.available() > 0), selama komunikasi serial komputer dengan Arduino berlangsung lancar, tidak terputus, maka akan dijalankan baris program selanjutnya yakni menampilkan karakter ke LCD
  • Untuk menampilkan data ke LCD dengan lang.write(source), dalam hal ini source atau input yang digunakan berasal dari pembacaan data Serial.read()
Lihat juga mengenai tutorial dan penjelasan mengenai project Arduino Uno LED blinking dan Arduino Uno LED animation.