arduino pcArduino umumnya menggunakan komunikasi serial RS232 yang memanfaatkan rangkaian tambahan dengan komponen utama berupa IC MAX232, FT232, PL2303 maupun ATMega8U2 dan ATMega16U2 (pada arduino seri terbaru) untuk dapat terkoneksi dengan PC. Dengan komunikasi serial ini, kita dapat meng-upload program yang telah kita buat sebelumnya menggunakan arduino IDE ke board arduino. Selain itu, kita juga dapat mengkoneksikan arduino dengan PC sesuai dengan keinginan kita agar dapat saling berkomunikasi/bertukar data.

Saat board arduino terkoneksi dengan PC/laptop pertama kali, maka akan muncul permintaan untuk menginstal driver. Driver inilah yang menghubungkan arduino dengan COMPort yang ada pada PC/laptop. Berikut ini merupakan cara penginstalan driver tersebut.

 

Setelah berhasil melakukan penginstalan driver, maka secara otomatis arduino akan terdaftar pada salah satu COMPort pada PC. Kita dapat melihat COM yang digunakan dengan cara membuka device manager PC. Berikut ini merupakan COM yang digunakan oleh arduino pada PC saya.

manage

device manager

Cara diatas adalah cara manual untuk dapat mengetahui COM yang digunakan oleh arduino yang kita koneksikan ke PC. Nah, bagaimana kalau kita ingin mengetahui tanpa melihat device manager???

Pertanyaan tersebut saya dapat dari teman saya. Yang terfikirkan oleh saya, tidak ada identitas khusus pada COMPort yang digunakan oleh arduino. Hal tersebut dikarenakan arduino menggunakan Port serial PC, kecuali jika arduino menggunakan USB HID, akan lain ceritanya  🙂 .

Kemudian saya mencoba untuk sedikit berfikir kembali, jika kita ingin mendeteksi COM yang digunakan oleh arduino dari sebuah program/aplikasi, kita harus membuat sebuah program tambahan berupa persetujuan koneksi atau lebih dikenal dengan handshaking baik pada arduino maupun pada aplikasi PC. Itu cara ribet saya, karena saya belum mengetahui cara lain yang lebih sederhana jika ingin mengetahui COM arduino dari sebuah aplikasi.

Akhirnya mulailah perburuan kata demi kata, baris demi baris program untuk sisi hardware (arduino) dan akhirnya didapatkan program yang lumayan panjang seperti berikut ini :

String dtIn = "";
String dataInPC = "#777*\r";
String dataOutPC = "#OK*\r\n";
int i;
boolean keluar = false;

void setup() {
  Serial.begin(9600);
  dtIn="";
  i=0;
  Serial.println("Mulai bro...!!!");

  tungguPC();
}

void loop() {
  Serial.print(i++);
  Serial.println(" OK bro, bisa dimulai...!!!");
  delay(1000);
}

void tungguPC(){
  keluar=false;
  while(!keluar){
    if(Serial.available()>0){
      char inChar = (char)Serial.read();

      if(inChar=='\n'){
        if(dtIn==dataInPC){
          keluar=true;
          //Serial.print(dtIn);
          Serial.print(dataOutPC);
          delay(2000);
        }
        dtIn="";
      }
      else{
        dtIn += inChar;
      }
    }
  }
}

Inti dari program diatas sebenarnya hanya untuk menunggu data yang berasal dari aplikasi pada PC. Pada fungsi setup() terdapat sebaris program yang digunakan untuk memanggil fungsi tungguPC(). Pada fungsi tungguPC() inilah proses handshaking terjadi. Arduino akan selalu mengecek tiap data yang masuk melalui port serial. Data masuk tersebut kemudian ditampung terlebih dahulu pada variabel dtIn samapi arduino menerima data ‘\n’. Setelah itu variabel dtIn akan dibandingkan dengan data pada variabel dataInPC, yang mana variabel tersebut merupakan kunci/paket data yang harus dikirimkan aplikasi untuk mengecek apakah itu arduino yang dituju atau bukan. Selama arduino tidak mendapatkan paket data yang sama dengan variabel dataInPC, maka arduino akan terus menunggu paket data tersebut. Jika paket data yang diterima sesuai, maka arduino akan mengirimkan paket data berupa variabel dataOutPC. Selain itu proses pada fungsi tungguPC() akan berakhir, dan arduino pun akan mengeksekusi program yang ada pada fungsi loop().

Untuk membuat aplikasi, saya menggunakan Visual Studio 2010 dengan C# sebagai bahasa pemrogramannya. Berikut ini merupakan design tampilan aplikasi yang saya buat.

desain tampilan

Berikut ini adalah program pada aplikasi

using System.IO.Ports;
using System.IO;

program diatas merupakan program penambahan library yang digunakan.

Variabel global yang digunakan pada aplikasi :

        string[] SerialPortNames;

        string dataOut = "#777*\r";
        string dataIn = "#OK*\r";

 

        private void Form1_Load(object sender, EventArgs e)
        {
            cariPort();
        }

Program diatas merupakan program yang akan dieksekusi saat aplikasi pertama kali dijalankan. Program akan memanggil fungsi cariPort().

        void cariPort()
        {
            SerialPortNames = System.IO.Ports.SerialPort.GetPortNames();

            comboBox1.DataSource = SerialPortNames;

            if (SerialPortNames.Length > 0)
            {
                lblStatus.Text = "Serial Port Detected";
                button3.Enabled = true;
            }
            else
            {
                lblStatus.Text = "Serial Port Not Detected!!!";
                button3.Enabled = false;
            }
        }

Fungsi cariPort() digunakan untuk mencari port serial yang sedang aktif pada PC/laptop. Port-port tersebut nantinya akan dimasukkan kedalam sebuah comboBox. Selain itu, akan ditampilkan pula status ketersediaan port serial yang aktif pada sebuah label lblStatus.

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            cariPort();
        }

Program diatas akan dieksekusi saat btnRefresh ditekan. Program yang akan dieksekusi adalah fungsi cariPort(). Yang mana port akan didata ulang kembali.

        private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            txtDtIn.Invoke(new EventHandler(delegate
            {
                txtDtIn.Text = serial.ReadLine();
            }));
        }

Program diatas akan dieksekusi saat ada data masuk melalui port serial. Fungsi ini memanfaatkan event serial_DataReceived. Setiap data serial yang masuk akan ditampilkan pada sebuah textBox yaitu txtDtIn.

        private void button3_Click(object sender, EventArgs e)
        {
            txtDtIn.Text = "";
            serial.PortName = comboBox1.SelectedItem.ToString();

            try
            {
                serial.Open();
                System.Threading.Thread.Sleep(1000);

                serial.WriteLine(dataOut);

                timer2.Start();
            }
            catch { }
        }

Program diatas akan dieksekusi saat button3 ditekan. Pada saat button3 ditekan, maka txtDtIn akan dikosongkan. Kemudian properties portName pada tool serial akan diset sesuai dengan item yang telah dipilih pada comboBox1. Setelah itu port serial dibuka dan paket data untuk hadshaking pun dikirimkan yang kemudian timer2 akan dijalankan.

        private void timer2_Tick(object sender, EventArgs e)
        {
            timer2.Stop();
            if (txtDtIn.Text == dataIn)
            {
                MessageBox.Show("ok bro, arduinonya ada di port : " + comboBox1.SelectedItem.ToString());
                lblStatus.Text = "COMPort untuk Arduino Ketemu";
            }
            else
            {
                lblStatus.Text = comboBox1.SelectedItem.ToString() + " bukan COMPort Arduino";
            }

            try
            {
                serial.DiscardInBuffer();
                serial.Close();
            }
            catch { }
        }

Program diatas akan dieksekusi jika timer2 telah aktif sesuai dengan interval yang telah diset sebelumnya. Interval timer2 adalah 2000. Saat timer2 aktif, maka fungsi timer2 ini di nonaktifkan. Terdapat sebuah pencabangan yang mana akan menyeleksi data yang ada pada txtDtIn. Jika data pada txtDtIn sama dengan data pada variabel dataIn, maka akan muncul messageBox berupa pemberitahuan COM yang digunakan oleh arduino dan proses handshaking pun terjadi. Jika tidak sama maka proses handshaking tidak dapat dilaksanakan. Setelah itu port serial akan ditutup kembali.

        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "Connect")
            {
                button1.Text = "Disconnect";
                serial.PortName = comboBox1.SelectedItem.ToString();

                try
                {
                    serial.Open();
                }
                catch
                {
                    MessageBox.Show("Port sedang digunakan");
                }
            }
            else
            {
                button1.Text = "Connect";
                try
                {
                    serial.Close();
                }
                catch {
                    MessageBox.Show("Port tidak bisa ditutup");
                }
            }
        }

Program diatas merupakan program yang akan dieksekusi setelah button1 ditekan. Program ini berfungsi untuk membuka port serial agar aplikasi dapat terkoneksi dengan arduino.

Berikut ini merupakan video saat pengetesan deteksi COMPort arduino menggunakan aplikasi.

 

Source code lengkapnya bisa didownload disini.

Semoga bermanfaat 🙂

Comments
  1. atlaslm.com says:

    I am extremely impressed with your writing skills as well as with
    the layout on your weblog. Is this a paid theme or did you customize it yourself?

    Either way keep up the excellent quality writing, it
    is rare to see a nice blog like this one these
    days.

  2. Ohio Movers says:

    Your style is so unique compared to other
    people I have read stuff from. Many thanks for posting when you have the opportunity, Guess I’ll just bookmark this site.

Terimakasih telah singgah di blog ini. Silahkan berikan komentar, saya membutuhkan kritik, saran serta masukan yang membangun guna perbaikan tulisan pada blog ini kedepannya.