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!