Arduino Basics: Blink

From Indonesian Research And Development Center
Jump to: navigation, search

Pendahuluan

Tutorial ini akan membahas mengenai dasar pemrograman arduino. Arduino itu sendiri adalah framework berupa gabungan perangkat keras (hardware) dan perangkat lunak (software). Perangkat keras yang digunakan pada tutorial ini adalah development board berbasis mikrokontroler AVR (ATMega328P) yaitu arduino UNO. Ada baiknya Anda mengenal dan membaca seputar mikrokontroler yang digunakan pada arduino sebelum Anda memulai pemrograman. Informasi tersebut dapat Anda temukan pada datasheet mikrokontroler yang digunakan pada arduino, misalnya datasheet ATmega328P jika Anda menggunakan arduino UNO.


Langkah-langkah

  • Sebelum memulai pemrograman pada arduino, terlebih dahulu kenali development board yang digunakan. Berikut ini adalah skematik arduino UNO yang digunakan pada tutorial ini (skematik ini dibuat oleh pighixxx):


Arduino-uno-pinout.jpg


  • Tujuan pengenalan skematik arduino yang akan digunakan adalah untuk mengetahui letak dan fungsi tiap pin pada development board arduino.
  • Pada prinsipnya, sketch pada arduino terdiri atas 2 fungsi utama, yaitu fungsi setup dan fungsi loop. Fungsi setup dijalankan hanya sekali, yaitu ketika arduino sedang aktif atau setelah melakukan reset. Fungsi ini diisi dengan inisialisasi yang perlu dilakukan oleh arduino sebelum menjalankan fungsi utama. Fungsi loop yang paling sederhana isinya berupa inisialisasi PORT yang akan digunakan, inisialisasi variabel dan lain sebagainya. Sedangkan fungsi utama pada arduino adalah fungsi loop yang akan dijalankan secara berulang-ulang ketika arduino aktif.
  • Berikut ini adalah contoh sketch sederhana yang akan membuat kelap-kelip lampu LED pada arduino yang terhubung pada PIN 13:
#define LED 13                  // LED pada arduino terhubung dengan Pin 13

void setup()                    // fungsi ini akan dijalankan hanya sekali
{
  pinMode(LED, OUTPUT);         // Atur agar Pin 13 berfungsi sebagai output
}

void loop()                     // fungsi ini akan dijalankan berulang-ulang
{
  digitalWrite(LED, HIGH);      // set nilai Pin 13 dengan nilai HIGH (nyalakan LED)
  delay(500);                   // tunggu selama 500 mili detik (setengah detik)
  digitalWrite(LED, LOW);       // set nilai Pin 13 dengan nilai LOW (padamkan LED)
  delay(500);                   // tunggu selama 500 mili detik (setengah detik)
}
  • Setelah melakukan kompilasi, maka firmware yang dihasilkan berukuran 1030 byte:
Sketch uses 1,030 bytes (3%) of program storage space. Maximum is 32,256 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2,039 bytes for local variables. Maximum is 2,048 bytes.
  • Selain menggunakan sketch di atas, Anda dapat juga menggunakan cara pemrograman yang biasa digunakan untuk avr-gcc pada IDE arduino seperti ini:
#include <avr/io.h>             // header yang berisi definisi dan fungsi input/output
#include <util/delay.h>         // header yang berisi definisi dan fungsi untuk mengatur delay pada AVR

#define PIN13   PB5             // Pin 13 (LED) pada arduino terhubung dengan Pin 5 pada PORTB
                                // mikrokontroler ATmega328P yang digunakan oleh arduino UNO

int main()                      // fungsi utama
{
  DDRB = 0x20;                  // atur agar Pin 5 pada PORTB berfungsi sebagai output
                                // bagian ini dapat juga ditulis seperti ini: DDRB = 0b00100000;
                                // Perlu diperhatikan bahwa bagian ini akan mengatur Pin selain
                                // Pin 5 pada PORTB sebagai input. Jika Anda hanya ingin mengatur
                                // Pin 5 pada PORTB, maka Anda dapat menggunakan cara seperti ini:
                                // DDRB |= (1 << PIN13); atau DDRB |= _BV(PIN13); sesuai dengan
                                // definisi PIN13 pada bagian atas kode sumber ini.

  for (;;) {                    // perulangan ini akan dijalankan secara terus-menerus
    PORTB |= (1 << PIN13);      // bisa juga ditulis seperti ini: PORTB |= _BV(PIN13);
    _delay_ms(500);             // tunggu selama 500 mili detik (setengah detik)
    PORTB &= ~(1 << PIN13);     // bisa juga ditulis seperti ini: PORTB &= ~_BV(PIN13);
    _delay_ms(500);             // tunggu selama 500 mili detik (setengah detik)
  }
}
  • Kelebihan dari cara pemrograman di atas adalah firmware yang dihasilkan ukurannya lebih kecil. Berikut ini adalah hasil kompilasi dari cara di atas:
Sketch uses 178 bytes (0%) of program storage space. Maximum is 32,256 bytes.
Global variables use 0 bytes (0%) of dynamic memory, leaving 2,048 bytes for local variables. Maximum is 2,048 bytes.
  • Sketch di atas dapat pula dibuat lebih sederhana dengan menggunakan operator XOR untuk mengubah kondisi Pin 13 dari LOW ke HIGH dan sebaliknya. Berikut ini adalah sketchnya:
#include <avr/io.h>             // header yang berisi definisi dan fungsi input/output
#include <util/delay.h>         // header yang berisi definisi dan fungsi untuk mengatur delay pada AVR

#define PIN13   PB5             // Pin 13 (LED) pada arduino terhubung dengan Pin 5 pada PORTB
                                // mikrokontroler ATmega328P yang digunakan oleh arduino UNO

int main()                      // fungsi utama
{
  DDRB |= (1 << PIN13);         // atur agar Pin 5 pada PORTB berfungsi sebagai output
                                // bagian ini dapat juga ditulis seperti ini: DDRB = 0b00100000;
                                // Perlu diperhatikan bahwa bagian ini akan mengatur Pin selain
                                // Pin 5 pada PORTB sebagai input. Jika Anda hanya ingin mengatur
                                // Pin 5 pada PORTB, maka Anda dapat menggunakan cara seperti ini:
                                // DDRB |= (1 << PIN13); atau DDRB |= _BV(PIN13); sesuai dengan
                                // definisi PIN13 pada bagian atas kode sumber ini.

  for (;;) {                    // perulangan ini akan dijalankan secara terus-menerus
    PORTB ^= (1 << PIN13);      // bisa juga ditulis seperti ini: PORTB ^= _BV(PIN13);
    _delay_ms(500);             // tunggu selama 500 mili detik (setengah detik)
  }
}
  • Dengan menggunakan cara tersebut, maka ukuran firmware setelah kompilasi akan berkurang beberapa byte:
Sketch uses 164 bytes (0%) of program storage space. Maximum is 32,256 bytes.
Global variables use 0 bytes (0%) of dynamic memory, leaving 2,048 bytes for local variables. Maximum is 2,048 bytes.
  • Jika Anda terbiasa dengan bahasa assembly, Anda dapat menggunakan assembler dari Atmel (avrasm), assembler dari gcc (avr-as) dan lain sebagainya. Pada tutorial ini akan digunakan naken_asm yang dibuat oleh Michael Kohn. Jika Anda menggunakan sistem operasi berbasis Linux, maka Anda dapat membaca proses instalasi naken_asm pada Linux. Berikut ini adalah potongan kode assembly untuk blink:
.avr8                               ; arsitektur mikrokontroler yang digunakan adalah AVR 8bit
.include "m328pdef.inc"             ; file yang berisi definisi untuk mikrokontroler ATmega328P
.org 0                              ; offset awal program

    rjmp    main                    ; lompat ke label main

main:                               ; mulai eksekusi dari sini
    ldi     r16,0x20                ; register r16 diisi dengan nilai 0x20 (untuk mengaktifkan Pin 5 sebagai output)
    out     DDRB,r16                ; aktifkan Pin 5 pada PORTB sebagai output sesuai dengan isi register r16
    clr     r16                     ; kosongkan register r16

loc_1:
    com     r16                     ; instruksi 1 complement pada register r16 (set pin 5 HIGH/LOW)
    out     PORTB,r16               ; output nilai pada register r16 ke PORTB
    ldi     r17,0x32                ; masukkan nilai 0x32 heksadesimal (50 desimal) ke register r17
                                    ; ini untuk menghasilkan delay selama 500 mili detik (setengah detik)

loc_2:
    ldi     r31,(40000 >> 8)        ; register r31 dan r30 adalah register khusus yang dapat menampung
    ldi     r30,(40000 & 255)       ; nilai 16bit dan dapat juga diakses dengan nama register Z (ZH/r31, ZL/r30)
                                    ; pada bagian ini, register Z diisi dengan nilai 40000
loc_3:                              ; bagian ini adalah fungsi delay dalam bahasa rakitan
    sbiw    r30,1                   ; isi dari register r30 dalam ukuran word dikurangi 1
    brne    loc_3                   ; jika nilainya masih lebih besar dari 0, maka ulangi hingga nilainya menjadi 0
    dec     r17                     ; kurangi 1 dari nilai register r17
    brne    loc_2                   ; jika nilainya nol, maka lompat ke label loc_2
    rjmp    loc_1                   ; lompat ke label loc_1

  • Gunakan naken_asm untuk mengubah kode sumber tersebut menjadi firmware dalam format intel hex:
% naken_asm -o blink.hex blink.asm

naken_asm - by Michael Kohn
               Joe Davisson
    CPU: MSP430, MSP430X, 65xx, 65816, 680x, 68HC08, 680x0, 805x
         ARM, AVR8, dsPIC, MIPS, STM8, THUMB, TMS1000, TMS1100
         TMS9900, Z80
    Web: http://www.mikekohn.net/
  Email: mike@mikekohn.net
Version: November 12, 2015

 Input file: blink.asm
Output file: blink.hex

Pass 1...
Pass 2...

Program Info:
Include Paths: .
               /usr/local/share/naken_asm/include
 Instructions: 14
   Code Bytes: 28
   Data Bytes: 0
  Low Address: 0000 (0)
 High Address: 000d (13)
  • Hasil kompilasi dengan naken_asm adalah 28 byte. Selanjutnya, unggah firmware dalam format intel hex tersebut menggunakan avrdude dengan perintah seperti ini:
% avrdude -q -c arduino -p m328p -P /dev/ttyACM0 -U flash:w:blink.hex

avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x1e950f
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "blink.hex"
avrdude: input file blink.hex auto detected as Intel Hex
avrdude: writing flash (28 bytes):
avrdude: 28 bytes of flash written
avrdude: verifying flash memory against blink.hex:
avrdude: load data flash data from input file blink.hex:
avrdude: input file blink.hex auto detected as Intel Hex
avrdude: input file blink.hex contains 28 bytes
avrdude: reading on-chip flash data:
avrdude: verifying ...
avrdude: 28 bytes of flash verified

avrdude: safemode: Fuses OK (E:00, H:00, L:00)

avrdude done.  Thank you.
  • Setelah proses mengunggah firmware selesai, maka LED pada arduino akan mulai berkedip setiap 500 mili detik atau sama dengan setengah detik.


Penutup

Dari sini, Anda dapat menentukan bahasa dan teknik pemrograman yang ingin Anda gunakan. Namun ada baiknya Anda berusaha menggunakan bahasa dan teknik pemrograman yang optimal. Jangan lupa untuk membaca datasheet mikrokontroler yang Anda gunakan, karena banyak informasi bermanfaat di dalamnya. Sekian tutorial kali ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, Maxindo, N3 dan Anda yang telah membaca tutorial ini.


Referensi