Memanfaatkan Sensor Rotasi dan Bluetooth pada Handphone Android sebagai Sistem Kendali Mobile Robot

DSC08254

Lebaran memang momen yang paling tepat untuk saling bermaaf-maafan. Tentu pada kesempatan yang tepat ini penulis dan segenap crew ksatriaunisi juga mohon maaf jikalau dalam tutur kata, sikap dan perbuatan kurang berkenan bagi para pembaca sekalian. Pada momen kali ini juga, kami akan membagikan hasil projek sederhana selama liburan. Inspirasi projeknya sangat sederhana yaitu pada beberapa game racing dalam android tentu kita ketahui sudah mengimplementasikan sensor orientasi sebagai kontrol untuk membelokan mobil. Nah, kali ini kami coba untuk mengimplementasikannya menjadi sebuah mobil RC dengan handphone android sebagai remotenya. Beberapa Konsep dasarnya adalah sebagai berikut:

  • Handphone digunakan secara landscape.
  • Sumbu Y sebagai Rotasi untuk gerakan maju dan mundur (sumbu roll-sudut putar pada sumbu y). Rentang nilainya adalah 0-90 derajat dengan nilai 0 saat handphone pada posisi mendatar dan 90 saat vertikal. Saya membaginya menjadi 2 rentang yaitu 0-45 untuk maju dan 46-90 untuk mundur yang nantinya juga sebagai kontrol nilai PWM.
  • Untuk belok kiri dan kanan saya mengunakan Rotasi pitch (sudut putar pada sumbu X) sebagai sensornya. Rentang nilai sebenarnya adalah -180 sampai 180. Untuk menjaga kenyamanan pengendalian maka dibatasi pada rentang -45-45.
  • Antarmuka yang digunakan antara android dan arduino adalah melalui komunikasi nirkabel berupa bluetooth. Continue reading

Memprogram Arduino Sambil Travelling? Mengapa Tidak?

DSC08249

Tak dapat dipungkiri, memprogram adalah hal yang menjenuhkan dimana progammer akan dihadapkan pada lokasi yang “terbatas” dalam jangka waktu yang cukup lama. Hal tersebut tentu termasuk programmer mikrokontroler yang seringkali menghabiskan waktu di ruang tertutup berjam-jam bahkan berhari-hari.  Kejenuhan tentu akan mengurangi kreativitas otak dalam mencari solusi dalam menyelesaikan program. Tentu akan sangat menyenangkan saat jika bisa memprogram sambil liburan atau wisata dipinggir pantai atau dipuncak gunung. Sayangnya, program yang sering kali indentik dengan pengunaan laptop atau notebook tentunya mempunyai keterbatasan jika digunakan sambil travelling atau liburan. Berat laptop atau netbook yang bisa mencapai 3-5 kg tentu sangat tidak efektif untuk dibawa traveling. Belum lagi ketersediaan eksternal power di alam terbuka tentu menjadi kendala lain untuk memprogram di alam bebas. Untungnya, semakin majunya teknologi anda tidak perlu risau lagi untuk bisa memprogram sambil travelling khususnya bagi pengguna dan programmer arduino. Sekarang anda dapat menggunakan smartphone anda untuk memprogram arduino. Mantap. Berikut kami sajikan tips agar anda dapat memprogram arduino sambil travelling.

Continue reading

Mengunggah Program Arduino Melalui Bluetooth

DSC_0559

Seringkali kita dibuat malas saat harus memprogram mobile robot dimana seringkali harus berjalan kesana-kemari mengambil robot untuk diprogram ulang. Kelihatannya hanya hal sepele tapi terkadang ikut menyumbang stres dalam memprogram. Memperpanjang kabel usb tentunya juga bukan solusi yang baik karena dapat mempengaruhi kestabilan mobile robot. Salah satu solusinya adalah menggunakan komunikasi nirkabel untuk memprogramnya. Pada kesempatan ini saya akan berbagi tips memprogram arduino melalui komunikasi Bluetooth. Sekarang ini, Bluetooth bukanlah barang asing lagi dimana hampir setiap notebook memiliki Perangkat Bluetooth yang sudah terintegrasi. Selain itu harga modul Bluetooth untuk kepentingan robotika juga tergolong murah. Sehingga, saya rasa cukup baik untuk digunakan sebagai sarana memprogram. Hal yang pertama yang perlu dipahami saat menggunakan Bluetooth adalah komunikasi serial. Secara umum Bluetooth menggunakan antarmuka berupa komunikasi serial ke mikrokontroler sehingga tentunya akan memunculkan 2 pin inti yaitu pin transceiver (Tx) dan receiver (Rx). Kedua pin tersebut akan dihubungkan secara berkebalikan antar perangkat. Sehingga pin Tx akan dihubungkan ke pin Rx dan pin Rx akan dihubungkan ke pin Tx. Pada contoh kali ini tidak perlu pengkabelan karena Bluetooth yang digunakan adalah Bluetooth shield. Akan tetapi perlu diperhatikan bahwa tersedia jumper pin Tx dan Rx sehingga konsep komunikasi serial harus tetap dipahami. Perangkat yang digunakan pada kali ini adalah Arduino Duemilanove dan Bluetooth shield v.2.2.

Continue reading

Beberapa Kendala Penggunaan Sensor Orientasi (Kompas)

Beberapa waktu lalu saya sempat mencoba sensor orientasi kompas (sumbu putar yaw) sebagai penunjuk orientasi robot. saya menerapkan kendali proporsional sebagai pengatur kecepatan motor. Simpel memang, dimana prinsip kerjanya robot akan meluruskan ke setpoint tertentu.  dengan menggunakan persamaan error=setPoint-presentValue dan Proporsional=Kp*error maka sudah cukup untuk membuat robot mampu berorientasi ke setpoint tertentu. Tapi masalahnya ketika selisih nilai setpoint dan present valuenya besar (error bernilai besar). misalnya present value nya adalah 350 dan set pointnya adalah 10. maka hasilnya adalah -340 sehingga robot akan berputar ke berlawanan arah jarum jam sebesar 340 derajat untuk menuju titik 20 derajat. padalah jika robot mau berputar searah jaruh jam, dia hanya membutuhkan 12 derajat. itu masalah pertama. masalah kedua tidak kalah menarik, yaitu saat set pointnya mengarah ke utara atau 0 derajat. nah, pada setpoint ini sering terjadi osilasi berkesinambungan yang diakibatkan overshot. misal robot berada pada posisi 10 derajat (pv) kemudian set pointnya adalah 0 dan robot akan berputar berlawanan arah jarum jam. Ketika terjadi overshoot maka robot akan ada pada posisi 359 sehingga robot akan berputar kembali berlawanan arah jarum jam. begitu seterusnya sampai taylor swift merilis album religi.

o1

dari hasil beberapa percobaan yang saya lakukan, kedua masalah diatas dapat diselesaikan dengan 1 solusi. ketika masalah kedua terselesaikan, masalah pertama juga ikut terselesaikan. solusinya yaitu dengan memodifikasi programnya :D. Tahapannya seperti ini.

Continue reading

[Part 2] Mengambil Data Objek dari Hasil Segmentasi Objek

Bagian ini adalah lanjutan posting sebelumnya (Part 1) yang berisi tentang segmentasi objek berdasarkan warna dasr objek. pada percobaan kali ini adalah improvisasi yaitu menghilangkan noise untuk menghindari kesalahan segmentasi objek kemudian mengambil data hasil segmentasi objek. Penghilangan noise (noise reduction) perlu dilakukan mengingat masih terjadi beberapa titik diluar objek yang dikenali sebagai objek. dengan adanya noise reduction diharapkan kesalahan segmentasi dapat diminamilisir karena hal tersebut akan memengaruhi data hasil segmentasi yang akan diambil. Untuk mengurangi Noise pada percobaan kali ini menggunakan Fungsi transformasi morfologi pada open cv yaitu fungsi erode dan dilate. Berikut adalah perubahan code untuk menambahkan fungsi erode dan dilate untuk segmentasi yang dilakukan pada postingan sebelumnya.

@Override
protected Bitmap processFrame(VideoCapture capture) {
capture.retrieve(matrikObjek,Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
Imgproc.cvtColor(matrikObjek, matrikHSV,Imgproc.COLOR_RGB2HSV);//Konversi dari RGB ke HSV
Core.inRange(matrikHSV, new Scalar(9, 70, 80), new Scalar (20, 255, 255), NR);// range Hue, Saturation, Value
Mat erode = Imgproc.getStructuringElement(Imgproc.MORPH_ERODE, new Size (9,9));
Imgproc.erode(NR, filterWarna, erode);
Mat dilate = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, new Size (9,9));
Imgproc.erode(filterWarna, NR, dilate);
Bitmap bmp = Bitmap.createBitmap(NR.cols(), NR.rows(),Bitmap.Config.ARGB_8888);

Utils.matToBitmap(NR, bmp);
return bmp;
}

@Override
public void run() {
super.run();
synchronized (this) {
if (matrikObjek !=null)
matrikObjek.release();
matrikObjek=null;
if (matrikHSV!=null)
matrikHSV.release();
matrikHSV=null;
if (filterWarna!=null)
filterWarna.release();
filterWarna=null;
if (NR!=null)
NR.release();
NR=null;
}
}

 

Hasilnya menjadi sebagai berikut.screenshot-1403344054295

Continue reading

[Part 1] Segmentasi Objek Menggunakan Kamera Android Berdasarkan Warna Dasar Objek

screenshot-1403342989069

Setelah beberapa waktu lalu mencoba-coba sensor orientasi android, pada kesempatan ini penulis akan berbagi sedikit hasil belajar saat memprogram kamera android. Percobaan yang dilakukan kali ini hanyalah sebatas segmentasi objek berdasarkan warna dasar yang dilakukan secara realtime(video Capturing). Hasil tersebut kemudian ditampilkan dalam bentuk Threshold pada layar handphone. Bahasa pemprograman yang digunakan adalah full java programming dan Image processing library yang digunakan adalah openCV android.Program terdiri dari 3 class yaitu activity utama, survace view, dan yang terakhir adalah class untuk image processing. Berikut adalah isi dari class yang berisi Aktivity utama :

packagecom.example.kamera;

importandroid.os.Bundle;

importandroid.app.Activity;

importandroid.util.Log;

importorg.opencv.android.BaseLoaderCallback;

importorg.opencv.android.LoaderCallbackInterface;

importorg.opencv.android.OpenCVLoader;

 

public class MainActivity extends Activity {

protected static final String TAG = “Test Kamera”;

private Unisi unisi;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this,

mOpenCVCallBack)) {

Log.i(TAG, “Gagal Conect”);

}

}

 

@Override

protected void onResume(){

super.onResume();

if (unisi !=null && !unisi.openCamera())

finish();

}

protected void onPause(){

super.onPause();

if (unisi !=null)

unisi.releaseCamera();

}

 

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {

@Override

public void onManagerConnected(int status) {

if (status == LoaderCallbackInterface.SUCCESS) {

Log.i(TAG, “Conect Success”);

unisi = new Unisi(mAppContext);

setContentView(unisi);

if(!unisi.openCamera())

finish();

} else {

super.onManagerConnected(status);

}

}

};

}

 

Continue reading

Penguraian Data Menjadi Karakter-Karakter Untuk Komunikasi Serial IOIO-Arduino

Dalam komunikasi serial penguraian suatu data menjadi penting ketika data yang dikirim lebih dari 8bit atau 256 kemungkinan nilai data. Misalnya saja saat pembacaan sensor orientasi compass yang dasarnya memiliki nilai 360 derajat. Ketika variabel pembacaan sensor tersebut dikirim secara utuh dengan tipe data integer  maka nilai yang dikirim adalah nilai desimal yang hanya bernilai 0 sampai 255. Selebihnya hanya akan dianggap 255. Hal tersebut tentunya akan sangat merugikan mengingat 105 data menjadi  hilang. Untuk mengatasi hal tersebut maka perlu penguiraian data menjadi string atau karakter kemudian dikirim per karakter melalui komunikasi serial. Jadi semisal data yang dikirim adalah 360 maka data tersebut akan diurai menjadi karakter 3, 6 dan 0. Kemudian karakter karakter tersebut akan dikirim dan dikonversi menjadi nilai desimal. Sehingga dalam pengiriman akan terbaca 51, 54 dan  48 (cek tabel ASCII untuk lebih jelasnya). Oleh sebab itu maka di receiver atau kontroler penerima, data harus dikonversi kembali menjadi karakter  dan dikumpulkan lagi dengan header sebagai pemisah antar variabel jika ada lebih dari 2 variabel data yang dikirim lebih dari 1 paket data. Berikut potongan program penguraian data menjadi karakter yang dikirim lewat serial IOIO ke arduino.

@Override

publicvoid loop() throws ConnectionLostException,

InterruptedException {

try {

String stringZ = Integer.toString(z); // konversi integer ke string

String stringY = Integer.toString(y); // konversi integer ke string

int panjangZ = stringZ.length();// panjang karakter Z

int panjangY = stringY.length();// panjang karakter Y

byte[] arrayZ = newbyte[panjangZ];//variable array untuk karakter Z

byte[] arrayY = newbyte[panjangY];// variable array untuk karakter Y

arrayZ = stringZ.getBytes();// mengambil data karakter Z dan memasukan ke array

arrayY = stringY.getBytes();// mengambil data karakter Y dan memasukan ke array

boolean value = input1.read();//baca input digital

if (value == true) {

out1.write(‘z’); //sebgai header data Z, nilai desimalnya adalah 122

for (int i = 0; i < 1; i++) {//perulangan untuk 1 kali pengiriman

out1.write(arrayZ);//pengiriman data Z yang telah diurai

}

out1.write(‘y’);//sebgai header data y, nilai desimalnya adalah 121

for (int i = 0; i < 1; i++) {//perulangan untuk 1 kali pengiriman

out1.write(arrayY);//pengiriman data Y yang telah diurai

}

led_.write(false);//led penanda serial aktif.

                                         thread.sleep(100);

}

if (value == false) {

// out1.write(‘a’);

led_.write(true);//led penanda serial tidak aktif.

                                         thread.sleep(100);

}

// out1.write(‘y’);

// out1.write(y);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

};

}

Berikut adalah hasil setelah diuraikan.

Continue reading

Data Error Pada Komunikasi Serial Antara IOIO-Arduino

Komunikasi serial merupakan komunikasi yang dikirim per paket data. Komunikasi serial merupakan  sebuah alternatif komunikasi antar mikrokontroler selain komunikasi digital. Salah satu keunggulan komunikasai serial dibandingkan komunikasi digital adalah komunikasi serial hanya membutuhkan pin tx/rx untuk mengirimkan paket data umumnya 8bit untuk kebanyakan mikrontroler). Lebih sedikit dibandingkan menggunakan komunikasi digital yang membutuhkan 8 pin digital untuk mengirim 8bit data. Akan tetapi dalam komunikasi serial yang pengirimnanya dilakukan secara bit per bit seringkali terjadi data error atau hilangnya data pada pengiriman paket. Hal tersebut tentunya akan sangat mengganggu aktifitas komunikasi antar 2 perangkat mikrokontroler. Contoh terjadinya data error yang pernah dijumpai adalah saat pengiriman data variabel sensor android melalui komunikasi serial IOIO ke arduino. Saat komunikasi serial digunakan untuk mengirim 1 data variabel, data error tidak begitu terlihat. Akan tetapi saat digunakan untuk mengirim multi variabel sekaligus maka pada waktu tertentu akan terjadi data error berupa hilangnya data atau data yang terlewati. Contohnya tampak pada serial monitor mada arduino berikut.

  1. Hasil saat awal pembacaan data

Terlihat bahwa 4 data yang dikirim masih sesuai dengan yang diterima.

 

  1. Hasil pembacaan data setelah beberapa waktu

Continue reading

Pengiriman Data Sensor Android ke Arduino Melalui Serial IOIO

Pengiriman data variabel yang bersifat stream  dalam pemprograman java ternyata tidak semudah pengiriman data pada bahasa C. Pada bahasa java pengiriman data variabel tersebut biasanya harus dilewatkan melalui broadcast receiver. Contoh kasus pengiriman data yang perlu dilakukan melalui broadcast receiver adalah pengiriman data event perubahan pembacaan sensor pada android. Dalam hal ini percobaan yang dilakukan adalah pengiriman data sensor orientasi android ke arduino melalui komunikasi serial pada IOIO. Pada awalnya pengiriman data event sensor orientasi dilakukan tanpa menggunakan broadcast receiver yaitu seperti pada bahasa C dengan cara memanggil kelas utama atau kelas pembacaan sensor ke kelas pengiriman data arduino, ternyata cara tersebut tidak berhasil sehingga pembacaan sensor android tidak terbaca pada serial monitor di arduino. Percobaan selanjutnya kemudian dilakukan menggunakan fungsi broadcast receiver yaitu dengan menambah kelas yang ke 3 yang berisi fungsi broadcast receiver. Sedangkan untuk pembangkitan kelas pengirim data ke arduino dan kelas broadcast receiver dilakukan menggunakan method intent.

Berikut potongan program untuk pengiriman data  melalui broadcast receiver

1. Kelas utama (main.class)

@Override

publicvoid onSensorChanged(SensorEvent event) {

// TODO Auto-generated method stub

log.d(“HASIL”, String.valueOf(event.values[0]));

intent = new Intent();

intent.setAction(“com.tutorialspoint.CUSTOM_INTENT”);//set aksi yang akan dilakukan

intent.putExtra(“Z”, event.values[0]);//memasukan data pembacaan sensor orientasi ke intent

intent.putExtra(“Y”, event.values[2]);//memasukan data pembacaan sensor orientasi ke intent

sendBroadcast(intent);//pengiriman broadcast data pada intent

sumbuZview.setText(“Sumbu Z: ” + Float.toString(event.values[0]) +

” Derajat”);//menampilkan pembacaan sensor orientasi pada layar handphone

sumbuYview.setText(“Sumbu Y: ” + Float.toString(event.values[2]) +

” Derajat”);//menampilkan pembacaan sensor orientasi pada layar handphone

}

 

Continue reading

Pengiriman Data Melalui Pin Serial dari IOIO ke Arduino

IMAG0118Sebagai orang yang sedang belajar java programing untuk android, kali ini penulis akan berbagi sedikit percobaan sederhana yang telah penulis lalukan. Percobaan tersebut adalah komunikasi serial antara sistem android melalui IOIO ke arduino mega, yaitu berupa pengiriman data dari android yang dikirimkan ke arduino kemudian menampilkannya ke serial monitor pada software arduino.
Berikut wujud dari IOIO dan Arduino mega yang digunakan.

Continue reading