Penggunaan Timer Untuk Polling Masukan Dari Port USB

Polling adalah cara mendeteksi perubahan kondisi masukan (input) yang dilakukan dengan cara membaca secara terus-menerus masukan. Secara pemrograman, polling bisa dilakukan dengan menggunakan perulangan yang akan berhenti jika kondisi masukan mengalami perubahan seperti yang dikehendaki (busy-wait) seperti contoh berikut ini.

motor_tutup_pintu = on;  //motor on ...
while (pintu == terbuka) //selama pintu terbuka.
{
   pintu = baca_sensor_pintu();
}
motor_tutup_pintu = off; //pintu tertutup, motor off.

Penggunaan polling seperti contoh di atas sah-sah saja dilakukan pada sistem single-process atau single-purpose dimana sistem tidak perlu melakukan tugas lain selama menunggu perubahan kondisi masukan.

Namun demikian, jika kecepatan proses cukup cepat, program bisa melakukan hal lain selain hanya membaca kondisi masukan, misalnya update tampilan seperti contoh berikut ini

while (1)
{
   if (Serial.available())
   {
      kar = baca_karakter();
      switch (kar)
      {
         case '1': ngapain_1();
         case '2': ngapain_2();
      }
   }
   update_tampilan();  //hal lain
}

Pada contoh kedua, program melakukan polling pada masukan port serial dan melakukan update tampilan pada perulangan yang sama. Hal ini sah-sah saja selama kecepatan proses masih cukup cepat dan tidak mengganggu kinerja sistem secara keseluruhan. Model polling secara pemrograman seperti contoh di atas disebut juga software-driven IO.

Polling Dengan Timer

Proses polling masukan juga bisa dilakukan dengan menggunakan timer. Cara ini masih masuk kategori software-driven IO, belum masuk kategori interrupt-driven IO. Pada sistem operasi multitasking saat ini, polling menggunakan timer adalah cara yang paling rasional (mudah) untuk tipe masukan dengan perubahan yang lambat seperti tombol, sensor proximity, limit-switch, sensor suhu/kelembaban dan lain-lain.

Dan sesuai judulnya, maka pada tulisan ini akan saya bagikan contoh penggunaan timer untuk polling membaca masukan dari port USB, tentunya menggunakan salah satu produk USBinov yakni USB-2R3IO. Bahasa pemrograman yang saya gunakan dalam hal ini adalah Bahasa C pada sistem operasi Windows.

USB-2R3IO

USB-2R3IO 300x225Adalah modul antarmuka USB dengan 2 buah relay sebagai output dan 3 buah GPIO yang masing-masing bisa difungsikan sebagai input atau output. Default GPIO adalah sebagai input.

USB-2R3IO membutuhkan catudaya DC 5V. Tegangan bisa dari catudaya eksternal seperti adaptor atau mengambil dari power-supply komputer.

Modul juga bisa mengambil catudaya langsung dari port USB (USB Powered) sehingga cukup praktis digunakan.

Cuplikan Program Timer

Berikut adalah cuplikan kode program timer dan event-handler timer yang aktif setiap kali timer mencapai batas nilai intervalnya.

USB Polling Timer

Pada program C di atas, Timer1 diset dengan interval 100ms yang berarti event timer akan muncul 10 kali dalam 1 detik. Atau dengan kata lain program akan membaca kondisi masukan pada USB-2R3IO sebanyak 10 kali dalam 1 detik.

Pengesetan dilakukan pada bagian event-handler untuk pesan WM_INITDIALOG dengan perintah:

Timer1 = SetTimer(hwndDlg, Timer1, 100, NULL);

Kita bisa mengeset timer dengan interval yang lebih cepat bilamana diperlukan. Dengan mengeset interval timer menjadi 10 misalnya, maka program akan membaca masukan sebanyak 100 kali dalam 1 detik.

Setiap kali interval timer terlampaui (muncul event timer), sistem operasi akan membangkitkan pesan WM_TIMER. Pada bagian event-handler inilah program melakukan pembacaan masukan dan kemudian melakukan update tampilan. Program akan mengeset teks komponen edit dengan nilai “OPEN” jika kondisi masukan tidak aktif atau nilai “CLOSE” jika kondisi masukan aktif.

case WM_TIMER:
  if (POLLING==TRUE) {
    nBytes = usb_control_msg(handle, USB_TYPE_VENDOR |
      USB_RECIP_DEVICE | USB_ENDPOINT_IN, USB2RIO_INPUT, 0,
      0, (char *)buffer, sizeof(buffer), 5000);
  if (nBytes<0) MessageBox(hwndDlg, usb_strerror(),
      "Error!", MB_ICONINFORMATION);
    else {
      if (buffer[0]=='L')
        SetDlgItemText(hwndDlg, ID_EDIT_IO1, "CLOSE");
      else if (buffer[0]=='H')
        SetDlgItemText(hwndDlg, ID_EDIT_IO1, "OPEN");
      if (buffer[1]=='L')
        SetDlgItemText(hwndDlg, ID_EDIT_IO2, "CLOSE");
      else if (buffer[1]=='H')
        SetDlgItemText(hwndDlg, ID_EDIT_IO2, "OPEN");
      if (buffer[2]=='L')
        SetDlgItemText(hwndDlg, ID_EDIT_IO3, "CLOSE");
      else if (buffer[2]=='H')
        SetDlgItemText(hwndDlg, ID_EDIT_IO3, "OPEN");
    }
  }
  return TRUE;

Perlu diperhatikan juga bahwa pembacaan dan update tampilan akan dieksekusi hanya bila nilai variabel POLLING bernilai TRUE. Hal ini saya lakukan untuk memberikan contoh bahwa pembacaan masukan dapat dilakukan secara manual menggunakan klik pada tombol atau secara otomatis menggunakan timer.

Berikut adalah tampilan programnya.

USB-2R3IO Bahasa C GUI

Aplikasi

Modul USB-2R3IO telah diaplikasikan oleh beberapa user pada sistem parkir otomatis. Dengan modul ini, program pada komputer membaca masukan berupa penekanan tombol tiket. Ketika terdeteksi adanya penekanan tombol, maka program akan melakukan pencetakan tiket parkir dan kemudian membuka portal dengan mengirimkan sinyal pada panel portal melalui relay USB-2R3IO.

Download Program USB-2R3IO

Anda bisa mendapatkan kode program USB-2R3IO ini dengan cara menuliskan komentar pada tulisan ini beserta nama dan alamat email. Saya akan kirimkan alamat URL untuk mengunduh file proyek USB-2R3IO langsung ke email Anda.

Sampai berjumpa pada tulisan selanjutnya dan salam inovatif.

Advertisements
About

Kami berfokus pada perancangan dan pembuatan piranti USB untuk keperluan kontrol dan penginderaan berbasis PC atau SBC untuk platform Windows, Linux dan Raspberry Pi.

Tagged with: , , ,
Posted in Programming, USB-2R3IO

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: