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 LCD TFT 2.4″ Untuk Arduino UNO

Berikut ini percobaan menyalakan LCD TFT 2.4″ dalam bentuk Shield untuk Arduino UNO.

Berikut ini penampakan Arduino UNO di sebelah shield LCD TFT 2.4″.

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

LCD Shield ini cocok dipasang di atas Arduino UNO. Kalau dipasang ke breadboard malah sulit, memerlukan kabel-kabel karena ukuran kakinya tidak sama dengan ukuran kaki di breadboard.

TFT LCD 2.4" Shield untuk Arduino UNO
Bagian belakang TFT LCD
 

Di bagian belakang TFT LCD ini ada slot untuk kartu memori SD card. Pada bagian belakang tertulis “http://tft.simkeim.com tftlcd for arduino uno (spiflash)”. Namun setelah dicek, domain simkeim.com ternyata tidak ada.

TFT LCD ini menggunakan chip SPFD5408, sehingga tidak kompatibel dengan library LCD dari Adafruit.

Cara menyalakan LCD ini dijelaskan oleh Joao Lopes di artikelnya sebagai berikut:

Cara instalasi library:

  • kunjungi situs https://github.com/JoaoLopesF/SPFD5408
  • klik di “Code”, kemudian klik di “Download ZIP”
  • file SPFD5408-master.zip akan ada di direktori download anda, biasanya di “Downloads”
  • Jalankan Arduino IDE
  • Klik di menu “Sketch” -> “Include Library” -> “Add .ZIP Library”
  • Pilih file SPFD5408-master.zip
  • library akan terinstall di direktori “Documents/Arduino/libraries/SPFD5408-master”
  • Contoh software dapat dilihat di sub direktori examples di bawah direktori tersebut.

Berikut ini screenshot hasil menjalankan contoh program di direktori /examples di library tersebut.

Berikut ini hasil menjalankan contoh program spfd5408_graphicstest.ino

TFT LCD 2.4" Shield untuk Arduino UNO
Pengujian menyalakan LCD dengan spfd5408_graphicstest.ino

 

Percobaan Penjadwal Periodik Dengan FreeRTOS pada Arduino Nano

Pada percobaan ini dilakukan penjadwalan untuk sebuah task periodik pada sistem operasi FreeRTOS. Mikroprosesor yang dipakai adalah Arduino Nano (ATmega328).

Pengukuran akan dilakukan dengan video dengan kecepatan 25 frame per detik, sehingga pemilihan waktu eksekusi dan periode tidak boleh terlalu kecil. Untuk percobaan dipilih waktu eksekusi 4 detik, dengan perioda task adalah 10 detik.

Task 4 detik dibuat menggunakan TaskDummy yang sudah dibuat di percobaan sebelumnya. Pemilihan waktu 4 detik dapat dilakukan dengan menggunakan parameter fungsi yang sesuai.

Perangkat Keras

Perangkat keras yang digunakan adalah Arduino Nano dengan 2 buah LED terhubung ke pin 2 dan pin 3.

Implementasi Program

Berikut ini source code percobaan tersebut.

// 1 task periodik dengan FreeRTOS Arduino Nano (ATmega328)
// template umum FreeRTOS di Arduino Nano  https://github.com/feilipu/Arduino_FreeRTOS_Library/blob/master/examples/AnalogRead_DigitalRead/AnalogRead_DigitalRead.ino
// contoh pemakaian vTaskDelayUntil dan xTaskGetTickCount dari https://github.com/feilipu/avrfreertos/blob/master/MegaBlink/main.c

#include "Arduino_FreeRTOS.h"
#include <semphr.h>

#define LED1  2
#define LED2  3

static void TaskBlinkLED1(void *pvParameters);

// task handle diperlukan jika ingin mengakses parameter suatu task. optional
TaskHandle_t xHandle1 = NULL;

void TaskDummy(int LED_A, int LED_B, long int counter) {
  long int i;
  for (i = 0; i < counter; i++) {
    cli();
    digitalWrite(LED_A, LOW);
    digitalWrite(LED_B, HIGH);
    sei();
    asm("nop");
    cli();
    digitalWrite(LED_A, HIGH);
    digitalWrite(LED_B, LOW);
    sei();
    asm("nop");
  }
  digitalWrite(LED_A, LOW);  // matikan semua LED
  digitalWrite(LED_B, LOW);
}

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);

  xTaskCreate(
    TaskBlinkLED1
    ,  "TaskBlinkLED1"  // A name just for humans
    ,  100  // This stack size can be checked & adjusted by reading the Stack Highwater
    ,  NULL
    ,  2  // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
    ,  &xHandle1 );
}

void loop() {
}

static void TaskBlinkLED1(void *pvParameters) // Main Red LED Flash
{
  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)
  {
    Serial.println(millis());
    Serial.println(xLastWakeTime); // cetak last wake time, untuk debugging. hanya untuk slow system

    TaskDummy(LED1, LED2, 10000L / 0.172 * 4 ); // 4 detik waktu eksekusi
    vTaskDelayUntil( &xLastWakeTime, ( 10000L / portTICK_PERIOD_MS ) ); // 10 detik perioda

  }
}

Pengukuran Dengan Video

Pengukuran dilakukan dengan merekam kedipan LED selama kurang lebih 30 detik. Kecepatan frame video yang dihasilkan adalah 25 frame per detik.

Berikut ini rekaman video lampu kedip yang dihasilkan.

Analisis frame per frame dilakukan dengan menggunakan aplikasi DaVinci Resolve 16.

Tampilan DaVinci Resolve 16
Tampilan DaVinci Resolve 16

Video dapat ditampilkan dengan mode “Media”,  “Cut” maupun “Timeline”. DaVinci Resolve secara default menampilkan waktu dalam format HH:MM:SS, namun tampilan ini dapat diubah menjadi tampilan nomor frame untuk memudahkan analisis.

Berikut ini hasil analisis video LED tersebut:

Transisi Frame
OFF -> ON 161
ON -> OFF 262
OFF->ON 432
ON->OFF 534
OFF->ON 704
ON->OFF 805
OFF->ON 975

Analisis durasi waktu eksekusi

  • 262-161 = 101 frame = 4,04 detik
  • 534-432=102 frame =  4,08 detik
  • 805-704 = 101 frame = 4,04 detik.

Analisis Perioda Task

  • 432-161= 271 frame = 10.85 detik
  • 534-262= 272 frame = 10.88 detik
  • 704-432= 272 frame= 10.88 detik
  • 805-534= 271 frame = 10.85 detik
  • 975-704= 271 frame= 10.85 detik

Durasi atau waktu eksekusi adalah 4,04 detik ~ 4,08 detik

Periode Task yang terukur adalah antara 10.85 detik sampai 10.88 detik.

Pengukuran Dengan Osiloskop

Sebagai perbandingan juga dilakukan pengukuran tegangan pada LED dengan osiloskop. Berikut ini rekaman video pengukuran dengan osiloskop

Berikut ini pengukuran perioda task dengan menggunakan fitur cursor  pada osiloskop.

Pengukuran perioda task pada FreeRTOS
Pengukuran perioda task

Dari hasil pengukuran perioda didapatkan angka 10,80 detik. Hasil ini cukup  sesuai dengan analisis frame video.

Berikut ini pengukuran durasi task.

Pengukuran durasi task pada FreeRTOS
Pengukuran durasi task

Didapatkan hasil angka durasi task adalah 4,1 detik, cukup mendekati angka 4,08 detik dari hasil analisis frame.

Analisis

Dari hasil perhitungan di atas, dapat didapatkan bahwa

  • durasi eksekusi dari TaskDummy sudah cukup mendekati hasil yang diinginkan
  • durasi perioda task berbeda cukup jauh , sekitar 8%

Dari hasil studi literatur didapatkan bahwa Timer Tick pada library FreeRTOS di Arduino Nano yang dipakai menggunakan osilator pada WDT (Watch Dog Timer). Osilator WDT ini menurut literatur datasheet tidak menggunakan kristal, dan periodanya tergantung dengan temperatur ruangan. Jadi perbedaan periode dari seharusnya 10 detik menjadi 10.8 detik dapat dijelaskan.

Referensi

Task Dummy Untuk FreeRTOS

Pada percobaan FreeRTOS dengan penjadwal periodik, diperlukan suatu task (pekerjaan) dengan waktu eksekusi yang diketahui.

Berikut ini sifat-sifat yang diperlukan dari task tersebut:

  • waktu eksekusi diketahui
  • waktu eksekusi dapat diubah-ubah dengan mengubah parameternya
  • status task dapat dimonitor dari luar mikroprosesor
  • status yang perlu diketahui: RUNNING, READY, BLOCKING, STOP.

Solusi

  • Task berupa iterasi yang jumlah iterasi dapat diubah-ubah dengan parameter.
  • Pengaruh parameter terhadap waktu eksekusi diukur. Pengukuran terbaik dengan menggunakan alat ukur eksternal seperti osiloskop. Jika tidak ada osiloskop, alternatifnya menggunakan fungsi millis() pada Arduino.
  • Task Dummy melakukan aktivitas membuat 2 buah LED berkedip secara komplementer. Jika kedua lampu nampak menyala, artinya task dalam keadaan RUNNING. Jika salah satu saja yang menyala, artinya task sedang berhenti, artinya dalam keadaan READY atau BLOCKING. Jika kedua lampu mati, artinya task sedang tidak aktif.

Berikut ini kode fungsi Task Dummy pada Arduino.

 

void TaskDummy(int LED_A, int LED_B, long int counter) {
  long int i;
  for (i = 0; i < counter; i++) {
    cli();
    digitalWrite(LED_A, LOW);
    digitalWrite(LED_B, HIGH);
    sei();
    asm("nop");
    cli();
    digitalWrite(LED_A, HIGH);
    digitalWrite(LED_B, LOW);
    sei();
    asm("nop");
  }
  digitalWrite(LED_A, LOW);  // matikan semua LED
  digitalWrite(LED_B, LOW);
}

DigitalWrite menyalakan dan mematikan LED A dan LED B. LED yang dipakai sebagai output dapat diatur melalui parameter fungsi. cli() fungsinya untuk disable interrupt, agar perubahan LED_A dan LED_B terjadi secara serentak. sei() fungsinya untuk mengaktifkan kembali interupsi. Instruksi assembly “nop” dipakai untuk menambah waktu iterasi.

Berikut ini program lengkapnya

// Contoh TaskDummy
// dengan output ke osiloskop juga
#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
}

void TaskDummy(int LED_A, int LED_B, long int counter) {
  long int i;
  for (i = 0; i < counter; i++) {
    cli();
    digitalWrite(LED_A, LOW);
    digitalWrite(LED_B, HIGH);
    sei();
    asm("nop");
    cli();
    digitalWrite(LED_A, HIGH);
    digitalWrite(LED_B, LOW);
    sei();
    asm("nop");
  }
  digitalWrite(LED_A, LOW);  // matikan semua LED
  digitalWrite(LED_B, LOW);
}

// the loop function runs over and over again forever
void loop() {
  unsigned long waktu_awal;
  unsigned long waktu_akhir;
  waktu_awal = millis();
  TaskDummy(LED1, LED2, 10000L);
  waktu_akhir = millis();
  Serial.print("waktu: ");
  Serial.println(waktu_akhir - waktu_awal);
  digitalWrite(LED_BUILTIN, HIGH);
  TaskDummy(LED1, LED2, 10000L);
  digitalWrite(LED_BUILTIN, LOW);
}

Durasi TaskDummy dalam milisekon dapat diamati di port serial. Berikut ini tampilan port serial.

Dari tampilan tersebut dapat diketahui bahwa waktu eksekusi task dummy adalah 173 ms.

Berikut ini foto pengukuran dengan osiloskop. Dari gambar nampak waktu yang diperlukan untuk task dummy adalah 172 ms

Berikut ini foto percobaan.

Osiloskop yang dipakai

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

 

Konfigurasi Dan Fungsi pin Arduino UNO

Berikut ini penjelasan konfigurasi dan fungsi masing-masing pin dari Arduino Uno dengan prosesor ATmega328P.

Pinout Arduino UNO
Pinout Arduino UNO

Daftar Pin Arduino

IOREF

Referensi 5 volt untuk shield yang memerlukannya

RESET

Reset pada ATmega328. Perlu sinyal LOW untuk mereset Arduino. Terhubung ke PC6 dan PCINT pada ATmega328.

3.3V

Catu daya 3,3 volt untuk shield yang memerlukannya. Tegangan 3,3 volt ini berasal dari regulator LP2985-33DBVR.

GND

Ground, 0 volt.

VIN

Tegangan input DC 7~12 volt. Masuk ke regulator internal 5 volt (NCP1117ST50T3G). Tidak melalui dioda pengaman, sehingga tidak ada pengecekan polaritas.

A0

Input analog 0

Terhubung ke pin PC0 pada ATmega328

A1

Input analog 1

Terhubung ke pin PC1 pada ATmega328

A2

Input analog 2

Terhubung ke pin PC2 pada ATmega328

A3

Input analog 3

Terhubung ke pin PC3 pada ATmega328

A4

Input analog 4

Terhubung ke pin PC4 pada ATmega328

Berfungsi juga sebagai SDA untuk komunikasi I2C

A5

Input analog 5

Terhubung ke pin PC5 pada ATmega328

Berfungsi juga sebagai SCL untuk komunikasi I2C

13

Terhubung ke pin PB5 pada ATmega328

12

Terhubung ke pin PB4 pada ATmega328

~11

Terhubung ke pin PB3 pada ATmega328

~10

Terhubung ke pin PB2 pada ATmega328

~9

Terhubung ke pin PB1 pada ATmega328

8

Terhubung ke pin PB0 pada ATmega328

7

Terhubung ke pin PD7 pada ATmega328

6

Terhubung ke pin PD6 pada ATmega328

5

Terhubung ke pin PD5 pada ATmega328

4

Terhubung ke pin PD4 pada ATmega328

3

Terhubung ke pin PD3 pada ATmega328

2

Terhubung ke pin PD2 pada ATmega328

1

Berfungsi sebagai TXD pada komunikasi serial

Terhubung ke pin PD1 pada ATmega328

0

Berfungsi sebagai RXD pada komunikasi serial

Terhubung ke pin PD0 pada ATmega328

Referensi

 

 

Menyalakan Lampu Dengan Arduino Uno

Menyalakan Lampu Dengan Arduino Uno dapat dilakukan dengan berbagai cara, tergantung jenis lampu yang ingin dinyalakan.

Berikut ini adalah beberapa variasi lampu yang dapat dinyalakan dengan Arduino UNO:

  • LED tegangan kecil & arus kecil
  • LED tegangan besar / arus besar
  • Lampu bohlam
  • Lampu 220 volt

 

LED tegangan kecil & arus kecil

Untuk LED tegangan kecil dan arus kecil dapat dinyalakan langsung dari port Arduino. Harap diperhatikan bahwa tegangan pin pada Arduino UNO hanya maksimum 5 volt, sehingga hanya dapat menyalakan 2 LED seri. Arus yang dapat diambil dari port Arduino juga terbatas, sehingga arus pada LED juga terbatas. Menurut spesifikasi teknis Arduino UNO, arus maksimum di setiap port adalah 20 mA. Arus maksimum pada VCC ATmega328 adalah 200 mA, sehingga hal ini juga harus diperhatikan.

LED output
LED output

LED Tegangan Besar / Arus Besar

Untuk tegangan lebih dari 5 volt ataupun arus lebih dari 20 mA, maka perlu komponen tambahan berupa transistor untuk memperkuat arus & tegangan.

Berikut ini cara memperkuat tegangan pada output  Arduino, supaya dapat menggunakan catu daya 12 volt untuk menyalakan LED.

Penguat arus digital dengan transistor NPN
Penguat arus digital dengan transistor NPN

Lampu bohlam kecil

Lampu bohlam kecil memerlukan arus agak besar. Untuk memperkuat arus, dapat digunakan transistor NPN , seperti pada gambar berikut ini.

Penguat output digital dengan transistor NPN

Lampu 220 volt

Untuk menghubungkan Arduino ke tegangan 220 volt, umumnya dapat menggunakan relay elektromekanik ataupun relay solid state (SSR). Berikut ini contoh cara menghubungkan Arduino ke lampu 220 volt dengan relay elektromekanik.

Referensi

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

I2C Scanner Untuk Arduino UNO & Nano

I2C Scanner Untuk Arduino UNO & Nano diperlukan untuk mengecek periferal apa saja yang terhubung ke bus I2C. Kadang-kadang ada modul yang dijual dengan berbagai alamat (seperti MCP4725). I2C scanner ini juga dapat membantu untuk mengecek kualitas sambungan pada bus I2C.

Kadang-kadang bus I2C tidak berfungsi dengan baik karena kabel terlalu panjang, resistor pull-up kurang kecil, bidirectional logic converter tidak jalan (jika bus menggunakan tegangan ganda 5 volt dan 3,3 volt), dan berbagai hal lainnya. Software I2C scanner ini dapat membantu mencari terjadinya kesalahan tersebut.

Ide software ini diambil dari situs https://playground.arduino.cc/Main/I2cScanner/

// --------------------------------------
// i2c_scanner
// https://playground.arduino.cc/Main/I2cScanner/
// Version 1
// This program (or code that looks like it)
// can be found in many places.
// For example on the Arduino.cc forum.
// The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
// Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26 2013
// V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
// by Arduino.cc user Krodal.
// Changes by louarnold removed.
// Scanning addresses changed from 0...127 to 1...119,
// according to the i2c scanner by Nick Gammon
// https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
// As version 4, but address scans now to 127.
// A sensor seems to use address 120.
// Version 6, November 27, 2015.
// Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//


#include <Wire.h>


void setup()
{
Wire.begin();

Serial.begin(115200);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}


void loop()
{
byte error, address;
int nDevices;

Serial.println("Scanning...");

nDevices = 0;
for (address = 1; address < 127; address++ )
{
Serial.println(address, HEX);
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the 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.print(address, HEX);
Serial.println(" !");

nDevices++;
}
else if (error == 4)
{
Serial.print("Unknown 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");

delay(5000); // wait 5 seconds for next scan


Referensi

Kekurangan Arduino Mega 2560

Apa kekurangan Arduino Mega 2560? Untuk itu pertama dibandingkan dulu spesifikasi antara Arduino Mega 2560 dengan Arduino UNO Rev 3.

Spesifikasi

Perbandingan antara Arduino Mega 2560 dengan Arduino UNO

  Arduino UNO Rev 3
Arduino Mega 2560 Rev 3
Prosesor / Mikrokontroler ATmega328P ATmega 2560
Clock 16 MHz 16 MHz
SRAM 2 KB 8 KB
EEPROM 1 KB 4 KB
Flash Memory 32 KB 256 KB, 8 KB untuk bootloader
Digital I/O 14 (6 dengan PWM) 54 pin (15 dengan PWM)
Analog Input 6 16 pin
berat 25 g 37 g
Ukuran 68,6 x 53,4 mm 101,52 mm x 53,3 mm
Harga
  • Original: Rp 300 ribu ~ Rp 400 ribu
  • Clone / KW: Rp 60 ribuan ~ Rp 70 ribuan
  • Original: Rp 500 ~ Rp 600 ribuan
  • Clone/ KW: Rp 100 ribuan

Dari hasil perbandingan tersebut dapat disimpulkan bahwa secara teknis Arduino Mega 2560 lebih unggul dari sisi teknis, namun kelemahannya dibandingkan Arduino  UNO adalah harganya yang jauh lebih mahal, dan ukurannya yang lebih besar.

Kekurangan Arduino Mega 2560 Rev 3 adalah sebagai berikut

  • harga lebih mahal
  • ukuran lebih besar
  • bobot lebih berat

Keuntungan Arduino Mega 2560 dibandingkan Arduino UNO adalah sebagai berikut:

  • memori SRAM (Static Random Access Memory) lebih besar, 8 KB vs 2 KB
  • memori EEPROM (Electrically Erasable Programmable Read Only Memory) lebih besar, 4 KB vs 1 KB
  • memori Flash (untuk diisi program) lebih besar, 256 KB vs 32 KB
  • jumlah pin lebih banyak

Kesamaannya adalah sama-sama menggunaan prosesor dari keluarga AVR, dan kecepatan clocknya adalah sama-sama 16  MHz. Jadi program yang dijalankan di Arduino Mega akan sama kecepatannya dengan dijalankan di Arduino UNO.

Referensi

Cara Menghubungkan 2 Arduino

Dua buah board Arduino UNO/Nano dapat dihubungkan dengan komunikasi serial, sehingga keduanya dapat berkomunikasi.

Alternatif komunikasi serial yang dapat dipakai adalah sebagai berikut:

  • Komunikasi Serial Asinkron
  • Komunikasi Serial I2C / TWI (Two Wire Interface)
  • Komunikasi SPI (Serial Peripheral Interface)

Komunikasi Serial Asinkron

Pada komunkasi serial asinkron, port yang dipakai adalah port komunikasi serial TX & RX, atau pin D0 dan D1 pada Arduino. Cara menghubungkannya adalah silang, yaitu TX dihubungkan ke RX , RX dihubungkan ke TX. Pengiriman data dilakukan dengan menggunakan library Serial pada Arduino. Pada komunikasi ini hanya dapat dihubungkan 2 buah board Arduino.

Komunikasi asinkron pada Arduino dapat menggunakan hardware dan software. Secara hardware, komunikasi asinkron terhubung ke pin D0 dan D1. Jika perlu tambahan komunikasi serial, dapat menggunakan library SoftwareSerial. 

Jika menggunakan library SoftwareSerial, port yang digunakan bebas.

Berikut ini skema menghubungkan Arduino dengan komunikasi sinkron, menggunakan port asinkron bawaan aslinya. Pin TX di Arduino pertama dihubungkan ke RX di Arduino kedua. Pin RX di Arduino pertama dihubungkan ke TX di Arduino kedua.

Cara menghubungkan 2 arduino dengan komunikasi asinkron
Cara menghubungkan 2 arduino dengan komunikasi asinkron

Komunikasi Serial I2C/TWI

Pada komunikasi ini digunakan protokol TWI (Two Wire Interface). Pin yang dipakai adalah SDA (ADC4) dan SCL (ADC5).

Berikut ilustrasi port pada Arduino:

Pin Arduino UNO
Pin Arduino UNO

Pada protokol TWI/I2C, 1 prosesor menjadi master, sedangkan lainnya adalah slave. Pengalamatan pada I2C adalah 7 bit, jadi jumlah node maksimum yang dapat dihubungkan pada bus I2C adalah 128 buah prosesor.

Berikut ini contoh cara menghubungkan 2 buah Arduino dengan protokol I2C.

Arduino UNO Master Slave I2C
Arduino UNO Master Slave I2C

Tutorialnya dapat diikuti di https://www.arduino.cc/en/Tutorial/MasterWriter

Komunikasi SPI (Serial Peripheral Interface)

Pada komunikasi ini digunakan protokl SPI. Pin yang dipakai adalah SCK, MOSI, MISO dan SS.

Daftar pin yang dipakai untuk SPI  pada Arduino adalah sebagai berikut:

Jalur SPI
Pin Arduino Pin ATmega328
MOSI 11 or ICSP-4 PB3
MISO 12 or ICSP-1 PB4
SCK 13 or ICSP-3 PB5
SS 10 PB2

Berikut cara menghubungkan 2 perangkat yang menggunakan protokol SPI

 

Arduino Dengan SPI
Arduino Dengan SPI

Tutorial menghubungkan 2 Arduino dengan SPI dapat diikuti di https://circuitdigest.com/microcontroller-projects/arduino-spi-communication-tutorial

Referensi

Berapakah besar arus maksimal masing masing pin digital Arduino?

Arus maksimal masing-masing pin digital Arduino UNO dan Arduino Nano adalah 40 milliampere (mA), dengan asumsi tidak melanggar batasan arus maksimum VCC dan GND sebesar 200 mA.

Arduino UNO dan Arduino Nano menggunakan prosesor ATmega328. Arus maksimal ini dijelaskan di datasheet prosesor ATmega328 tersebut sebagai berikut:

ATmega328 absolute maximum rating
ATmega328 absolute maximum rating
 

Namun demikian perlu diperhatikan batasan arus yang lain, yaitu arus maksimum di pin VCC dan GND, yaitu 200 mA. Jumlah pin pada ATmega328 adalah 23 buah, jadi kalau semua pin mengeluarkan arus yang sama, maka arus di setiap pin adalah 200/23 = 8.7 mA.

Jika ingin mengeluarkan arus 40 mA, maka maksimum jumlah pin yang memberikan arus 40 mA adalah 200/40 = 5 pin saja.

Board Arduino tidak semuanya menggunakan prosesor ATmega328. Untuk Arduino yang menggunakan prosesor lain, maka perlu dicek datasheet masing-masing prosesornya.

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

 

Pemrograman Arduino Dengan Java, Mungkinkah?

 

Arduino UNO R3
Arduino UNO R3

Pemrograman Arduino dengan Java, mungkinkah? Arduino UNO / Nano tidak dapat diprogram dengan bahasa pemrograman Java. Alasan mudahnya karena memori RAM dan Flash pada Arduino terlalu kecil untuk menjalankan Java Virtual Machine (JVM).

Sejauh ini prosesor yang mendukung JVM adalah sebagai berikut:

  • x86
  • x86-64
  • SPARC
  • MIPS
  • Itanium
  • Power ISA
  • ARM
  • Alpha
  • S/390
  • z/Architecture
  • m68k

JVM juga memerlukan sistem operasi di bawahnya. Berikut ini sistem operasi yang mendukung JVM:

  • Windows
  • Linux
  • FreeBSD
  • NetBSD
  • OpenBSD
  • Solaris
  • OpenSolaris
  • Darwin
  • macOS
  • iOS
  • BeOS
  • Haiku
  • AIX
  • IRIX
  • OS/2
  • Windows Mobile
  • AmigaOS

Arsitektur CPU pada Arduino UNO adalah AVR. Sistem operasi pada Arduino UNO juga tidak mendukung JVM.

Jika perlu program Java yang mengakses port pada Arduino, biasanya dilakukan dengan cara menjalankan program Java di komputer yang mendukung JVM, dengan mengirimkan perintah-perintah melalui port serial ke Arduino UNO. Contohnya adalah dengan menggunakan library Processing.

Referensi

  • https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines
  • https://processing.org/

 

Bagaimana mengatasi regulator Arduino yang panas?

Cara mengatasi regulator Arduino UNO ataupun Arduino Nano yang panas adalah dengan :

  • menggunakan tegangan pada power jack serendah mungkin. Tegangan paling kecil yang masih memungkinkan adalah 7 volt.
  • batasi pemakaian arus oleh prosesor
  • gunakan pendingin seperti kipas angin

Batasi Tegangan Power Jack dan VIN

Jika regulator Arduino panas, artinya ada disipasi daya pada regulator tersebut. Rangkaian regulator pada Arduino UNO adalah sebagai berikut

Rangkaian Catu Daya Arduino UNO
Rangkaian Regulator Arduino UNO

Tegangan dari power jack ataupun VIN dikecilkan menjadi 5 volt oleh regulator MC33269D-5.0 . Kelebihan tegangan ini dibuang menjadi panas. Makin besar perbedaan tegangan , maka daya yang dibuang makin besar. Daya makin besar, akibatnya regulator makin panas. Jadi salah satu cara mudah mengurangi panas pada regulator tersebut adalah dengan menggunakan tegangan power jack ataupun VIN di 7 volt saja.

Batasi Arus Mikroprosesor ATmega328

Arus maksimum pada terminal VCC prosesor adalah 200 mA. Arus ini akan menjadi beban juga bagi regulator.

Misal tegangan VIN 9 volt, dengan arus pada VCC ATmega328 adalah 200 mA. Maka akan ada pengurangan tegangan 4 volt pada regulator. Disipasi daya karena VCC sebesar P = V x I =4 volt x 200 mA = 800 mW

Misal penggunaan arus pada port ATmega328 dikurangi, sehingga total arus hanya 50 mA. Maka disipasi daya pada regulator menjadi P = VxI = 4 volt x 50 mA = 200 mW. Dengan demikian regulator tidak terlalu panas.

Gunakan Kipas

Regulator pada Arduino UNO tidak dilengkapi pendingin khusus seperti heat sink yang besar, sehingga panas sulit dibuang dengan baik. Pendinginan terutama melalui jalur tembaga di papan rangkaian (PCB) Untuk mempercepat pendinginan dapat dengan kipas angin kecil.

Secara teori cara ini dapat dipakai, namun dalam praktek sangat tidak praktis.

 

Arduino UNO R3
Arduino UNO R3