Me 18211042

ng-ARDUINO yang asik di kuliah IMKA



Postingan kali ini saya akan membahas tugas akhir dari mata kuliah Interaksi Manusia dengan Komputer dan Antarmuka. Yah, memang tiba-tiba saja sudah tugas akhir. Semoga ini bukan tulisan terakhir karena ARDUINO benar-benar asik banget buat di-oprek. Palingan kendalanya adalah di budget buat beli alat-alat buat ngoprek.

Interfacing

Jadi pada tugas akhir kali ini, proyek dibuat harus melibatkan interfacing antara ARDUINO dengan sesuatu. Nah, sesuatunya itu apa? bisa bermacam-macam. Kelompok lain ada yang menggunakan interfacing antara 2 ARDUINO, memakai komunikasi Radio, GSM Shield, dll. Tetapi dari awal kelompok sudah menentukan akan membuat interface antara ARDUINO dan ANDROID sehingga bisa disingkat menjadi ARDUDROID.

ARDUINO - ANDROID

Bagaimana mengkomunikasikan ARDUINO dan ANDROID? Setelah googling akhirnya didapat cara yang paling efektif adalah menggunakan perangkat Bluetooth. Pada komunikasi ini, dipasang perangkat Bluetooth di rancangan alat kami dan nantinya smartphone kita tinggal membuat koneksi ke Bluetooth tadi. Setelah itu dari smartphone kita  bisa mengirimkan perintah berupa teks yang selanjutnya dikirimkan melalui Bluetooth dan bisa kami proses untuk menjadi masukan bagi ARDUINO.



Bluetooth Module HC-05

Perangkat Bluetooth yang kami gunakan adalah Bluetooth Module HC-05. Perangkat kami beli di Jaya Plaza dengan harga Rp. 135.000,-. Menurut hasil googling HC-05 ini merupakan seri yang paling mudah digunakan dan fiturnya sudah cukup mumpuni. Perangkat Bluetooth ini menggunakan voltase 3,3V dan serial port TX dan RX untuk berkomunikasi dengan ARDUINO. Jadi, pesan yang diterima oleh perangkat Bluetooth ini nantinya akan dikirimkan ke ARDUINO secara serial sehingga cara pembacaannya melalui Serial Monitor untuk menangkap pesan yang diterima oleh perangkat Bluetooth.



Wake! - Alarm yang bisa dikontrol oleh banyak orang

Dengan terhubugnya ARDUINO dan ANDROID maka kita bisa melakukan apa saja hanya melalui smartphone kita. Karena terlalu luasnya kemampuan ini, kami sempat bingung mau bikin apa. Akhirnya kami memutuskan akan menggabungkan ilmu tentang LCD, Lampu LED, dan suara menjadi satu sehingga terciptalah Wake!. Sebuah alarm yang bisa dikontrol oleh banyak orang.


Sering banget kan mahasiswa bangun telat? Nah, salah satu sebabnya karena alarm mereka bisa dimatikan sesuka hati mereka. Jadi alarm Wake! ini tidak punya tombol untuk snooze mauapun dismiss, jadi alarm ini nggak bisa dimatiin sesuka hati, sekali lagunya dimainkan maka akan terus berjalan sampai habis. Selain itu fitur unggulan lainnya adalah alarm ini bisa dikendalikan oleh banyak orang. Dengan memakai konsep interfacing yang dijelaskan sebelumnya, alarm ini bisa dikendalikan melalui Bluetooth. Jadi, tinggal bagi-bagi password Bluetooth-nya ke orang-orang yang rajin bangun pagi buat ngebangunin kita. Ditambah lagi orang tersebut bisa mengirimkan pesan yang nantinya akan ditampilkan di layar LCD.

Berikut adalah rangkaian dari Wake!



Berikut adalah kode untuk Wake! Sedangkan untuk aplikasi android kami menggunakan Ardudroid.



/*
 PROJECT: ArduDroid 
 PROGRAMMER: Hazim Bitar (techbitar at gmail dot com)
 DATE: Oct 31, 2013
 FILE: ardudroid.ino
 LICENSE: Public domain
 
 diedit pada tanggal : 24-03-2014 / 28-04-2014
*/

#include LiquidCrystal.h;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define START_CMD_CHAR '*'
#define END_CMD_CHAR '#'
#define DIV_CMD_CHAR '|'
#define CMD_DIGITALWRITE 10
#define CMD_ANALOGWRITE 11
#define CMD_TEXT 12
#define CMD_READ_ARDUDROID 13
#define MAX_COMMAND 20  // max command number code. used for error checking.
#define MIN_COMMAND 10  // minimum command number code. used for error checking. 
#define IN_STRING_LENGHT 40
#define MAX_ANALOGWRITE 255
#define PIN_HIGH 3
#define PIN_LOW 2

String inText;
const int speakerPin = 8; // mengkoneksikan PIN speker pada PIN 8
char noteNames[] = {'C','D','E','F','G','a','b'};
unsigned int frequencies[] = {262,294,330,349,392,440,494};
const byte noteCount = sizeof(noteNames); // nomor ukuran note (7 here)
//notes, a space represents a rest
char score[] = "CCGGaaGFFEEDDC GGFFEEDGGFFEED CCGGaaGFFEEDDC"; 
const byte scoreLen = sizeof(score); //jumlah note yang ada pada score
boolean isPlay=false;
byte beats[scoreLen] = {1,1,1,1,1,1,2, 1,1,1,1,1,1,2,1,
1,1,1,1,1,1,2, 1,1,1,1,1,1,2,1,
1,1,1,1,1,1,2, 1,1,1,1,1,1,2};
byte beat = 180; // bits per menit
unsigned int speed = 30000 / beat; // waktu yang digunakan untuk melakukan sekali beats


void setup() {
  Serial.begin(9600);
  Serial.println("ArduDroid 0.12 Alpha by TechBitar (2013)");
  Serial.flush();
  lcd.begin(16, 2);
  lcd.print("Hello");
  pinMode(speakerPin, OUTPUT);
}

void loop()
{
  Serial.flush();
  int ard_command = 0;
  int pin_num = 0;
  int pin_value = 0;
  char get_char = ' ';  //membaca nilai serial 
  
  if(isPlay){
    loopsong();
    isPlay=false;
  }

  //Menunggu data masukan 
  if (Serial.available() < 1) return; // if serial empty, return to loop().

  // melakukan pemilihan data masukan 
  get_char = Serial.read();
  if (get_char != START_CMD_CHAR) return; // if no command start flag, return to loop().

  // memilih tipe data masukan 
  ard_command = Serial.parseInt(); // read the command
  
  // parse incoming pin# and value  
  pin_num = Serial.parseInt(); // read the pin
  pin_value = Serial.parseInt();  // read the value

  // 1) Mendapatkan perintah berupa text
  if (ard_command == CMD_TEXT){   
    inText =""; //clears variable for new input   
    while (Serial.available())  {
      char c = Serial.read();  //Membaca satu byte dari serial 
      delay(5);
      if (c == END_CMD_CHAR) { // Mengakhiri pembacaan 
        
        lcd.clear(); //menghapus seluruh tulisan pada LCD
        lcd.setCursor(0,0); // meletakkan cursor pada koordinat 0,0
        lcd.print(inText); // mencetak text masukan 
        break;
      }              
      else {
        if (c !=  DIV_CMD_CHAR) {
          inText += c; 
          delay(5);
        }
      }
    }
  }

  // 2) Membaca masukan data digital 
  if (ard_command == CMD_DIGITALWRITE){  
    if (pin_value == PIN_LOW) pin_value = LOW;
    else if (pin_value == PIN_HIGH) pin_value = HIGH;
    else return;
    return;  // Kembali ke loop utama jika tidak ada masukan data
  }

  // 3) Membaca masukan data analog
  if (ard_command == CMD_ANALOGWRITE) {  
    analogWrite(  pin_num, pin_value ); 
 
    return; 
  }

  // 4)Mengirim data ke ardudroid
  if (ard_command == CMD_READ_ARDUDROID) { 
   
    Serial.print(" Analog 0 = "); 
    Serial.println(analogRead(A0));  // contoh : mengirimkan data pembacaan pin analog 0
    return;  // kembali ke loop utama 
  }
}

// 2a) mengubah nilai pin digital
void set_digitalwrite(int pin_num, int pin_value)
{
  switch (pin_num) {
  case 13:
    pinMode(13, OUTPUT);
    digitalWrite(13, pin_value);  
         
    break;
  case 12:
    pinMode(12, OUTPUT);
    digitalWrite(12, pin_value); 
    break;
  case 11:
    pinMode(11, OUTPUT);
    digitalWrite(11, pin_value);   
    break;
  case 10:
    pinMode(10, OUTPUT);
    digitalWrite(10, pin_value);    
    break;
  case 9:
    pinMode(9, OUTPUT);
    digitalWrite(9, pin_value);     
    break;
    isPlay=false; // untuk mengubah state memainkan lagu 
  case 8:
    pinMode(8, OUTPUT);
    digitalWrite(8, pin_value);
    isPlay=true;    
    break;
  case 7:
    pinMode(7, OUTPUT);
    digitalWrite(7, pin_value);       
    break;
  case 6:
    pinMode(6, OUTPUT);
    digitalWrite(6, pin_value);        
    break;
  case 5:
    pinMode(5, OUTPUT);
    digitalWrite(5, pin_value); 
    break;
  case 4:
    pinMode(4, OUTPUT);
    digitalWrite(4, pin_value);        
    break;
  case 3:
    pinMode(3, OUTPUT);
    digitalWrite(3, pin_value);        
    break;
  case 2:
    pinMode(2, OUTPUT);
    digitalWrite(2, pin_value); 

    break;      
  } 
  
}
//fungsi untuk memainkan note yang didefinisikan 
void playNote(char note, int duration)

{
// mencocokkan nama note dan memainnkannya jika terdefinisi 
for (int i = 0; i < noteCount; i++)
{
if (noteNames[i] == note) 
tone(speakerPin, frequencies[i], duration); 
}
// 
delay(duration);
}

//fungsi untuk melakukan perulangan musik yang dimainkan
void loopsong(){

for (int i = 0; i < scoreLen; i++)
{
int duration = beats[i] * speed; // menggunkan perbandingan beats yang telah didefinisikan
playNote(score[i], duration); // memainkan note
}
delay(4000); // waktu yang ditentukan untuk menunggu perulangan 

}

Berikut adalah dokumentasinya :)














ritual setelah praktikum - foto selfie bareng kelompok lain

Praktikum kali ini lebih menarik dari praktikum sebelumnya. Jika pada praktikum sebelumnya sudah memakai display, sekarang dilanjutkan dengan penggunaan kontrol. Device yang digunakan untuk kontrol adalah matrix keypad 3x4. Jadi untuk praktikum kali ini kami diminta untuk implementasi ke ARDUINO menggunakan device kontrol tersebut, terserah bentuknya mau gimana.

Ide awal kelompok kami adalah membuat permainan, semacam Flappy Bird. Ternyata eh ternyata bakalan susah dan kompleks untuk nge-random rintangannya. Walhasil kami nggak jadi membuat permainan. Akhirnya kami memutuskan untuk membuat kalkulator. Banyak sebenarnya kode di internet untuk membuat kalkulator, tapi nggak menantang bro. Kami memutuskan untuk membuat sendiri kodenya. Yeah.

Rangkaian


Pertama kali, kami khawatir bakalan cukup atau tidak pin untuk input/output. Setelah dihitung-hitung ternyata cukup. Karena rangkaiannya bakal rumit kalau digambarkan, kami tidak sertakan gambarnya. Tapi pemasangannya sederhana banget. Lihat gambar di bawah ini untuk melihat keterangan bagian-bagian LCD dan Matrix keypad. Lalu lihat keterangan di bawahnya untuk lokasi pin-nya.


penamaan pin terurut dari atas (*) sampai bawah (#)



nama pin di sebelah kiri kabel
Berikut adalah daftar pasangan pin LCD dan Matrix keypad di atas dengan pin di ARDUINO :
  • row 0 = 0
  • row 1 = 13
  • row 2 = 12
  • row 3 = 11
  • col 0 = 10
  • col 1 = 9
  • col 2 = 8
  • Gnd dan R/W = ground
  • Vcc = 5V
  • V0 = pin tengah potentiometer
  • Rs = 7
  • E = 6
  • D4 = 5
  • D5 = 4
  • D6 = 3
  • D7 = 2
                 

hasil rangkaian

Kode program


// include library LCD dan Keypad
#include <keypad.h>
#include <liquidcrystal.h>

// Mendefinisikan LCD
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
const int inPin = 0;

// Mendefinisikan Keypad
const byte ROWS = 4; // 4 baris
const byte COLS = 3; // 3 kolom

// Definisi posisi kunci, sesuaikan dengan gambar
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

// Hubungkan dengan pin di ARDUINO
byte rowPins[ROWS] = { 0, 13, 12, 11 };
byte colPins[COLS] = { 10, 9, 8 };

// Membuat objek Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

// Definisi variabel-variabel
int var1 = 0;
int var2 = 0;

int no_operan = 0; // nomor operator
char operan=' '; // operator
char operans[4] = {'+', '-', '/', 'x'}; // isi operator

boolean is_var1 = true; // untuk menentukan apakah sedang dalam var1?

String var1_str; // penampung var1
String var2_str; // penampung var2

// inisiasi
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
}

// loop utama
void loop()
{
  char key = kpd.getKey(); // mendapatkan posisi key yang ditekan
  if(key)  // cek validasi
  {

    // jika pager maka hapus semuanya
    if(key == '#'){
      lcd.clear();
      var1_str="";
      var2_str="";
      operan=' ';
      var1=0;
      var2=0;
    }

    // jika angka yang ditekan
    if((key != '*')&&(key != '#')){
      if((is_var1)&&(operan == ' ')){ // variabel 1
        var1_str += key;
        lcd.print(key);
      }else{ // variabel 2
        is_var1=false;
        var2_str += key;
        lcd.print(key);
      }
    }

    // jika yang ditekan bintang, untuk menentukan operator
    if(is_var1){
      if((key == '*')&&(var1_str != "")){ // tekan pertama kali untuk ganti oprator
        lcd.setCursor(0, 1);
        operan=operans[no_operan];
        lcd.print(operans[no_operan]);
        no_operan++;
        if(no_operan>3){
          no_operan=0;
        }
      }
    }else{ // tekan kedua kali untuk hasil operasi
      if((key == '*')&&(var2_str != "")){
        var1 = var1_str.toInt();
        var2 = var2_str.toInt();
        if(operan == '+'){
          var1 = var1+var2;
        }else if(operan == '-'){
          var1 = var1-var2;
        }else if(operan == '/'){
          var1 = var1/var2;
        }else if(operan == 'x'){
          var1 = var1*var2;
        }
        lcd.clear();
        var2_str="";
        operan=' ';
        lcd.setCursor(0,0);
        lcd.print(var1);
        is_var1=true;
      }
    }
    Serial.println(key);
  }


Hasil praktikum



pertama kali coba keypad dan ditampilkan ke LCD



kalkulator pertama kali, hitungan kedua ngaco


kalkulator kedua, sukses. walaupun cuma bisa sekali hitung

Terima kasih
Muhammad Fatoni / STI / 18211042


Praktikum kali ini sangat menarik sekaligus menguras kesabaran.

Latar Belakang

Jadi pada praktikum kali ini kami diminta untuk mengimplementasikan ARDUINO menggunakan display. Ada 2 pilihan yaitu bisa memakai 7-segment atau LCD. Tujuan parktikumnya adalah dengan mengukur suhu menggunakan sensor LM-35 pada praktikum sebelumnya dan menampilkan angkanya menggunakan salah satu display tersebut. Nah lho menarik kan.


Jalan Cerita

Pada semester 4, kami pernah mendapat mata kuliah Sistem Digital. Pada kuliah tersebut kami pernah membuat program menggunakan 7-segment sebagai display-nya. Belajar dari pengalaman yang ternyata ribet ketika memakai 7-segment, akhirnya kami memilih LCD display. Ditambah lagi setelah meilhat kdoenya, wow, simple banget.


Akhirnya kami membeli LCD display dan Potentiometer. Namun, salahnya, kami tidak sekalian membeli pin header untuk di-solder di LCD. Kami percaya bahwa kabel jumper-nya bisa dimasukkan ke lubang-lubang pada LCD. Malang bagi kami, gara-gara hal itu, kami berkutat dengan tampilan LCD yang tidak jelas selama kurang lebih 2 jam. Yeah.

Lanjut akhirnya salah satu dari kami membeli pin header tersebut ditambah solder seharga Rp. 10.000 (kata mang-mangnya, solder Cuma buat sekali pakai). Begitu teman kami sampai… dia tidak sekalian beli timahnya. Walhasil, kami minjem minta timah sekalian pinjem solder di HME.

Dan yah, sesuai yang di Web, dengan pin header tampilannya jadi jelas banget :



Hasilnya ga jelas banget, Haha

Berikut ini rangkaiannya-nya :





Berikut ini adalah kode-nya :
// import library LiquidCrystal buat menangani LCD
#include <LiquidCrystal.h>;

// Inisialisasi nomor pin
// yang digunakan LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Pin analog yang digunakan sensor LM-35
const int inPin = 0;

void setup()
{
    // Definisikan jumlah kolom dan baris di, ada 16 kolom dan 2 baris
    lcd.begin(16, 2);

    // Teks yang ditampilkan
    lcd.print("Suhunya segini :");
}

void loop()
{
    // Baca nilai tegangan dari sensor suhu LM3-5
    int value = analogRead(inPin);

    // konversikan data ke mV
    float millivolts = (value / 1024.0)*5000;

    // Jadiin tegangan tadi ke celcius
    float celcius = millivolts / 10;
    
    // Pindahkan kursor ke baris 2, kolom 0
    lcd.setCursor(0, 1);

    // Tuliskan ke LCD
    lcd.print(celcius); lcd.print(" C");
  
    delay(1000);
} 
Berikut adalah hasilnya setelah sekian lama :







Kalibrasi

Jadi setelah suhunya terukur, kami harus lakukan kalibrasi untuk menetukan galatnya. Kami memakai smartphone Samsung S4 dan aplikasi pengukur suhu. Hasilnya yah mirip-mirip dengan galat 0,4. Tapi kami tidak pernah tahu aplikasi itu galatnya berapa dengan dunia nyata.

Sekian Terima Kasih,
Muhammad Fatoni / STI / 18211042
Selamat datang kembali,

Tugas kali ini cukup menarik yaitu pertama kalinya menggunakan sensor. Jadi kami diminta mengimplementasikan sebuah kode yang menggunakan sebuah sensor, lebih tepatnya sensor suhu LM-35. Ada yang berbeda juga dalam tugas ini yaitu hasilnya tidak bisa dilihat langsung melalui board ARDUINO-nya maupun kelap-kelip lampu. Maka dari itu hasil dari eksekusi kode ini bisa dilihat di software ARDUINO.

Pada dasarnya sebuah sensor adalah sebuah alat masukan (input) bukan sebagai keluaran (output). Oleh karenanya pada praktikum kali ini kami hanya diminta untuk kinerja dari sensor ini apakah jalan atau tidak. Caranya adalah dengan meihatnya di layar Serial Monitor.

Berikut ini adalah gambar ragkaiannya :

Rangkaian

Implementasi


Berikut ini adalah kodenya :

Kode Program


Berikut ini adalah hasil di layar Serial Monitor. Layar ini bisa diakses melalui Tools > Serial Monitor.

Hasil Pengukuran

Terima Kasih
Muhammad Fatoni / STI 2011 / 18211042
Yap, welcome back.

Pada tugas kedua ARDUINO ini, kami diminta untuk mengimplementasikan 2 kode program. Kedua kode ini diambil dari buku Getting Started with ARDUINO. Jadi, setelah kami mengimplementasikan kedua kode program tersebut kami harus menganalisis, apa sebenarnya yang terjadi di dalam kode program tersebut. Oke, here we go!

Kode Program 1 – Fade an LED in and out like on a sleeping Apple computer

Dilihat dari judulnya sudah terlihat menarik yaitu kode program ini akan memperagakan efek fade in & fade out selayaknya sleeping Apple computer. Sebelum analisis kode programnya berikut ini adalah rangkaian dan hasil videonya :


Rangkaian untuk Kode Program 1





Kode Program 2 – Fade an LED in and out (Special Edition)


Kode kedua ini adalah versi spesial dari kode program yang pertama. Kenapa spesial? Sebenarnya tidak spesial banget, hanya ditambah 1 push button. Jadi, lampu LED akan menyala jika tombol ditekan dan akan tetap menyala setelah tombol dilepaskan. Namun, jika tombol tetap ditekan maka lampu LED akan mengalami efek fade in & fade out. Menarik? Berikut ini adalah rangkaian dan hasil videonya :

Rangkaian untuk Kode Program 2




Analisis Kode Program


Berikut ini adalah analisis dari kode program 1 :

Kode Program 1

Bagian
Penjelasan

Inisiasi Variabel
LED : untuk menyimpan nomor port untuk lampu LED

i : untuk dijadikan sebagai iterator di bagian looping

Inisasi Program
Menjadikan lampu LED sebagai output

Looping #1
Dalam looping ini, lampu LED akan berubah nilai brightness-nya dari mati sampai menyala. Nilai brightness-nya disimpan di iterator i yang bertambah dari 0 sampai 255. Kemudian nilai ini diimplementasikan ke lampu LED dengan delay 10 milisecond. Implementasinya menggunakan analogWrite agar perubahannya lebih halus, tidak putus-putus.

Looping #2
Dalam looping ini, lampu LED akan berubah nilai brightness-nya dari menyala sampai mati. Berlawanan dari Looping #1. Sehingga nantinya lampu LED akan fade in dan fade out bergantian.


Berikut ini adalah analisis dari kode program 2 :

Kode Program 2

Bagian
Penjelasan

Inisiasi Variabel
LED : untuk menyimpan nomor port lampu LED
BUTTON : untuk menyimpan nomor port push button
val : untuk menyimpan keadaan/state input
old_val : untuk menyimpan keadaan/state sebelumnya dari variabel val
state : untuk menyimpan keadaan/state lampu LED
brightness : untuk menyimpan nilai brightness lampu LED
startTime : untuk menyimpan waktu saat menekan tombol pertama kali

Inisiasi Program
Pada bagian ini didefinisikan lampu LED sebagai output dan push button sebagai input

Kondisional #1
Pada bagian ini dibaca state dari tombol.

Kondisional ini mensyaratkan :
- Tombol sedang ditekan
- Sebelumnya tombol tidak ditekan, jadi ini merupakan keadaan ketika tombol pertama kali ditekan

Jika syarat terpenuhi :
- Keadaan lampu LED di-toggle (jika menyala dimatikan, jika mati dinyalakan)
- Mulai menghitung jeda waktu mulai dari tombol ditekan
- Delay 10 milisecond

Kondisional #2
Kondisional ini mensyaratkan :
- Tombol sedang ditekan
- Sebelumnya tombol sedang ditekan, jadi ini merupakan keadaan ketika tombol tetap ditekan
- Jeda waktu mulai dari tombol ditekan lebih dari 500 milisecond

Jika syarat terpenuhi :
- Nilai brightness bertambah
Delay 10 milisecond
- Jika sudah menyala terang, maka lampu LED mati
Kondisional #3
Nilai old_val diisi dengan keadaan tombol saat itu, sehingga akan tercatat keadaan tombol sebelumnya yang akan dibawa ke loop selanjutnya

Jika keadaan lampu menyala, maka diatur nilai brightness lampu LED, jika tidak maka lampu LED akan dimatikan


Terima Kasih :)
Semoga membantu

Muhammad Fatoni / 18211042 / STI 2011