Lampu Kedip Dengan Model Finite State Machine dan Interupsi Timer

Lampu Kedip Dengan Model Finite State Machine dan Interupsi Timer

Artikel ini adalah pengembangan dari artikel “Lampu Kedip Dengan Model Finite State Machine“. Pada artikel tersebut pewaktuan 1 detik menggunakan fungsi delay() dari Arduino. Pada artikel ini digunakan Timer 1 untuk mendapatkan perioda 1 detik untuk eksekusi Finite State Machine (FSM).

Spesifikasi

Sistem yang dibuat adalah lampu kedip, dengan perioda 2 detik.

Perangkat Keras

Perangkat lunak dengan Arduino Nano ATmega328. Output dengan LED yang diseri dengan resistor pembatas arus. Nilai resistor tidak kritis. Pada percobaan ini dipakai nilai resistor 1000 ohm. LED disambung ke port D3 pada Arduino Nano.

Model Sistem

Model FSM untuk lampu kedip adalah sebagai berikut.

Perangkat Lunak

Pada sistem ini diperlukan pewaktuan (timing) agar lampu berkedip dengan frekuensi 0,5 Hz. Untuk itu diperlukan FSM yang dihitung/dipanggil setiap 1 detik. Untuk membuat pemanggilan periodik seperti ini dapat dilakukan dengan beberapa cara sebagai berikut:

  • delay pada Arduino atau library lain
  • interupsi timer
  • delay pada Real Time Operating System misal FreeRTOS

Pada implementasi ini yang dibuat adalah menggunakan interupsi Timer 1 pada Arduino.

Model diagram alir (flowchart) perangkat lunak adalah sebagai berikut.

 

Inisialisasi di fungsi setup() hanya dipanggil sekali.

loop() dapat dikosongkan , karena tidak melakukan apa-apa di situ.

Interupsi Timer 1 dipanggil setiap detik oleh periferal Timer 1 pada Arduino.

Untuk mengaktifkan Timer 1 pada aplikasi ini dipakai modul TimerOne (https://www.arduino.cc/reference/en/libraries/timerone/).

Modul ini dapat diinstall secara manual, ataupun dari Library Manager di Arduino.

Untuk instalasi manual, unzip isi library ke direktori Arduino/hardware/libraries/Timer1/ 

Untuk instalasi dengan library manager, cari library timerone dari Sketch -> Include Library -> Manage Libraries

Source code dapat dilihat di https://github.com/waskita/embedded/tree/master/kedip/nano-fsm-timer1

Penjelasan isi source code sebagai berikut.

Bagian Awal

#include <TimerOne.h>
#define ON    100
#define OFF   101
#define LED_OUTPUT 3
int state = OFF;

Implementasi Inisialisasi

void setup() {
  int output = 0;
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(LED_OUTPUT, OUTPUT);
  Serial.begin(115200);
  fsm_init(&state,&output);
  fsm_output(output);
  Timer1.initialize(1000000); // delay dalam microsecond
  Timer1.attachInterrupt(ISR_Timer1);
}

Implementasi FSM Init

Implementasi ini serupa dengan di artikel “Lampu Kedip Dengan Model Finite State Machine

void fsm_init(int *state, int *out) {
  *state = OFF;
  *out = 0;
}

Implementasi FSM

Implementasi ini serupa dengan di artikel “Lampu Kedip Dengan Model Finite State Machine

void fsm(int  *state, int *out) {
  switch (*state) {
    case ON: {
        *state = OFF;
        *out = 0;
        break;
      }
    case OFF: {
        *state = ON;
        *out = 1; // nyalakan output
        break;
      }
  }
}

Implementasi Output FSM

Implementasi ini serupa dengan di artikel “Lampu Kedip Dengan Model Finite State Machine

void fsm_output(int output_value) {
  if (output_value == 1) {
    digitalWrite(LED_OUTPUT, HIGH);
  } else {
    digitalWrite(LED_OUTPUT, LOW);
  }
}

Implementasi Interrupt Service Routine (ISR)

Fungsi ini dipanggil setiap kali terjadi interupsi timer 1. Setiap kali ada interupsi, dilakukan hal berikut:

  • menghitung transisi state
  • mengirim output ke port digital I/O pada Arduino
  • mengirim status ke port serial. status ini dipakai untuk debugging / monitoring. Jika dipakai pada sistem sesungguhnya (production), bagian monitoring ini tidak wajib ada.
void ISR_Timer1(void)
{
  int output = 0;
  fsm(&state, &output);
  fsm_output(output);
  Serial.print("state: ");
  Serial.print(state);
  Serial.print(" output: ");
  Serial.print( output);
  Serial.println();
}

Pengujian

Pengujian dilakukan dengan menjalankan program, kemudian mengamati kedipan lampu dan output ke port serial.

Pada output serial akan muncul tampilan seperti berikut ini:

14:40:39.834 -> state: 100 output: 1
14:40:40.812 -> state: 101 output: 0
14:40:41.838 -> state: 100 output: 1
14:40:42.813 -> state: 101 output: 0
14:40:43.834 -> state: 100 output: 1
14:40:44.808 -> state: 101 output: 0
14:40:45.836 -> state: 100 output: 1
14:40:46.813 -> state: 101 output: 0
14:40:47.844 -> state: 100 output: 1
14:40:48.815 -> state: 101 output: 0
14:40:49.835 -> state: 100 output: 1
14:40:50.812 -> state: 101 output: 0

Pada serial monitor Arduino kita dapat mengaktifkan timestamp, sehingga kita dapat mengecek apakah pewaktuan pada sistem ini sudah sesuai dengan yang spesifikasi.

Video

under construction

One thought on “Lampu Kedip Dengan Model Finite State Machine dan Interupsi Timer

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.