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:
- Download library usb-serial
- Copy file library usb-serial-for-android-v010.jar ke project yang anda buat di folder libs
- 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>
- Konfigurasi AndroidManifest.xml seperti dibawah ini
- 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>
- Sekarang buat program serial.java
- Setelah semua program di android dibuat, sekarang kita buat program baca serial di arduino, disini saya menggunakan board arduino uno R3
<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>
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;
}
}
}
}
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 :
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
- Buat button dengan listener OnTouchListener
Silahkan di share dengan menuliskan sumbernya..
Created by: Rifqi Arridho Abid