Perbedaan Arduino dan NodeMCU

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. Perangkat keras yang kompatibel dengan Arduino meliputi modul mikrokontroler buatan Arduino serta berbagai modul mikrokontroler lain yang sudah dibuat librarynya supaya kompatibel dengan Arduino. Bahasa pemrograman yang dipakai untuk mengembangkan aplikasi pada Arduino adalah C/C++.

NodeMCU adalah kerangka pengembangan IoT open source berbiaya murah. Perangkat NodeMCU meliputi firmware NodeMCU dan perangkat keras berbasis ESP32 dan ESP8266 yang kompatibel. Bahasa pemrograman yang dipakai untuk mengembangkan aplikasi pada NodeMCU adalah Lua

Pada awalnya yang disebut NodeMCU adalah software (firmware) tertentu yang dijalankan pada modul ESP8266 dan modul ESP-12. Saat ini NodeMCU juga dapat dijalankan di ESP32.

Arduino UNO (kiri), NodeMCU ESP8266 (kanan)
Arduino UNO (kiri), NodeMCU ESP8266 (kanan)

Hardware NodeMCU

Hardware NodeMCU ada yang berbasis ESP8266 dan ESP32.

NodeMCU berbasis ESP32 biasanya menggunakan board DevkitC

ESP32 DevkitC Clone tampak atas
ESP32 DevkitC Clone tampak atas

 

Referensi

  • https://en.wikipedia.org/wiki/NodeMCU
  •  

 

 

Perbedaan Arduino UNO dan Arduino Mega 2560

Berikut ini perbedaan utama antara Arduino UNO dan Arduino Mega

Parameter Arduino Uno Arduino Mega
Prosesor ATmega328 ATmega2560
Ukuran 68,6 mm x 53,4 mm 101,52 mm x  53,3 mm
Analog Input 6 16
Tegangan catu daya 6 sampai 20 volt DC, namun disarankan hanya 7 sampai 12 volt DC 7 sampai 12 volt DC
Pin untuk Digital Input/Output 14 (6 dengan fitur Pulse Width Modulation) 54 (6 dengan fitur Pulse Width Modulation)
Berat 25 g 37 g
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 256 kilobyte
SRAM 2 kilobyte 8 kilobyte
EEPROM 1 kilobyte 4 kilobyte

Kesamaan antara Arduino UNO dan Mega:

Parameter Nilai
Clock prosesor 16 MHz
Digital Input/Output 14
EEPROM 1 kilobyte
Tegangan kerja 5 volt
Konektor USB USB type B
Tegangan kerja 5 volt

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.

Arduino Mega 2560

Arduino Mega 2560 adalah modul mikrokontroler berbasis prosesor ATmega2560. Arduino Mega 2560 memiliki 54 pin input/output digital (15 di antaranya dapat digunakan sebagai output Pulse Width Modulation(PWM) / Modulasi Lebar Pulsa), 16 input analog, 4 UART (port serial perangkat keras), osilator kristal 16 MHz, koneksi USB, colokan catu daya, header ICSP (In Circuit Serial Programming), dan tombol reset. Modul berisi semua komponen yang diperlukan untuk menjalankan sistem mikrokontroler; Untuk mulai menggunakan/mengaktifkan, cukup dengan menyambungkan modul ini ke komputer dengan kabel USB atau nyalakan dengan adaptor AC-ke-DC atau baterai. Modul Arduino Mega 2560 kompatibel dengan sebagian besar perisai yang dirancang untuk Arduino UNO dan modul sebelumnya seperti Arduino Duemilanove atau Arduino Diecimila.

Arduino Mega 2560 adalah versi baru dari Arduino Mega. Perbedaan utama Arduino Mega 2560 dengan Arduino Mega adalah prosesor yang dipakai. Arduino Mega 2560  menggunakan prosesor ATmega 2560, sedangkan Arduino Mega menggunakan prosesor ATmega 1280.

Referensi

Perbedaan Arduino UNO dan Nano

Berikut ini perbedaan utama antara Arduino Uno dan Arduino Nano

Parameter Arduino Uno Arduino Nano
Ukuran 68,6 mm x 53,4 mm 18 mm x 45 mm
Konektor USB USB type B USB mini
Analog Input 6 8
Tegangan catu daya 6 sampai 20 volt DC, namun disarankan hanya 7 sampai 12 volt DC 7 sampai 12 volt DC
Pin untuk Digital Input/Output 14 (6 dengan fitur Pulse Width Modulation) 22 (6 dengan fitur Pulse Width Modulation)
Berat 25 g 7 g
Ukuran lebih besar, terutama dirancang untuk dipasangi Arduino Shield lebih kecil, terutama dirancang untuk dipasang di breadboard
     
     

Kesamaan antara Arduino UNO dan Nano:

Parameter Nilai
Prosesor ATmega328 (arsitektur AVR)
Clock prosesor 16 MHz
Digital Input/Output 14
EEPROM 1 kilobyte
SRAM 2 kilobyte
Flash memory 32 kilobyte ( 2 kilobyte  untuk boot loader)
   
   
   
Arduino UNO dan Arduino Nano
Arduino UNO (atas)  dan Arduino Nano (bawah)

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.

Berikut ini contoh Arduino UNO dengan sebuah shield tampilan LCD yang dirancang untuk dipasang di atas Arduino UNO.

TFT LCD 2.4" Shield untuk Arduino UNO
Arduino UNO di sebelah TFT LCD

Arduino Nano

Arduino Nano asli
Arduino Nano asli

Arduino Nano adalah rangkaian mikrokontroler berbasis ATmega328 dalam kemasan kecil, lengkap, dan mudah dipasang di breadboard. Ini memiliki fungsi yang kurang lebih sama dengan Arduino UNO, dengan bentuk yang lebih kecil. Arduino Nano tidak memiliki colokan listrik DC, dan konektor USB yang dipakai adalah USB mini-B, lebih kecil daripada USB type-A di Arduino UNO.

Berikut ini contoh Arduino Nano dipasang di sebuah breadboard.

Rangkaian Arduino Nano dan MCP4725 di breadboard
Rangkaian Arduino Nano dan MCP4725 di breadboard

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

 

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

 

 

IoT Pengukur Debu Dengan ESP32 dan Sensor Sharp GP2Y1010

Spesifikasi

 

// CJMCU-8118
#include <WiFi.h>           // WiFi control for ESP32
#include <ThingsBoard.h>    // ThingsBoard SDK
#include <esp_task_wdt.h>

// WiFi access point
#define WIFI_AP_NAME        "APNAME" // ganti dengan WIFI AP 
// WiFi password
#define WIFI_PASSWORD       "123456"  // ganti dengan WIFI AP password
#define TOKEN               "zRG1HN8w0PRydh5gV7Il"

#define LED_SENSOR 23
#define ADC_INPUT 34
#define BUILTIN_LED 2
#define WDT_TIMEOUT 60

// ThingsBoard server instance.
#define THINGSBOARD_SERVER  "192.168.0.114"

#include <Arduino.h>
#include <Wire.h>

// Initialize ThingsBoard client
WiFiClient espClient;
// Initialize ThingsBoard instance
ThingsBoard tb(espClient);
// the Wifi radio's status
int status = WL_IDLE_STATUS;

// main application loop delay (ms)
int quant = 20;

// Period of sending a temperature/humidity data.
int send_delay = 2000;

// Time passed after telemetry data was sent, milliseconds.
int send_passed = 0;

char mac_str[20]; // storing MAC address string
byte mac_byte[6]; // storing MAC address bytes

int led_counter = 0; //blinking built int led

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);
  pinMode(LED_SENSOR, OUTPUT);

  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(1000);
  Serial.print("Source Code: ");
  Serial.println(__FILE__);

  //wait for serial connection to open (only necessary on some boards)
  while (!Serial);

  WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
  InitWiFi();
  WiFi.macAddress(mac_byte);
  sprintf(mac_str, "%02x%02x%02x%02x%02x%02x", mac_byte[0], mac_byte[1], mac_byte[2], mac_byte[3], mac_byte[4], mac_byte[5]);
  Serial.print("ESP board MAC address:  ");
  Serial.println(WiFi.macAddress());
  Serial.print("ESP board  IP address: ");
  Serial.println(WiFi.localIP());

  // setup WDT
  esp_task_wdt_init(WDT_TIMEOUT, true); //enable panic so ESP32 restarts
  esp_task_wdt_add(NULL); //add current thread to WDT watch

}

void loop() {
  float temperature = 25;
  float pressure = 0;
  float humidity = 60; // default humidity
  float co2 = 0;
  float tvoc = 0;

  delay(quant);
  send_passed += quant;

  // Reconnect to WiFi, if needed
  if (WiFi.status() != WL_CONNECTED) {
    reconnect();
    return;
  }

  // Reconnect to ThingsBoard, if needed
  if (!tb.connected()) {
    // Connect to the ThingsBoard
    Serial.print("Connecting to: ");
    Serial.print(THINGSBOARD_SERVER);
    Serial.print(" with token ");
    Serial.println(TOKEN);
    if (!tb.connect(THINGSBOARD_SERVER, TOKEN)) {
      Serial.println("Failed to connect");
      return;
    }
  }

  // Check if it is a time to send sensor data
  if (send_passed > send_delay) {
    int dust;
    dust = DustRead();

    Serial.print("Sending telemetry data...");
    Serial.print("Dust ");
    Serial.print(dust);
    Serial.println("");
    tb.sendTelemetryFloat("dust", dust);
    send_passed = 0;
  }

  // Process messages
  tb.loop();

  led_counter++; // LED blink at 1 Hz
  if (led_counter > 50) {
    led_counter = 0;
  }
  if (led_counter > 25) {
    digitalWrite(BUILTIN_LED , LOW);
  } else {
    digitalWrite(BUILTIN_LED , HIGH);
  }
  esp_task_wdt_reset(); // WDT reset setelah berhasil mengirim data
}

void I2C_Scan() {
  byte error, address;

  int nDevices;
  Serial.println("I2C Scanning...");
  nDevices = 0;
  for (address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
      nDevices++;
    }
    else if (error == 4) {
      Serial.print("Unknow error at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
}

void InitWiFi()
{
  Serial.println("Connecting to AP ...");
  // attempt to connect to WiFi network

  WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Connected to AP");
}

void reconnect() {
  // Loop until we're reconnected
  status = WiFi.status();
  if ( status != WL_CONNECTED) {
    WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("Connected to AP");
  }
}

int DustRead() {
  int sensorValue;
  // read the analog in value:
  digitalWrite(LED_SENSOR, HIGH);
  delayMicroseconds(280);
  sensorValue = analogRead(ADC_INPUT); // measurement 280 us after signal start
  delayMicroseconds(40); // total signal duration 320 us
  digitalWrite(LED_SENSOR, LOW); // turn off LED

  // print the results to the Serial Monitor:
  Serial.print("sensor = ");
  Serial.println(sensorValue);
  return sensorValue;
}

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

Mikroprosesor dan Mikrokontroler Populer

 

Beberapa mikroprosesor dan mikrokontroler populer zaman sekarang. Dari kiri: Arduino Nano, ESP32, Raspberry Pi 4, Jetson Nano. Arduino Nano dengan clock 16 MHz, mikrokontroler yang sangat populer di kalangan hobi elektronika. ESP32 punya 2 prosesor dengan clock 240 MHz. ESP32 ini komputasinya lebih powerful dibandingkan Arduino Nano, plus ada kemampuan WiFi. Populer untuk membuat aplikasi IoT (Internet of Things). Raspberry Pi prosesornya dari keluarga ARM sebanyak 4 core, clock 1 GHz, sistem operasinya Linux. Dapat dipakai menjalankan aplikasi Linux yang tidak terlalu besar. Jetson Nano berisi prosesor ARM dan dilengkapi dengan GPU (Graphical Processing Unit). Cocok untuk menjalankan aplikasi AI (Artificial Intelligence) dari jenis Deep Neural Network / Deep Learning.

Mikroprosesor/mikrokontroler ini perubahannya cepat sekali. Zaman 1990an ketika saya kuliah, benda-benda ini belum ada. Mikroprosesor yang diajarkan di kuliah masih pakai Z80 / 8051. Sekarang tiap tahun mesti ngintip-ngintip perkembangan terbaru. Kalau kuliah dasar seperti rangkaian listrik & medan elektromagnetik isinya praktis tidak berubah

Rangkaian Pengkondisi Sinyal Untuk ADC

Sinyal dari sensor dapat memiliki rentang tegangan besar, rentangan tegangan kecil ataupun tegangan negatif dan positif. ADC pada mikroprosesor umumnya hanya dapat menerima input tegangan positif dengan rentang tegangan terbatas. Untuk itu sinyal dari sensor perlu diperkuat/diperlemah, dan digeser supaya tepat dengan rentang tegangan ADC.

Skema Rangkaian

Berikut ini contoh rangkaian untuk melakukan pengkondisian sinyal tersebut.

Rangkaian Pengkondisi Sinyal ADC dengan 3 buah op-amp
Rangkaian Pengkondisi Sinyal ADC

Dasar Teori

Rangkaian ini terdiri dari 3 bagian:

  • inverting amplifier
  • buffer amplifier
  • summing amplifier

Inverting amplifier

Komponen IC1 berfungsi sebagai inverting amplifier. Menguatkan input dan membalik polaritasnya.

Berikut ini bentuk dasar rangkaian inverting Inverting amplifier

 

Buffer amplifier

Detail dan rumus-rumus terkait dapat dipelajar di Inverting Amplifier

Buffer amplifier

Komponen IC2 berfungsi sebagai buffer

Summing amplifier

Detail dan rumus-rumus buffer amplifier dapat dipelajari di Buffer Amplifier

Komponen IC3 berfungsi sebagai summing amplifier / adder  / penjumlah.

Detail dan rumus-rumus summing amplifier dapat dipelajari di Summing Amplifier

Cara Kerja

Cara kerja rangkaian adalah sebagai berikut

Rangkaian ini terdiri dari 3 buah op-amp. Op-amp yang digunakan adalah LM358. Power supply plus minus 12 volt, dari DC to DC converter.

IC1 berfungsi sebagai penguat/peredam inverting.  Penguatan/peredaman dapat diatur dengan menggunakan potensiometer VR1. Total penguatan/redaman dapat dihitung berdasarkan nilai R1 dan VR1.

Tegangan untuk menggeser naik-turun tegangan dihasilkan oleh VR2. Pada contoh ini sumber tegangan menggunakan power supply -12 volt. Jika diinginkan ketelitian lebih tinggi, sumber tegangan dapat menggukan dioda zener atau sumber tegangan referensi yang lebih baik. Pada contoh ini tegangan penggeser adalah negatif, karena hanya diperlukan penaikan tegangan  Jika diinginkan juga penurunan tegangan, maka tegangan referensi yang diperlukan adalah plus minus 12 volt.

IC2 berfungsi sebagai buffer dari VR2. Jika tidak ada IC2, resistansi dari VR2 dapat mempengaruhi penguatan summing amplifier, karena resistansi dari VR2 akan diseri dengan R3.

Sinyal hasil penguatan/peredaman dan sinyal penggeseran dijumlahkan dengan menggunakan IC3. IC3 dikonfigurasikan sebagai op-amp penjumlah inverting.

Pada contoh ini semua resistor yang digunakan sama, 1k ohm untuk memudahkan pembuatan dan perhitungan.

Untuk lebih amannya , pada bagian output perlu dipasang dioda clamp, supaya tegangan output tidak melebihi batas maksimum dan minimum ADC pada mikrokontroler.

Foto Alat

Pada percobaan ini, digunakan sinyal dengan frekuensi 50 Hz dan tegangan amplitudo 1 volt.

Sumber sinyal dengan generator sinyal GW Instek AFG-2012.

Pengukuran sinyal dengan Osiloskop GW Instek GDS-1152-U

Sumber sinyal dari generator sinyal GW Instek AFG 2012
Generator sinyal
 

Implementasi rangkaian dengan breadboard, sebagai berikut:

Percobaan rangkaian pengkondisi sinyal dengan breadboard
Rangkaian dengan breadboard
Suasana percobaan
Suasana percobaan

Foto Sinyal

Berikut ini contoh sinyal yang dihasilkan.

Pertama-tama sinyal dengan penggeseran tanpa penguatan.

Contoh geser naik saja
Contoh geser naik saja

Sinyal input pada kanal 1, dengan warna kuning. Sinyal output pada kanal 2, dengan warna biru.

Berikut ini sinyal yang diredam, dan digeser naik ke positif.

Contoh redaman dan geser naik
Contoh redaman dan geser naik

Berikut ini sinyal dengan penguatan dan penggeseran naik.

Contoh penguatan dan geser naik
Contoh penguatan dan geser naik

 

Arduino Nano memerlukan tegangan ADC antara 0~5 volt atau 0~1,1 volt, tergantung setting tegangan referensi ADC tersebut. Arduino Nano KW biasanya tegangan VCC nya adalah kurang dari 5 volt, sekitar 4,6 volt. Untuk itu perlu tegangan input ADC antara 0 ~ 4 volt. Berikut ini contoh sinyal (biru) yang sudah cocok untuk rentang tersebut.

Contoh penguatan dan geser naik
Contoh penguatan dan geser naik untuk Arduino

Output dari op-amp dibatasi oleh tegangan supply. Percobaan berikut menunjukkan apa yang terjadi jika output mengalami saturasi. 

Output saturasi
Output saturasi

Output (warna biru) mengalami saturasi di 7.12 volt. Tegangan supply positif yang dipakai adalah 9 volt. Datasheet LM358 menunjukkan bahwa LM358 memiliki ‘voltage output swing to rail’ sebesar 1.35 volt sampai 1,61 volt tergantung arus output. Hasil pengukuran menunjukkan jarak antara output ke VCC adalah 1,88 volt, masih di sekitar angka yang ditunjukkan di datasheet LM358.

Referensi

 

Arduino UNO Dengan Display LCD 20×4 (serial I2C)

Berikut ini percobaan menghubungkan Arduino UNO (ATmega328) dengan display LCD 20×4. Antar muka menggunakan komunikasi serial I2C. LCD 20×4 menggunakan protokol serial, sehingga perlu modul I2C. Antara Arduino Nano dan LCD 20×4 dipasang modul serial to paralel PCF8574 untuk menghubungkan protokol I2C ke paralel input/output.

Hasil antar muka Arduino UNO ke LCD 20×4 dengan I2C

Arduino UNO secara praktis sama saja dengan Arduino Nano, jadi cara menyambungnya sama seperti pada artikel “Arduino Nano Dengan Display LCD 20×4 (serial I2C)“.

Berikut fisik penyambungan kabel I2C antara Arduino UNO dengan modul PCF8574.

Sambungan I2C antara Arduino UNO dan LCD 20x4
Sambungan I2C antara Arduino UNO dan LCD 20×4

 

// sumber: https://github.com/johnrickman/LiquidCrystal_I2C/blob/master/examples/HelloWorld/HelloWorld.pde
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
  lcd.init();                      // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Elektrologi");
  lcd.setCursor(0, 1);
  lcd.print("iptek.web.id");
  lcd.setCursor(0, 2);
  lcd.print("Arduino UNO");
  lcd.setCursor(0, 3);
  lcd.print("31 Januari 2021");
}


void loop()
{
}

Arduino Nano

Arduino Nano adalah modul berbasis mikrokontroler ATmega328 dalam bentuk rangkaian yang kecil, lengkap, mudah dipasang di breadboard. Modul ini dapat diprogram melalui kabel USB Mini-B.

Rangkaian Arduino Nano dan MCP4725 di breadboard
Rangkaian Arduino Nano dan MCP4725 di breadboard

Spesifikasi

Microcontroller ATmega328
Architecture AVR
Operating Voltage 5 V
Flash Memory 32 KB of which 2 KB used by bootloader
SRAM 2 KB
Clock Speed 16 MHz
Analog IN Pins 8
EEPROM 1 KB
DC Current per I/O Pins 40 mA (I/O Pins)
Input Voltage 7-12 V
Digital I/O Pins 22 (6 of which are PWM)
PWM Output 6
Power Consumption 19 mA
PCB Size 18 x 45 mm
Weight 7 g
   

Daftar Pin pada Arduino Nano

Daftar pin Arduino Nano
Daftar pin Arduino Nano

Sumber:

 

 

Arduino Nano Dengan Display LCD 20×4 (serial I2C)

Berikut ini percobaan menghubungkan Arduino Nano (ATmega328) dengan display LCD 20×4. Antar muka menggunakan komunikasi serial I2C. LCD 20×4 menggunakan protokol serial, sehinggan perlu modul I2C. Antara Arduino Nano dan LCD 20×4 dipasang modul serial to paralel PCF8574 untuk menghubungkan protokol I2C ke paralel input/output.

Blok diagram sistem adalah sebagai berikut:

Sumber daya dapat menggunakan USB dari komputer ataupun USB charger. Sumber daya dihubungkan ke Arduino Nano menggunakan kabel USB. Arduino Nano dihubungkan ke modul PCF8574 menggunakan komunikasi I2C. Modul PCF8574 dihubungkan ke LCD 20×4 menggunakan komunikasi data paralel.

Arduino Nano dengan display lCD 20x4
Arduino Nano dengan display LCD 20×4

Berikut ini modul PCF8752 dipasang di bagian belakang LCD:

LCD 20x4 tampak belakang
LCD 20×4 tampak belakang dengan komunikasi serial I2C

Pada modul PCF8574 terdapat potensiometer berwarna biru. Potensiometer ini fungsinya adalah mengatur kontras pada LCD 20×4

Penyambungan memperhatikan daftar pin Arduino Nano sebagai berikut:

Daftar pin Arduino Nano  yang lebih detail
Daftar pin Arduino Nano

Kaki yang dipakai pada Arduino Nano adalah SDA (A4) dan SCL (A5). Pin SDA dan SCL pada Arduino Nano sudah tetap, tidak dapat diganti-ganti.

Tegangan kerja Arduino Nano adalah 5 volt. Tegangan kerja LCD 20×4 adalah 5 volt, sehingga dapat langsung menggunakan tegangan 5 volt dari modul Arduino Nano. Tegangan kerja PCF8574 adalah 2,5 volt sampai dengan 6 volt, sehingga aman kalau disambung ke Arduino Nano.

Penyambungan kabel sebagai berikut

Pin pada Modul PCF8752 Pin Arduino Nano
GND GND
VCC 5V
SDA SDA (A4)
SCL SCL (A5)

Sebelum dicoba ke LCD, sebaiknya diuji dulu apakah sambungan I2C sudah betul , menggunakan perangkat lunak I2C Scanner.

Prosedur instalasi library LCD I2C sebagai berikut:

  • Download library Liquid Crystal I2C buatah John Rickman https://github.com/johnrickman/LiquidCrystal_I2C
  • Install library tersebut di direktori library Arduino. Biasanya letaknya di Documents/Arduino/libraries atau C:\Users\<USERNAME>\Documents\Arduino\libraries

Contoh program dapat dilihat dari https://github.com/johnrickman/LiquidCrystal_I2C/blob/master/examples/HelloWorld/HelloWorld.pde

Untuk membuat tampilan seperti pada foto, buat program Arduino berikut ini:

// sumber: https://github.com/johnrickman/LiquidCrystal_I2C/blob/master/examples/HelloWorld/HelloWorld.pde
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
  lcd.init();                      // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Elektrologi");
  lcd.setCursor(0, 1);
  lcd.print("iptek.web.id");
  lcd.setCursor(0, 2);
  lcd.print("Arduino Nano");
  lcd.setCursor(0, 3);
  lcd.print("31 Januari 2021");
}


void loop()
{
}

Referensi

  • LCD 20×4
  • https://github.com/johnrickman/LiquidCrystal_I2C/tree/master/examples/HelloWorld

Pengisi Botol Otomatis

Dalam proses produksi, kadang-kadang kita perlu mengisi suatu cairan ke wadah dengan volume tertentu. Untuk itu dapat menggunakan mesin otomatis ‘liquid filling machine’ seperti berikut ini:

Liquid Filling Machine
Liquid Filling Machine

Prinsip kerja alat tersebut adalah memompa cairan dengan durasi tertentu. Jika pompa menghasilkan tekanan dan aliran yang konsisten, maka volume air yang diisi akan sebanding dengan durasi pompa menyala.

Untuk memastikan volume yang dimasukkan tepat, ada beberapa cara:

  • menggunakan flow meter untuk mengukur total cairan yang sudah mengalir
  • menggunakan sensor ketinggian air untuk mengukur tinggi cairan dalam wadah
  • sensor berat untuk mengetahui total cairan di dalam wadah
  • menggunakan pompa yang dinyalakan dengan durasi tertentu. Jika tekanan dan aliran dari pompa konsisten, maka total cairan dalam wadah dapat diatur.

Pada percobaan ini untuk memastikan volume yang tepat dipakai durasi pompa. Pertimbangannya:

  • flow meter yang teliti cukup mahal
  • sensor ketinggian air mahal dan repot kalau dipakai pada botol yang kecil
  • sensor berat (load cell) cukup mahal
  • dari video-video pengisi botol otomatis, rata-rata menggunakan durasi, tidak menggunakan sensor lain.
  • Pengendalian durasi pompa cukup mudah

Berikut ini contoh sistem sederhana untuk mengisi cairan.

Cara Kerja

Air disediakan di sebuah wadah. Air dipompa dengan pompa air DC 12 volt. Air dari pompa dialirkan ke botol tujuan. Spesifikasi pompa dan selang yang dipakai dapat disesuaikan dengan keadaaan. Pada percobaan ini kebetulan yang tersedia adalah pompa DC 12 volt.

Untuk mengendalikan durasi nyala pompa, dipakai mikroprosesor Arduino. Untuk memulai pengisian, digunakan sebuah tombol (push button). Arduino tidak cukup kuat untuk menyalakan pompa, maka tegangan output dari Arduino dipakai untuk mengendalikan sebuah relay 5 volt. Catu daya untuk pompa diperoleh dari jala-jala listrik 220 volt AC , yang diubah menjadi tegangan 12 volt dengan sebuah power supply switching dengan output 12 volt 5 ampere.

Pompa air DC yang dipakai memerlukan tegangan 12 volt dan arus 3,5 ampere, sehingga power supply yang dipakai juga harus menyesuaikan.

Berikut ini komponen yang dipakai pada percobaan ini.

Sistem Pengisi Air
Sistem Pengisi Air

Komponen Utama

Berikut ini uraian komponen-komponen utama yang dipakai

pompa air sakai input socket, output drat
Pompa air Sakai dengan input socket, output drat

Komponen utama adalah pompa air Sakai DC 12 volt , 3,5 ampere. Untuk menyalakan pompa ini diperlukan power supply 12 volt 5 ampere.

Power supply Thunderin 12 volt 5 ampere
Power supply merek Thunderin 12 volt 5 ampere

Berikutnya adalah relay 5 volt. Arduino tidak dapat langsung memberikan tegangan 12 volt dan 3,5 ampere, sehingga diperlukan bantuan relay. Relay ini dikendalikan oleh tegangan 5 volt dari Arduino, dengan tegangan yang dikendalikan adalah 12 volt untuk pompa. Rating arus juga cukup untuk mengendalikan 3,5 ampere pada pompa air.

Relay 5 volt
Relay 5 volt

Sebagai pengendali adalah Arduino Nano. Pada percobaan ini rangkaian dipasang di breadboard. Proses komputasi pada sistem ini tidak banyak, sehingga prosesor ATmega328 di Arduino Nano sudah cukup.

Arduino Nano specimen 1
Arduino Nano

Sebagai pengganti botol dipakai gelas ukur 500 ml. Volume air yang diisi dapat langsung dilihat di gelas ukur tersebut.

Gelas ukur 500 mililiter
Gelas ukur 500 mililiter

Video

Berikut ini tautan video percobaan pengisian. Suara pompa air cukup keras. Pada sistem ini, pompa air dinyalakan selama 10 detik. Air yang terpompa selama 10 detik adalah sekita 350 ml.

Sistem yang dibuat masih berupa proof of concept saja.

Perbaikan yang masih diperlukan:

  • Menu dan tampilan untuk mengubah durasi / volume yang diinginkan. Dapat ditambahkan display / LCD yang sesuai.
  • Kotak yang lebih representatif
  • Pengamanan seperti sekring / pembatas arus
  • Suara / lampu untuk menandakan pengisian air sudah selesai
  • Deteksi terjadinya gangguan-gangguan seperti kebocoran air, arus lebih dan sebagainya.

Referensi

  • Pompa air Sakai
  • Arduino Nano ORI
  • Arduino Nano KW
  • Relay Semikonduktor
  • Power Supply Thunderin 12 volt 5 ampere
  • Easy Fill Manual Bottle Filling Machine https://www.youtube.com/watch?v=6x0GVpDqFh8
  • Pengisian cairan dengan meja putar https://www.youtube.com/watch?v=MpqrR-Boeoo
  • Mini Pinch Filler https://www.youtube.com/watch?v=Z0vZwbCHT-8