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).
Daftar Isi
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