Berapa Tegangan Kerja Arduino

Berapakah tegangan kerja Arduino?

Tegangan kerja untuk Arduino Nano dan Arduino UNO adalah 5 volt. Tegangan yang dapat diberikan ke pin-pin Arduino adalah minimum 0 volt, maksimum 5 volt. Perkecualian adalah sebagai berikut: pin RESET dapat menerima tegangan sampai 13 volt. Pin VIN dapat menerima tegangan sampai 20 volt karena di pin tersebut ada regulator DC untuk mengubah tegangan masuk menjadi 5 volt.

Arduino Nano dan Arduino UNO menggunakan prosesor ATmega328. Batas maksimum tegangan pada ATmega328 dapat dilihat di datasheet prosesor ATmega328, di bagian “Absolute Maximum Ratings”. Kutipannya sebagai berikut:

ATmega328 absolute maximum rating
ATmega328 absolute maximum rating

Tegangan pada VIN atau POWER IN tidak langsung dihubungkan ke prosesor ATmega328, melainkan melalui regulator DC. Jadi tegangan maksimumnya tergantung komponen regulator DC yang dipakai.

Pin POWER IN dihubungkan ke regulator 5 volt (NCP1117 pada Arduino UNO dan UA78M05 pada Arduino Nano). NCP1117 maksimal menerima tegangan input 20 volt. UA7805 maksimal menerima input 25 volt. Jika tegangan POWER IN melebihi batas ini, maka regulator 5 volt tersebut akan rusak.

Batas tegangan maksimum pada NCP1117 dapat dibaca pada datasheetnya sebagai berikut:

Tegangan maksimum pada NCP1117
Tegangan maksimum pada NCP1117

Batas tegangan maksimum pada UA78M05 dapat dibaca pada datasheetnya sebagai berikut:

Tegangan maksimal pada UA7805
Tegangan maksimal pada UA7805


Referensi

Apa perbedaan pin analog dan digital pada Arduino?

Berikut ini perbedaan pin analog dan digital pada Arduino adalah sebagai berikut:

  • Pin analog menerima sinyal listrik berupa tegangan analog. Tegangan ini diubah oleh ADC (Analog to Digital Converter) menjadi angka digital. ADC pada Arduino UNO dan Arduino Nano memiliki resolusi 10 bit, jadi tegangan analog tersebut akan dibaca oleh perangkat lunak sebagai angka integer 0 sampai dengan 1023.
  • Pin digital pada Arduino menerima sinyal listrik digital. Tegangan pada pin digital akan dibaca oleh perangkat lunak sebagai angka 0 (jika input tegangan rendah mendekati 0 volt) atau 1 (jika input tegangan tinggi mendekati 5 volt).

Sinyal input pada pin analog dibaca dengan fungsi analogRead(), hasilnya adalah angka integer dari 0 sampai 1023.

Sinyal input pada pin digital dibaca dengan fungsi digitalRead(), hasilnya adalah angka 0 atau 1.

Pin analog pada Arduino UNO dan Nano dapat difungsikan sebagai input analog maupun digital.

Pin digital pada Arduino UNO dan Nano hanya dapat difungsikan sebagai input digital.

Referensi

Apa yang dimaksud dengan pin pada Arduino?

Yang dimaksud dengan pin pada Arduino adalah kontak elektrik yang terdapat pada modul Arduino. Kontak elektrik ini berfungsi untuk menyambungkan sinyal listrik dari modul Arduino ke perangkat lain di luar Arduino.

Berikut ini foto pin berbentuk batang-batang serupa jarum pada Arduino Nano

Arduino Nano tampak samping
Arduino Nano tampak samping

Setiap pin pada Arduino tersebut memiliki fungsi tertentu yang berbeda-beda. Untuk mengetahui fungsinya kita mesti membaca datasheet dari modul Arduino tersebut.

Berikut ini adalah daftar fungsi setiap pin pada Arduino Nano

Kontak elektrik pada Arduino UNO menggunakan lubang-lubang, bukan berupa pin. Berikut ini foto Arduino UNO dengan kontak elektrik berupa plastik hitam yang di dalamnya terdapat kontak elektrik.

Referensi

  • Arduino Nano Pinout https://docs.arduino.cc/hardware/nano
  • Datasheet Arduino Nano https://docs.arduino.cc/resources/datasheets/A000005-datasheet.pdf
  • Electrical Connector https://en.wikipedia.org/wiki/Electrical_connector

 

 

 

 

Pengukuran Frekuensi ADC pada Arduino Nano ATmega328

Pengukuran Frekuensi ADC internal pada Arduino Nano ATmega328

berikut ini kode yang dipakai untuk pengukuran

int counter;  // how many iterations
int time_begin = 0;
int time_end = 0;
int duration;

int sensorPin = A0;   // select the input pin for the potentiometer
int ledPin = 13;      // select the pin for the LED

void setup() {
  Serial.begin(115200);
  counter = 0;
  pinMode(2, OUTPUT);
  Serial.println("start benchmark");
}
//---------------------------------------------------
void loop() {
  int value;  // angka yang ditulis
  value = 0;  // minimum value
  analogRead(sensorPin);
  PORTD=0; // langsung akses port supaya lebih cepat
  analogRead(sensorPin);
  PORTD=255;
  counter = counter + 1;
  if (counter >= 10000) {
    float period;
    int time_now = millis();
    counter = 0;
    duration = time_now - time_begin;
    period = duration / 10000.0 /2;
    Serial.print("period (ms): ");
    Serial.println(period);
    //  prepare next round
    time_begin = time_now;
  }
}

Hasil Pengukuran

Pengukuran output pada pin D2 dengan osiloskop menghasilkan sinyal berikut

Dari data port serial, didapatkan angka perioda 0,11 ms

start benchmark
period (ms): 0.11
period (ms): 0.11
period (ms): 0.11
period (ms): 0.11
period (ms): 0.11

Dengan osiloskop didapatkan sinyal kotak dengan frekuensi 4,45532 kHz . Artinya frekuensi ADC adalah dua kalinya, yaitu 8,91064 kHz

Angka 8900 Hz ini sesuai dengan pengukuran di artikel lain: https://chisight.wordpress.com/2016/03/25/speeding-up-the-adc-on-an-arduino-atmega-328p/

Kesimpulan

Frekuensi ADC adalah 8,91064 kHz

Frekuensi ini jauh di bawah kecepatan teoritis. Kemungkinan kelambatan karena library yang dipakai.

Referensi

  • Open Music Labs : ATmega ADC
  • https://www.ee-diary.com/2022/08/programming-atmega328p-adc-in-c.html#
  • https://chisight.wordpress.com/2016/03/25/speeding-up-the-adc-on-an-arduino-atmega-328p/
  • Kode di https://github.com/waskita/embedded/tree/master/nano-adc

Frekuensi DAC MCP4725 pada Arduino Nano ATmega328

Pada percobaan ini diukur frekuensi & perioda konversi DAC (Digital to Analog Converter) tipe MCP4725  pada modul Arduino Nano dengan prosesor ATmega328.

Rangkaian sistem adalah sebagai berikut

 

Kode yang dipakai untuk pengujian adalah sebagai berikut:

// idea from https://learn.sparkfun.com/tutorials/mcp4725-digital-to-analog-converter-hookup-guide/all
#define MCP4725_ADDR 0x60
#include <Wire.h>  //Include the Wire library to talk I2C

int counter;  // how many iterations
int time_begin = 0;
int time_end = 0;
int duration;
void setup() {
  Wire.begin();
  Serial.begin(115200);
  counter = 0;
  Serial.println("start benchmark");
}
//---------------------------------------------------
void loop() {
  int value;  // angka yang ditulis
  value = 0;  // minimum value
  Wire.beginTransmission(MCP4725_ADDR);
  Wire.write(64);                 // cmd to update the DAC
  Wire.write(value >> 4);         // the 8 most significant bits...
  Wire.write((value & 15) << 4);  // the 4 least significant bits...
  Wire.endTransmission();

  value = 4095;  // maximum value
  Wire.beginTransmission(MCP4725_ADDR);
  Wire.write(64);                 // cmd to update the DAC
  Wire.write(value >> 4);         // the 8 most significant bits...
  Wire.write((value & 15) << 4);  // the 4 least significant bits...
  Wire.endTransmission();

  counter = counter + 1;
  if (counter >= 10000) {
    float  period;
    int time_now = millis();
      counter = 0;
    duration = time_now - time_begin;
    period = duration / 10000.0 / 2.0 ;
    Serial.print("period (ms): ");
    Serial.println(period);
    //  prepare next round
    time_begin = time_now;
  }
}

I2C 100 kHz

ATmega328 menggunakan 2 frekuensi I2C: 100 kHz dan 400 kHz. Percoban pertama menggunakan kecepatan default adalah 100 kHz.

Sinyal yang dihasilkan pada output MCP4725 adalah sebagai berikut:

Tampilan pada serial monitor adalah sebagai berikut:

start benchmark
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43

Pengukuran dengan osiloskop menunjukkan sinyal persegi dengan frekuensi 1,166 kHz

Jumlah transisi adalah 2x frekuensi ini, jadi frekuensi konversi adalah 1,166 x 2 = 2,332 kHz

I2C 400 kHz

Pada pengukuran ini, kecepatan I2C dinaikkan menjadi 400 kHz. Caranya menggunakan fungsi Wire.setClock()

Perioda menjadi 0,15 ms

start benchmark
period (ms): 0.15
period (ms): 0.15
period (ms): 0.15
period (ms): 0.15
period (ms): 0.15

Output DAC diukur dengan osiloskop, dengan hasil sebagai berikut

Frekuensi output adalah 3,41733 kHz, sehingga frekuensi DAC adalah 2x 3,417 = 6,834 kHz

Kesimpulan

Dengan clock I2C 100 kHz, didapatkan

  • Perioda konversi ADC adalah 0,43 ms
  • frekuensi konversi ADC adalah 2,332 kHz

Dengan clock I2C 400 kHz, didapatkan

  • Perioda konversi ADC adalah 0,15 ms
  • frekuensi konversi ADC adalah 6,384 kHz

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 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”

 

 

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

Real Time pada Raspberry Pi

Raspberry Pi dapat dibuat menjadi real time dengan menggunakan sistem operasi RTOS (Real Time Operating System), misalnya:

Berikut ini petunjuk instalasi RTOS pada Raspberry Pi:

Raspberry Pi umumnya menggunakan sistem operasi Raspbian , yang merupakan varian dari Debian Linux. Sistem operasi Linux ini bukan sistem operasi real time, sehingga Raspberry Pi tidak real time jika menggunakan sistem operasi Raspbian.

Fitur penting pada Raspbery PI adalah kemampuan komputasinya di prosesornya yang cepat (bisa sampai 4 core @1  GHz), memori yang besar (sampai 8 GB) dan sistem operasi Linux yang fleksibel.

Kekurangan Raspberry Pi jika menggunakan RTOS adalah contoh programnya tidak sebanyak Raspberry Pi dengan sistem operasi Raspbian. Jika kita perlu Raspberry Pi dengan sistem operasi Raspbian tapi perlu juga fitur real time, maka salah satu solusinya adalah fitur real time ditangani oleh prosesor lain, misal ATmega328 (Arduino Nano) atau ESP32. Untuk menghubungkan Raspberry Pi ke ArduinoNano / ESP32 dapat menggunakan protokol serial, seperti serial asinkron maupun I2C (Inter Integrated Circuit).

Referensi

 

 

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

Kelebihan dan Kekurangan Arduino Nano Dibandingkan Arduino UNO

Kelebihan Arduino Nano dibandingkan Arduino UNO:

  • Arduino Nano ukurannya lebih kecil dibandingkan Arduino UNO
  • Arduino Nano cocok untuk dipasang di breadboardd

Kekurangan Arduino Nano dibandingkan Arduino UNO:

  • Beberapa modul tersedia sebagai shield untuk Arduino UNO, namun tidak dapat / sulit disambungkan ke Arduino Nano
  • Untuk prototyping yang cepat, kabel dapat langsung dimasukkan ke konektor pada Arduino UNO
  • Pada Arduino UNO terdapat konektor power supply. Pada Arduino Nano, power supply ini terhubung ke pin VIN, tidak melalui konektor khusus.

Berikut ini perbandingan ukuran Arduino UNO dan Nano. Arduino UNO lebih besar dibandingkan Arduino Nano.

Arduino UNO dan Arduino Nano
Arduino UNO dan Arduino Nano

Berikut ini Arduino Nano dipasang di breadboard. Pada rangkaian itu Arduino Nano dihubungkan dengan LCD OLED 0.91″

Arduino Nano di breadboard dengan OLED 0.91"
Arduino Nano terpasang di breadboard

Berikut ini Arduino UNO dengan modul shield TFT LCD 2.4″.  Shield dapat dipasang langsung di atas Arduino UNO. Shield ini tidak dapat dipasang ke breadboard.

Arduino UNO dan shield TFT LCD 2.4"
Arduino UNO dan shield TFT LCD 2.4″

Berikut ini foto konektor USB (di sebelah kiri) dan konektor power (di sebelah kanan) pada Arduino UNO.

Konektor USB dan power pada Arduino UNO
Konektor USB dan power pada Arduino UNO

Referensi

 

 

 

Percobaan Arduino Nano Dengan SoftwareSerial

Arduino Nano & UNO hanya menggunakan prosesor ATmega328 yang hanya memiliki 1 port serial asinkron. Jika perlu lebih dari 1 port serial, maka kita perlu menggunakan software yang berfungsi sebagai port serial. Library yang diperlukan adalah SoftwareSerial (https://www.arduino.cc/en/Reference/softwareSerial)

Berikut ini diuraikan percobaan menggunakan library SoftwareSerial pada Arduino Nano

Komponen yang diperlukan:

  • Arduino Nano / Arrduino UNO
  • Modul USB Serial, bisa yang FTDI ataupun yang CH340
  • Komputer desktop/laptop dengan 2 port USB yang bebas
  • 2 kabel USB mini
  • breadboard
  • kabel-kabel breadboard

Perangkat lunak yang diperlukan

Diagram Software Serial
Diagram Software Serial
Percobaan software serial dengan arduino nano dan modul USB to serial converter di breadboard
Rangkaian Arduino Nano dan modul USB Serial Converter

Modul USB serial yang digunakan memiliki pilihan 5 volt dan 3,3 volt. Board Arduino Nano memiliki tegangan 5 volt, sehingga dipilih tegangan 5 volt.

Perangkat lunak sebagai berikut:

// ide dari https://www.arduino.cc/en/Tutorial/LibraryExamples/SoftwareSerialExample

#include <SoftwareSerial.h>
// RX: pin 2
// TX: pin 3
SoftwareSerial mySerial(2, 3); // RX, TX

void setup() {
// put your setup code here, to run once:
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Native USB only
}
Serial.println(“percobaan software serial”);
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println(“Hello, world from software serial”);

}

void loop() {
// baca karakter, dan kirim kembali

if (mySerial.available())
Serial.write(mySerial.read()); // karakter yang diterima di mySerial ditampilkan di Serial
if (Serial.available())
mySerial.write(Serial.read());

}

Compile program, kemudian upload.

Jalankan Serial Monitor di Arduino untuk memonitor data yang dikirim dari port serial hardware di Arduino. Pastikan baud rate cocok dengan yang disetting di program (115200bps)

Jalankan software terminal (RealTerm) di Windows, atur port ke port USB Serial. Hati-hati tertukar dengan port Arduino. Pastikan baud rate cocok dengan yang disetting di program (9600 bps)

Kirimkan karakter dari Serial Monitor Arduino. Karakter tersebut akan muncul di RealTerm

Kirimkan karakter dari RealTerm. Karakter tersebut akan muncul di Serial Monitor Arduino

Tampilan RealTerm dan Serial Monitor
Tampilan RealTerm dan Serial Monitor

 

Membuat Gelombang Sinus Dengan Arduino Nano Dan DAC MCP4725

Gelombang sinus dapat dibuat dengan Arduino Nano, dengan bantuan DAC (Digital to Analog Converter).

Arduino Nano dan UNO di dalamnya menggunakan mikrokontroler  ATmega328. ATmega328 ini tidak memiliki DAC, sehingga sebenarnya tidak mampu membuat tegangan analog secara langsung. Untuk aplikasi yang sederhana, hal ini dapat diakali dengan menggunakan fitur PWM (Pulse Width Modulation). Librarynya di Arduino menggunakan AnalogWrite() . Namun untuk menghasilkan tegangan analog yang lebih baik, diperlukan komponen DAC seperti MCP4725.

Berikut ini contoh pembangkitan gelombang sinusoidal dengan Arduino Nano dan DAC MCP4725.

Pertama rakit hubungkan MCP4725 ke Arduino. Koneksinya menggunakan protokol I2C.

Daftar pin yang dihubungkan adalah sebagai berikut:

Pin Arduino Pin MCP4725 Keterangan
A4 (SDA) SDA pin data untuk I2C
A5 (SCL) SCL pin clock untuk I2C
GND GND ground 0 volt
VCC 5V supply 5 volt

Protokol I2C menggunakan 2 kabel, yaitu SDA (data) dan SCL (clock). Kedua jalur ini sebenarnya perlu disambungkan dengan pull up menggunakan resistor, namun pada Arduino sudah ada pull up internal 10 kilo ohm, sehingga tidak perlu ditambah lagi.

MCP4725 perlu supply 5 volt, yang dapat diambil dari pin 5V dari Arduino. Namun perlu diperhatikan pada Arduino clone/KW, tegangan 5V ini biasanya kurang dari 5 volt, terutama jika menggunakan power supply dari USB.

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

Tahap selanjutnya adalah instalasi library “Adafruit MCP4725”. Ada beberapa cara instalasi:

  • Download langsung filenya dari  https://github.com/adafruit/Adafruit_MCP4725/archive/master.zip, kemudian instalasi dengan cara copy ke direktori library Arduino secara manual
  • Instalasi dari menu Arduino

Untuk melakujkan instalasi dari Arduino, lakukan tahap berikut ini:

  • Klik di menu “Tools” -> “Manage Libraries”, atau Ctrl -Shift – I
  • Cari library “Adafruit MCP4725”, kemudian klik install
  • Proses download akan dilakukan. Tunggu sampai selesai

 

Alamat MCP4725 mungkin perlu dicoba-coba, antara 0x60, 0x61, 0x62, 0x63, 0x64, 0x65. Jika ingin dicari dengan cepat, dapat menggunakan program kecil I2C Scanner untuk Arduino UNO/Nano

Berikut ini contoh software pembangkit sinusoidal. Kode ini diadaptasi dari situs https://learn.sparkfun.com/tutorials/mcp4725-digital-to-analog-converter-hookup-guide/all

Pada contoh di bawah ini, alamat MCP4725 adalah 0x63, namun mungkin perlu diubah-ubah.

/******************************************************************************
MCP4725 Example Waveform Sketch
Joel Bartlett
SparkFun Electronics
Sept. 11, 2014
https://github.com/sparkfun/MCP4725_Breakout

This sketch takes data from a lookup table to provide
waveforms to be generated by the MCP4725 DAC.

Development environment specifics:
Arduino 1.0+
Hardware Version V14

This code is beerware; if you see me (or any other SparkFun employee) at the local,
and you've found our code helpful, please buy us a round!

Distributed as-is; no warranty is given.

This code builds off the sketch written by Mark VandeWettering, which can be found here:
http://brainwagon.org/2011/02/24/arduino-mcp4725-breakout-board/
*/

#include <Wire.h>//Include the Wire library to talk I2C

//This is the I2C Address of the MCP4725, by default (A0 pulled to GND).
//Please note that this breakout is for the MCP4725A0.
#define MCP4725_ADDR 0x63
//For devices with A0 pulled HIGH, use 0x61

//Sinewave Tables were generated using this calculator:
//http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml


int lookup = 0;//varaible for navigating through the tables

int sintab2[512] =
{
2048, 2073, 2098, 2123, 2148, 2174, 2199, 2224,
2249, 2274, 2299, 2324, 2349, 2373, 2398, 2423,
2448, 2472, 2497, 2521, 2546, 2570, 2594, 2618,
2643, 2667, 2690, 2714, 2738, 2762, 2785, 2808,
2832, 2855, 2878, 2901, 2924, 2946, 2969, 2991,
3013, 3036, 3057, 3079, 3101, 3122, 3144, 3165,
3186, 3207, 3227, 3248, 3268, 3288, 3308, 3328,
3347, 3367, 3386, 3405, 3423, 3442, 3460, 3478,
3496, 3514, 3531, 3548, 3565, 3582, 3599, 3615,
3631, 3647, 3663, 3678, 3693, 3708, 3722, 3737,
3751, 3765, 3778, 3792, 3805, 3817, 3830, 3842,
3854, 3866, 3877, 3888, 3899, 3910, 3920, 3930,
3940, 3950, 3959, 3968, 3976, 3985, 3993, 4000,
4008, 4015, 4022, 4028, 4035, 4041, 4046, 4052,
4057, 4061, 4066, 4070, 4074, 4077, 4081, 4084,
4086, 4088, 4090, 4092, 4094, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4094, 4092, 4090, 4088,
4086, 4084, 4081, 4077, 4074, 4070, 4066, 4061,
4057, 4052, 4046, 4041, 4035, 4028, 4022, 4015,
4008, 4000, 3993, 3985, 3976, 3968, 3959, 3950,
3940, 3930, 3920, 3910, 3899, 3888, 3877, 3866,
3854, 3842, 3830, 3817, 3805, 3792, 3778, 3765,
3751, 3737, 3722, 3708, 3693, 3678, 3663, 3647,
3631, 3615, 3599, 3582, 3565, 3548, 3531, 3514,
3496, 3478, 3460, 3442, 3423, 3405, 3386, 3367,
3347, 3328, 3308, 3288, 3268, 3248, 3227, 3207,
3186, 3165, 3144, 3122, 3101, 3079, 3057, 3036,
3013, 2991, 2969, 2946, 2924, 2901, 2878, 2855,
2832, 2808, 2785, 2762, 2738, 2714, 2690, 2667,
2643, 2618, 2594, 2570, 2546, 2521, 2497, 2472,
2448, 2423, 2398, 2373, 2349, 2324, 2299, 2274,
2249, 2224, 2199, 2174, 2148, 2123, 2098, 2073,
2048, 2023, 1998, 1973, 1948, 1922, 1897, 1872,
1847, 1822, 1797, 1772, 1747, 1723, 1698, 1673,
1648, 1624, 1599, 1575, 1550, 1526, 1502, 1478,
1453, 1429, 1406, 1382, 1358, 1334, 1311, 1288,
1264, 1241, 1218, 1195, 1172, 1150, 1127, 1105,
1083, 1060, 1039, 1017, 995, 974, 952, 931,
910, 889, 869, 848, 828, 808, 788, 768,
749, 729, 710, 691, 673, 654, 636, 618,
600, 582, 565, 548, 531, 514, 497, 481,
465, 449, 433, 418, 403, 388, 374, 359,
345, 331, 318, 304, 291, 279, 266, 254,
242, 230, 219, 208, 197, 186, 176, 166,
156, 146, 137, 128, 120, 111, 103, 96,
88, 81, 74, 68, 61, 55, 50, 44,
39, 35, 30, 26, 22, 19, 15, 12,
10, 8, 6, 4, 2, 1, 1, 0,
0, 0, 1, 1, 2, 4, 6, 8,
10, 12, 15, 19, 22, 26, 30, 35,
39, 44, 50, 55, 61, 68, 74, 81,
88, 96, 103, 111, 120, 128, 137, 146,
156, 166, 176, 186, 197, 208, 219, 230,
242, 254, 266, 279, 291, 304, 318, 331,
345, 359, 374, 388, 403, 418, 433, 449,
465, 481, 497, 514, 531, 548, 565, 582,
600, 618, 636, 654, 673, 691, 710, 729,
749, 768, 788, 808, 828, 848, 869, 889,
910, 931, 952, 974, 995, 1017, 1039, 1060,
1083, 1105, 1127, 1150, 1172, 1195, 1218, 1241,
1264, 1288, 1311, 1334, 1358, 1382, 1406, 1429,
1453, 1478, 1502, 1526, 1550, 1575, 1599, 1624,
1648, 1673, 1698, 1723, 1747, 1772, 1797, 1822,
1847, 1872, 1897, 1922, 1948, 1973, 1998, 2023
};


void setup()
{
Wire.begin();

// Set A2 and A3 as Outputs to make them our GND and Vcc,
//which will power the MCP4725
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);

digitalWrite(A2, LOW);//Set A2 as GND
digitalWrite(A3, HIGH);//Set A3 as Vcc
}
//---------------------------------------------------
void loop()
{
Wire.beginTransmission(MCP4725_ADDR);
Wire.write(64); // cmd to update the DAC
Wire.write(sintab2[lookup] >> 4); // the 8 most significant bits...
Wire.write((sintab2[lookup] & 15) << 4); // the 4 least significant bits...
Wire.endTransmission();
lookup = (lookup + 1) & 511;
}

Definisi alamat MCP4725 ada di baris berikut ini:

#define MCP4725_ADDR 0x63

Versi lain software pembangkit sinusoidal dapat dilihat di https://github.com/adafruit/Adafruit_MCP4725/blob/master/examples/sinewave/sinewave.ino

Tegangan output sinusoidal dapat diukur di pin OUT pada MCP4725.

Berikut ini contoh output yang diukur dengan osiloskop.

Tegangan sinusoidal dari MCP4725 dan Arduino Nano
Tegangan sinusoidal dari MCP4725 dan Arduino Nano

Frekuensi gelombang sinusoidal adalah 4,5039 Hz . Jumlah sampel dalam 1 periode adalah 512. Periode sampling adalah 1/4,5039/512 = 0,434 milidetik. Frekuensi sampling adalah 2306 Hz.

Demikianlah cara sederhana membuat gelombang sinusoidal pada Arduino Nano dengan menggunakan DAC MCP4725. Namun demikian rangkaian ini masih mempunyai kelemahan:

  • Tegangan referensi DAC menggunakan tegangan 5V dari Arduino Nano yang kalau diukur tegangannya kurang dari 5 volt (sekitar 4,6 volt), dan ada ripple / noise di situ. Solusinya adalah menambahkan filter atau regulator supaya tegangan VCC untuk MCP4725 lebih stabil.
  • Tegangan keluaran masih terbatas dari 0 sampai 5 volt, sesuai tegangan VCC pada MCP4725. Jika perlu jangkauan tegangan lain maka perlu ditambah rangkaian penguat / pengubah level, yang mudahnya dapat dibuat dengan rangkaian op-amp
  • Belum ada filter rekonstruksi (reconstruction filter), untuk menghilangkan efek tangga pada tegangan output DAC. Sistem DAC yang lebih lengkap dapat dilihat di artikel https://elektrologi.iptek.web.id/sistem-filter-digital/

Referensi

Perangkat Lunak Untuk Simulasi Arduino

Arduino dapat disimulasikan dengan perangkat lunak apa saja?

Berikut ini beberapa simulator Arduino dalam bentuk perangkat lunak (software):

  1. Atmel Studio (https://www.microchip.com/mplab/avr-support/atmel-studio-7)
  2. TinkerCad (https://www.tinkercad.com/) , simulasi berbagai perangkat termasuk Arduino. Gratis. Hanya Online
  3. Paul Ware’s Arduino simulator (https://github.com/Paulware/ArduinoDebugger/). Gratis & open source
  4. Simduino  (https://apps.apple.com/us/app/simduino/id526927905), hanya jalan di aplikasi Apple. Berbayar
  5. Emulare Arduino simulator (http://emulare.sourceforge.net/)
  6. Proteus Virtual System Modelling (VSM) https://www.labcenter.com/simulation/
  7. Virtronics Simulator for Arduino (http://www.virtronics.com.au/Simulator-for-Arduino.html)
  8. Arduino IO Simulator https://xevro.be/
  9. Circuit.io (https://www.circuito.io/) (hanya online)
  10. Virtual Breadboard (http://www.virtualbreadboard.com/)

Simulator Arduino yang sudah tidak aktif:

  1. Autodesk Eagle: fitur simulasi sudah tidak ada, tinggal PCB design saja
  2. Autodesk Circuits: sudah jadi tinkercad
  3. ArduinoSim: tidak dapat dicari lagi
  4. Arduino Simulator (https://sourceforge.net/projects/arduinosim/) sudah tidak aktif
  5. Electronify (https://www.electronify.org) ,sudah tidak aktif
  6. Yenka (https://www.yenka.com/). Sudah tidak menyediakan Arduino