Rabu, 08 Januari 2014

Pengatur Posisi Translasi dengan Ketukan dan Siulan


Muchamad Dwi Purnama, Thosin Novandrian
 Jurusan Teknik Elektro POLINES
Jl. Prof. H. Soedarto, SH Tembalang Semarang 50275 INDONESIA

Abstract This document is a report on the subject project Arduino Microcontroller Laboratory 2. This project uses the input of whistling sounds and knocks to move the device outputs a linear actuator. At the input device there are four piezo sounder and a sound sensor, while the outputs using a motor stepper as the driving actuators. Piezo sounder as an input to adjust the position of the linear actuator device by tapping it. Linear actuator will move to the position corresponding location of the piezo sounder is tapped. While the sound sensor is used to measure the frequency of the sound around the device. Linear actuators will go to the starting position when the appliance is turned on and also when the Arduino Uno microcontroller detect sound frequencies corresponding to the settings in the program.

KeywordsArduino, knock, whistling, linear actuator.

Ringkasan — Dokumen ini merupakan laporan proyek arduino pada matakuliah Laboratorium Mikrokontroler 2. Proyek ini mengunakan masukan berupa suara siul dan ketukan untuk menggerakkan perangkat luaran yang berupa linier aktuator. Pada masukan terdapat empat buah perangkat bel atau piezo sounder dan sebuah sensor suara sedangkan pada luaran menggunakan motor langkah sebagai penggerak aktuator. Bel sebagai masukan untuk mengatur posisi linier aktuator dengan cara mengetuk perangkat ini. Linier aktuator akan bergerak menuju posisi sesuai letak bel yang diketuk. Sedangkan sensor suara digunakan untuk mengukur frekuensi suara disekitar perangkat. Linier aktuator akan kembali keposisi awal pada awal penggunaan alat dan juga ketika Mikrokontroler Arduino Uno mendeteksi frekuensi suara yang sesuai dengan pengaturan pada program.

Kata kunciArduino, ketukan, siul, linier aktuator.



I.                    PENDAHULUAN

Untuk tugas proyek Arduino masukan yang digunakan berupa ketukan dan siul, serta keluaran linier aktuator. Alat yang digunakan untuk memproses data masukan dan keluaran adalah Arduino Uno Revisi 3. Pada proyek Arduino kali ini,yang diatur adalah pergerakan linier aktuator. Untuk mengatur linier aktuator menggunakan Bel dan Sensor suara yang terdiri dari mic dan penguat. Bel yang digunakan sebagai masukan berupa ketukan, karena bel dapat menghasilkan tegangan. Dalam proyek ini menggunakan 4 buah bel untuk mengatur 4 posisi yang akan diatur, dimana tiap bel memiliki posisi yang berbeda-beda. Selain Bel juga digunakan Sensor suara yang terdiri dari mic dan penguat. Mic pada sensor ini berfungsi untuk menangkap gelombang suara disekitarnya sebelum dikuatkan. Selain mic, terdapat sirkuit yang terintegrasi (IC) LM 393 yang digunakan sebagai penguat karena tegangan masukan pada mic harus mencukupi untuk menghasilkan logika ‘1’ pada keluarannya. Sensor suara yang digunakan ini untuk mengatur aktuator untuk bergerak ke posisi awal atau dengan kata lain untuk mengatur ulang (reset). Keluaran pada proyek arduino yang digunakan adalah linier aktuator. Dimana linier aktuator yang digunakan bergerak berdasarkan masukan dari masukan bel dan sensor suara. Sebagai penggerak aktuator ini adalah motor langkah .Dan alat pemroses data yang digunakan adalah arduino. Arduino merupakan mikrokontroler yang saat ini sedang populer digunakan. Mikrokontroler ini memiliki bahasa yang lebih mudah dimengerti dari pada bahasa C, karena hampir semua perintahnya menggunakan bahasa inggris yang utuh (bukan merupakan singkatan).



II.                landasan teori
A.    Arduino Uno Revisi 3

Gbr  1. Arduino Uno R3
Arduino Uno adalah mikrokontroler yang berbasis ATmega328. Mikrokontroler Ini memiliki 14 masukan digital/ pin keluaran dimana 6 pin dapat digunakan sebagai output modulasi lebar pulsa (Pulse Width Modulation/ PWM), 6 masukan analog, resonator keramik 16 MHz, koneksi USB, jek listrik, header ICSP, dan tombol reset. Arduino ini berisi semua yang diperlukan untuk mendukung mikrokontroler, hanya terhubung ke komputer dengan kabel USB atau catu dengan adaptor atau baterai AC ke DC untuk menggunakannya.

Uno berarti satu di Italia dan diberi nama  tersebut untuk menandai peluncuran Arduino 1.0. Kata Uno dan versi 1.0 akan menjadi versi referensi dari Arduino untuk bergerak maju. Uno ini adalah yang terbaru dalam serangkaian Arduino USB, dan model referensi untuk platform Arduino

Sifat Arduino Uno R3:
  • Menggunakan mikrokkontroler ATmega328
  • Tegangan masukan : 7-12V
  • Memiliki 14 digital pin masukan/keluaran  (6 luaran modulasi lebar pulsa)
  • 6 masukan analog
  • Memori Flash 32k
  • Kecepatan  Clock 16Mhz
B.    Bel
        
Gbr  2. Bel

Buzzer atau bel adalah sebuah komponen elektronika yang berfungsi untuk mengubah getaran listrik menjadi getaran suara. Pada dasarnya prinsip kerja bel hampir sama dengan penyuara (speaker), jadi bel juga terdiri dari kumparan yang terpasang pada diafragma dan kemudian kumparan tersebut dialiri arus sehingga menjadi elektromagnet, kumparan tadi akan tertarik ke dalam atau keluar, tergantung dari arah arus dan polaritas magnetnya, karena kumparan dipasang pada diafragma maka setiap gerakan kumparan akan menggerakkan diafragma secara bolak-balik sehingga membuat udara bergetar yang akan menghasilkan suara. Bel biasa digunakan sebagai indikator bahwa proses telah selesai atau terjadi suatu kesalahan pada sebuah alat (alarm).

Buzzer atau bel juga dapat digunakan sebagai masukan. Jika bel diberi tegangan akan menghasilkan suara, begitu juga jika bel diberi getaran berupa ketukan maka bel akan menghasilkan luaran berupa tegangan. Tegangan yang bangkit itulah yang digunakan untuk sinyal perintah untuk menggerakkan linier aktuator ke posisi yang diinginkan.



C.    Sensor Suara

Gbr  3.  Sensor suara


Sensor suara ini terdiri dari mikrofon, penguat dan komparator. Mikrofon akan menangkap suara disekitarnya dan dikuatkan oleh komponen penguat, lalu dibandingkan dengan tegangan yang ditetapkan. Jika sinyal masukan komparator lebih besar dari pada pengaturan tegangannya, maka keluaran pada komparator berlogika tinggi (5Volt) sedangkan jika sinyal masukan komparator lebih kecil dari pada pengaturan tegangannya, maka keluaran komparator akan berlogika rendah.








D.    Linier Aktuator

Gbr  4.  Linier Aktuator


Linier aktuator adalah sebuah aktuator yang keluarannya berupa gerakan lurus dengan penggerak berupa motor langkah bipolar. Gerakan motor langkah akan menggerakkan sabuk bergigi yang kemudian menggerakkan lurus aktuatornya. Jarak pergeseran dapat dihitung dengan mencari panjang pergeseran satu langkahnya. Linier aktuator ini memiliki gerakan 1mm per langkahnya.
Adapun motor langkah bipolar memiliki tabel kebenaran sebagai berikut:



Gambar 5. Motor langkah bipolar


TABEL I
Tabel Kebenaran Langkah Penuh

1a
2a
1b
2b
Keterangan
1
0
0
0
Kanan
0
1
0
0
0
0
1
0
0
0
0
1

1a
2a
1b
2b
Keterangan
0
0
0
1
Kiri
0
0
1
0
0
1
0
0
1
0
0
0



TABEL II
Tabel Kebenaran Setengah Langkah

1a
2a
1b
2b
Keterangan
1
0
0
0
Kanan
1
1
0
0
0
1
0
0
0
1
1
0
0
0
1
0
0
0
1
1
0
0
0
1
1
0
0
1



1a
2a
1b
2b
Keterangan
0
0
0
1
Kiri
0
0
1
1
0
0
1
0
0
1
1
0
0
1
0
0
1
1
0
0
1
0
0
0
1
0
0
1



III.        PERANCANGAN PERANGKAT KERAS DAN PERANGKAT LUNAK

A.       Perancangan Perangkat Keras
Perangkat keras pada alat ini terdiri dari piezo bel, sensor suara dan linier aktuator. Perancangan perangkat keras adalah sebagai berikut:

Gbr 6. Rangkaian masukan


Empat buah bel dirangkai seperti gambar. Letak bel akan mewakili posisi linier aktuator. Sedangkan keluaran sensor suara dihubungkan dengan pin 8 karena dalam pustaka arduino untuk pengukuran frekuensi dengan Arduino Uno harus menggunakan pin 8 [3].


Gambar 3.2 Rangkaian keluaran



Linier aktuator menggunakan motor langkah sebagai penggeraknya. Sehingga membutuhkan driver motor untuk mengendalikan motor langkah. Driver motor menggunakan IC L298 yang di dalamnya merupakan rangkaian H-Bridge.




B.       Perancangan Perangkat Lunak
1)    Diagram Alir:









2)   Program:
/*================================
  PProyek-<> Proyek Arduino
  program untuk mengendalikan
  posisi linier
  aktuator dengan masukan berupa
  ketukan dan
  siulan.
----------------------------------
 Materi Baru:
 - switch-case
----------------------------------
 Komponen:
 - 4x Piezo Sounder
 - 4x R1M
 - 1x IC L293
 - 1x Liniear Aktuator
================================*/
 #include <FreqMeasure.h>
 // diunduh pada [2]
  // menggunakan pin 8 untuk
  // arduino
 // (lihat file capture.h atau
 // laman)
 #define pinA 5
 // pin untuk Stepper masukan A
 #define pinB 4
 // pin untuk Stepper masukan B
 #define pinC 3
 // pin untuk Stepper masukan C
 #define pinD 2
 // pin untuk Stepper masukan D
 //=== Deklarasi Variable ===
 int
 arah,
 // var arah linier aktuator
 posAwal=0,
 // var posisi awal linier
 // aktuator
 posAkhir=0,
 // var posisi akhir linier
 // aktuator
 masukanAkhir=0,
 // var masukan yang terakhir
 // diberi
 jmlStep, // var jumlah langkah
 ambang=1000, // batas ADC
 normal=1,
 // tanda sudah ke posisi
 // normal/ belum
 klik=13;
 // pin masukan limit switch
 double sum=0;
 // var jumlah pengukuran
 // frekuensi
 int count=0;
 // var jumlah berapa kali
 // mengukur
 //=== Pengesetan Awal ===
void setup() {
FreqMeasure.begin();
  // mengaktifkan pembacaan
  // frekuensi
pinMode (pinA,OUTPUT);
  // pin 5 sebagai keluaran
pinMode (pinB,OUTPUT);
  // pin 4 sebagai keluaran
pinMode (pinC,OUTPUT);
  // pin 3 sebagai keluaran
pinMode (pinD,OUTPUT);
  // pin 2 sebagai keluaran
pinMode (klik,INPUT);
  // pin 13 sebagai masukan
digitalWrite(klik,HIGH);
  // mengaktifkan pull up
  // internal    }
//==Program Utama (Pengulangan)===
 void loop() {
   if (normal==1) {posisiNormal();}
// jika belum pernah ke posisi normal
   bacaFrek(); // baca frekuensi
   posisiTujuan();
// mendeteksi posisi tujuan
   jumlahStep();
// menghitung jumlah langkah  
   arahPutar();
// menentukan arah gerakan linier aktuator
 }
 //=== Sub Program ===
 //----------------------------------------
void posisiNormal() {
  int masukan,  // var masukan limit switch
      jedaMotor=5; // jeda motor 5ms
   normal=0; // kembali ke pengaturan awal
   posAwal=0;
   posAkhir=0;
   masukanAkhir=0;
   label1: // label pengulangan
   digitalWrite (pinA,LOW);
   digitalWrite (pinB,LOW);
   digitalWrite (pinC,HIGH);
   digitalWrite (pinD,LOW);
   delay(jedaMotor); // delay 5ms
   masukan=digitalRead (klik);
// baca masukan limit switch
   if (masukan==0) {return;}
// jika sudah menyentuh limit switch
// kembali
   digitalWrite (pinA,HIGH);
   digitalWrite (pinB,LOW);
   digitalWrite (pinC,LOW);
   digitalWrite (pinD,LOW);
   delay(jedaMotor); // delay 5ms
   masukan=digitalRead (klik);
// baca masukan limit switch
   if (masukan==0) {return;}
// jika sudah menyentuh limit switch
// kembali
   digitalWrite (pinA,LOW);
   digitalWrite (pinB,LOW);
   digitalWrite (pinC,LOW);
   digitalWrite (pinD,HIGH);
   delay(jedaMotor); // delay 5ms
   masukan=digitalRead (klik);
// baca masukan limit switch
   if (masukan==0) {return;}
// jika sudah menyentuh limit switch
// kembali
   digitalWrite (pinA,LOW);
   digitalWrite (pinB,HIGH);
   digitalWrite (pinC,LOW);
   digitalWrite (pinD,LOW);
   delay(jedaMotor); // delay 5ms
   masukan=digitalRead (klik);
// baca masukan limit switch
   if (masukan==0) {return;}
// jika sudah menyentuh limit switch
// kembali
   goto label1; // kembali ke label
   // jika belum menyentuh limit switch
 }
 //------------------------------------------
void arahPutar () {
  int posisi; // var posisi
  posisi=posAkhir-posAwal;
// mencari keadaan negatif/ positif
  if (posisi<0) {arah=-1;}
  else {arah=1;}
// mendefinisikan ke var arah
  posAwal=posAkhir;
// menyalin data ke var posAwal
switch (arah){
//jika hasilnya negatif
  case -1:
  putarKanan(jmlStep,5);
  break;
//putar kanan sesuai langkah dan jeda
//jika hasilnya positif
  case 1:
  putarKiri(jmlStep,5);
  break;
//putar kiri sesuai langkah dan jeda
  }
}
//------------------------------------------
int posisiTujuan () {
int piezoA= 3;
// pin analog 3 untuk buzzer A
int piezoB= 2;
// pin analog 2 untuk buzzer B
int piezoC= 1;
// pin analog 1 untuk buzzer C
int piezoD= 0;
// pin analog 0 untuk buzzer D
  if(analogRead (piezoA)>ambang && masukanAkhir!=1) {
// jika tegangan melebihi batas ambang dan
// tidak pada posisi 1
    masukanAkhir=1;
    posAkhir=1;
    return posAkhir;
  }

  if(analogRead (piezoB)>ambang && masukanAkhir!=2) {
// jika tegangan melebihi batas ambang dan
// tidak pada posisi 2   
    masukanAkhir=2;
    posAkhir=2;
    return posAkhir;
  }
 
  if(analogRead (piezoC)>ambang && masukanAkhir!=3) {
// jika tegangan melebihi batas ambang dan
// tidak pada posisi 3   
    masukanAkhir=3;
    posAkhir=3;
    return posAkhir;
  } 
  if(analogRead (piezoD)>ambang && masukanAkhir!=4) {
// jika tegangan melebihi batas ambang dan
// tidak pada posisi 3  
    masukanAkhir=4;
    posAkhir=4;
    return posAkhir;
  }
}
//-------------------------------------------
int jumlahStep (){
  int selisih; // var selisih
  selisih=posAkhir-posAwal;
  if (selisih<0) {selisih=-selisih;}
// selisih hanya diambil nilai positif
  switch (selisih) {
       case 0:
// jika hasilnya 0
       jmlStep=0;
// jalan 0 siklus
       break;
       case 1:
// jika hasilnya 1
       jmlStep=30;
// jalan 30 siklus
       break;
       case 2:
// jika hasilnya 2
       jmlStep=60;
// jalan 60 siklus
       break;
       case 3:
// jika hasilnya 3
       jmlStep=90;
// jalan 90 siklus
       break;
       case 4:
// jika hasilnya 4
       jmlStep=120;
// jalan 120 siklus
       break;
     } return jmlStep;
} // kembali dengan nilai jml langkah
//-------------------------------------------
void putarKanan(int jmlStep, int jedaMotor) {
  int a;
 for (a=0;a<jmlStep;a++) {
// loop sebanyak jml langkah
   digitalWrite (pinA,LOW);
   digitalWrite (pinB,LOW);
   digitalWrite (pinC,HIGH);
   digitalWrite (pinD,LOW);
   delay(jedaMotor); // jeda selama 5 ms
   digitalWrite (pinA,HIGH);
   digitalWrite (pinB,LOW);
   digitalWrite (pinC,LOW);
   digitalWrite (pinD,LOW);
   delay(jedaMotor); // jeda selama 5 ms
   digitalWrite (pinA,LOW);
   digitalWrite (pinB,LOW);
   digitalWrite (pinC,LOW);
   digitalWrite (pinD,HIGH);
   delay(jedaMotor); // jeda selama 5 ms
   digitalWrite (pinA,LOW);
   digitalWrite (pinB,HIGH);
   digitalWrite (pinC,LOW);
   digitalWrite (pinD,LOW);
   delay(jedaMotor); // jeda selama 5 ms
   }
}
//------------------------------------------
 void putarKiri(int jmlStep, int jedaMotor) {
  int a;
 for (a=0;a<jmlStep;a++) {
// loop sebanyak jml langkah
   digitalWrite (pinA,LOW);
   digitalWrite (pinB,HIGH);
   digitalWrite (pinC,LOW);
   digitalWrite (pinD,LOW);
   delay(jedaMotor); // jeda selama 5 ms
   digitalWrite (pinA,LOW);
   digitalWrite (pinB,LOW);
   digitalWrite (pinC,LOW);
   digitalWrite (pinD,HIGH);
   delay(jedaMotor); // jeda selama 5 ms
   digitalWrite (pinA,HIGH);
   digitalWrite (pinB,LOW);
   digitalWrite (pinC,LOW);
   digitalWrite (pinD,LOW);
   delay(jedaMotor); // jeda selama 5 ms
   digitalWrite (pinA,LOW);
   digitalWrite (pinB,LOW);
   digitalWrite (pinC,HIGH);
   digitalWrite (pinD,LOW);
   delay(jedaMotor); // jeda selama 5 ms
   }
}

//-----------------------------------------

void bacaFrek() {
  if (FreqMeasure.available()) {
    // menghintung total pembacaan frekuensi
    sum = sum + FreqMeasure.read();
    count = count + 1;
    // menghitung banyaknya pengukuran
    if (count > 20) {
      double frequency = F_CPU / (sum / count);
// merata-rata hasil pengukuran
      if (frequency > 2000 && frequency < 4000)
      {posisiNormal();}
// jika hasil perhitungan diantara 2000-4000
// maka kembali ke posisi normal
      else {
        // kembali ke nilai awal
         sum = 0;
         count = 0;
         return;
       }
       // kembali ke nilai awal
      sum = 0;
      count = 0;
    }  
  }    
}
IV.                PENGUJIAN DAN ANALISIS
A.       Pengujian Alat
TABEL III
Tabel Kebenaran Langkah Penuh
No.
Masukan
Posisi
Linier Aktuator
Ketukan
Siulan
1
-
-
0 (Posisi Awal)
2
Buzzer 1
-
1
3
Buzzer 2
-
2
4
Buzzer 3
-
3
5
Buzzer 4
-
4
6
-
Siulan
0 (Posisi Awal)
Saat pertama kali alat dinyalakan, maka secara otomatis linier aktuator akan menuju ke posisi awal yang ditandai dengan limit switch yang tertekan oleh linier aktuator. Setelah linier aktuator mencapai posisi 0, maka alat baru bisa diperintah  dengan masukan yang lainnya. Jika buzzer 1 diketuk, maka linier aktuator akan menuju posisi 1. Selama proses menuju posisi 1, linier aktuaor akan mengabaikan masukan-masukan yang diberikan saat itu. Setelah linier aktuator mencapai posisi 1, alat bisa diperintah lagi. Ketika buzzer 2 diketuk, maka linier aktuator menuju posisi 2, jika buzzer 3 diketuk  maka linier aktuator akan menuju posisi 3, begitu pula jika buzzer 4 diketuk maka linier aktuator akan bergerak menuju posisi 4. Dan ketika sensor suara mendeteksi suara dengan frekuensi antara 2KHz s/d 4KHz, maka linier aktuator akan kembali ke posisi 0.

B.       Analisa Rangkaian
1)       Pada masukan buzzer: buzzer  yang diketuk akan menghasilkan sinyal gelombang sejenak. Semakin keras ketukan, maka sinyal tegangan yang dihasilkan semakin besar. Dengan membatasi nilai ADC, maka akan dapat membedakan ketukan sebagai perintah dan ketukan yang bukan sebagai perintah. Jika tegangan  yang dihasilkan buzzer melebihi batasan nilai ADC yang sudah ditetapkan maka ketukan tersebut merupakan perintah, dan linier aktuator akan menuju posisi sesuai buzzer yang diketuk. Sedangkan jika tegangan keluaran buzzer kurang dari batas ADC maka ketukan tersebut diabaikan.
2)       Pada masukan sensor suara: luaran pada sensor suara ini berupa sinyal pulsa. Pulsa keluaran mewakili periode sinyal masukan suara. Keluaran sensor suara akan diolah secara program sehingga didapat nilai frekuensi suara tersebut. Frekuensi yang dihitung menggunakan metode perbandingan kecepatan clock pada mikrokontroler dengan rumus:

Dimana:
fs= frekuensi suara
fc= frekuensi clock (16MHz)
Clock= jumlah pulsa clock

Semakin tinggi frekuensi suara yang diukur semakin sedikit clock yang digunakan. Semakin rendah frekuensi suara yang diukur semakin banyak clock yang digunakan.

3)       Pada luaran linier aktuator: dengan mengukur jarak tiap langkah motornya, maka dapat diukur berapa langkah untuk mencapai sudut linier aktuator. Pada alat telah diukur bahwa untuk mencapai ujung linier aktuator dari ujung yang lain membutuhkan 496 langkah. Karena menggunakan langkah penuh sehingga setiap siklusnya ada 4 langkah, maka dapat diambil 120 siklus motor langkah untuk menuju ujung linier aktuator. Karena ada 4 posisi, maka 120 siklus dibagi lagi dengan 4 posisi, sehingga setiap posisinya memiliki selisih 30 siklus atau 120 langkah motor.



V.    PENUTUP
Kesimpulan
·    Alat pengatur posisi dengan ketukan dan siulan ini menggunakan perangkat masukan berupa buzzer 4 buah dan sebuah sensor suara sedangkan perangkat luaran sebuah linier aktuator.
·    Linier akan menuju posisi 0 pada awal alat dinyalakan.
·    Linier aktuator akan bergerak menuju posisi sesuai posisi buzzer yang diketuk.
·    Linier aktuator akan kembali ke posisi 0 (awal) jika mendeteksi suara dengan frekuensi antara 2KHz s/d 4KHz.
·    Masukan yang diberikan saat linier aktuator bergerak akan diabaikan.
Referensi
[1] Mcrobert,Michael.Begining Arduino
[2] http://indraharja.wordpress.com/2012/01/07/pengertian-buzzer/ di akses pada tanggal 5 Desember 2013
[3] http://www.pjrc.com/teensy/td_libs_FreqMeasure.html di akses pada tanggal 6 Desember 2013
[4] https://www.sparkfun.com/products/11021 di akses pada tanggal 8 Desember 2013





Tidak ada komentar:

Posting Komentar