Saturday 27 December 2014

Arduino Yun + Android

Arduino Yun + Android
Oktober lalu saya mendapatkan kesempatan ikut sebuah kompetisi. Satu hal yang menarik, saya mendapat "mainan baru dari event tersebut: Arduino Yun. Saya tidak tahu mengapa Arduino Yun mahal (punyanya Uno sebelumnya soalnya haha), tapi yang saya tahu Yun sudah built-in dengan WiFi module.
Satu hal yang langsung terlintas di kepala saya: "Remote kontrol arduino dengan android via WiFi"

Kalau dulu saya pernah buat RC pake joystick bluetooth (yang sebenernya ga begitu paham detail juga prinsip kerja bluetoothnya), sekarang saya kepikiran mau buat via wifi, mumpung ada barangnya. Oleh karena itu, saya mencoba untuk mengoprek komunikasi android-arduino yun. Mungkin ini masih secuil kecil, tapi minimal ada pembelajaran di dalamnya.

Sekilas Arduino Yun

Arduino Yun in box
Arduino Yun memiliki dua buah prosesor, yang satu berbasis AVR yang satunya berbasis Linux. Akibat dua prosesor ini, katanya Yun punya kelebihan sebagai mini computer campur microcontroller.
Untuk lebih lengkapnya dapat dicek di:

Karena belum begitu kenal, saya coba baca lebih jauh guide yang ada di webnya arduino (http://arduino.cc/en/Guide/ArduinoYun)
Ada beberapa hal penting yang perlu diperhatikan dalam pemakaiannya (karena fiturnya)

Modul Wifi

Secara default, pertama kali Yun dinyalakan, Yun akan membuat WiFi Host bernama sesuai MAC Address milik Yun tersebut. Untuk dapat menggunakannya lebih jauh, cukup sambungkan komputer dengan WiFi tersebut. Lalu dengan web browser, dengan menyambungkan ke IP Arduino Yun atau ke http://arduino.local/ , maka akan terbuka halaman konfigurasi Arduino Yun tersebut. (Apabila Yun masih dalam status WiFi Host, IP Yun adalah 192.168.240.1). Dari page tersebut, dapat dilakukan pengaturan terhadap Yun, misalnya mengganti nama boardnya. Namun apabila diganti, maka akses ke http://arduino.local/ berubah menjadi http://namaarduino.local/. 

Yang menarik, programming dapat dilakukan secara wireless via wifi! Oiya inget Arduino IDE harus disesuaikan dulu versinya. I think it's a great feature.

Kedua, dengan REST Style, kita dapat memberi informasi via browser. Dengan mengkonfigurasi REST Password diset Off, kita bisa memberi perintah ke Yun lewat browser dengan URL:
- http:// namaarduino.local/arduino/digital/13/1 untuk menyalakan LED di pin 13.
- http:// namaarduino.local/arduino/digital/13/0 untuk mematikan LED di pin 13.
dan lainnya (dapat dilihat di Guide Arduino Yun).
Contoh perintah lewat web browser
Dari fitur ini, saya terpikirkan untuk mencoba memberi perintah bukan dari komputer, tetapi dari Android, karena seharusnya konsepnya hanya konsep HTTP.

Android Programming

Saya belum pernah sebelumnya mencoba programming untuk Android, oleh karena itu pada kesempatan ini saya mencoba mempelajarinya.
Bagi para pemula seperti saya, mungkin ada baiknya untuk mengikuti tutorial-tutorial agar dapat terbiasa dengan environment-nya. Yang paling menjanjikan bagi saya adalah dari web Developer Android sendiri: http://developer.android.com/training/index.html.
Hanya saja, sekarang tutorial yang diberikan full menggunakan program Android Studio, bukan Eclipse lagi (yah udah bikin program sendiri sih wajar aja)
Hati-hati kalau mau coba, mungkin size installernya kecil, tapi SDK yang dibutuhkan mungkin cukup besar. Jadi persiapkan terlebih dahulu dirimu.

HTTP Client

Yang penting dari program yang mau dibuat adalah HTTP Client, karena kita akan mengakses Arduino Yun kita via Network.
Salah satu referensi yang sangat membantu adalah:
http://developer.android.com/training/basics/network-ops/connecting.html
http://hmkcode.com/android-internet-connection-using-http-get-httpclient/

Saya mendapatkan gambaran umumnya dari link kedua, tapi entah mengapa saya gagal terus menggunakan cara pada link kedua, dan baru berhasil dengan metode pada link pertama. Perbedaan dari kedua link tersebut adalah yang pertama menggunakan HTTPURLConnection, dan yang kedua menggunakan Apache HTTPClient.

Mungkin saya akan sedikit menjelaskan beberapa hal yang dimodifikasi dari referensi tersebut.
Satu hal yang penting adalah menambahkan line berikut pada file manifest.xml anda.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Tambahan pada manifest.xml
Secara umum, untuk koneksi HTTP Client sudah dijelaskan pada referensi pertama. Berikutnya saya akan memodifikasi contoh tersebut untuk melakukan koneksi ke Arduino Yun.

Connect to Arduino Yun

Layout program yang saya buat adalah sebagai berikut.
Layout program
Komponen yang saya gunakan:
  • EditText untuk Set IP Yun target.
  • Button Set untuk mengeset IP sesuai EditText
  • TextView IP Yun saat ini
  • Button LED13On untuk menyalakan LED pada pin 13 secara digital
  • Button LED13Off untuk mematikan LED pada pin 13
  • SeekBar untuk menyalakan LED pada pin 13 secara analog
  • TextView untuk menunjukkan URL yang diakses
  • TextView untuk menunjukkan response dari HTTP Client

Saya merasa butuh untuk mengeset IP, karena akan memudahkan untuk bisa mengubah target IP apabila IP Yun berubah.

Dengan menggunakan variable urlText untuk EditText, maka perintah OnClick pada Button Set dapat diisi dengan pengisian variable ArduinoIP dan penulisan pada TextView seperti kode berikut.
    public void saveClickHandler (View view){
        ArduinoIP= urlText.getText().toString();
        yunIPtextView.setText("Arduino Yun IP: "+ArduinoIP);
    }
Setelah IP Yun diset, maka perintah lainnya dapat dilakukan, misalnya perinta OnClick pada LED13On seperti berikut.
    public void ledOn (View view){
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo!= null && networkInfo.isConnected())
            new DownloadWebpageTask().execute("http://"+ArduinoIP+"/arduino/digital/13/1");
        else
            textView.setText("No Network connection available");
        urlsentText.setText("http://"+ArduinoIP+"/arduino/digital/13/1");
    }
Untuk LED13Off dan Analog Output hanya tinggal memodifikasi kode LED13On sesuai kebutuhan.

Hasil dari program tersebut adalah seperti pada video berikut.


Untuk sampai saat ini baru sampai segitu saja. Mungkin berikutnya saya akan mencoba untuk memberikan perintah dalam bentuk string sehingga dapat lebih variatif.

Kalau misalkan butuh contoh:
MainActivity.java
activity_main.xml
full project

Terima kasih sudah mau mampir dan membaca sekedar postingan pada blog ini.
Selamat berkarya!
"Be childish to dream, be mature to realize it" - Tanduk Ion

11 comments:

  1. numpang komen ya we :D

    itu suasananya engineer abis begadang banget. suara serak-serak banjir lagi wkwkwk

    anw arduino yun berapaan? bisa jadi client atau host doang?

    *males buka guide di arduino ehehe

    ReplyDelete
    Replies
    1. Haha maklum hujan terus

      Lupa berapaan, search aja di sparkfun. Kayaknya 1.2an jt deh.
      Bisa jadi client, tapi harus disetting dulu dan kalau mau ganti network mesti setting lagi. Manual setting kalau mau jadi client. Diakses via arduino.local settingnya.

      Oiya satu hal yang masih bingung, kalau nyambungnya ke network buatan si android (tether), yun ga bisa diakses. Fitur HTTP Client buat client doang ya? *namanya aja client

      Delete
    2. This comment has been removed by the author.

      Delete

  2. Hai. apakah mungkin saya dapat mengendalikan yun saya bahkan tanpa menyetel alamat IP? Terima kasih

    ReplyDelete
    Replies
    1. well, the important thing is you can connect to the Yun. doesn't matter if you set it beforehand or just leave it as default

      Delete
    2. oh ok thank you. what if I want to add another led that I can also control.how will I make it work? Terima Kasih :)

      Delete
  3. Hi, the links to the source code are broken. Is it possible to get them?

    ReplyDelete
  4. can I have the source code please

    ReplyDelete
  5. in android please

    ReplyDelete