Kendala perancangan arduino yang sering terjadi :
- Program berhenti ditengah jalan
- Contoh rangkaian dan sketch tidak jalan
- Tegangan referensi bersama
- Hasil pembacaan sensor analog tidak konsisten
- Jalannya program tersendat
- Pembacaan detik yang berulang pada RTC
- Modul serial tidak bisa berkomunikasi
- Data dari komunikasi melalui internet tidak lengkap
- Arduino kekurangan power
- Kesalaham umum sketch/program
- kondisi if..else tidak bekerja di dalam loop()
- Interupsi bertumpuk dan terabaikan
- Variabel tidak berubah didalam blok interupsi
- Arduino me-reset saat relay berubah keadaan
- Upload sketch gagal
Para perancang Arduino sering menghadapi masalah dalam mengembangkan sistem berbasis arduino, maka sebelum melakukan perakitan arduino pastikan hal sepele berikut :
- Pastikan kabel jumper tersambung antara ujung-ujungnya.
- Komponen tidak rusak/cacat secara fisik
- Power supply / baterai / adaptor tersambung dengan benar (sesuai polaritas dan tegangan)
Sebelum memulai merakit arduino Juga perlu diperhatikan jalur internal pin-pin di papan/board arduino yang terhubung secara fisik.
- Antara pin A0-A5 (A0 – A8 pada mega) dan pin 0 – 5 (0 – 8 pada mega) adalah berbeda.
- Pin TWI/I2C (SCL dan SDA) dan SPI (SCK, MOSI, MISO) terhubung seperti gambar berikut:
Apabila salah satu pin telah digunakan, maka pasangannya tidak lagi bisa digunakan sebagai pin (kecuali keperluan sambungan tambahan).
berikut ini adalah beberapa permasalahan yang sering muncul dalam perancangan sistem otomatis berbasis arduino:
Program berhenti ditengah jalan
Perangkat berjalan normal tetapi terhenti setelah menyelesaikan tugasnya. dan tidak bisa menjalankan perintah lainnya. Hal ini terjadi karena didalam sketch terdapat baris berikut:
while(1);
atau
for(;;);
baris sketch ini akan menghentikan jalannya program (kecuali interrupt), biasanya disisipkan oleh perancang untuk melihat hasil dan membuat perangkat selesai melakukan tugasnya dan berhenti dititik itu.
dengan menghapus baris tersebut maka program akan kembali berjalan dan menjalankan baris perintah berikutnya.
Contoh rangkaian dan sketch tidak jalan
Rangkaian dan sketch dibuat serupa tanpa perubahan tetapi perangkat tidak berkerja.
Dalam merakit rangkaian, –utamakan– defenisi poisisi pin dari sketch yang akan di upload. contohnya kode berikut berarti pin sensor berada dan pin nomor 2:
#define sensor 2
int sensor = 2;
Tegangan referensi bersama
Groung/polaritas negatif yang tidak terhubung mengakibatkan intepretasi yang berbeda terhadap suatu nilai.
Membangun sebuah sistem digital atau sistem analog yang terhubung dengan beberapa perangkat lain harus memiliki tegangan referensi yang sama (biasanya ground/negatif) kecuali wireless.
Hasil pembacaan sensor analog tidak konsisten
Pembacaan sensor analog melalui pin A0-A5 (A0-A8 pada mega) menggunakan perintah analogRead(pin), hasil berubah-ubah padahal sensor mengukur sesuatu yang diam.
Pembacaan analog dengan Arduino menggunakan ADC. ADC pada Arduino sendiri memiliki spesifikasi yang harus dipenuhi seperti dalam datasheetnya, beberapa penyebab yang sering terjadi adalah:
- Tegangan sumber (power supply) ke Arduino dan sensor tidak stabil.
- Resistansi yang besar, bisa diakibatkan
- Jarak sensor dan pin dengan kabel yang panjang.
- kabel memiliki resistansi besar.
- Koneksi konektor yang tidak bagus (tidak kontak sempurna) karena longgar atau karatan.
- interferensi sinyal lain (sinyal yang bersebelahan, jala listrik, sinyal handphone dll)
Jalannya program tersendat
penyebab umum jalannya program arduino lambat dan tersendat:
- Delay sering digunakan, namun sebenarnya pengunaan perintah delay yang berlebihan sangat merugikan karena
- Menyita kinerja CPU
- Melewatkan adanya permintaan dari modul/komponen luar yang ingin segera ditanggapi.
- Interupsi yang berlangsung tanpa disadari seperti penggunaan library yang sebenarnya mengandung interupsi.
- Perulangan seperti for, do, while yang berlangsung terus menerus, sebaiknya lebih diefesien lagi dan keluar dengan perintah ‘break’ jika persyaratannya telah terpenuhi.
Pembacaan detik yang berulang pada RTC
RTC digunakan sebagai penedia data waktu real time, namun kesalahan yang sering terjadi adalah ketika menunggu adanya perubahan data dari RTC (detik), pembacaan dilakukan berulang-ulang ke RTC.
Jika dicermati RTC juga memiliki fitur interupsi yang memberii tahu CPU bahwa adanya perubahan data. Ketika CPU Arduino mendapat interupsi ini barulah dilakukan pembacaan data RTC.
Modul serial tidak bisa berkomunikasi
Beberapa baudrate yang direkomendasikan : 300, 1.200, 2.400, 4.800, 9.600, 19.200, 38.400, 57.600, 74.880, 115.200, 230.400, 250.000, 500.000, 1.000.000, 2.000.000. Pemilihan baudrate berdasarkan :
- Spesifikasi modul yang akan berkomunikasi dengan Arduino. beberapa modul memiliki fitur ‘auto Baudrate’
- Tingkat kesalahan data, hal ini berkaitan dengan frekuensi CPU arduino, batas yang dizinkan adalah 0.5%.
yang dihitung menggunakan rumus :
error(%) = ((baudrate sebenarnya/badudrate )- 1) * 100%
- Baud rate yang rendah akan menyebabkan waktu tunda (delay) yang lebih banyak, seringkali hal ini tidak disadari dan menyebabkan baris perintah lain terlambat untuk dieksekusi.
untuk menghitung waktu yang dibutuhkan serial dalam mengirim data (1 start bit, 8 data, 1 parity, 1stop bit) digunakan formula:Waktu(detik) = (1/baudrate * 11) * jumlah datasebagai contoh untuk mengirim 100 karakter pada baud rate 9600 dalam mode asynchronous membutuhkan waktu ±1 detik
Data dari komunikasi melalui internet tidak lengkap
Akses Arduino bisa dilakukan menggunakan ethernet, Wifi, Modem. Kesalahan umumnya adalah data yang diterima tidak lengkap, terpotong, kacau. kemungkinan yang terjadi adalah :
- Koneksi terganggu, perbaiki pengkabelan dan periksa apakah koneksi ke internet berjalan dari perangkat lain.
- Upaya menampilkan hasil data yang diterima melalui komunikasi serial.
- naikkan baudrate misal Serial.begin(115200) untuk mengurangi waktu bagi komunikasi serial
- Simpan data yang diterima dalam variabel string, dan tampilkan melalui serial setelah komunikasi internet selesai.
Arduino kekurangan power
Arduino memiliki internal regulator tegangan 5V dan 3.3V, dengan kemampuan arus 0.8-1A. keluaran dari regulator ini digunakan oleh Arduino sendiri dan sisanya melalui pin power. Jika sumber tegangan ini juga digunakan oleh modul-modul diluar arduino, maka pastikan itu mencukupi (sesuai spesifikasi) untuk memperoleh kinerja maksimal.
Kesalaham umum sketch/program
Dalam membuat sketch/koding/program/listing program dengan IDE Arduino kita harus mengikuti gaya bahasa C++, dan aturan gaya bahasa serta logika program yang sering terlewatkan adalah :
- Tanda titik koma (semicolon) pada setiap akhir perintah.
- Tanda kurung (parentheses) dan kurung kurawal (curly bracket) haruslah berpasangan.
- Penamaan variabel pada C++ bersifat case-sensitive, yang berarti perbedaan kapitalisasi huruf berarti beda variabel.
- Variabel global dan variabel local dengan nama yang sama sebaiknya dihindari.
- Tipe data antara signed dan unsigned harus menjadi perhatian khusus, karena akan menghasilkan logika matematika berbeda pada operasi tertentu.
- Variabel dengan bilangan berkoma (floating point) akan tersimpan sebagai bilangan digital basis 2 yang kadang berbeda (dibulatkan).
kondisi if..else tidak bekerja di dalam loop()
void setup() {
pinMode(12, INPUT_PULLUP);//Tombol
pinMode(13, OUTPUT);//LED
}
void loop() {
if(digitalRead(12))
{
digitalWrite(13, HIGH);
}
else
{
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
}
}
dari sketch diatas kita mengharapkan ketika tombol di pin 12 ditekan maka LED akan hidup terus, dan ketika dilepas LED akan hidup selama 1 detik kemudian mati.
Namun setelah dirunning ternyata LED terus hidup dan tidak pernah mati. kondisi ini disebut dengan “false loop”, karena sebenarnya kondisi dalam blok else selalu dijalakan karena berada didalam operasi loop().
Interupsi bertumpuk
Interupsi akan memotong jalannya program biasa untuk mengeksekusi baris yang ada dalam blok interupsi dan tidak dapat diinterupsi lagi. Apabila terjadi interupsi lain yang berbeda sebelum sebuah interupsi selesai/keluar (reti) maka interupsi lain itu harus menunggu.
Apabila sebuah interupsi berjalan dan terjadi kejadian interupsi yang sama lagi maka interupsi kedua ini akan dibatalkan (selama flag interupsi masih aktif).
Untuk interupsi yang sering terjadi dan dalam jeda yang singkat, maka baris program yang ada di badan interupsi haruslah sesingkat mungkin, baris program dihitung dalam satuan baris assembler misalnya satu baris “Serial.println();” akan menghasilkan lebih dari satu baris assembler.
Jika badan interupsi harus memiliki baris program yang besar, maka sebaiknya badan interupsi hanya menghasilkan flag, dan flag ini akan dibaca oleh baris program reguler untuk dieksekusi lebih lanjut.
Variabel tidak berubah didalam blok interupsi
Apabila interupsi digunakan untuk merubah keadaan/nilai sebuah variabel, maka variabel tersebut harus dideklarasikan dengan properti volatile.
Proses compile sketch menjadi bahasa mikrokontroller juga menjalankan fungsi optimalisasi, artinya baris program yang menurut compiler tidak efektif/sia-sia akan diabaikan, kecuali variabel dengan properti volatile (tetap diperhitungkan).
Arduino me-reset saat relay berubah keadaan
Relay merupakan komponen elektro mekanik yang memiliki koil (lilitan) untuk menggerakkan tuas kontak. Dalam operasional relay menghasilkan spike (kejut listrik) yang dihasilkan oleh:
- Koil, memiliki induktansi yang berpengaruh terhadap laju arus/detik, saat koil diberi tegangan maka koil akan dialiri arus sesaat yang besar sedangkan ketika di nonaktifkan relay akan menghasilkan arus sesaat yang besar dalam arah berlawanan (minus).
Arus sesaat yang besar ini bisa mengakibatkan terjadinya kejut listrik diseluruh rangkaian nya.
- Kontak listrik, berlaku seperti saklar (switch) dimana semakin besar arus beban yang diputus/disambungkan maka akan semakin besar pula kemungkinan terjadinya bunga api, yang juga berpotensi besar menghasilkan kejut listrik.
Upaya pemecahan permasahan kontak relay ini bisa dilakukan dengan cara:
- Gunakan kabel berkualitas
- batasi arus ke koil dengan penambahan hambatan (resistor) yang sesuai
- Gunakan power supply yang bagus (dayanya cukup saat beban max) dan dilengkapi EMI filter (perlindungan dari gangguan luar)
- Pemisahan power supply arduino dan relay serta beban-beban besar
- Relay dilengkapi flyback dioda (seperti 1N4048)
- Lindungi kabel power dari EMI (twist, shielding)
- Lengkapi decoupling kapasitor sedekat mungkin ke pin power.
- Lindungi kabel komponen sensitif dari EMI (twist yang rapi) kabel clock diutamakan.
- tambahkan decoupling/filter kapasitor (1-100nf) di clock komponen sensitif
- saat relay bekerja, komponen sensitif dalam keadaan read mode
- Pisahkan jalur kabel daya dan kontrol, beda ducting.
- kabel antara Arduino dan komponen sensitif sedekat mungkin.
- firmware trick.
Upload sketch gagal
Sebelum mengupload sketch ke arduino pastikan memlih board dan processor serta port (dalam menu Tools) yang sesuai dengan board Arduino yang terpasang. Pastikan juga kabel usb dalam keadaan baik.
Masalah yang kerap terjadi saat proses upload adalah:
- Bentrok dengan Serial, arduino melakukan proses upload memanggunakan pin Serial (pin 0 dan 1) apabila pin tersebut juga digunakan untuk keperluan lain dapat dipastikan akan terjadi interferensi data.
- Gangguan juga bisa ditimbulkan oleh komponen/modul lain yang bekerja/berubah keadaan dan menyebabkan tegangan tidak stabil.
- Port Serial di PC/laptop digunakan oleh program lain seperti processing, putty atau serial monitor dari arduino IDE yang tidak se-gruop.