UDP Client di ESP32

Berikut ini contoh pembuatan aplikasi UDP client di ESP32 dengan compiler Arduino

#include <WiFi.h>
#include <WiFiUdp.h>

/* WiFi network name and password */
const char * ssid = "dd-wrt";
const char * pwd = "0000000000";

// IP address to send UDP data to.
// it can be ip address of the server or 
// a network broadcast address
// here is broadcast address
const char * udpAddress = "192.168.1.100";
const int udpPort = 44444;

//create UDP instance
WiFiUDP udp;

void setup(){
  Serial.begin(115200);
  
  //Connect to the WiFi network
   WiFi.begin(ssid, pwd);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop(){
  //data will be sent to server
  uint8_t buffer[50] = "hello world";
  //This initializes udp and transfer buffer
  udp.beginPacket(udpAddress, udpPort);
  udp.write(buffer, 11);
  udp.endPacket();
  memset(buffer, 0, 50);
  //processing incoming packet, must be called before reading the buffer
  udp.parsePacket();
  //receive response from server, it will be HELLO WORLD
  if(udp.read(buffer, 50) > 0){
    Serial.print("Server to client: ");
    Serial.println((char *)buffer);
  }
  //Wait for 1 second
  delay(1000);
}

Referensi

Perbedaan Arduino dan Mikrokontroler

Arduino adalah kerangka kerja untuk membuat sistem elektronik open-source yang meliputi sejumlah perangkat keras dan perangkat lunak. Sebagian perangkat keras Arduino menggunakan prosesor/mikrokontroler dari keluarga ATmega.

Mikrokontroler adalah komputer kecil pada suatu keping rangkaian integrasi (integrated circuit/IC) terpadu. Pada mikrokontrole sudah ada CPU (Central Processing Unit) , memori dan periferal. Mikrokontroler umumnya dirancang untuk aplikasi yang tertanam di perangkat lain, atau dikenal dengan istilah ‘embedded system’.

Perangkat keras Arduino menggunakan mikrokontroler, namun tidak semua mikrokontroler adalah bagian dari Arduino

Berikut ini contoh mikrokontroler ATmega8535 yang tidak termasuk Arduino.

Perangkat Keras Arduino

Berikut ini contoh perangkat keras Arduino yang menggunakan mikrokontroler dari keluarga ATmega

Nama Prosesor  
Arduino Nano Every ATmega4809  
Arduino Nano ATmega328  
Arduino UNO ATmega328  
Arduino Mega 2560 ATmega2560  
Arduino Leonardo ATmega32u4  

Berikut ini contoh perangkat keras Arduino yang tidak menggunakan mikrokontroler ATmega.

Nama Prosesor  
Arduino Nano 33 IoT SAMD21 Cortex®-M0+ 32bit low power ARM MCU  
Arduino Nano RP2040 Connect Raspberry Pi® RP2040  
Arduino Nano 33 BLE Sense nRF52840  

Berikut ini contoh mikrokontroler yang tidak termasuk pada sistem Arduino:

  • ATmega8535
  • ATmega8
  • ATmega16
  • ATmega32

Mikrokontroler Secara Umum

Mikrokontroler adalah komputer kecil pada suatu keping rangkaian integrasi (integrated circuit/IC) terpadu. Pada mikrokontrole sudah ada CPU (Central Processing Unit) , memori dan periferal. Mikrokontroler umumnya dirancang untuk aplikasi yang tertanam di perangkat lain, atau dikenal dengan istilah ‘embedded system’.

Pada masa lalu, mikrokontroler umumnya dibuat dalam 1 keping chip. Pada saat ini mulai dikenal konsep SoC (System on a Chip). SoC ini menggabungkan keping silikon berisi mikrokontroler dengan komponen-komponen lain yang lebih kompleks, misalnya GPU (Graphical Processing Unit) ataupun antarmuka WiFi.

Mikrokontroler digunakan dalam berbagai produk dan perangkat yang dikontrol secara otomatis, seperti sistem kontrol mesin mobil, perangkat medis, remote control, mesin kantor, alat rumah tangga, perkakas listrik, mainan, dan sistem tertanam (embedded) lainnya. Desain dengan mikrokontroler lebih ekonomis daripada mikroprosesor karena pada mikrokontroler memori dan perangkat input/output dapat digabung dalam 1 chip, sedangkan pada mikroprosesor memori dan perangkat input/output harus ditambahkan pada chip terpisah.

Mikrokontroler ada murni digital, ada juga yang campuran antara sinyal digital dan analog. Dalam konteks internet of things (IoT), mikrokontroler adalah teknik pengumpulan data yang ekonomis dan populer, mengukur dan mengendalikan dunia fisik sebagai perangkat ‘komputasi tepi’. Kontras dari ‘komputasi tepi’ adalah ‘komputasi awan’ atau ‘cloud computing’, di mana data & informasi dikumpulkan secara terpusat untuk kemudian semua data diolah secara terpusat.

Referensi

 

Perbedaan Arduino UNO dan ESP32

Berikut ini perbedaan utama antara Arduino UNO dan ESP32:

Parameter Arduino Uno ESP32
Prosesor ATmega328 Xtensa dual core / single core
Clock prosesor 16 MHz 160 MHz / 240 MHz
Ukuran 68,6 mm x 53,4 mm tergantung board
Analog Input 6 kanal, 10 bit ADC 18 kanal, 12 bit ADC
Tegangan catu daya 6 sampai 20 volt DC, namun disarankan hanya 7 sampai 12 volt DC 5 volt (USB)
Pin untuk Digital Input/Output 14 (6 dengan fitur Pulse Width Modulation) 34 (maksimum)
Berat 25 g tergantung board
Ukuran lebih kecil. shield Arduino Mega tidak dapat dipakai di Arduino UNO lebih besar. shield Arduino UNO dapat dipakai di Arduino Mega
Kapasitas flash memory 32 kilobyte 4 MB (eksternal denganm antar muka SDIO/SPI)
SRAM 2 kilobyte 320 kilobyte
EEPROM 1 kilobyte tidak ada secara khusus, namun dapat menggunakan sebagian memory Flash
Tegangan kerja 5 volt 3 volt
Konektor USB USB type B USB mini
Konektivitas Jaringan tidak ada WiFi 802.11, bluetooth
Port serial (UART) 1 (hardware) 3 (hardware)
I2C 1 kanal 2 kanal
Output analog tidak ada DAC (Digital to Analog Converter) ada DAC 2 kanal, 8 bit
SPI (Serial Peripheral Interface) 1 kanal 4 kanal

 

Arduino UNO R3, ESP32 Devkit-C  , ESP32 Lolin32 Lite
Arduino UNO R3, ESP32 Devkit-C , ESP32 Lolin32 Lite

Arduino UNO

Arduino UNO R3 asli
Arduino UNO R3 asli

Arduino UNO adalah rangkaian mikrokontroler berbasis ATmega328P. Arduino UNO memiliki 14 pin input/output digital (6 di antaranya dapat digunakan sebagai output PWM), 6 input analog, resonator keramik 16 MHz sebagai sumber clock, koneksi USB untuk catu daya dan komunikasi serial, colokan listrik DC, header ICSP (In Circuit Serial Programming), dan tombol reset. Papan rangkaian Arduino UNO berisi semua hal yang diperlukan untuk mendukung mikrokontroler. Untuk menggunakan Arduino UNO, cukup dengan disambung ke komputer dengan kabel USB atau sambungkan dengan adaptor AC-ke-DC atau baterai untuk memulai. Anda dapat mengotak-atik UNO Anda tanpa terlalu khawatir melakukan kesalahan. Pada kondisi terburuk, chip ATmega328 dengan kemasan DIP (Dual In line Package) dapat diganti jika rusak.

ESP32

ESP 32 adalah mikrokontroler yang memiliki banyak fitur pada prosesornya, dan dilengkapi dengan konektivitas Wi-Fi dan Bluetooth terintegrasi untuk berbagai macam aplikasi.

ESP32 mampu berfungsi dengan andal di lingkungan industri, dengan suhu pengoperasian mulai dari –40°C hingga +125°C. ESP32 dapat secara dinamis menghilangkan ketidaksempurnaan sirkuit eksternal dan beradaptasi dengan perubahan kondisi eksternal dengan dukungan rangkaian kalibrasi di dalamnya. Rangkaian kalibrasi ini memungkinkan WiFi pada ESP32 berfungsi tanpa perlu kalibrasi ekstra.

ESP32 dirancang untuk perangkat bergerak (mobile), perangkat elektronik yang dapat dikenakan (wearable electronics), dan aplikasi IoT. Konsumsi daya ESP32 dapat dibuat sangat rendah dengan kombinasi beberapa macam perangkat lunak khusus. ESP32 juga mencakup fitur-fitur canggih, seperti ‘clock gating‘ untuk mereduksi konsumsi daya, berbagai mode daya, dan penskalaan daya secara dinamis.

ESP32 dibuat sangat terintegrasi dengan sakelar pemilih antena di dalamnya, RF balun, power amplifier untuk radio, amplifier penerima radio dengan kebisingan rendah (low noise), filter, dan modul manajemen daya. ESP32 menambahkan fungsionalitas dan keserbagunaan yang banyak aplikasi dengan hanya memerlukan ruang kecil di PCB (Printed Circuit Board)

ESP32 dapat berfungsi sebagai sistem mandiri yang lengkap atau sebagai perangkat pembantu ke mikrokontroler lain, mengurangi overhead tumpukan komunikasi pada prosesor aplikasi utama. ESP32 dapat berinteraksi dengan sistem lain untuk menyediakan fungsionalitas Wi-Fi dan Bluetooth melalui antarmuka SPI/SDIO atau I2C/UART.

Modul ESP32 tersedia dalam berbagai versi, di antaranya adalah Lolin32 Lite dan DevkitC serta clone nya.

ESP32 memiliki beberapa kelebihan dibandingkan Arduino. Di antaranya sebagai berikut:

  • Prosesor di ESP32 dari keluarga Xtensa, lebih cepat dibandingkan prosesor ATmega dengan arsitektur AVR. ESP32 clocknya adalah 240 MHz, sedangkan Arduino UNO menggunakan ATmega328 dengan kecepatan maksimum 16 MHz
  • Jumlah core pada prosesornya lebih banyak. ESP32 mempunyai 2 core, sedangkan ATmega328 hanya 1 core saja.
  • Memori Flash yang terhubung lebih banyak. ESP32 memiliki Flash Memory sebesar 1 MB sampai 16 MB. Arduino UNO memiliki memori flash sebesar 32 KB. Model Arduino lain ada yang memiliki flash lebih besar, seperti ATmega2560 yang memiliki flash sebesar 256 KB
  • Memori RAM lebih besar. ESP32 memiliki SRAM 520 KiB, sedangkan Arduino UNO memiliki SRAM hanya 2 KB. ATmega2560 memiliki SRAM sebesar 8 kilobyte
  • ESP32 memiliki kemampuan nirkabel WiFi 802.11 dan Bluetooth. Fitur ini di Arduino UNO tidak ada, harus menambah modul/shield.

Referensi

Perbedaan Arduino dan ATmega

Arduino adalah kerangka kerja untuk membuat sistem elektronik open-source yang meliputi sejumlah perangkat keras dan perangkat lunak. Sebagian perangkat keras Arduino menggunakan prosesor/mikrokontroler dari keluarga ATmega.

ATmega adalah keluarga mikrokontroler dari arsitektur AVR yang diproduksi oleh perusahaan Atmel. Saat ini perusahaan Atmel sudah diakuisisi oleh Microchip.

Perangkat Keras Arduino

Berikut ini contoh perangkat keras Arduino yang menggunakan prosesor ATmega

Nama Prosesor  
Arduino Nano Every ATmega4809  
Arduino Nano ATmega328  
Arduino UNO ATmega328  
Arduino Mega 2560 ATmega2560  
Arduino Leonardo ATmega32u4  

Berikut ini contoh perangkat keras Arduino yang tidak menggunakan prosesor ATmega

Nama Prosesor  
Arduino Nano 33 IoT SAMD21 Cortex®-M0+ 32bit low power ARM MCU  
Arduino Nano RP2040 Connect Raspberry Pi® RP2040  
Arduino Nano 33 BLE Sense nRF52840  
     
     
     

Perangkat Lunak Arduino

Berikut ini perangkat lunak Arduino

  • Arduino IDE (versi terbaru adalah 2.0.1) untuk pengembangan perangkat lunak di komputer laptop/desktop.
  • Arduino Web Editor untuk mengembangkan perangkat lunak secara online. Data-data disimpan di cloud server.

Mikrokontroler ATmega

Berikut ini beberapa contoh mikrokontroler ATmega yang dipakai di perangkat keras Arduino

  • ATmega168
  • ATmega328
  • ATmega2560
  • ATmega32u4
  • ATmega4809

Berikut ini beberapa contoh mikrokontroler ATmega yang tidak dipakai di perangkat keras Arduino

Berikut ini contoh prosesor ATmega168 yang dipakai di Arduino

Berikut ini contoh rangkaian berbasis ATmega8535 yang bukan menggunakan Arduino

Referensi

 

 

Perbedaan Antara Arduino UNO dan Raspberry PI 3

Berikut ini perbedaan utama antara Arduino Uno dan Arduino Nano

Parameter Arduino Uno Raspberry PI 3
Prosesor ATmega328 (AVR), single core, 8 bit ARM Cortex A53, quad core, 64 bit.
Clock 16 MHz 1,2 GHz
Memori RAM 2 kilobyte 1 gigabyte
Memori EEPROM 1 kilobyte tidak ada
Memori Flash 32 kilobyte (internal) tidak ada internal. Memori flashmenggunakan SD card eksternal
Input Analog 6 pin tidak ada
Input/Output Digital 14 (6 dengan fitur Pulse Width Modulation) 40 pin GPIO, namun tidak semuanya dipakai untuk input/output
Sistem Operasi tidak perlu sistem operasi, namun dapat menggunakan sistem operasi real time seperti FreeRTOS Raspberry Pi OSRaspberry Pi Debian, dan berbagai sistem operasi berbasis Linux, Windows IoT Core
Bahasa Pemrograman C / C++ praktis semua bahasa pemrograman yang dapat dijalankan di sistem operasi Linux
Port USB 1 buah USB type B untuk port serial dan catu daya 1 buah mini USB untuk catu daya
4 buah USB type-A untuk memasang periferal seperti keyboard-USB dan mouse-USB
Koneksi jaringan komputer tidak ada Ethernet 802.3 dan Wifi 802.11 (2,4 GHz)
Tegangan Kerja 5 volt 3,3 volt
Catu Daya 5 volt (USB), 6 ~ 12 volt (pin catu daya). Konsumsi arus untuk prosesor maksimum adalah 14 mA. Konsumsi arus untuk periferal output maksimum 200 mA. 5 VDC, 2,5 ampere
Ukuran 68,6 mm x 53,4 mm 85 mm x 56 mm
berat 37 g 50 g
harga Rp 350.000 ~ Rp 450.000 Rp 3,5 juta (model B+)

Arduino UNO

Arduino UNO R3 asli
Arduino UNO R3 asli

Arduino UNO adalah rangkaian mikrokontroler berbasis ATmega328P. Arduino UNO memiliki 14 pin input/output digital (6 di antaranya dapat digunakan sebagai output PWM), 6 input analog, resonator keramik 16 MHz sebagai sumber clock, koneksi USB untuk catu daya dan komunikasi serial, colokan listrik DC, header ICSP (In Circuit Serial Programming), dan tombol reset. Papan rangkaian Arduino UNO berisi semua hal yang diperlukan untuk mendukung mikrokontroler. Untuk menggunakan Arduino UNO, cukup dengan disambung ke komputer dengan kabel USB atau sambungkan dengan adaptor AC-ke-DC atau baterai untuk memulai. Anda dapat mengotak-atik UNO Anda tanpa terlalu khawatir melakukan kesalahan. Jika ATmega328 rusak dapat diganti jika rusak.

Raspberry PI Model 3

Spesifikasi Raspberry Pi secara ringkas

The Raspberry Pi 3 Model B+ is the final revision in the Raspberry Pi 3 range.

  • Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bit SoC @ 1.4GHz
  • 1GB LPDDR2 SDRAM
  • 2.4GHz and 5GHz IEEE 802.11.b/g/n/ac wireless LAN, Bluetooth 4.2, BLE
  • Gigabit Ethernet over USB 2.0 (maximum throughput 300 Mbps)
  • Extended 40-pin GPIO header
  • Full-size HDMI
  • 4 USB 2.0 ports
  • CSI camera port for connecting a Raspberry Pi camera
  • DSI display port for connecting a Raspberry Pi touchscreen display
  • 4-pole stereo output and composite video port
  • Micro SD port for loading your operating system and storing data
  • 5V/2.5A DC power input
  • Power-over-Ethernet (PoE) support (requires separate PoE HAT)

Memilih Arduino Atau Raspberry Pi

Arduino dan Raspberry memiliki kelebihan dan kekurangan masing-masing. Berikut ini beberapa saran untuk melakukan pemilihan.

Faktor-faktor yang mengarah ke Raspberry Pi:

  • Perlu menjalankan aplikasi perlu dijalankan di sistem operasi Linux, misal database MySQL, web server Apache, dan sebagainya.
  • Aplikasi menggunakan bahasa pemrograman selain C/C++, misal Python, PHP, Java dan sebagainya.
  • Perlu terhubung ke internet lewat ethernet atau wifi
  • Tidak perlu input analog. Jika terpaksa perlu input analog, maka perlu menambah ADC eksternal seperti MCP3008, ADC1115 , HX711
  • Perlu output HDMI ke monitor
  • Perlu kamera
  • Perlu memori besar, baik memori RAM ataupun memori Flash.
  • Perlu kecepatan komputasi besar
  • Perlu periferal USB, seperti keyboard, mouse
  • Fasih menggunakan sistem operasi berbasis Linux

Faktor-faktor yang mengarahkan ke Arduino

  • Harga Arduino lebih murah
  • Aplikasi sederhana, sehingga sumber daya CPU dan memori yang diperlukan aplikasi sedikit.
  • Aplikasi mobile dengan sumber energi solar cell atau baterai, sehingga perlu hemat energi.
  • Tidak perlu konektivitas jaringan komputer, seperti ethernet atau wifi.
  • Perlu input analog
  • Perlu fitur real time dengan sistem operasi real time seperti FreeRTOS.
  • Porting real time operating system (RTOS) untuk Raspberry Pi tersedia untuk beberapa RTOS, namun tidak sepopuler pada Arduino atau mikrokontroler lain.
  • erlu akses langsung ke interupsi pada mikroprosesor. Pada Raspberry Pi, interupsi diurus oleh sistem operasi, jadi tidak dapat diakses langsung oleh pengguna.

Referensi

Lampu Kedip Dengan Model Finite State Machine dan FreeRTOS

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 vTaskDelay pada sistem operasi real time FreeROTS 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 FreeRTOS. Delay menggunakan fungsi vTaskDelay() pada FreeRTOS. Penjelasan tentang FreeRTOS di Arduino dapat dibaca di artikel https://www.arduino.cc/reference/en/libraries/freertos/

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

Diagram alir perangkat lunak berbasis FreeRTOS

Aplikasi memiliki 2 super loop. Super loop pertama ada di main program, tidak berisi apa-apa. Super loop kedua ada di Task FSM.

Kode lengkap dapat dilihat di repository https://github.com/waskita/embedded/blob/master/kedip/nano-fsm-freertos/nano-fsm-freertos.ino

Bagian Awal

#include "Arduino_FreeRTOS.h"

#define ON    100
#define OFF   101

#define LED_OUTPUT 3
int state = OFF;
TaskHandle_t xHandle1 = NULL;

Inisialisasi Sistem

void setup() {
  int output = 0;
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(LED_OUTPUT, OUTPUT);
  Serial.begin(115200);

  Serial.print("portTICK_PERIOD_MS: ");
  Serial.print(portTICK_PERIOD_MS);
  Serial.println();

  fsm_init(&state);
  fsm_output(output);

  xTaskCreate(
    TaskFSM
    ,  "TaskFSM"  // A name just for humans
    ,  100  // stacksize
    ,  NULL
    ,  2  // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
    ,  &xHandle1 );
}

Implementasi Inisialisasi Finite State Machine

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 Finite State Machine

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 Task / Thread

static void TaskFSM(void *pvParameters) 
{
  TickType_t xLastWakeTime;
  /* The xLastWakeTime variable needs to be initialised with the current tick
    count.  Note that this is the only time we access this variable.  From this
    point on xLastWakeTime is managed automatically by the vTaskDelayUntil()
    API function. */
  xLastWakeTime = xTaskGetTickCount();
  while (1)
  {
    int output = 0;
    fsm(&state, &output);
    if (output == 1) {
      digitalWrite(LED_OUTPUT, HIGH);
    } else {
      digitalWrite(LED_OUTPUT, LOW);
    }
    Serial.print("state: ");
    Serial.print(state);
    Serial.print(" output: ");
    Serial.print( output);
    Serial.println();
    vTaskDelayUntil( &xLastWakeTime, ( 1000 / portTICK_PERIOD_MS ) ); // perioda 1 detik
  }
}

Pengujian

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

Pada output serial akan muncul tampilan seperti berikut ini:

16:23:36.204 -> state: 100 output: 1
16:23:37.280 -> state: 101 output: 0
16:23:38.302 -> state: 100 output: 1
16:23:39.324 -> state: 101 output: 0
16:23:40.390 -> state: 100 output: 1
16:23:41.415 -> state: 101 output: 0
16:23:42.427 -> state: 100 output: 1
16:23:43.466 -> state: 101 output: 0
16:23:44.534 -> state: 100 output: 1
16:23:45.557 -> state: 101 output: 0
16:23:46.581 -> state: 100 output: 1
16:23:47.652 -> state: 101 output: 0
16:23:48.674 -> state: 100 output: 1

Dari output serial tersebut nampak perubahan state dan output terjadi sesuai rancangan.

Waktu perubahan tidak tepat 1 detik, terlihat bergeser sedikit. Penyebabnya kemungkinan karena implementasi timer tick pada FreeRTOS Arduino menggunakan Watchdog Timer, bukan Timer 0, Timer 1 ataupun Timer 2. Watchdog Timer pada Arduino menggunakan osilator RC yang tidak setepat osilator kristal.

Video

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

Lampu Kedip Dengan Model Finite State Machine

Pada artikel ini diuraikan pembuatan lampu kedip berbasis mikrokontroler Arduino Nano ATmega328 dengan model Finite State Machine (FSM). Lampu kedip sebenarnya dapat juga dibuat dengan menggunakan model flowchart biasa. Tujuan tulisan ini untuk menunjukkan teknik implementasi FSM yang sederhana. Untuk sistem yang sangat sederhana seperti lampu kedip biasa, penggunaan FSM mungkin berlebihan (overkill). Pada sistem yang kompleks, penggunaan FSM akan sangat memudahkan. Implementasi FSM dalam bentuk perangkat lunak agak rumit, memerlukan latihan. Untuk itu pada artikel ini ditunjukkan tahap implementasi FSM yang sederhana dulu. Setelah dapat memahami artikel ini, dapat dilanjutkan dengan membuat FSM yang lebih kompleks.

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.

Pada sistem ini tidak ada input.

FSM dievaluasi setiap detik.

Notasi FSM pada gambar ini diadopsi dari buku Lee & Seshia “Introduction to Embedded Systems”.

Kondisi awal sistem adalah state OFF, dengan lampu mati. Pada state OFF, state berikutnya adalah ON, tanpa syarat. Maka pada panah dari OFF ke ON diberi syarat ‘true’, artinya transisi ini selalu terjadi tanpa syarat apapun. Transisi ini menyebabkan state berganti menjadi ON, dan lampu output menyala. Output aktif ditandai dengan ‘out=1’.

Pada state ON, state selanjutnya adalah OFF tanpa syarat. Maka syarat transisi dari ON ke OFF adalah ‘true’. Setiap kali transisi ini, output sistem adalah 1, maka ditulis sebagai ‘out=0’.

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 delay dengan Arduino

Model diagram alir (flowchart) software adalah sebagai berikut.

Implementasi perangkat lunak dapat dilihat di file berikut ini: https://github.com/waskita/embedded/blob/master/kedip/nano-fsm/nano-fsm.ino

Penjelasan isi source code sebagai berikut.

Pendefinisian state

#define ON    100
#define OFF   101

Inisialisasi FSM

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

Implementasi Finite State Machine

Finite State Machine diimplementasikan di fungsi fsm(). Pada fungsi ini ada 2 state yang ditangani yaitu ON dan OFF. Pemilihan state dilakuan dengan perintah switch() di bahasa C. Pada setiap case diimplementasikan setiap transisi yang ada pada model FSM di atas.

Fungsi ini tidak menggunakan global variabel maupun static variabel, supaya didapat kode yang lebih aman.

Output dari fungsi diberikan dengan passing pointer pada fungsi. Ada 2 parameter yaitu state (state dari FSM) dan out (output). Kedua parameter diberikan menggunakan pointer.

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

Implementasi FSM ini menggunakan kode C standar yang dapat dijalankan di semua mikrokontroler. Akses ke port output dipisahkan ke fungsi fsm_output(). Tujuannya agar fungsi ini dapat dengan mudah diporting ke mikrokontroler lain.

Inisialisasi sistem

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(LED_OUTPUT, OUTPUT);
  Serial.begin(115200);
  int output = 0;
  fsm_init(&state);
  fsm_output(output);
}

Superloop / Main loop

Berikut ini potongan kode dari main loop.

void loop() {
  int output = 0;
  fsm(&state, &output);
  fsm_output(output);
  Serial.print("state: ");
  Serial.print(state);
  Serial.print(" output: ");
  Serial.print( output);
  Serial.println();

  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);                       //
  digitalWrite(LED_BUILTIN, HIGH);
}

Proses yang dilakukan di main loop adalah sebagai berikut:

  • Perhitungan nilai state di FSM
  • Output ke pin output digital dengan fungsi fsm_output()
  • mencetak status FSM ke port serial. Data yang dicetak meliputi state dan output. Jika FSM memiliki input ataupun variabel pada extended state machine, maka nilai-nilai ini juga perlu dicetak.
  • Melakukan delay selama 1 detik. Pada implementasi delay ini ditambahkan fitur lampu kedip, sehingga LED_BUILTIN akan berkedip dengan frekuensi sekitar 1 Hz. Lampu kedip 1 Hz ini fungsinya untuk menunjukkan waktu terjadinya perubahan state. Frekuensinya tidak akan tepat sekali di 1 Hz, namun untuk sistem ini sudah dapat dianggap cukup baik.

Output FSM

Fungsi fsm_output() adalah menerjemahkan output dari FSM ke pin output pada mikrokontroler.

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

Pengujian

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

Pada output serial akan muncul tampilan seperti berikut ini

11:08:45.511 -> state: 100 output: 1
11:08:46.493 -> state: 101 output: 0
11:08:47.517 -> state: 100 output: 1
11:08:48.492 -> state: 101 output: 0

Dari output serial tersebut dapat diamati perubahan state dan output serta waktu kejadiannya. Dari output di atas dapat disimpulkan bahwa lampu berkedip dengan perioda sekitar 2 detik. Perubahan state juga sesuai dengan model FSM.

Video

Under construction

 

Prosesor untuk kuliah Pengolahan Sinyal Digital

Berikut ini beberapa prosesor yang dipakai untuk kuliah Pengolahan Sinyal Digital (Digital Signal Processing) di beberapa perguruan tinggi di dunia.

TU Graz

TU Graz 442.003 Digital Signal Processing, Laboratory Winter Term 2020/21
https://www.spsc.tugraz.at/courses/digital-signal-processing-laboratory.html
prosesor: Raspberry Pi

Penampakan samping
Penampakan samping

University of Texas

ECE445S Real-Time Digital Signal Processing Laboratory
website: http://users.ece.utexas.edu/~bevans/courses/realtime/
prosesor: Texas Instrument TMDSLCKL6748  , harga USD 200
materi: http://users.ece.utexas.edu/~bevans/courses/realtime/handouts/CourseReaderFall2022.pdf

Technische Hocshule Ingolstadt

Laboratory for Digital Signal Processing and Optoelectronics (C307)
https://www.thi.de/en/electrical-engineering-and-information-technology/laboratories-of-faculty-ei/digital-signal-processing-laboratory/
prosesor: TMDSDSK6713 https://www.ti.com/product/TMDSDSK6713/part-details/TMDSDSK6713

 

R.M.K College of Engineering and Technology

Prosesor: Texas Instruments TMS320C50

Website kuliah: https://rmkcet.ac.in/ece-dsp-lab.php

The Grainger College of Engineering, Electrical & Computer Engineering

The Grainger College of Engineering

Nama kuliah: ECE 420- Embedded DSP Laboratory

website kuliah: https://ece.illinois.edu/academics/courses/ece420-120178

Prosesor yang dipakai: Texas Instruments TMS320C5510 Fixed Point Digital Signal Processors  development board

Tipe: TMDSDSK5510 (DSP STARTER KIT TMS320VC5510)

 

Rutgers School of Engineering

Kuliah: 14:332:348 Digital Signal Processing Laboratory

Website kuliah: https://www.ece.rutgers.edu/332348

Tipe prosesor: Texas Instruments TMS320C6713 DSP starter kit

Stanford

Nama kuliah: EE264 Digital Signal Processing

Website kuliah: https://web.stanford.edu/class/ee264/

Materi kuliah DSP: https://web.stanford.edu/~rqi/papers/ee264_spw15.pdf

Prosesor: TMS320C5535. TMDX5535EZDSP, Development board berbasis TMS320C5535 Harga USD 249

Menurut foto di artikelnya, mereka mengembangkan board khusus kerjasama antara Texas Instruments dengan Stanford: (Picture of the DSP shield calculating heart rate in bpm) dari [dokumen]

Berikut ini foto DSP Shield yang dikembangkan Stanford: [sumber]

DSP Shield & Arduino:

Board ini dipasang di atas Arduino Uno

Referensi

Lampu kedip dengan extended state machine

Fitur sistem

  • kondisi awal lampu menyala
  • lampu menyala selama 1 siklus
  • setelah itu lampu mati selama 9 siklus
  • 1 siklus adalah 1 detik

Model Extended State Machine

Penampilan hardware

 

Source code: https://github.com/waskita/embedded/tree/master/kedip-duty-cycle/nano-fsm-extended

Video demonstrasi

Contoh-contoh lain pemodelan dengan FSM dapat dilihat di artikel “Contoh Implementasi Finite State Machine dengan mikrokontroler

Artikel terkait

 

Lampu kedip dengan duty cycle tertentu menggunakan model finite state machine

Pada artikel ini diuraikan pembuatan sistem mikrokontroler dengan lampu yang berkedip dengan duty cycle 10%.

Pada mikrokontroler , lampu kedip dapat dibuat dengan delay ataupun dengan finite state machine (FSM). Pada artikel ini dipakai FSM dengan tujuan mendemonstratikan kemampuan FSM sebagai model untuk membuat perangkat lunak mikrokontroler.

Duty cycle yang diinginkan adalah 10%. Untuk itu maka lampu akan menyala selama 1 satuan waktu, dan lampu mati selama 9 satuan waktu. Lampu menyala selama 1 state , sedangkan lampu mati selama 9 state. Untuk itu dibuat 10 state: 1 state lampu menyala, dan 10 state lampu mati.

Nama state yang dibuat adalah sebagai berikut

  • ON
  • OFF_1
  • OFF_2
  • OFF_3
  • OFF_4
  • OFF_5
  • OFF_6
  • OFF_7
  • OFF_8
  • OFF_9

Diagram state chart adalah sebagai berikut

Source code dapat dilihat di file berikut ini: https://github.com/waskita/embedded/tree/master/kedip-duty-cycle/nano-fsm-normal

Berikut ini video demonstrasi lampu kedip tersebut:

 

Contoh-contoh lain pemodelan dengan FSM dapat dilihat di artikel “Contoh Implementasi FSM dengan mikrokontroler

 

 

Lampu Penyeberangan Jalan Dengan Extended State Machine

Berikut ini adalah implementasi lampu penyeberangan jalan (“traffic light at a pedestrian
crosswalk”) dari Example 3.9 di buku “Introduction to Embedded Systems, a cyber physical systems approch” karangan Lee & Seshia.

Model sistem menggunakan Extended State Machine, sebagai berikut:

Perangkat Keras

Implementasi hardware menggunakan Arduino Nano ATmega328

Pin yang dipakai:

  • output lampu merah : pin D2 (active high)
  • output lampu hijau: D3 (active high)
  • output lampu kuning: pin D4 (active high)
  • input tombol: pin D11 (active low)
  • output lampu kedip: pin LED_BUILTIN / D13

Pada model tidak diperlukan lampu kedip, namun pada aplikasi ini ditambahkan lampu kedip sebagai indikasi bahwa sistem berfungsi.

Perangkat Lunak

Model FSM perangkat lunak mengikuti Example 3.9 sebagai berikut:

Kode aplikasi dapat dilihat di https://github.com/waskita/embedded/blob/master/traffic-light-controller/nano-fsm-extended/nano-fsm-extended.ino

Perangkat lunak dibuat menggunakan library Arduino. Perangkat lunak terbagi menjadi bagian inisialisasi yang hanya dilakukan sekali di fungsi setup() dan bagian yang dilakukan berulang-ulang di fungsi loop().

Implementasi finite state machine (FSM) ada di fungsi fsm_init() dan fsm(). Fungsi fsm_init() berisi inisialisasi variabel FSM. fungsi fsm() berisi perubahan (reaction) yang terjadi pada FSM. Sesuai dengan penjelasan di Example 3.9, fungsi fsm() ini dipanggil secara setiap 1 detik, dengan cara menambahkan delay dengan fungsi delay().

Membuat fungsi periodik dengan delay() sebenarnya tidak tepat sekali pewaktuannya. Jika diperlukan pewaktuan yang lebih tepat, dapat menggunakan interupsi Timer1.

Penjelasan Perangkat Lunak

Pada sistem ini terdapat 4 buah state. Untuk itu, setiap state didefinisikan menggunakan macro. Penggunaan macro ini untuk membantu memahami kode dengan lebih mudah.

#define STATE_RED    100
#define STATE_GREEN   101
#define STATE_PENDING   102
#define STATE_YELLOW   103

Setiap state diasosiasikan dengan suatu angka tertentu. Angka yang dipakai bebas, asal memperhatikan batas tipe data yang dipakai. Pada program ini tipe data yang dipakai adalah int, sehingga nilainya yang dapat dipakai adalah antara -32,768 sampai dengan 32,767

Bagian selanjutnya adalah definisi untuk pin-pin yang dipakai. Ada 4 pin yang dipakai, sehingga diperlukan 4 buah macro sebagai berikut.

#define PEDESTRIAN_BUTTON 11
#define OUTPUT_RED     2
#define OUTPUT_GREEN   3
#define OUTPUT_YELLOW  4

Penggunaan macro ini untuk memudahkan pembacaan source code.

Bagian selanjutnya adalah variabel global

int state ;
int sig_r = 0;
int sig_g = 0;
int sig_y = 0;
int count = 0;

Pada program ini diperlukan beberapa variabel global. Variabel global diperlukan karena fungsi fsm_init() dipanggil di setup(), sedangkan fsm() dipanggil di fungsi loop(), padahal ada variabel FSM diperlukan untuk keduanya.

Software embedded yang baik seharusnya meminimalkan penggunaan variabel global, supaya program lebih rapi.

Fungsi setup()

Selanjutnya adalah fungsi setup() untuk inisialisasi Arduino

  pinMode(OUTPUT_RED, OUTPUT);
  pinMode(OUTPUT_GREEN, OUTPUT);
  pinMode(OUTPUT_YELLOW, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(PEDESTRIAN_BUTTON, INPUT_PULLUP);
  Serial.begin(115200);
  Serial.println(__FILE__);

fungsi pinMode() dipanggil untuk mengatur konfigurasi pin-pin sebagai input dan output. Pada kode ini, yang dipakai adalah macro dari nomor pin, dengan tujuan memudahkan pembacaan software.

Port serial sebenarnya tidak wajib diaktifkan untuk sistem lampu penyeberangan ini. Pada implementasi ini, port serial dipakai untuk melakukan monitoring dan debugging. Variabel state, input dan output dicetak ke port serial secara teratur untuk mengecek apakah implementasi sudah berjalan sebagaimana mestinya.

Bagian selanjutnya dari fungsi setup() adalah melakukan inisialisasi FSM.

  fsm_init();
  activate_output(sig_r, sig_g, sig_y);
  print_state(0);
  delay(1000);

Fungsi activate_output()

Fungsi activate_output(int r, int g, int y) fungsinya adalah menyalakan lampu output sesuai output dari FSM. Pada penjelasan Example 3.9, output adalah berupa sinyal sigR, sigR dan sigY. Sinyal-sinyal ini hanya ada / aktif ketika diperlukan perubahan lampu yang menyala. Untuk itu perlu fungsi ini untuk mengubah 3 buah sinyal ini menjadi penyalaan lampu yang sesuai.

Fungsi fsm_init()

Fungsi fsm_init() berfungsi memasukkan nilai awal (state) di FSM.

Berikut ini adalah bagian yang diimplementasikan di fungsi fsm_init()

Menurut model FSM, yang perlu dilakukan di awal adalah variabel count diubah menjadi 0, dan state awal adalah RED. Namun pada program ini ditambahkan juga kondisi awal lampu merah menyala, dengan cara memberikan sinyal sigR.

 

Fungsi loop()

Fungsi loop() dipanggil secara rutin oleh Arduino.

Hal-hal yang dilakukan di fungsi ini adalah:

  • membaca input dari tombol dengan perintah digitalRead()
  • membalik nilai input, karena tombol di hardware dibuat active low, sedangkan FSM memerlukan tombol pedestrian yang active_high
  • memanggil fungsi fsm() untuk menghitung state berikut dari FSM berdasarkan state terkini dan input pada saat itu. Hasilnya adalah state akan diubah, variabel count diubah, dan ada keluaran di variabel output.
  • memanggil activate_output() untuk melakukan perubahan lampu menyala jika diperlukan
  • mencetak state,input dan output untuk keperluan debugging / monitoring
  • membuat delay 1 detik

Fungsi print_state()

Fungsi ini tugasnya adalah mencetak semua variabel sistem untuk melakukan debugging

Fungsi fsm()

Fungsi ini adalah implementasi state chart.

Fungsi ini dirancang untuk tidak menggunakan variabel global, karena variabel global kurang baik dipakai . Semua output menggunakan pointer sebagai metode passing parameter.  Pada fungsi ini tidak ada variabel global ataupun variabel jenis static.

Jenis FSM yang dipakai adalah extended state machine, jadi pada FSM ini ada variabel state dan variabel ‘count’.

Pada bagian awal, variabel sig_r,sig_g dan sig_y dinolkan, untuk menandakan bahwa defaultnya tidak ada output apapun.

Pada fungsi fsm() , yang dihitung adalah:

  • state selanjutnya, di variabel *state
  • variabel count (*count)

Perhitungan state dan variabel *count dibagi berdasarkan state terkini.

Implementasi STATE_RED

Berikut ini adalah bagian dari state chart yang diimplementasikan untuk case STATE_RED

    case STATE_RED: {
        if (*count >= 60) {
          *state = STATE_GREEN;
          *sig_g = 1;
          *count = 0;
        } else {
          *count = *count + 1;
        }
        break;
      }

Dari state RED akan pindah ke state GREEN dengan syarat varioabel count lebih besar atau sama dengan 60. Jika terjadi perpindahan ini, maka variabel count diubah menjadi 0.

Jika tidak terjadi perpindahan state, maka variabel count ditambah dengan 1.

Implementasi STATE_GREEN

Berikut ini adalah bagian dari state chart yang diimplementasikan untuk case STATE_GREEN

 case STATE_GREEN: {
        if (pedestrian == 1 && *count < 60) {
          *state = STATE_PENDING;
          *count = *count + 1;
        } else if (pedestrian == 1 && *count >= 60) {
          *sig_y = 1;
          *state = STATE_YELLOW;
          *count = 0;
        } else if (pedestrian == 0 && *count < 60) {
          *count = *count + 1;
        } else {
          // do nothing
        }
        break;
      }

Dari state GREEN akan pindah ke state PENDING dengan syarat tombol input pedestrian ditekan, dan variabel count<60. Jika terjadi perpindahan ini, maka variabel count ditambah 1.

Dari state GREEN akan pindah ke state YELLOW dengan syarat tombol input pedestrian ditekan, dan variabel count lebih dari atau sama dengan 60. Jika terjadi perpindahan ini, maka variabel count diubah menjadi 0.

Implementasi STATE_PENDING

Berikut ini adalah bagian dari state chart yang diimplementasikan untuk case STATE_PENDING

 case STATE_PENDING: {
        if (*count >= 60) {
          *state = STATE_YELLOW;
          *sig_y = 1;
          *count = 0;
        } else {
          *count = *count + 1;
        }
        break;
      }

Dari state PENDING akan pindah ke state YELLOW dengan syarat variabel count lebih atau sama dengan 60. Jika terjadi perpindahan ini, maka terjadi output sigY dan variabel count diset menjadi 0.

Jika tidak terjadi perpindahan tersebut, maka variabel count ditambah 1

Implementasi STATE_YELLOW

Berikut ini adalah bagian dari state chart yang diimplementasikan untuk case STATE_YELLOW

 

    case STATE_YELLOW: {
        if (*count >= 5) {
          *state = STATE_RED;
          *sig_r = 1;
          *count = 0;
        } else {
          *count = *count + 1;
        }
        break;
      }

Dari state YELLOW akan pindah ke state RED dengan syarat count>5. Jika terjadi transisi ini , maka akan ada sinyal sigR dan variabel count dibuat menjadi 0

Jika tidak terjadi pindah ke state RED, maka variabel count ditambah 1.

Komentar

Pada model FSM yang diberikan di Example 3.9, ada kelemahan:

  • pada initial state tidak diberikan output, sehingga lampu yang menyala tidak terdefinisi. Pada program, hal ini diselesaikan dengan menambahkan sinyal sigR untuk menyalakan lampu merah

Sistem ini memiliki kelemahan dalam pembacaan tombol input. Penekanan tombol perlu dilakukan cukup lama agar terbaca oleh FSM. Hal ini terjadi karena fungsi fsm() dipanggil setiap detik. Jadi pada kondisi worst case, tombol input pedestrian perlu ditekan dan ditahan selama 1 detik. Pada best case cukup ditahan mendekati 0 detik. Rata-rata 0,5 detik.

Untuk mengatasi masalah lambatnya pembacaan tombol, dapat diatas dengan memperkecil perioda pemanggilan fungsi fsm(). Supaya perilaku sistem tidak berubah, maka batas-batas untuk variabel count di FSM perlu diubah. Misal perioda diubah dari 1 detik menjadi 1 milidetik. Maka batasan  count<60 di FSM pada STATE_GREEN perlu diubah menjadi count<60000, demikian juga untuk batasan lainnya.

Video Demonstrasi

Penutup

Contoh-contoh lain pemodelan dengan FSM dapat dilihat di artikel “Contoh Implementasi FSM dengan mikrokontroler

Referensi:

  • Lee & Seshia “Introduction to Embedded Systems, a cyber physical systems approach”

 

 

Digital Signal Processor di Drone Iran

Sebuah drone buatan Iran jatuh di Ukraina. Di dalamnya ternyata terdapat komponen prosesor digital buatan Texas Instruments di Amerika . DSP (Digital Signal Processor) adalah mikroprosesor yang dioptimasi untuk melakukan perhitungan matematis yang sangat cepat.

Tipe DSP di gambar tersebut adalah TMS320F28335, Real Time Microcontroller C200 series 320-bit MCU.

Kemampuan TMS320F28335 adalah komputasi 150 MIPS , Floating Point Unit, 512 KB flash memory, EMIF (External Memory Interface), 12 bit Analog to Digital Converter.

Berikut ini foto drone buatan Iran tersebut (foto dari sebuah pameran militer):

Tipe drone tersebut: Shahed-191 UAV

Selain prosesor digital, ada juga pompa bahan bakar buatan Polandia

Update:

Ada lagi ditemukan komponen dari kepingan drone Shahed136 .

Di antaranya prosesor TMS320F28335, Real Time Microcontroller C200 series 320-bit MCU

Berikut ini komponen MCIMX6L2EVN10AB dari NXP Semiconductors

Menurut situs NXP, komponen ini adalah “i.MX 6 series 32-bit MPU, ARM Cortex-A9 core, 1GHz, MAPBGA 432”

Menurut datasheetnya, fitur dari MCIMX6L2EVN10AB  adalah sebagai berikut :

  • Application processor
  • Multilevel memory system
  • smart speed technology
  • dynamic voltage and frequency scaling
  • Multimedia powerhouse
  • Powerful graphics acceleration
  • Interface flexibility
  • Electronic Paper Display Controller
  • Advanced security
  • Integrated power management
  • GPIO with interrupt capabilities
  • speed grade 1 GHz
  • ARM Cortex-A9 MPCore CPU processor

Spesifik untuk MCIMX6L3DVN10AB:

  • ada GPU
  • tidak ada EPDC

Berikut ini relay tipe P3C47

 

Sumber: 

  • https://twitter.com/United24media/status/1574692917834309632
  • https://www.thedrive.com/the-war-zone/the-drones-russia-is-reportedly-receiving-from-iran-for-its-ukraine-war
  • https://twitter.com/Gerashchenko_en/status/1579799277122920448

Buffer pada Komunikasi Serial Arduino Nano ATmega328

Arduino Nano dapat melakukan komunikasi serial baik transmit (mengirim) maupun receive (menerima). Pada library Arduino, sudah disiapkan buffer FIFO (First In First Out) pada data yang dikirimkan maupun data yang diterima. Pada tulisan ini dilakukan pengecekan berapa ukuran buffer tersebut. Pengujian ini dilakukan pada Arduino Nano dengan prosesor ATmega328. Untuk prosesor lain, ada kemungkinan ukuran buffernya berbeda.

Library Arduino untuk komunikasi serial memiliki buffer FIFO untuk outgoing maupun incoming.

Hardware yang diperlukan:

  • Komputer Desktop PC / Laptop
  • Arduino Nano Atmega328
  • Kabel USB

Buffer Pengiriman

Ukuran buffer pengiriman yang tersisa dapat dicek dengan fungsi Serial.availableForWrite() . Pada kondisi awal seharusnya buffer yang tersisa adalah maksimal, karena belum ada karakter yang dikirim.

Contoh program:

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  int incomingByte ;
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);
  incomingByte = Serial.availableForWrite();
  Serial.print("jumlah available: ");
  Serial.println(incomingByte, DEC);
}

Output seperti sebagai berikut

14:42:26.343 -> jumlah available: 63

Artinya ukuran bufffer outgoing adalah 63 karakter

Buffer Penerimaan

Ukuran buffer data masuk (receive) dapat dicek dengan fungsi Serial.available

Contoh program

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  int incomingByte ;
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);
  incomingByte = Serial.availableForWrite();
  Serial.print("jumlah available: ");
  Serial.println(incomingByte, DEC);
}

Setelah itu kirimkan beberapa karakter dari PC ke Arduino. Angka yang ditampilkan akan naik, namun akan berhenti di suatu batas tertentu. Angka inilah yang menunjukkan ukuran buffer FIFO incoming.

Dari hasil percobaan didapatkan rekaman komunikas serial sebagai berikut

14:37:37.062 -> jumlah available: 0
14:37:39.051 -> jumlah available: 0
14:37:41.043 -> jumlah available: 30
14:37:43.038 -> jumlah available: 43
14:37:45.064 -> jumlah available: 54
14:37:47.057 -> jumlah available: 63
14:37:49.050 -> jumlah available: 63
14:37:51.042 -> jumlah available: 63
14:37:53.067 -> jumlah available: 63
14:37:55.058 -> jumlah available: 63
14:37:57.050 -> jumlah available: 63

Artinya jumlah data yang menunggu untuk dibaca oleh software adalah maksimum 63 karakter.

Referensi

ESP8266 NodeMCU

NodeMCU pinout

LED di port D2

NodeMCU Versi 0.9

Berikut ini foto development kit NodeMCU versi original [sumber]

NodeMCU Devkit v0.9 ESP8266
NodeMCU Devkit v0.9
Definisi Pin NodeMCU V0.9 ESP8266
Definisi Pin NodeMCU V0.9

Berikut ini skematik rangkaian NodeMCU versi 0.9 [sumber]

Skematik NodeMCU 0.9 ESP8266
Skematik NodeMCU 0.9

NodeMCU Versi 1.0

Berikut ini foto development kit NodeMCU V1.0 versi original [sumber]

NodeMCU Devkit v1.0 ESP8266
NodeMCU Devkit v1.0
NodeMCU ESP8266
NodeMCU ESP8266

Definisi pin NodeMCU menurut situs NodeMCU DEVKIT V1.0

Definisi Pin NodeMCU Devkit V1.0
Definisi Pin NodeMCU Devkit V1.0

Skema Rangkaian

Sumber: https://github.com/nodemcu/nodemcu-devkit-v1.0/blob/master/NODEMCU_DEVKIT_V1.0.PDF

Skema rangkaian NodeMCU Devkit V1.0 Konektor
Skema rangkaian NodeMCU Devkit V1.0 Konektor
Skema rangkaian NodeMCU Devkit V1.0 Catu Daya
Skema rangkaian NodeMCU Devkit V1.0 Catu Daya
Skema rangkaian NodeMCU Devkit V1.0 Serial
Skema rangkaian NodeMCU Devkit V1.0 Serial
Skema rangkaian NodeMCU Devkit V1.0 Inti
Skema rangkaian NodeMCU Devkit V1.0 Inti

 

Referensi