Perbedaan Antara Resistor dan Transistor

Resistor adalah komponen pasif dua terminal yang memiliki sifat melawan arus. Transistor adalah komponen aktif dari bahan semikonduktor yang berfungsi sebagai penguat atau sakelar.

Resistor

Resistor di bidang elektronika adalah komponen pasif yang memiliki tahanan listrik di dalamnya. Resistor tersusun dari material konduktor listrik. Resistor memiliki dua terminal. Hubungan antara arus dan tegangan pada resistor mengikuti hukum ohm sebagai berikut:

V = I x R

Dengan:
V: tegangan listrik dengan satuan volt (V)
I: arus listrik dengan satuan ampere (A)
R: resistansi pada resistor dengan satuan ohm (Ω)

Berikut ini contoh komponen resistor dalam berbagai bentuk dan ukuran.

Macam-macam resistor

Transistor

Berikut ini contoh foto transistor:

Parameter Resistor Transistor
Peranan menghambat arus listrik penguat atau sakelar
Jumlah kutub 2 umumnya 3
Persamaan matematis V = I x R  
Bahan / material karbon, thick film, thin film, metal film, metal oxide film, wire wound, metal foil semikonduktor seperti silikon , germanium dan sebagainya
Menyimpan energi tidak tidak
Aktif/pasif pasif aktif
     
     
     

Referensi

 

 

Perbedaan Antara Resistor, Kapasitor dan Induktor

Resistor adalah komponen elektronika yang sifatnya menghambat arus listrik, Kapasitor adalah komponen elektronika yang sifatnya menyimpan energi dalam bentuk medan listrik. Induktor adalah komponen elektronika yang sifatnya menyimpan energi dalam bentuk medan magnetik pada arus yang mengalir.

Kapasitor dikenal juga sebagai kondensator.

 

Berikut ini penjelasan lebih panjang dari hal tersebut.

Resistor

Resistor di bidang elektronika adalah komponen pasif yang memiliki tahanan listrik di dalamnya. Resistor tersusun dari material konduktor listrik. Resistor memiliki dua terminal. Hubungan antara arus dan tegangan pada resistor mengikuti hukum ohm sebagai berikut:

V = I x R

Dengan:
V: tegangan listrik dengan satuan volt (V)
I: arus listrik dengan satuan ampere (A)
R: resistansi pada resistor dengan satuan ohm (Ω)

Berikut ini contoh komponen resistor dalam berbagai bentuk dan ukuran.

Macam-macam resistor

Kapasitor

Kapasitor/kondensator di bidang elektronika dalah komponen pasif yang menyimpan energi listrik dalam bentuk medan listrik. Kapasitor tersusun dari 2 keping penghantar listrik yang dipisahkan oleh bahan isolator listrik.

Hubungan antara muatan listrik dan tegangan pada kapasitor adalah sebagai berikut:

C = Q / V
Dengan:
C: nilai kapasitansi kapasitor dengan satuan farad (F)
Q: muatan listrik dengan satuan coulomb (C)
V: tegangan listrik dengan satuan volt (V)

Berikut ini kapasitor dalam berbagai bentuk:

Induktor

Induktor adalah komponen elektronika pasif yang dapat menyimpan energi pada medan magnet yang ditimbulkan oleh arus listrik yang melintasinya.

Berikut ini beberapa contoh komponen induktor.

Beberapa macam induktor

 

Parameter Resistor Kapasitor Induktor
Peranan menghambat arus listrik menyimpan energi dalam medan listrik menyimpan energi dalam medan magnet
Jumlah kutub 2 2 2
Persamaan matematis V = I x R C = Q / V  
Bahan / material karbon, thick film, thin film, metal film, metal oxide film, wire wound, metal foil multilayer ceramic, ceramic disc, multilayer polyester film, polystyrene, aluminium electrolytic konduktor umumnya dalam bentuk gulungan. Sering diberi inti dari bahan feromagnetik
Menyimpan energi tidak dalam medan listrik dalam medan magnet
Aktif/pasif pasif pasif pasif
       
       
       

 

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 lalu lintas untuk kendaraan dan penyeberang jalan dengan model extended state machine

Model sistem diambil dari Example 5.8 di buku Lee & Seshia “Introduction to Embedded Systems”

Berikut ini model untuk lampu lalu lintas

 

Berikut ini model untuk lampu bagi penyeberang jalan.

Berikut ini semantik gabungan dari lampu untuk mobil dan penyeberang jalan:

Implementasi: masih under construction

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

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 On Off Dengan 1 Sakelar

Pada artikel ini diuraikan membuat sistem mikrokontroler untuk mengendalikan lampu berdasarkan sebuah sakelar. Lampu dinyalakan dengan menekan tombol satu kali. Lampu dimatikan dengan cara menekan tombol agak lama.

Kebutuhan Sistem

  • Input switch push-button
  • Output 1 buah LED
  • Tombol ditekan sekali secara singkat untuk menyalakan lampu
  • Tombol ditekan dan ditahan selamat 1 detik untuk mematikan lampu

Diagram Blok Sistem secara umum sebagai berikut

Skenario sistem

Untuk memperjelas sistem yang akan dibuat, perlu dibuat dulu beberapa skenario yang dapat terjadi pada sistem ini.

  1. LED mati: ditekan 1x pendek (kurang dari 1 detik) maka LED menyala
  2. LED mati: ditekan 1x panjang (lebih dari 1 detik) -> LED menyala
  3. LED menyala: ditekan & ditahan selama 1 detik -> LED mati
  4. LED menyala: ditekan kurang dari 1 detik -> LED tetap menyala
  5. LED menyala: ditekan & ditahan selama lebih dari 1 detik -> LED mati dalam 1 detik, setelah itu tetap mati
  6. LED menyala: switch ditekan berkali-kali pendek -> LED tetap menyala (frekuensi di bawah batas tertentu)
  7. LED mati: switch ditekan berkali-kali pendek -> LED menyala dan tidak mati (frekuensi di bawah batas tertentu)

Hal-hal yang tidak diperhatikan pada sistem ini:

  • prosedur mematikan/menyalakan sistem
  • keadaan baterai habis. Untuk sistem yang menggunakan baterai isi ulang (rechargeable), seharusnya ada mekanisme untuk mencegah baterai betul-betul habis.

Berikut ini Diagram Skenario 1
LED mati: ditekan 1x pendek (kurang dari 1 detik) maka LED menyala

Diagram Skenario 2: LED mati: ditekan 1x panjang (lebih dari 1 detik) -> LED menyala

Diagram skenario 3: LED menyala: ditekan & ditahan selama 1 detik -> LED mati

Skenario 4 LED menyala: ditekan kurang dari 1 detik -> LED tetap menyala

LED menyala: ditekan & ditahan selama lebih dari 1 detik -> LED mati dalam 1 detik, setelah itu tetap mati

Skenario Ekstra 6

Skenario Ekstra 7

Strategi/Algoritma:

  1. Kondisi awal mati
  2. Tunggu ada tombol ditekan. Jika ada , nyalakan lampu.
  3. Tunggu tombol ditekan lama. Jika ada, matikan lampu. Abaikan input lain.
  4. Kembali ke (2)

Model State Chart

Sketsa state chart

State diagram sistem versi final

Implementasi Perangkat Keras

Implementasi Perangkat Lunak

Kode implementasi dapat dilihat di https://github.com/waskita/embedded/blob/master/on-off-switch/nano-on-off/nano-on-off.ino

Pengujian

 

 

 

 

Contoh Implementasi Finite State Machine Dengan Mikrokontroler

Berikut ini beberapa contoh implementasi FSM dengan mikrokontroler. Urutan contoh ini mulai dari yang paling mudah, sampai yang paling sulit.

  1. Lampu kedip berbasis FSM dengan delay. Pada contoh ini dibuat lampu kedip dengan duty cycle 50%
  2. Lampu kedip berbasis FSM dengan interupsi Timer 1
  3. Lampu kedip berbasis FSM dengan FreeRTOS
  4. Lampu kedip duty cycle 10% dengan model FSM biasa
  5. Lampu kedip duty cycle 10% dengan model Extended State Machine
  6. Lampu on-off (toggle) dengan input switch
  7. Lampu on-off (toggle) dengan fitur debounce dan model extended state machine
  8. Lampu on-off (toggle) dengan fitur debounce dan model cascade composition
  9. Lampu on off (tekan lama) dengan extended state machine
  10. Lampu on-off (tekan ganda)
  11. Lampu on-off dengan 2 tombol
  12. Lampu lalu lintas jalan dengan extended state machine. Contoh ini adalah implementasi Example 3.9 di buku Lee & Seshia “Introduction to Embedded Systems”.
  13. Lampu lalu lintas untuk kendaraan dan penyeberang jalan dengan model extended state machine.  Contoh ini adalah implementasi Example 5.9 di buku Lee & Seshia “Introduction to Embedded Systems”.
  14. Lampu geser dengan arsitektur event triggered
  15. Lampu geser dengan arsitektur time triggered
  16. Kendali pintu otomatis dengan supervisory control

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”

 

 

Unit Test untuk C/C++

Berikut ini beberapa library unit test untuk bahasa pemrograman C atau C++

Unity Unit Test

CppUTest

Google Test

 

Aplikasi Untuk Menggambar Rangkaian Elektronika

Berikut ini beberapa aplikasi untuk menggambar rangkaian elektronika.

Falstadt

Alamat situs: https://www.falstad.com/circuit/

Aplikasi ini hanya ada versi online.

Aplikasi ini dapat dipakai untuk menggambar rangkaian dan animasi simulasi rangkaian.

Logicly

Alamat website: https://logic.ly/

Aplikasi ini berbayar. Ada versi demonya di https://logic.ly/demo

Aplikasi ini hanya ada versi online.

Aplikasi ini dapat dipakai untuk menggambar rangkaian dan animasi simulasi rangkaian.

Logisim

Alamat website: http://www.cburch.com/logisim/

Aplikasi ini diinstall di desktop.