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

11 komentar :

  1. gan ini buat aplikasi diandroidnya pake apa ?

    BalasHapus
    Balasan
    1. pakai java gan.. compilernya pakai eclipse yg udah bundle dengan android (ADT)

      Hapus
  2. contoh yang pake switch button donk om

    BalasHapus
    Balasan
    1. bentar ya gan,. nanti kalau lg ga sibuk, InsyaAllah saya buatkan tutornya.. konsepnya sama seperti pakai push button kok

      Hapus
  3. versi androidnya brp ya yg bisa support??
    kok saya mau pasang driver usb host checknya??? ada pesan " tidak kompitable dg perangkat"

    BalasHapus
    Balasan
    1. saya blm coba pakai HH lain gan, HH saya xperia L,
      coba lihat spek HH agan dulu

      Hapus
  4. Hp tipe apa yang agan pakai?
    apakah HP HUAWEI ASCEND P1 (U9200) bisa di OTG kan?
    mohon support, terima kasih sebelumnya..

    BalasHapus
    Balasan
    1. maaf baru balas, HH ane xperia L gan.. saya juga blm coba pakai HH lain

      Hapus
  5. gan mau tanya klo arduino yg lain spti arduino mega 2560 bisa tidak pkai cara ini biar bisa komunikasi dgn hp android? tx

    BalasHapus
  6. gan boleh minta file nya?

    BalasHapus