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);
}
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
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.
Arduino UNO R3, ESP32 Devkit-C , ESP32 Lolin32 Lite
Arduino UNO
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.
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
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 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.
erlu akses langsung ke interupsi pada mikroprosesor. Pada Raspberry Pi, interupsi diurus oleh sistem operasi, jadi tidak dapat diakses langsung oleh pengguna.
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.
#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 );
}
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:
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.
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.
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.
Pada serial monitor Arduino kita dapat mengaktifkan timestamp, sehingga kita dapat mengecek apakah pewaktuan pada sistem ini sudah sesuai dengan yang spesifikasi.
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.
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.
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.
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.
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]
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.
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:
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.
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.
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
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.
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
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
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
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
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.
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.
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 .
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.
Skema rangkaian NodeMCU Devkit V1.0 KonektorSkema rangkaian NodeMCU Devkit V1.0 Catu DayaSkema rangkaian NodeMCU Devkit V1.0 SerialSkema rangkaian NodeMCU Devkit V1.0 Inti
Referensi
Situs Resmi NodeMCU https://www.nodemcu.com/index_en.html