Coding Arduino 101 | Untuk Beginners

Dalam artikel ini, anda akan mempelajari asas memahami coding dalam Arduino. Artikel ini mengandungi beberapa bahasa yang advance yang menyentuh bab coding.

Walaubagaimanapun, anda tidak perlu takut, kerana artikel ini hanyalah sebagai reference untuk beginners sahaja, bagi individu yang ingin cuba memahami coding Arduino.

Anda sebenarnya boleh belajar dengan lebih cepat dengan menggunakan Kaedah Copy/Paste sahaja, iaitu dengan mengikuti setiap Tutorial kami dan ditiru pendawaian(wiring) serta, copy/paste sahaja coding yang diberikan untuk melihat hasilnya.

Kemudian cuba memahami fungsi setiap coding dari setiap tutorial yang disediakan.

Nota : Artikel-artikel di MatGyver.my telah disesuaikan dan dipermudahkan pemahaman untuk golongan-golongan beginners sehingga intermediate yang hanya memerlukan pemahaman ditahap permukaan sahaja. Namun, comment-comment dari pihak-pihak yang sudah advance adalah amat kami alu-alukan bagi proses penambah-baikan artikel-artikel kami.

 

Lain Board, Lain Coding?

arduino-comparison

Secara asasnya, cara coding untuk semua Arduino board adalah sama. Coding yang digunakan untuk Arduino UNO, memang boleh dipakai terus pada board-board lain seperti MEGA , NANO dan lain-lain. Cuma pemilihan BOARD dan PROCESSOR perlu betul dalam Arduino IDE.

Diperingkat lebih advance, apabila anda mula menggunakan Input/Output Communication Peripherals lain seperti, I2C, SPI, Serial, ada kemungkinan sambungan komunikasi mereka sahaja yang berbeza antara setiap board dan coding kekal sama.

3 Perkara Pertama Beginners Perlu Tahu!

  • ‘SKETCH’
  • ‘//’ NOTA
  • ‘{‘  ‘}’ SEMI-COLON

Pastikan anda mengetahui dengan terperinci mengenai 3 perkara ini sebelum advance lebih lanjut, ikuti artikel di bawah:

Struktur Asas Coding Arduino IDE

Bagi individu yang mempunyai asas coding seperti Java, HTML, CSS dan juga asas C++, anda pasti dapat pelajari coding Arduino dengan mudah dan pantas.

Bagi beginners pula, contoh sketch dalam artikel di atas (3 Perkara Asas…) mungkin nampak kompleks. Namun hakikatnya, itulah antara coding paling ringkas dalam Arduino, lagi-lagi apabila dibuang semua Nota-Nota Kaki dalam coding tersebut, dan ia jadi ringkas seperti berikut:

void setup() {
 pinMode(2, OUTPUT);                     
}
void loop() {
 digitalWrite(2, HIGH); 
 delay(1000);              
 digitalWrite(2, LOW); 
 delay(1000);                                
}

Coding di atas adalah asas untuk mengelipkan satu lampu LED yang disambungkan pada Pin 2 Arduino.

Namun, secara keseluruhan, Kawasan Coding dalam Arduino IDE boleh dibahagikan kepada 4 bahagian seperti berikut:

COVER PHOTO IDE.jpg

Untuk mudah faham, kawasan Coding terbahagi kepada 4 bahagian.

Walaubagaimanapun, Void Setup() dan juga Void Loop() merupakan  2 komponen utama dan paling penting. Manakala Defining Area serta Auxilary Area hanya merupakan kawasan untuk coding-coding supportif dan tambahan pada penggunaan-penggunaan yang lebih advance.

Anda boleh perhatikan code mengelip lampu LED di atas, hanya mempunyai code dalam Void Setup() dan juga Void Loop(). Jika anda perhatikan betul-betul, anda juga dapat lihat, sebenarnya Void Loop() yang mengandungi Coding Utama untuk mengerlipkan LED tersebut.
(Rujuk coding penuh di bawah yang mempunyai Nota-nota Kaki untuk setiap fungsi coding)

//CONTOH: KELIPKAN LED PADA PIN 2 ARDUINO//
//coding berikut adalah untuk mengelipkan LED yang disambungkan pada pin 2
//arduino anda
//Anda boleh gunakan coding ini untuk mana-mana projek anda
//cuma pastikan anda 'TAG' kami iaitu MatGyver.my apabila
//anda 'SHARE' projek anda

void setup() {
// Setup Code di sini hanya akan berjalan sekali sahaja
pinMode(2, OUTPUT); // Declare pin 2 sebagai digital output
                    // LED disambungkan pada pin 2
}

void loop() {
// Di sini biasanya adalah code utama projek
// Code dalam void loop() akan di-loop secara infiniti

digitalWrite(2, HIGH); //digital output HIGH = 5V pada LED (ON)
delay(1000); //loop tunggu 1000 millisaat = 1s
             //bermaksud signal LED ON selama 1s
digitalWrite(2, LOW); //digital output LOW = 0V pada LED (OFF)
delay(1000); //loop tunggu 1000 millisaat = 1s
             //bermaksud signal LED OFF selama 1s   
}

Perbezaan yang paling ketara antara Void Setup() dan Void Loop() adalah,

Void Setup() hanya membaca dan menjalankan coding anda SEKALI SAHAJA, iaitu dari awal pembukaan semi-colon ‘{‘ sehingga akhir penutupan semi-colon ‘}’ bagi Void Setup().

Void Loop() pula membaca dan menjalankan coding di dalamnya secara INFINITE-LOOP berasaskan kelajuan frequency Chip MCU Arduino anda, hampir 100kHz.

Ini bermakna, setelah Arduino membaca dan menjalankan coding dalam Void Loop() sehingga hujung penutupan semi-colon ‘}’ Void Loop(), ia akan mulakan semula pembacaan dari permulaan semi-colon'{‘ Void Loop() sehingga habis semula dengan kadar hampir 100kHz.

Sebagai contoh, jika kita meletakkan satu sensor Ultrasonic yang mengesan jarak objek di hadapan, Sensor Ultrasonic tadi akan memberikan data mengenai jarak pada kelajuan 100khz atau setiap 1/100000 saat. Kadang-kadang, Sketch yang tiada langsung penggunaan delay adalah digalakkan untuk meletakkan delay sekurang-kurangnya 20 millisecond di penghujung Void Loop(). Kelajuan 20 millisecond adalah memadai untuk kebanyakan project.

Void Setup()

Selain membaca dan menjalankan coding SEKALI-SAHAJA, Void Setup() berfungsi mengikut namanya, iaitu untuk ‘Setup’ fungsi-fungsi tertentu dalam Arduino. Hampir semua aktiviti Setup dan Declaration berlaku dalam kawasan Void Setup().

Memang sesetengah fungsi dalam Arduino  perlu ‘Setup’ dahulu sebelum dapat digunakan dalam Coding Utama projek anda dalam Void Loop().

Berdasarkan contoh kelip LED di atas, kita lihat, dalam Void Setup(), hanya terdapat syntax,

pinMode(2, OUTPUT); // Declare pin 2 sebagai digital output

Syntax coding di atas adalah coding ‘Declaration’, yang memberitahu MCU Arduino, kita mahu gunakan pin nombor 2 sebagai Digital Output, yang akan menyalakan LED.

Antara fungsi-fungsi asas lain yang selalunya berada dalam Void Setup() adalah seperti berikut:

  • Pin Declaration – Digital Input
    Digunakan bila perlukan input On/Off yang menggunakan input digital 5V.
    Contoh mudah seperti switch, butang, dan relay-contact 5V.

    pinMode(2, INPUT_PULLUP); //input pull-up pada pin 2
    
  • Pin Declaration – Digital Output
    Digunakan bila mempunyai Output yang menggunakan 5V untuk di ON-kan.
    Contoh mudah seperti LED, Motor-Kecil (100mW), ataupun Relay-Coil 5V.

    pinMode(5, OUTPUT); //Output Digital pada pin 5
    

    Perhatian: Digital Output Arduino hanya mampu support peralatan pada voltan 5V dan arus 20mA maksimum, atau 100mW kuasa maksimum untuk setiap Pin Output.

  • Pin Declaration – Analog Output(PWM)
    Digunakan bila mempunyai Output boleh laras yang menggunakan 5V untuk di ON-kan.
    Contoh mudah seperti LED, Motor-Kecil (100mW), Motor Shield yang kawal motor-motor besar.

    pinMode(7, OUTPUT); //sama seperti digital output, cuma pin 7
    

    //Nota Kaki : Analog Input tidak perlu declare pin

  • Pin Declaration – Servo Motor (Library: Servo.h)
    Digunakan untuk mengawal Servo Motor RC.

    ServoSaya.attach(3); //kawalan signal Servo pada pin 3
    

    Perhatian: Penggunaan servo, perlu memanggil library Servo.h dalam kawasan ‘Defining Area’. Penggunaan servo lebih dari 2 unit di sarankan menggunakan power supply berasingan.

  • Initiate (Memulakan) Komunikasi Peripheral (.begin() )
    Contoh-contoh komunikasi peripheral adalah seperti,
    Serial Hardware, Serial Software, SPI, I2C dll.
    Setiap jenis perpheral mempunyai coding yang tertentu untuk menggunakan mereka.

    Serial.begin(9600); //initiate komunikasi Serial
                       //pada kelajuan Baud Rate 9600Kb/s
    radio.begin(); //initiate komunikasi radio nRF24             
    Wire.begin(); //initiate komunikasi I2C
    SPI.begin(); //initiate komunikasi SPI
    

Penggunaan Komunikasi Peripheral adalah dikira intermediate level, kebiasaannya digunakan untuk module-module sensor, module komunikasi wireless mahupun module-module display LCD.

Void Loop()

Void Loop() pula merupakan bahagian yang mengandungi Coding Utama yang akan di-loop-kan secara berterusan dan secara infiniti selagi Arduino diberi kuasa voltan. Semua fungsi utama seperti, On-kan LED, Off-kan LED, baca Input dari butang, baca Input dari komunikasi Serial atau SPI, timer dan kira-kira matematik, semuanya perlu diletakkan dalam Void Loop() yang menjadi asas pada fungsi mana-mana project atau applikasi anda.

Sebagai Coding Utama, tentulah ia perlu berfungsi dengan sistematik. Lazimnya, Coding Utama pasti akan dapat membuat 3 aktiviti berikut:

  1. Membaca Input
  2. Memproses Data/Maklumat
  3. Arahan Output
maklumat-proses

3 Peringkat Pemprosesan Maklumat/Data untuk mana-mana sistem automasi.

MEMBACA INPUT
Input bagi Arduino boleh datang dari berbagai sumber, dari input Digital High/Low (5V/0V) seperti butang, switch dan relay, juga terdapat beberapa jenis sensor yang mengeluarkan Digital Output (5V/0V), dari Sensor Analog yang memberikan Range-data (0~1023) ataupun sumber tetap yang telah di tulis dalam Coding Program.

Seperti contoh program kelip LED di atas, Input-nya adalah sumber tetap delay(1000), iaitu delay timer 1s.

Antara beberapa contoh syntax untuk bacaan Input adalah seperti berikut:

  • Digital Input digitalRead()
    Bacaan ini kebiasaannya adalah dalam bentuk “character” atau syntax char.
    Bacaan akan diterima sebagai “HIGH” atau “LOW”.

    digitalRead(8); //mendapatkan bacaan dari Digital Input pin 8
    

    Atau cara penggunaannya bersama pemprosesan:

    if (digitalRead(8)==HIGH){  //jika pin 8 adalah HIGH atau ON
     digitalWrite(2, HIGH); //nyalakan LED pada pin 2
    }
    
  • Analog Input analogRead()
    Bacaan ini pula adalah dari nilai 0~1023 (10 bit maximum, abaikan bit jika tidak faham)

    analogRead(A3); //mendapatkan bacaan dari Analog Input pin 3
    

    Atau cara penggunaannya bersama pemprosesan:

    if (analogRead(A3) < 500){ //jika bacaan dari pin A3 adalah kurang dari 500
     digitalWrite(2, HIGH); //nyalakan LED pada pin 2
    }
    
  • Serial Input Serial.Read()

    Serial.read(); //mendapatkan data dari sumber Serial
    

    Atau cara penggunaannya bersama pemprosesan:

    if(Serial.available()){ //jika terdapat transmisi data melalui Serial
    throttleByte = Serial.read(); //simpan data tersebut dalam throttleByte
    }
    
  • .Read() untuk peripherals lain seperti SPI, I2C dan lain-lain,
    ikuti artikel berikut:

    • SPI vs I2C

MEMPROSES DATA/MAKLUMAT
Setiap data input yang diterima seperti di atas, dapat di manipulasi  untuk menjadi asbab/sebab kepada suatu output.

Apa yang penting, semua bentuk input yang diterima, semuanya dalam bentuk nombor digital yang tepat. Dengan nombor-nombor inilah, data tersebut dapat dimanipulasi dengan Operasi Matematik mahupun Operasi berasaskan Situasi.

Antara cara memanipulasi data input adalah seperti contoh-contoh berikut:

  • Operasi Matematik +, -, x, /, =
    Peratus_PerbezaanMasa = (MasaSekarang - MasaSebelum)/ MasaSekarang;
    //contoh cara meletakkan setiap data dalam bentuk fomula matematik
    if(Peratus_PerbezaanMasa > 50){ //membuat perbandingan kondisi
     analogWrite(9, 255); //output hasil dari manipulasi data input tersebut
    }                      //PWM output bernilai max 255 pada pin 9
    
  • Perbandingan Situasi, While(), If(), For() Loop
    While() Loop

    while(digitalRead(3) == LOW) {
    //loop ini akan kekal berulang sehingga digitalRead(3) menjadi HIGH   
              
       val9 = map(analogRead(A0),225, 830, 16, 160);     
       ServoSatu.write(val9);                   
             
       val10 = map(analogRead(A1),225, 830, 16, 160);     
       ServoDua.write(val10);                  
    
       delay(15);  
       }
    

    For() Loop

    for (x = 0; x < 5; x++){
    /*FOR LOOP ini mengatakan bahawa,
     * Nilai permulaan 'x' adalah 0.
     * Loop FOR akan berulang-ulang selagi nilai x tidak
     * bersamaan 5.
     * Dan setiap kali 1 cycle habis, nilai x ditambah '1'
     * 
     * Loop ini akan berulang sebanyak 5 kali sahaja.
     */
    
     digitalWrite(2, HIGH);
     delay(1000);
     digitalWrite(2, LOW);
     delay(1000);
    }
    

    If() Condition
    Contoh If() condition adalah seperti contoh-contoh di atas. Namun, hampir kesemua jenis comparator dapat digunakan. Antaranya adalah, nilai sama’==’ , nilai tidak  sama ‘!=’ , lebih besar ‘>’ atau lebih kecil ‘<‘

  • Pelarasan Nilai, Fungsi Map
    Selalunya digunakan pada data-data yang mempunyai ‘range’ seperti Analog Input.

    nilaiA = analogRead(potpin2);            
    nilaiA = map(analogRead(potpin2),0,1023, 0, 255);
    /*data dari analog input adalam dalam range 0~1023  
     *jadi fungsi map di atas menukar dan melaraskan
     *range 0~1023 kepada range yang lebih rendah 0~255
     *ini bermakna 1023 diterjemahkan secara linear kepada
     *255
     */
    
    analogWrite(9, nilaiA);
    //analogWrite atau PWM, hanya boleh mengeluarkan 255 maksimum
    

ARAHAN OUTPUT
Arahan-arahan Output, selalunya mempunyai penghujung .Write() .Beberapa contoh arahan Output adalah seperti berikut:

  • Output Digital (HIGH/LOW), digitalWrite()

     digitalWrite(2, HIGH); //sama seperti kelipan LED
    
    
  • Output Analog (0~255), analogWrite()

    analogWrite(9, 255);
    //analogWrite atau PWM, hanya boleh mengeluarkan nilai 255 maksimum
    //nilai 255 ini adalah 100% duty cycle PWM
    //iaitu bersamaan dengan 5V penuh   
    
  • Kawalan Servo (0~180), ServoSaya.Write()

    ServoSaya1.write(180);
    //Servo dikawal ke 180 darjah
    //anda boleh masukkan range dari 0~180 darjah
    //untuk mengawal Servo    
    
  • Penghataran data ke Serial , Serial.Write()

    //hantar data value pin Analog 3 pada Serial
    Serial.write(analogRead(A4));  
    //hantar data value pin Analog 3 pada Serial
    
  • Penghantaran data ke Peripherals lain SPI & I2C , XXX.Write()
    Detail akan ditulis dalam blog entry lain, contoh seperti di bawah,

    SPI.transfer(); //dengan library SPI
    Wire.write(); //dengan library I2C
    radio.write(); //dengan library nRF24
    

Defining Area

Kawasan untuk declare ‘variable-variable’ custom anda, juga kawasan untuk memanggil ‘library-library’ tambahan yang diperlukan.

‘Variable’ lebih mudah difahami sebagai ‘Nama Panggilan’. Ia lebih mudah untuk disemak dan troubleshoot berbanding jika menulis nombor-nombor dalam coding Input/Output, lihat contoh berikut:

int LED_Hijau = 2;

void setup() {
pinMode(LED_Hijau, OUTPUT);
}

void loop() {
digitalWrite(LED_Hijau, HIGH);
delay(1000);
digitalWrite(LED_Hijau, LOW);
delay(1000);
}

Coding di atas adalah sama seperti kelip LED yang awal, cuma nombor pin 2 telah digantikan dengan ‘variable’ LED_Hijau. Lebih mudah untuk kita tulis coding begini. Namun, penggunaan setiap variable, perlu di-declare di-‘Defining Area’ seperti di atas.
(Rujuk artikel berikut untuk mengetahui jenis-jenis variable yang ada)

Coding berikut pula, akan menunjukkan contoh coding memanggil ‘library-library’ tambahan, semuanya menggunakan simbol ‘#’ dipermulaan:

#include <SPI.h> //memanggil Library unutk SPI
#include <Wire.h> //memanggil Library unutk I2C
#include <nRF24L01.h> //memanggil Library untuk module nRF24L01
#include <RF24.h> //memanggil Library untuk module RF24
#include <Servo.h> //memanggil Library untuk Servo

Mengapa Perlu Panggil Library Tambahan?
Untuk menjimatkan ruang Memory dalam Microcontroller chip Arduino anda. Maksimum memory hanya 32kB sahaja untuk board-board biasa seperti UNO, NANI dan PRO MINI. Oleh itu, hanya panggil Library yang diperlukan sahaja dalam satu masa.

Auxillary Area

Dalam kawasan Auxillary pula, kebiasaannya digunakan untuk meletakkan fungsi-fungsi custom anda sendiri. Tidak semua orang menggunakan fungsi custom. Tetapi apabila anda sudah biasa, ia akan membuatkan coding anda nampak lebih kemas dan teratur.

Tambahan pula, ia sangat sesuai digunakan untuk coding-coding yang berulang.
Dengan menggunakan contoh Kelip LED juga, kita lihat bagaimana membuat fungsi custom seperti contoh berikut:

void setup() {
pinMode(2, OUTPUT);
}

void loop() {
kelipkelip();
delay(5000);
kelipkelip();
delay(3000);
}

void kelipkelip(){
 digitalWrite(2, HIGH);
 delay(1000);
 digitalWrite(2, LOW);
 delay(1000);
}

Semua coding untuk kelip telah diletakkan dalam fungsi custom kita yang dipanggil kelipkelip() . Mengikut kaedah di atas, hanya perlu beri nama anda sendiri dan tambahkan ‘()’ dihujung.

Jangan Takut Untuk Bermula

Penerangan di atas hanyalah sebagai panduan. Anda tidak perlu menulis coding anda sendiri untuk peringkat awal.

Untuk peringkat permulaan, anda pasti akan dapat belajar dengan cepat dengan kaedah copy/paste. Setiap tutorial yang kami sediakan di MaGyver.my telah disediakan pelan pendawaian (wiring) serta ‘Sketch’ coding yang berfungsi.

Copy/Paste dan kaji coding, wiring serta output yang terhasil.

Kemudian perlahan-lahan cuba ingat dan fahami maksud setiap coding. Ia tidaklah begitu susah. Apabila sudah biasa, ia pasti berada di hujung minda sahaja.

Kami syorkan anda terus ke artikel berikut untuk mula menguji Arduino tanpa perlu tahu mengenai coding:

Lebih Lanjut Mengenai Coding Arduino

Untuk mengetahui lebih lanjut dan detail mengenai command-command syntax dalam Arduino IDE, anda boleh layari URL berikut dari Arduino.cc yang menerangkan mengenai setiap command arahan:

Beberapa Artikel bacaan lain yang kami syorkan:

MatGyver.my menyediakan forum perbincangan untuk komuniti DIY Hobbyist termasuk Arduino untuk yang Beginners mahupun Advance, bagi berbincang serta bertanyakan soalan mengenai topik-topik Arduino dan DIY. Soalan basic juga akandilaya, jangan risau. Daftarkan account dalam forum untuk mula menggunakannya, dan :

Tinggalkan Jawapan

Masukkan butiran anda dibawah atau klik ikon untuk log masuk akaun:

WordPress.com Logo

Anda sedang menulis komen melalui akaun WordPress.com anda. Log Out /  Tukar )

Google+ photo

Anda sedang menulis komen melalui akaun Google+ anda. Log Out /  Tukar )

Twitter picture

Anda sedang menulis komen melalui akaun Twitter anda. Log Out /  Tukar )

Facebook photo

Anda sedang menulis komen melalui akaun Facebook anda. Log Out /  Tukar )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.