Kesalahan umum perancangan berbasis Arduino

Kendala perancangan arduino yang sering terjadi :

  1. Program berhenti ditengah jalan
  2. Contoh rangkaian dan sketch tidak jalan
  3. Tegangan referensi bersama
  4. Hasil pembacaan sensor analog tidak konsisten
  5. Jalannya program tersendat
  6. Pembacaan detik yang berulang pada RTC
  7. Modul serial tidak bisa berkomunikasi
  8. Data dari komunikasi melalui internet tidak lengkap
  9. Arduino kekurangan power
  10. Kesalaham umum sketch/program
  11. kondisi if..else tidak bekerja di dalam loop()
  12. Interupsi bertumpuk dan terabaikan
  13. Variabel tidak berubah didalam blok interupsi
  14. Arduino me-reset saat relay berubah keadaan
  15. Upload sketch gagal

Para perancang Arduino sering menghadapi masalah dalam mengembangkan sistem berbasis arduino, maka sebelum melakukan perakitan arduino pastikan hal sepele berikut :

  1. Pastikan kabel jumper tersambung antara ujung-ujungnya.
  2. Komponen tidak rusak/cacat secara fisik
  3. 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.

  1. Antara pin A0-A5 (A0 – A8 pada mega) dan pin 0  – 5 (0 – 8 pada mega) adalah berbeda.
  2. 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:

  1. Tegangan sumber (power supply) ke Arduino dan sensor tidak stabil.
  2. 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:

  1. 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.
  2. Interupsi yang berlangsung tanpa disadari seperti penggunaan library yang sebenarnya mengandung interupsi.
  3. 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 :

  1. Spesifikasi modul yang akan berkomunikasi dengan Arduino. beberapa modul memiliki fitur ‘auto Baudrate’
  2. 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%
  3. 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 :

  1. Koneksi terganggu, perbaiki pengkabelan dan periksa apakah koneksi ke internet berjalan dari perangkat lain.
  2. 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 :

  1. Tanda titik koma (semicolon) pada setiap akhir perintah.
  2. Tanda kurung (parentheses) dan kurung kurawal (curly bracket) haruslah berpasangan.
  3. Penamaan variabel pada C++ bersifat case-sensitive, yang berarti perbedaan kapitalisasi huruf berarti beda variabel.
  4. Variabel global dan variabel local dengan nama yang sama sebaiknya dihindari.
  5. Tipe data antara signed dan unsigned harus menjadi perhatian khusus, karena akan menghasilkan logika matematika berbeda pada operasi tertentu.
  6. 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:

  1. 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.
  2. 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:

  1. Gunakan kabel berkualitas
  2. batasi arus ke koil dengan penambahan hambatan (resistor) yang sesuai
  3. Gunakan power supply yang bagus (dayanya cukup saat beban max) dan dilengkapi EMI filter (perlindungan dari gangguan luar)
  4. Pemisahan power supply arduino dan relay serta beban-beban besar
  5. Relay dilengkapi flyback dioda (seperti 1N4048)
  6. Lindungi kabel power dari EMI (twist, shielding)
  7. Lengkapi decoupling kapasitor sedekat mungkin ke pin power.
  8. Lindungi kabel komponen sensitif dari EMI (twist yang rapi) kabel clock diutamakan.
  9. tambahkan decoupling/filter kapasitor (1-100nf) di clock komponen sensitif
  10. saat relay bekerja, komponen sensitif dalam keadaan read mode
  11. Pisahkan jalur kabel daya dan kontrol, beda ducting.
  12. kabel antara Arduino dan komponen sensitif sedekat mungkin.
  13. 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:

  1. 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.
  2. Gangguan juga bisa ditimbulkan oleh komponen/modul lain yang bekerja/berubah keadaan dan menyebabkan tegangan tidak stabil.
  3. Port Serial di PC/laptop digunakan oleh program lain seperti processing, putty atau serial monitor dari arduino IDE yang tidak se-gruop.
Bagikan Link halaman ini :

147 thoughts on “Kesalahan umum perancangan berbasis Arduino

  1. kak mau nanya aku pakai node mcu, load cell sama ulrasonik wiringnya udah bener tapi kok diserial monitor cuma muncul “connect: 192.168.0.7 ” nilainya gak muncul, kurangnya dimana ?

  2. Mau tanya hu, saya pakai wemos d1 mini untuk nembak ke api. Nah ketika dia connect/ saat di debug dgn laptop respon berjalan dgn baik dan normal. Namun ketika daya dipindah ke baterai atau power supply gk bisa connect ke wifi, tapi kondisi sensor dan arduino nyala. Apakah ada masalah di dayanya atay yg lain ya?

  3. Bang mau tanya, saya menggunakan arduino untuk control bilik disinfektan, awalnya oke, tapi setelah beberapa bulan, arduinonya sering aktf sendiri (tanpa trigger), kira kira apanya ya.
    Terimakasih

  4. Bang, ini saya mau buat spider robot, progam arduino sudah sama persis dengan tutorial, tapi pas saya coba aslinya tidak sama, gimana dong?

  5. Bang programku kenapa berulang terus ya padahal harusnya setelah 1x loop dia akan berhenti dan bekerja lagi saat ada kondisi high dari rfid. Tp ini baru 1 x tap , programnya looping terus. Kira2 masalahnya apa ya?
    Saya menggunakan pro mini dan node mcu. Pro mini untuk inisiate input dan node mcu untuk eksekusi program.
    Makasih bang

  6. Assallamuallaikum, dan selamat malam semuanya. saya mau bertanya,
    Saya lagi membuat project saklar sms,sudah terupload program, dan sudah terpasang rapi. Muncul masalah, setiap pertama kali dihidupkan harus menekan tombol reset baru bisa menerima sms. Mohon bantuanya

  7. relay saya di kaskade dengan coil kontaktor, coil nya bekerja di 220 V AC, kalau kontak pas lagi ada bebannya nya suka bikin hang LCD, ada saran bg?

  8. Kak mau tanya. Saya mau menggunakan sensor ZMPT101B, untuk mengukur tegangan. Nah masalahnya ada di sinyal ADC sensor. Saat saya coba menggunakan kabel usb dalam keadaan laptop tidak dicas. Sinyal ADC stabil dan bisa berubah sesuai tegangan yang dibaca. Namun bila laptopnya dalam keadaan dicas, sinyal ADC malah tak berubah dan cenderung tinggi, sinyal ADC tetap sama walaupun mengukur tegangan 0V atau 220V.
    Itu msalahnya di mana ya kak? Kok sinyal ADC kacau saat laptop dalam keadaan dicas saja. Mohon bantuannya, terima kasih

    1. ketrangannya kurang lengkap,
      dalam kasus tertentu bisa menerapkan sistem ‘bongkar pasang’, jadi di bagian setup cukup di inisialisasi salah satunya
      dan dalam loop dengan menonaktifkan salah satu sebelum mengaktifkan yang lainnya

  9. Izin kak,
    kalo ada tulisan gini
    sketch uses 4286 bytes (13%) of program storage space. Maximum is 32256 bytes.
    Global variables use 241 bytes (11%) of dynamic memory, leaving 1807 bytes for local variables. Maximum is 2048 bytes.
    program masih bisa berjalan ga ya?

  10. Mau nanya mas, saya ada kendala nilai pada port analog tetap berjalan meskipun tidak terhubung dengan sensor. Itu kira-kira kenapa ya?
    Sudah tak coba di arduino Uno dan stm32, meskipun tidak konek dengan sensor, portnya tetep mengeluarkan nilai dan nilainya itu tidak stabil

  11. Mau nanya mas, port analog arduino tetep mengeluarkan nilai meskipun tidak terhubung dengan sensor, itu masalahnya apa ya?

  12. Mau nanya kak, pada port analog arduino saya mengeluarkan nilai yang tidak stabil meskipun tidak terhubung dengan sensor, itu cara menghilangkan nilainya gimana kak? Karena saat disambung dengan sensor, maka outputnya akan ditambah dengan nilai tadi yang mengakibatkan nilainya jadi double

    1. port analog (atau digital) pada mode input bersifat floating/mengambang (kecuali pada mode input pull up ==indikasinya pembacaan stabil di 1023/maksimal==)
      jadi ketika di pasangi sensor, maka yang terbaca adalah output sensor dari itu sendiri

  13. Kak mau tanya, saya membeli relay 2 channel untuk suatu projek. Relay itu masih berfungsi dengan baik sampai saya gunakan untuk tester kabel jumper apakah kabel masih berfungsi atau tidak. Jadi pas lagi ngetes kabel yang lain tiba-tiba relaynya ga bisa hidup sama sekali, padahal udh betul pin jumpernya. Itu masalahnya apa ya? Sama solusinya gimana? Mohon bantuannya kak

    1. *modul relay pada umumnya di lengkapi indikator led power supply, pastikan led power on itu menyala (cek kabel power +5v-gnd)
      *mekanik relay membutuhkan daya, pastikan power supplynya cukup daya / arusnya cukup (misal 5 volt – 2 ampere)

  14. selamat malam bg, kenapa arduino tiba-tiba led L, TX, RX nyala terus dan system tidak bekerja untuk membaca ultrasonic us-015..

    1. indikator l terhubung ke pin 13, dan rx-tx sebagai indikasi komunikasi serial
      jika rx-tx nyala terus bisa jadi ada komunikasi serial yang terus-terusan, dan penyalaan pin 13
      cek lagi logika programnya, besar kemungkinan program hanya loop di pengiriman data serial

    1. umumnya di arduino ada 4 led yaitu on, led, rx dan tx,
      on sebagai indikator power supply
      l terhubung ke pin 13
      led rx-tx hanya menyala ketika ada transmisi data serial,
      jika maksudnya led rx-tx selalu menyala berarti ada transmisi komunikasi serial yang terus menerus (normal jika memang di programkan demikian)

  15. Saya menggunakan arduino uno dan load cell, tapi nilai load cell yang terbaca di serial monitor tidak stabil kira-kira itu karena apa ya? Dan ketika sudah stabil tetapi nilai yang terbaca tidak berbeda antara load cell dengan beban dan tanpa beban, masalahnya dimana ya padahal load cell yang saya gunakan baru.

  16. maaf kak, saya mau tanya, saya mau menjalankan bell sekolah dari mains 220v melalui single chanel 5v optocoupler relay, yang di kendalikan oleh pin ouput dan pin input interupt, arduino uno, yang terhubung ke pushbutton dengan pullup internal resistor, dan interupt aktif bila kondisi low… pada waktu test relay saya hubungkan dengan buzzer dan powersupplly 5v.. rangkaian berjalan dengan baik, bila yang di drive dengan relay alat yang jalan dengan baterai atau dc powered,

    namun pada tahap implementasi ketika kaki common pada relay baru saja terhubung dengan 220v belum di apa2in, kalau kaki common di sentuh dengan obeng, kadang interupt langsung jalan seperti push button tertekan

    dan di tengah2 running seperti ada random triger interupsinya, kira2 masalahnya di mana ya kak ? terima kasih sebelumnya

    1. kemungkinan penyebabnya adalah weak pullup,

      • Pastikan internal pullup tetap aktif, misalnya penulisan kode digitalWrite(2, LOW); akan mematikan internal pullup di pin 2
      • Jika diperlukan, tambahkan external pullup
      • Periksa sinyalnya dengan analogRead(pin);
  17. Kak mau tanya, saya secara ceroboh menggunakan pin 0 dan pin 1 sebagai input. Setelah saya gunakan tiba2 Arduino error kemudian Arduino tdk bisa di upload program lagi meskipun kabel jumper sudah di lepas dari pin 0 dan pin 1. Solusinya supaya bisa baik lagi Arduino saya gimana ya kak?

    1. Tidak akan ada masalah dengan pin 0, 1 sebagai GPIO biasa (seperti lainnya), karena antara serial (16u2, ch340/sejenisnya) di batasi oleh resistor 1k ohm.
      Jika terjadi masalah, hal yang mungkin bisa dilakukan:

      • Periksa secara visual komponen-komponen yang mungkin rusak
      • Gunakan external usb to serial ttl
      • Gunakan ISP programmer

Tinggalkan Balasan ke Fm27 Batalkan balasan

Alamat email Anda tidak akan dipublikasikan.