Minggu, 01 November 2015

Analisis Penambahan Indikator Lokal Variable Inlet Guide Vane (VIGV) pada Gas Turbine 5.1 PT.PJB UP Muara Tawar

Project Assignment Ini Disusun Sebagai Syarat Akademik Program On The Job Training PT.Pembangkitan Jawa-Bali Angkatan XII

Disusun Oleh:

Donal Afriwandi
Hadratul Hendra
Rifqi Arridho Abid
Pinkan Dyah Bathari

1. Latar Belakang      
        Pada tiap-tiap unit pembangkit, terdapat kontrak/kesepakatan jual beli tenaga listrik antara PT. PLN P3B (Penyaluran dan Pusat Pengatur Beban) dengan pembangkit. Oleh karena itu, pembangkit memerlukan adanya Deklarasi Kesiapan Pembangkit (DKP) untuk memenuhi kontrak tersebut. Deklarasi Kesiapan Pembangkit yang harus dipersiapkan oleh unit pembangkitan diantaranya EAF (Equivalent Availabity Factor), EFOR (Equivalent Forced Outage Rate), SdOF (Suddent Outage Factor), Planned Outage (PO), Forced Outage (FO), Derating dan lain-lain.
       Pada PT.Pembangkitan Jawa Bali Unit Pembangkitan Muara Tawar blok 5 merupakan pembangkit dengan sistem combined cycle, yang menggunakan pola operasi 1 unit Gas Turbine (GT), 1 unit Heat Recovery Steam Generator (HRSG) dan 1 unit Steam Turbine (ST).
       Salah satu komponen pendukung yang terdapat pada GT 5.1 adalah Variable inlet guide vane (VIGV). VIGV merupakan suatu sistem yang mengatur volume aliran udara yang masuk ke dalam kompresor. Udara yang masuk akan digunakan untuk sealing, cooling dan pembakaran. Selain itu VIGV berperan untuk mengoptimalkan rasio udara dengan bahan bakar pada proses pembakaran. Pada VIGV GT 5.1 terdapat dua buah angle transmitter yang berfungsi untuk mengetahui posisi pembukaan VIGV. Jika terjadi deviasi pembacaan antara angle transmitter VIGV channel A dan B >4º maka akan mengakibatkan VIGV position failure PLST. Jika hal ini terjadi maka akan mempengaruhi nilai kesiapan pembangkit dan menyebabkan penurunan tingkat keandalan turbin gas.


2. Permasalahan
       Permasalahan yang dikaji dalam pokok bahasan “Analisis Penambahan Indikator Lokal Variable Inlet Guide Vane (VIGV) pada GT 5.1 PT PJB UP Muara Tawar” adalah  terjadinya deviasi antara angle transmitter channel A dan channel B >4º. Deviasi tersebut mengakibatkan VIGV position failure PLST. Agar alarm PLST tidak aktif lagi, maka salah satu dari angle transmitter VIGV harus di-disturb. Sehingga saat ini hanya satu angle transmitter channel A yang aktif. Terjadinya PLST akan mempengaruhi nilai kesiapan pembangkit dan menyebabkan penurunan tingkat keandalan turbin gas.


3. Fakta Yang Mempengaruhi
3.1 Protection List VIGV
      Keseluruhan operasi kerja Turbin Gas diatur oleh sistem kontrol EGATROL . Dimana sistem kontrol tersebut menjaga keseluruhan proses tetap dalam batasan kerja masing masing peralatan. Jika suatu peralatan mengalami penyimpangan dari fungsi sebagai mana mestinya, dan melewati nilai batas tersebut, maka akan terjadi kegagalan fungsi opersai kerja. Dengan kata lain unit mengalami gangguan. Hal ini sangat berbahaya bagi kelangsungan kerja unit/sistem. Oleh karena itu dilakukan langkah pengamanan guna menghindari kerusakan lebih pada peralatan, yang disebut sistem proteksi.
Sistem proteksi pada turbin gas dapat digolongkan sebagai berikut : 
1. Alarm 
   Peralatan terganggu. Muncul di Sequnce of Event Log
2. Protective Load Shedding (PLS) 
    Unloading 80 MW/menit hingga beban mencapai 0% dari nominalnya, namun rotor masih tetap berputar sesuai nominalnya (idle operation). GT dapat dihubungkan kembali kedalam jaringan, setelah penyebab PLS di reset terlebih
3. Protective Load Shedding Trip (PLST)
  Prinsip kerja nya sama dengan PLS, namun setelah beban 6 MW unit akan Trip
4. Trip
   Gangguan pada peralatan sudah dalam kondisi maksimal, unit di stop langsung dari kondisi berbeban (Generator Circuit Breaker lepas) tanpa unloading. Kondisi ini sangat rawan terhadap thermal stress

3.2 Deviasi Angle Transmitter A dan Angle Transmitter B
       Di bawah ini menampilkan data recorder deviasi pembukaan VIGV Angle Transmitter A dan Angle Transmitter B pada tanggal 15 Agustus 2014 di UP Muara Tawar blok 5

      Dari data di atas menunjukkan pada tanggal 15 Agustus 2014, pukul 12:55:37 WIB, terjadi deviasi pembacaan angle transmitter antara channel A dan B sebesar >4° saat proses naik beban menuju baseload (145 MW). Kontroller turbin Egatrol memerintahkan untuk pembukaan vigv pada setpoint -4,1°, akan tetapi pada angle transmitter channel A pembukaan sebesar -3,7° dan angle transmitter channel B pembukaan sebesar -8,9° sehingga terjadi deviasi antar angle transmitter >4°, deviasi ini menyebabkan alarm Protective Load Shedding Trip (PLST) aktif sehingga salah satu dari angle transmitter VIGV harus di-disturb agar alarm PLST tidak aktif lagi.
      Berikut tampilan pada komputer Human Machine Interface (HMI) yang menampilan angle transmitter channel A aktif dan angle transmitter channel B di disturb.



4. Pembahasan
4.1 Dasar Teori Variable Inlet Guide Vane (VIGV)
       Salah satu komponen pendukung yang terdapat pada GT 5.1 adalah Variable inlet guide vane (VIGV). VIGV merupakan suatu sistem yang berfungsi untuk mengatur volume aliran udara yang masuk ke dalam kompresor. Udara yang masuk tersebut akan digunakan untuk sealing, cooling dan pembakaran. Selain itu VIGV juga berperan untuk mengoptimalkan rasio udara dengan bahan bakar pada proses pembakaran.
      Komponen utama pada VIGV adalah:
a. Inlet guide vane yang terdiri dari 52 vane, berfungsi untuk mengarahkan aliran udara ke inlet kompresor

b. Hydraulic cylinder, berfungsi sebagai aktuator untuk menggerakkan vigv yang sudah terkopel dengan adjustment ring.

c. Safety and monitoring equipment (angle transmitter), berfungsi untuk mengetahui posisi pembukaan vigv

      VIGV dipasang pada casing inlet compressor dan derajat pembukaanya diatur oleh kontroller turbin (Egatrol). VIGV digerakan oleh hydraulic piston dimana minyak penggeraknya disuplai oleh power oil system. Posisi pembukaan VIGV:
·   Rotor Barring dan standstill : -65° (full closed)
·   Purging        : 0° (full open)
·   Start up       : -30°
·   Loading        : -30° to 0° (base load)
VIGV Posisi Full Closed -65°
VIGV Posisi Full Open
 





Grafik Proses Pembukaan VIGV Saat Startup Gas Turbine
Kurva Hubungan Pembukaan VIGV dengan Temperature After Turbine (TAT), Turbine Inlet Temperature (TIT) saat startup dan loading

       Pada VIGV GT 5.1, terdapat dua buah angle transmitter yang berfungsi untuk mengetahui posisi pembukaan VIGV. Kesalahan pembukaan pada VIGV akan menyebabkan campuran antara udara dan bahan bakar tidak sesuai yang berakibat pada menurunnya efisiensi turbin gas, dan ketidakstabilan flame (api). Sehingga pada nantinya dapat menimbulkan vibrasi pada ruang bakar (pulsation) dan pada kasus yang sangat ekstrem dapat terjadi flame-off yang berakibat pada unit GT 5.1 trip. Salah satu faktor yang menyebabkan penurunan produksi dan tingkat keandalan turbin gas adalah kesiapan dari komponen angle transmitter pada sistem VIGV.


4.2 Perhitungan Equivalent Operating Hours (EOH)
4.2.1 Saat Terjadinya PLS
      Salah satu faktor yang menyebabkan penurunan produksi dan tingkat keandalan turbin gas adalah kesiapan dari komponen angle transmitter pada sistem VIGV. Berikut merupakan perhitungan Equivalent Operating Hours (EOH) pada GT 5.1 yang diakibatkan oleh VIGV PLS:

Keterangan :
EOH               : Equivalent Operating Hour
WOH              : Weighted Operating Hour
WCE              : Weighted Cyclic Events
OH                 : Operating Hour
CE                 : Cyclic Events
X and V          : Weighting Factore
Z                   : Fuel Factore

        Protective Load Shedding (PLS) adalah jenis pengaman operasi dimana beban gas turbin akan turun (80 MW/Menit) jika peralatan yang terganggu sudah mencapai batasannya, dan akan berhenti jika penyebab gangguan sudah hilang. Tetapi beban tidak akan kembali naik ke beban semula sebelum PLS direset.
         Pada GT 5.1 terhitung EOH sebagai berikut saat terjadi PLS
 
Sehingga diperoleh WCE dan WOH sebesar:
 

        Dengan penambahan EOH sebesar 52.5 dari EOH normal, maka terjadinya PLS ini merugikan unit dari sisi EOH. Sehingga keandalan unit berkurang dan mempercepat untuk dilaksanakannya proses inspeksi.


4.2.2 Saat Terjadinya Trip
      Berikut akan ditampilkan perhitungan Weighted Cyclic Events (WCE) pada GT 5.1 saat trip yang diakibatkan oleh kesalahan pembukaan VIGV:
Dengan rumus :
       Maka diperoleh penambahan faktor EOH (10 ∙ WCE) saat terjadi trip berdasarkan temperature sebagai berikut:
Tabel Penambahan Faktor EOH (10.WCE) saat Terjadi Trip Berdasakan Turbine Inlet Temperature (TIT)
       Dari data tabel diatas, penambahan EOH baik saat terjadi PLS/Trip berdasarkan Turbine Inlet Temperature GT 5.1 akan mempercepat proses pelaksanaan inspeksi. Semakin cepat periode inspeksi maka efisiensi unit akan menurun dari segi perhitungan unit.

4.3 Perhitungan Indikator Kinerja
      Selain perhitungan EOH PLS dan trip, kejadian trip pada unit dapat mengakibatkan penurunan kinerja kesiapan dan keandalan unit. Berikut tabel perhitungan indikator kinerja blok 5 berdasarkan periode harian dan bulanan.
Pengaruh Unit Trip Terhadap EAF dan EFOR dalam Laporan Harian
Pengaruh Unit Trip Terhadap EAF dan EFOR dalam Laporan Bulanan

4.3.1 Perhitungan Kerugian Finansial Saat Trip
       Perhitungan kerugian dari segi finansial akibat kejadian trip dapat dihitung dengan rumus sebagai berikut:
Dimana :
Hkap : Harga komponen A dimana penyusunnya adalah biaya pengembalian modal
Hfix : Harga komponen B dimana penyusunnya adalah biaya penggantian Operation & Maintenance
DMN   : Daya Mampu Netto

Contoh perhitungan :
Terjadi trip selama 1 jam pada PLTGU Blok 5 dengan  DMN   : 214 MW, 
Hkap   : Rp 1,884,717 
Hfix     : Rp 223,060

Maka didapatkan:
       Dengan rumus di atas, maka dapat diperhitungkan kerugian akibat trip selama 1 jam, 6, 12 dan 24 jam dalam tabel dibawah ini:


5. Kesimpulan
    Berdasarkan hasil analisis diatas penambahan indikator lokal VIGV dirasa sangat penting. Hal ini didasarkan atas pertimbangan keuntungan dari penambahan indikator VIGV di lokal adalah:
1. Mengetahui keakuratan pembacaan dari angle transmitter antara di lokal dengan di HMI control room.
2. Mempermudah pada saat proses kalibrasi angle transmitter.
3. Sebagai pembanding apabila ada salah satu dari angle transmitter ada yang rusak atau error.


6. Saran
     Berdasarkan kesimpulan yang ada, terdapat saran yaitu diperlukan penambahan indikator lokal VIGV yang bertujuan untuk mengetahui posisi pembukaan vigv yang aktual, sehingga memudahkan operator saat melakukan recording/patrol check jika terjadi deviasi operator bisa melaporkan secepat mungkin kepada pihak yang terkait . Indikator lokal vigv akan terpasang pada ring yang sudah terkopel dengan vigv, sehingga saat vigv membuka/ menutup indikator lokal yang berbentuk busur derajat ini akan bergerak sesuai sudut pembukaan vigv. Berikut adalah ilustrasi dari indikator lokal VIGV.

7. Referensi
    1. Alstom Gas Turbine GT13E2 Manual Book
    2. PROTAP Deklarasi Kesiapan Pembangkit-Indeks Kinerja Pembangkit

Minggu, 07 September 2014

Komunikasi Data Android dengan Arduino via USB

Terdapat banyak cara agar smartphone android bisa saling bertukar data/berkomunikasi dengan arduino. Salah satu cara yang praktis adalah dengan menggunakan usb serial. 
Disini saya akan berbagi tentang komunikasi android ke arduino via usb dengan tambahan library dari  usb-serial-for-android .Dengan library ini kita tidak perlu membeli lagi shield usb host atau arduino ADK untuk berkomunikasi dengan android, jadi secara biaya juga lebih hemat. Syarat menggunakan library ini adalah android support USB Host, lalu bagaimana jika ternyata smartphone android kita tidak support USB Host? 

Anda bisa membaca artikel sebelumnya Membuat Smartphone Android Support USB Host .

Pada artikel ini, saya akan menerapkan komunikasi serial antara android dengan arduino untuk menyalakan led .Langkah selanjutnya adalah:
  1. Download library usb-serial
  2. Copy file library usb-serial-for-android-v010.jar ke project yang anda buat di folder libs
  3. Buat file dengan nama device_filter.xml ,isi dengan sourcecode seperti dibawah ini, lalu simpan di direktori /res/xml/
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!-- 0x0403 / 0x6001: FTDI FT232R UART -->
        <usb-device vendor-id="1027" product-id="24577" />
    
        <!-- 0x2341 / Arduino -->
        <usb-device vendor-id="9025"
            product-id="0067" />
    
        <!-- 0x16C0 / 0x0483: Teensyduino  -->
        <usb-device vendor-id="5824" product-id="1155" />
    
        <!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
        <usb-device vender-id="4292" product-id="60000" />
    </resources>
    
  4. Konfigurasi AndroidManifest.xml seperti dibawah ini 
  5. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.testserial"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="19" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" > 
            <activity
                android:name="com.example.testserial.serial">    
                <intent-filter>
           <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter> 
         <meta-data
                  android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
                  android:resource="@xml/device_filter" />
            </activity> 
        </application> 
    </manifest>
    
  6. Sekarang kita buat user interfacenya main.xml, sederhana saja menggunakan LinearLayout dan terdiri dari beberapa Button
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"    
        android:orientation="vertical" 
        android:background="#060000">
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:textStyle="bold"
            android:textSize="18dp"         
            android:text="Button dengan OnClickListener" />
    
        <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center_horizontal"
        android:paddingTop="10dp"
        >
         <Button
             android:id="@+id/merahOn"
             android:background="#FF0000"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="ON" />
         <Button
                android:id="@+id/putihOn"
                android:background="#FFFFFF"         
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="ON" />
        </LinearLayout>
        
        
        <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center_horizontal"
        android:paddingBottom="5dp"
        >
         <Button
             android:id="@+id/merahOff"
             android:background="#FF0000"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="OFF" />
         <Button
                android:id="@+id/putihOff"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:background="#FFFFFF"
             android:text="OFF" />
         </LinearLayout>
    
        <TextView
            android:id="@+id/teks"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textColor="#FFFFFF"        
            android:textStyle="bold"
            android:paddingBottom="10dp"
            android:text="" />
        
        <View 
            
            android:layout_width="fill_parent"       
         android:layout_height="1dp"
         android:background="#FFFFFF"
         />
    
        <TextView
            android:id="@+id/textView2"        
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:textStyle="bold"
            android:textSize="18dp"  
            android:text="Button dengan OnTouchListener" />
        
        <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center_horizontal"
        android:paddingTop="10dp"
        android:paddingBottom="5dp"
        >
         <Button
             android:id="@+id/BTmerahOn"
             android:background="#FF0000"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="ON" />
         <Button
                android:id="@+id/BTputihOn"
                android:background="#FFFFFF"         
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="ON" />
        </LinearLayout>
        
           <TextView
            android:id="@+id/teks1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textColor="#FFFFFF"        
            android:textStyle="bold"
            android:paddingBottom="10dp"
            android:text="" />
        
       
    </LinearLayout>
    
  7. Sekarang buat program serial.java
  8. package com.example.testserial; 
    
    import android.app.Activity;
    import android.content.Context;
    import android.hardware.usb.UsbManager;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnTouchListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.io.IOException;
    import com.hoho.android.usbserial.driver.UsbSerialDriver;
    import com.hoho.android.usbserial.driver.UsbSerialProber;
     
    
    public class serial extends Activity 
    {
        private UsbManager usbManager;
        private UsbSerialDriver device;
        
        TextView teks,teks1;
        byte[] kirim,kirim1;
        int pm,mm=0;
        
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);       
            setContentView(R.layout.main);
            
            teks  = (TextView)findViewById(R.id.teks); 
            teks1 = (TextView)findViewById(R.id.teks1);
            usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
            
            Button merahOn = (Button)findViewById(R.id.merahOn);  
            merahOn.setOnClickListener(new OnClickListener() 
            {
                public void onClick(View v) 
                {
                    if (device != null)
                    {
                        kirim = new byte[] {(byte)'M','O','N','\n'};
                        try
                        {
                            device.write(kirim, 500);     
                            teks.setText("Merah Nyala");
                            mm=0;
                        }
                        catch (IOException e)
                        {
                            teks.setText("Pengiriman data gagal");
                        }
                    }
                    else
                    {
                        teks.setText("Perangkat Tidak Ditemukan");
                    }
                }
            });  
            
            Button putihOn = (Button)findViewById(R.id.putihOn);  
            putihOn.setOnClickListener(new OnClickListener() 
            {
                public void onClick(View v) 
                {
                    if (device != null)
                    {
                        kirim = new byte[] {(byte)'P','O','N','\n'};
                        try
                        {
                            device.write(kirim, 500);     
                            teks.setText("Putih Nyala");
                            pm=0;
                        }
                        catch (IOException e)
                        {
                            teks.setText("Pengiriman data gagal");
                        }
                    }
                    else
                    {
                        teks.setText("Perangkat Tidak Ditemukan");
                    }
                }
            });  
            
            Button putihOff = (Button)findViewById(R.id.putihOff);  
            putihOff.setOnClickListener(new OnClickListener() 
            {
                public void onClick(View v) 
                {
                    if (device != null)
                    {
                        kirim = new byte[] {(byte)'P','O','F','\n'};
                        try
                        {
                            device.write(kirim, 500);     
                            teks.setText("Putih Mati");
                            pm = 1;
                        }
                        catch (IOException e)
                        {
                            teks.setText("Pengiriman data gagal");
                        }
                        
                        if (pm==1 && mm==1)
                        {
                            teks.setText("LED MATI");
                            pm=0;
                            mm=0;
                        }
                    }
                    else
                    {
                        teks.setText("Perangkat Tidak Ditemukan");
                    }
                }
            }); 
            
            
            Button merahOff = (Button)findViewById(R.id.merahOff);  
            merahOff.setOnClickListener(new OnClickListener() 
            {
                public void onClick(View v) 
                {
                    if (device != null)
                    {
                        kirim = new byte[] {(byte)'M','O','F','\n'};
                        try
                        {
                            device.write(kirim, 500);     
                            teks.setText("Merah Mati");
                            mm=1;
                        }
                        catch (IOException e)
                        {
                            teks.setText("Pengiriman data gagal");
                        }
                        
                        if (pm==1 && mm==1)
                        {
                            teks.setText("LED MATI");      
                        }
                    }
                    else
                    {
                        teks.setText("Perangkat Tidak Ditemukan");
                    }
                }
            });  
    
    
        }
    
    public void onResume() 
        {      
          super.onResume();
          
          device = UsbSerialProber.acquire(usbManager);
          if (device == null) 
          { 
             teks.setText("Perangkat Tidak Ditemukan");
          } 
          else 
          {
              try 
              {   
                 device.open();    
                 device.setBaudRate(9600); 
                 teks.setText("Perangkat Ditemukan");             
              } 
              catch (IOException err) 
              {               
                 try 
                 {     
                    device.close();
                 } 
                 catch (IOException err2) 
                 {}
                
                 device = null;
                 return;
              }
          }
                
       }
    }  
  9. Setelah semua program di android dibuat, sekarang kita buat program baca serial di arduino, disini saya menggunakan board arduino uno R3
  10. int ledMerah=5;
    int ledPutih=6;
    
    int maksData = 10;
    char data[10];
    int dataIndex;
    
    void bacaSerial()
    {
      if (Serial.available() > 0)
      {
         char dataMasuk = Serial.read();
         data[dataIndex] = dataMasuk;
         
          if(dataMasuk=='\n')
          {      
              data[dataIndex] = '\0';       
              dataIndex = 0;
            
              String stringData = String(data);
            
              if(strcmp(data, "MON")  == 0)
              {                    
                 digitalWrite(ledMerah, HIGH);         
              }       
              else if(strcmp(data, "PON")  == 0)
              {                    
                 digitalWrite(ledPutih, HIGH);         
              }  
              else if(strcmp(data, "POF")  == 0)
              {                    
                 digitalWrite(ledPutih, LOW);         
              } 
              else if(strcmp(data, "MOF")  == 0)
              {                    
                 digitalWrite(ledMerah, LOW);         
              } 
          } 
          
         else
         {
            if(dataIndex++ >= maksData)
            {
              dataIndex = 0;
            }   
         }
      }
    }
    
    void setup()
    {
      pinMode(ledMerah, OUTPUT); 
      pinMode(ledPutih, OUTPUT); 
      
      dataIndex = 0;
      Serial.begin(9600);
    }
    
    void loop()
    {
      bacaSerial();
    }
Hasil dari program yang telah dibuat akan seperti ini:


Pada program android yang dibuat diatas menggunakan Button yang diberi listener OnClickListener, sehingga :
  • Ketika Button di android ditekan maka hanya mengirim perintah satu kali saja 
  • Data serial yang diterima di arduino akan dieksekusi satu kali, dan akan berganti state saat mendapat input lagi dari Button lainnya
Lalu bagaimana jika kita ingin mengirim data secara kontinu ketika button ditekan? 
  • Buat button dengan listener OnTouchListener
Silahkan di share dengan menuliskan sumbernya..
Created by: Rifqi Arridho Abid

Jumat, 05 September 2014

Membuat Smartphone Android Support USB OTG

USB On The Go atau yang lebih sering dikenal dengan USB OTG adalah sebuah fitur pada smartphone yang berguna untuk transfer data dari smartphone android ke media penyimpanan atau sebagai konektor antara perangkat android dengan perangkat lain via usb.
Keuntungan smartphone android yang support usb OTG adalah perangkat usb lain seperti usb
flashdrive, mouse, atau keyboard dapat terkoneksi secara langsung dengan android.Selain itu bagi embedded system developer, usb OTG bisa berfungsi sebagai media komunikasi data dengan board mikrokontroler, misalnya board arduino.

Namun sayangnnya tidak semua smartphone android support usb otg, hal itu disebabkan karena tidak semua kernel android support usb otg. Salah satu cara untuk mengatasinya tanpa mengganti kernel android adalah dengan me"root" smartphone android, sehingga bisa mendapatkan hak akses untuk mengaktifkan permission usb host.

Setelah smartphone android dalam posisi sudah di root, langkah selanjutnya adalah :
  1. install aplikasi USB Host Check yang berfungsi untuk mengecek fungsi android host pada perangkat android.
  2. Buka aplikasi tersebut
  3. Jika muncul notifikasi "usb host support is not enable on this device" itu berarti file permission android.hardware.usb.host.xml tidak ditemukan pada sistem, sehingga kita perlu membuatnya sendiri.
  4. Buat file xml dengan nama android.hardware.usb.host.xml (bisa menggunakan notepad++ editor)
  5. Isi file tersebut dengan sourcecode dibawah ini, lalu save.Fungsi code dibawah ini untuk mengaktifkan dukungan usb host.
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <feature name="android.hardware.usb.host" />
    </permissions>
  6.  Setelah itu pindah file android.hardware.usb.host.xml ke smartphone android dan push ke etc/permissions (bisa menggunakan aplikasi root explorer)
  7. Lalu buka kembali aplikasi USB Host Check dan klik re-check
  8. Selamat,sekarang smartphone android anda sudah mendukung fitur USB OTG dan selamat berkarya! :D

    Cara diatas sudah saya coba di smartphone Xperia L dan work 100%. Sebenarnya HH saya tidak support usb otg namun setelah diakali dg cara diatas dan ditambah power external 5v pada usb otg jadi bisa support usb OTG. Untuk tutor penambahan power 5v external pada usb otg akan saya buat jika nanti ada waktu luang.. hehe
Dibawah ini beberapa aplikasi yg sudah saya buat memanfaatkan fitur usb otg android dengan arduino.. semoga terinspirasi:

- Komunikasi data antara android dengan arduino via usb
- EIRDROID (Android Robot Based Smartphone Android with WiFi Communcation)

Silahkan di share dengan menuliskan sumbernya..
Created by: Rifqi Arridho Abid

NB: Untuk smartphone selain Sony Xperia L saya blm pernah mencoba, Do With Your Own Risk!
  

Jumat, 14 Juni 2013

Kontrol Fuzzy Logic Berbasis Sensor Ultrasonik Pada Navigasi Robot Pemadam Api Beroda

A. Pendahuluan

  Perkembangan ilmu pengetahuan memacu perkembangan teknologi yang dapat membantu aktifitas manusia. Pada umumnya manusia tertarik dengan sesuatu yang dapat meringankan beban dari pekerjaannya. Salah satu caranya dengan adanya pemakaian robot. Robot memiliki beberapa kelebihan dalam pekerjaan dibandingkan manusia, salah satunya adalah dalam aspek tenaga, kualitas kerja yang statis, dan masih banyak lagi. 
   Sementara itu, perkembangan dunia robotik di Indonesia mulai berkembang dengan pesat, dimana dapat dilihat dari banyaknya kontes-kontes robot yang diadakan saat ini. Salah satu kontesnya adalah KRCI(Kontes Robot Cerdas Indonesia), yang mana merupakan ajang kontes robot bertaraf nasional. Pada lomba ini robot dihadapkan pada lintasan tertentu. 
  Robot Cerdas Pemadam Api divisi beroda adalah robot yang memiliki kemampuan menjelajahi suatu arena untuk menemukan titik api kemudian memadamkannya dan kembali ke titik awal dengan waktu secepat mungkin. Agar dapat melakukan misi tersebut dalam waktu yang cepat, sistem navigasi dalam perancangan robot memegang peranan penting, seperti sistem navigasi right-wall following, left-wall following, dead recogning, dan lain-lain. 
   Pada sistem kerja robot juga dibutuhkan suatu input berupa sensor yang berguna sebagai media perindraan robot. Sensor yang biasa digunakan pada robot adalah sensor ultrasonik sebagai sensor untuk mengukur jarak. Sensor ini dapat memberikan data sejauh apa robot ini dapat bergerak, sesuai dengan adanya halangan di depannya. Selain itu dalam robot pemadam api juga ditambahkan sensor untuk mendeteksi  api dan sensor untuk mendeteksi suhu api, yaitu sensor UVtron dan Thermal Array.   
   Penggunaan sensor ultaksonik tidak terbatas hanya untuk mendapatkan jarak, tetapi sensor ini juga memungkinkan robot dapat mengetahui posisi robot tersebut terhadap suatu lintasan (apakah robot sudah dalam posisi yang tepat atau tidak). Posisi robot yang miring dapat disempurnakan dengan dilakukannya kontrol kecepatan motor terhadap perbandingan pembacaan ultrasonik dengan metode fuzzy logic. 
    Dengan adanya kesamaran posisi robot yang didapat dari sensor ultrasonik (dekat, sedang, atau jauh,dll), maka metode fuzzy logic dinilai tepat. Diharapkan dengan menggunakan metode ini bisa mendapatkan hasil yang terbaik dalam memposisikan robot dalam lintasannya secara tepat dikarenakan banyak kemungkinan yang terjadi pada posisi robot saat melalui lintasan. Dengan latar belakang itu semua, maka kami membuat tugas besar kami dengan judul “Desain dan Implementasi Robot Pemadam Api Beroda dengan Kontrol Fuzzy Logic Berbasis Sensor Ultrasonik”.

1) Batasan Masalah
   Kami membatasi masalah-masalah dalam tugas besar sebagai 
   berikut :
a. Menggunakan 2 sensor ultrasonik sebagai media pembacaan 
   jarak dan penentuan posisi robot (1 didepan, 1 di kanan 
   robot).
b. Robot berjalan dengan sistem navigasi right-wall following
c. Robot akan mencari titik api, memadamkannya, dan kembali 
   posisi awal start
d. Bahasa pemrograman yang digunakan adalah bahasa pemrograman C
e. Menggunakan metode fuzzy logic untuk menyempurnakan jalannya 
   robot serta adanya penambahan program untuk mendapatkan hasil 
   yang terbaik dalam navigasi

2) Proses Fuzzyfikasi

     Setelah kita mendapatkan nilai jarak dari tiap sensor, langkah selanjutnya adalah fuzzyfikasi yakni proses pengubahan nilai data jarak setiap sensor menjadi bentuk himpunan fuzzy menurut fungsi keanggotaannya.Proses awal di dalam proses fuzzyfikasi adalah membuat fungsi keanggotaan dari setiap masukan terlebih dahulu, serta menentukan banyaknya variabel linguistic di dalam fungsi keanggotaan yang akan kita buat nantinya. Dari fungsi keanggotaan yang kita buat akan dapat diketahui nilai derajat keanggotaan masing-masing variabel dalam himpunan fuzzy yang telah dibuat.Dalam tugas besar kami, terdapat dua masukan dari sensor ultrasonik, yaitu sensor ultrasonik depan dan sensor ultrasonik kanan. Masukan dari sensor ultrasonik depan memiliki dua variabel linguistic, yaitu DEKAT dan JAUH dengan menggunakan fungsi keanggotaan trapesium. Berikut tampilan fungsi keanggotaan dari sensor ultrasonik depan di dalam sebuah gambar :

   Dari fungsi keanggotaan di atas, dapat diketahui derajat keanggotaan masing-masing variabel dala himpunan fuzzy DEKAT dan JAUH. Untuk menghitung derajat keanggotaan dapat menggunakan persamaan sebagai berikut : 

   Sedangkan untuk sensor ultrasonik kanan memiliki tiga variabel linguistic, yaitu DEKAT, SEDANG, dan JAUH dengan fungsi keanggotaan gabungan dari fungsi segitiga dan trapesium seperti yang tampak pada gambar :
3) Rules Evaluation
  Pada rules evaluation, terjadi pengolahan data input fuzzyfikasi dengan hasil keluaran yang dikehendaki dengan aturan-aturan tertentu. Dari aturan-aturan yang dibentuk inilah yang nantinya akan menentukan respon dari sistem terhadap berbagai kondisi set point dan gangguan yang terjadi pada sistem yang akan dibuat. Dalam tugas besar kami set point yang kami ambil adalah 8 cm dari dinding, dimana posisi tersebut berada pada posisi sedang pada sensor kanan. Berikut adalah tabel rules evaluation :

Dari tabel di atas, maka kita memiliki 6 aturan sebagai berikut :
IF sensor depan=DEKAT AND sensor kanan=DEKAT THEN motor kiri=PELAN AND motor kanan=CEPAT
•    IF sensor depan=DEKAT AND sensor kanan=CUKUP THEN motor kiri=PELAN AND motor kanan=CEPAT
•    IF sensor depan=DEKAT AND sensor kanan=JAUH THEN motor kiri=CEPAT AND motor kanan=PELAN
•    IF sensor depan=JAUH AND sensor kanan=DEKAT THEN motor kiri=PELAN AND motor kanan=CEPAT
•    IF sensor depan=JAUH AND sensor kanan=CUKUP THEN motor kiri=SEDANG AND motor kanan=CEPAT
•    IF sensor depan=JAUH AND sensor kanan=JAUH THEN motor kiri=CEPAT AND motor kanan=SEDANG

  Setelah mendapatkan aturan seperti tabel di atas, maka selanjutnya yang dilakukan adalah mencari nilai derajat keanggotaan untuk nilai setiap aturan yang didapat. Nilai keanggotaan untuk keluaran didapatkan dengan menggunakan fungsi AND.Misalkan didapatkan aturan sebagai berikut :

IF Sensor Depan = DEKAT(0.5) AND Sensor Kanan = DEKAT(0.5) THEN Motor Kiri = PELAN AND Motor Kanan = CEPAT
• IF Sensor Depan = DEKAT(0.75) AND Sensor Kanan = CUKUP(0.5) THEN Motor Kiri = PELAN AND Motor Kanan = CEPAT
• IF Sensor Depan = JAUH(0.75) AND Sensor Kanan = CUKUP(0.25) THEN Motor Kiri = SEDANG AND Motor Kanan = SEDANG

Maka keluaran akan mendapatkan nilai keanggotaan sebagai berikut :
o IF Sensor Depan = DEKAT(0.5) AND Sensor Kanan = DEKAT(0.5) THEN Motor Kiri = PELAN(0.5) AND Motor Kanan = CEPAT(0.5)
o IF Sensor Depan = DEKAT(0.75) AND Sensor Kanan = CUKUP(0.5) THEN Motor Kiri = PELAN(0.5) AND Motor Kanan = CEPAT(0.5)
o IF Sensor Depan = JAUH(0.75) AND Sensor Kanan = CUKUP(0.25) THEN Motor Kiri = SEDANG(0.25) AND Motor Kanan = SEDANG(0.25)

   Setelah nilai linguistic keluaran telah mendapatkan nilai derajat keanggotaan, maka pada nilai linguistic keluaran yang sejenis dicari nilai derajat keanggotaan yang maksimum untuk digunakan dalam pengolahan data selanjutnya, yakni defuzzifikasi.
Misalnya dari data di atas didapatkan nilai-nilai maksimum setiap linguistic keluaran sebagai berikut :
 
    Motor Kiri
PELAN(0.5), PELAN(0.5) → maka nilai derajat keanggotaan PELAN = 0.5
SEDANG(0.25) → maka nilai derajat keanggotaan SEDANG = 0.25

    Motor Kanan
SEDANG(0.25) → maka nilai derajat keanggotaan SEDANG = 0.25
CEPAT(0.5), CEPAT(0.5) → → maka nilai derajat keanggotaan CEPAT

Lalu, setelah mendapatkan derajat keanggotaan pada nilai keluarannya, nilai keluaran juga memiliki fungsi keanggotaan model singletone, yang merupakan model interferensi sederhana. Dalam tugas besar ini kami menggunakan Model Sugeno

4) Defuzzyfikasi
Proses ini merupakan penggabungan dari beberapa fuzzy set yang telah didapatkan. Misal kita dapat menggunakan data di atas :

>>Motor Kiri
PELAN(0.5), PELAN(0.5) → maka nilai derajat keanggotaan PELAN = 0.5
SEDANG(0.25) → maka nilai derajat keanggotaan SEDANG = 0.25

Fungsi Keanggotaan Motor Kiri

>>Motor Kanan
SEDANG(0.25) → maka nilai derajat keanggotaan SEDANG = 0.25
CEPAT(0.5), CEPAT(0.5) →  maka nilai derajat keanggotaan CEPAT = 0.5


Fungsi Keanggotaan Motor Kanan


 
   Proses selanjutnya adalah mengolah data tersebut menggunakan metode Weight Average untuk proses defuzzifikasinya. Metode ini mengambil rata-rata dengan menggunakan nilai derajat keanggotaan dari proses komposisi fuzzy set menggunakan Model Sugeno sebelumnya.Dari data sebelumnya, didapatkan data sebagai berikut:

Motor Kiri = PELAN(0.5), SEDANG(0.25)
Motor Kanan = SEDANG(0.25), CEPAT(0.5)
Data diatas dapat diolah sebagai berikut :

>>Motor Kiri
PWMKIRI=  ((0.5)70+(0.25)150)/(0.5+0.25)=96.6
 
Jadi, berdasarkan persamaan di atas nilai kecepatan Motor Kiri yang didapat adalah 96.6 PWM
 
>>Motor Kanan
PWMKANAN=  ((0.25)150+(0.5)230)/(0.25+0.5)=203.3
 
Jadi, berdasarkan persamaan di atas nilai kecepatan Motor Kanan yang didapat adalah 203.3 PWM. Inilah hasil tugas besar fuzzy logic yang saya buat 


Silahkan di share dengan menuliskan sumbernya..
Created by: Rifqi Arridho Abid