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 :)













1 comment : Leave Your Comments