Mahir Arduino Sketch dan Elektro secara praktek

Showing posts with label Project Beginner. Show all posts
Showing posts with label Project Beginner. Show all posts
Nah sebagai pemula, saya perlu memilih proyek yang sederhana namun cukup membuka pengertian akan akses pin pada Arduino Uno Board.

Led Blink, program akan mengakses pin 10 dan memerintahkan arduino untuk mengulang blink led. Dengan mengerjakan proyek ini, kita akan mempelajari beberapa dasar-dasar elektronik dan sketch programming Arduino.


Hal yang diperlukan

Skema



Note Karena saya mempelajari arduino dari nol, jadi saya share juga yang  hal-hal yang mungkin terlihat remeh bagi para expert. Warna kabel jumper tidak harus sesuai gambar, namun untuk kebiasaan yang baik, usahakn untuk positif gunakan warna merah, untuk ground gunakan hitam. Lubang pada breadboard pun tidak masalah, kita bisa memasang di lubang yang mana saja. Yang harus betul-betul diperhatikan adalah hubungan antar komponen dan pin pada arduino, harus sesuai gambar.

Sketch

// Project 1 - LED Flasher
int ledPin = 10;


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

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


setelah sketch diketik, tekan tombol verivy, bila tidak ada error, tekan tombol upload. (silakan lihat cara upload dan konek arduino uno dengan komputer).

Pembahasan Sketch

// Project 1 - LED Flasher
Ini adalah komentar baris yang berguna untuk dokumentasi program, kompiler akan mengabaikan bagian ini. Baris komentar berguna bagi programmer agar bisa mengerti maksud program.

int ledPin = 10;
Inisialisasi variable, dalam hal ini inisialisasi variable bernama ledPin dengan type data integer dan nilai 10.

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

Setiap sketch arduino wajib memiliki fungsi setup() dan loop().  Fungsi setup() dipanggil hanya sekali saat pertama kali program berjalan. Fungsi setup() biasanya tempat untuk men-setup hal-hal umum agar program Anda siap dijalankan, seperti setup pin modes, setting serial baud rates, dan lainnya.

Pada sketch Led Blink, fungsi setup hanya memiliki 1 baris perintah yaitu

pinMode(ledPin, OUTPUT);

pinMode fungsi yang berguna untuk memberitahu arduino bahwa pin pada board akan digunakan sebagai input atau output.Dalam baris program diatas,  kita memberitahu arduino untuk menset pin 10 (nilai ledPin adalah 10) sebagai OUTPUT.

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


Fungsi loop() function adalah program utama yang dipanggil secara continue selama arduino menyala (dialiri power). Setiap perintah dalam fungsi loop() akan dipanggil satu persatu sampai perintah terakhir dalam blok loop dicapai, lalu Arduino akan kembali ke awal perintah di blok fungsi loop(), sampai Arduino dimatikan atau tombol reset ditekan.

Jadi dalam proyek ini Arduino akan menyalakan led, menunggu selama 1 detik, lalu mematikan led, lalu menunggu 1 detik. Urutan perintah ini akan diulang terus menerus sampai arduino dimatikan atau direset.


Related Article

Artikel Sebelumnya Pengenalan Sketch
Artikel Selanjutnya Proyek Led Blinker Advanced
Dari rangkaian proyek LED Blinker sebelumnya, kita dapat membuat lebih advanced dengan kreatifitas dalam programming. Salah satu contohnya adalah S.O.S  kode morse dengan LED. LED akan menyala lebih lama untuk menunjukkan kode garis, dan menyala lebih sebentar untuk kode titik. (Morse merupakan code dengan garis dan titik, sekiranya saya tidak perlu menjelaskan morse terlalu mendetail, karena saya tidak lulus dari pramuka siaga...hehehe..just kidding)


Sketch S.O.S Morse

// LED connected to digital pin 10
int ledPin = 10;
 

// run once, when the sketch starts
void setup()
{
  // sets the digital pin as output
  pinMode(ledPin, OUTPUT);
}


// run over and over again
void loop()
{
  // 3 dits (3 titik atau huruf S)
  for (int x=0; x<3; x++) {
    digitalWrite(ledPin, HIGH); // sets the LED on
    delay(150); // waits for 150ms
    digitalWrite(ledPin, LOW); // sets the LED off
    delay(100); // waits for 100ms
  }


  // 100ms delay to cause slight gap between letters
  delay(100);


  // 3 dahs (3 garis atau huruf O)
  for (int x=0; x<3; x++) {
    digitalWrite(ledPin, HIGH); // sets the LED on
    delay(400); // waits for 400ms
    digitalWrite(ledPin, LOW); // sets the LED off
    delay(100); // waits for 100ms
  }

  // 100ms delay to cause slight gap between letters
  delay(100);
 

  // 3 dits again (3 titik atau huruf S)
  for (int x=0; x<3; x++) {
    digitalWrite(ledPin, HIGH); // sets the LED on
    delay(150); // waits for 150ms
    digitalWrite(ledPin, LOW); // sets the LED off
    delay(100); // waits for 100ms
  }


  // wait 5 seconds before repeating the SOS signal
  delay(5000);

}



Pembahasan Kode
Untuk fungsi setup, kita hanya mengidentifikasikan pinout dari LED, masih seperti sketch sebelumnya (proyek Led Blinker).

Perubahan cukup banyak, dilakukan pada fungsi loop(). Secara umum, fungsi loop() memiliki logika menyalakan LED dengan kode morse S.O.S secara terus menerus, diantara sinyal SOS diberikan jeda selama 5 detik.

Hal yang baru disini adalah fungsi for(), ini adalah fungsi perulangan. memiliki parameter nilai awal, nilai akhir dan nilai penambahan. Nilai awal untuk menentukan awal loop, nilai akhir untuk mengecek apakah nilai saat ini sudah mencapai nilai akhir, bila belum maka nilai sekarang akan ditambahkan sesuai nilai increment, dan blok kode didalam loop akan dijalankan.

Pada sketch diatas loop akan dilakukan sebanyak 3 kali

for (int x=0; x<3; x++) {
  //blok kode loop
}

For I : x=0, lalu akan dibandingkan, 0 < 3, bila betul maka, nilai x akan ditambah 1, menjadi 1, lalu blok kode didalam for akan dilakukan.

For II : x=1, lalu dibandingkan 1<3, kondisi betul, nilai x ditambah menjadi 2, lalu blok kode didalam for akan dijalankan.

For III : x=2,  lalu dibandingkan 2<3, kondisi betul, nilai x ditambah menjadi 3, lalu blok kode didalam for akan dijalankan.

For III : x=3,  lalu dibandingkan 3<3, kondisi salah, maka program akan melanjutkan kebaris perintah berikutnya, blok for akan dilewati.

Jadi blok for ke-1 akan membuat huruf S, blok for ke-2 membuat huruf O, blok for ke-3 membuat huruf S, lalu delay 5 detik. Mudahkan? Dengan kreatifitas programming, Rangkaian yang sederhana sudah bisa dibuat menjadi sesuatu yang bermanfaat.

Artikel Sebelumnya: Proyek Led Blinker
Artikel Selanjutnya: Proyek Lampu Lalu Lintas
Nah, kembali berkreasi dengan LED. Proyek kali ini adalah bikin lampu stopan yang menyala dari hijau, kuning lalu merah dan berulang terus selayaknya lampu merah.

Ngomong-ngomong soal lampu merah.. jadi teringat koran yang dibredel..hehehe.. just kidding yah.. berikut komponen yang diperlukan untuk proyek kali ini.
  • Breadboard
  • LED merah, kuning dan hijau
  • 3x Resistor 150 ohm
  • Kabel jumper

Rangkaian atau Skema


Note
Nah, seperti yang sudah dibahas sebelumnya, warna kabel jumper tidak masalah, anda bisa gunakan berbagai warna, namun untuk umumnya, kabel merah untuk positif. Jangan kebalik juga yah pasang kaki LED nya, silakan lihat artikel pengenal LED untuk menentukan kaki positif dan negatif.

Oya, Anda bisa mencolokkan LED dilubang yang mana saja..(maaf..bila terkesan vulgar..hahaha..) asalkan skemanya seperti diatas.

Perhatikan juga Pinout yang digunakan, disini digunakan pinout digital 8, 9 dan 10. Juga ground.

Sketch Lampu Lalu Lintas

// Project 3 - Traffic Lights
int ledDelay = 5000; // delay in between changes
int redPin = 10;
int yellowPin = 9;
int greenPin = 8;
 

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
}




void loop() {
  digitalWrite(redPin, HIGH); // turn the red light on
  delay(ledDelay); // wait 5 seconds

  digitalWrite(yellowPin, HIGH); // turn on yellow
  delay(2000); // wait 2 seconds
 

  digitalWrite(greenPin, HIGH); // turn green on
  digitalWrite(redPin, LOW); // turn red off
  digitalWrite(yellowPin, LOW); // turn yellow off
  delay(ledDelay); // wait ledDelay milliseconds
 

  digitalWrite(yellowPin, HIGH); // turn yellow on
  digitalWrite(greenPin, LOW); // turn green off
  delay(2000); // wait 2 seconds


  
  digitalWrite(yellowPin, LOW); // turn yellow off

  // now our loop repeats
}



Nah.. logika programnya seperti ini:
  • nyalakan lampu merah, tunggu 5 detik
  • nyalakan lampu kuning, tunggu 2 detik
  • nyalakan lampu hijau, matikan lampu merah dan kuning lalu tunggu 5 detik
  • nyalakan lampu kuning, matikan lampu hijau, tunggu 2 detik.
  • matikan lampu kuning, dan program kembali ke awal fungsi loop()
Mungkin Anda merasa kurang ajar, motor ane belum maju koq udah kuning lagi, delaynya bisa ditambah..atau coba ditambah sensor, biar giliran agan selalu hijau.. :D

Artikel Sebelumnya Proyek LED Blinker Advanced
Artikel Selanjutnya Proyek Lampu Lalu lintas Advanced
Kali ini, proyek kita akan ditambah fungsinya dari proyek sebelumnya yaitu proyek Lampu Lintas. Fungsi yang ditambahkan adalah lampu penyebrang jalan. Saat penyebrang menekan saklar untuk menyebrang jalan, lampu lalu lintas akan berganti menjadi orange, lalu merah, kemudian lampu penyebrang jalan akan menyala hijau. Setelah sekian detik waktu, lampu penyebrang jalan akan berganti merah, lampu lalulintas akan kembali berjalan normal.


Jadi dalam proyek ini kita juga belajar menangkap input dari luar sistem, juga mengenal tipe data baru yaitu unsigned long.

Komponen
2 LED merah
1 LED kuning
2 LED hijau
1 resistor 10 kiloohm 
5 resistor
1 pushbutton

Skema


Sketch

// Project 4 - Interactive Traffic Lights
int carRed = 12; // assign the car lights
int carYellow = 11;
int carGreen = 10;
int pedRed = 9; // assign the pedestrian lights
int pedGreen = 8;
int button = 2; // button pin
int crossTime = 5000; // time allowed to cross
unsigned long changeTime = 0; // time last pedestrian cycle completed


void setup() {
  pinMode(carRed, OUTPUT);
  pinMode(carYellow, OUTPUT);
  pinMode(carGreen, OUTPUT);
  pinMode(pedRed, OUTPUT);
  pinMode(pedGreen, OUTPUT);
  pinMode(button, INPUT); // button on pin 2
 

  // turn on the green light
  digitalWrite(carGreen, HIGH);
  digitalWrite(pedRed, HIGH);
}


void loop() {
  int state = digitalRead(button);
  /* check if button is pressed and it is over 5 seconds since last button press */
  if (state == HIGH && (millis() - changeTime) > 5000) {
    // Call the function to change the lights
    changeLights();
  }
}
 

void changeLights() {
  digitalWrite(carGreen, LOW); // green off
  digitalWrite(carYellow, HIGH); // yellow on
  delay(2000); // wait 2 seconds
  digitalWrite(carYellow, LOW); // yellow off
  digitalWrite(carRed, HIGH); // red on
  delay(1000); // wait 1 second till its safe
  digitalWrite(pedRed, LOW); // ped red off
  digitalWrite(pedGreen, HIGH); // ped green on
  delay(crossTime); // wait for preset time period
 

  // flash the ped green
  for (int x=0; x<10; x++) {
    digitalWrite(pedGreen, HIGH);
    delay(250);
    digitalWrite(pedGreen, LOW);
    delay(250);
  }


  // turn ped red on
  digitalWrite(pedRed, HIGH);
  delay(500);
  digitalWrite(carYellow, HIGH); // yellow on
  digitalWrite(carRed, LOW); // red off
  delay(1000);
  digitalWrite(carGreen, HIGH);
  digitalWrite(carYellow, LOW); // yellow off

  
  // record the time since last change of lights
  changeTime = millis();


  // then return to the main program loop
}



Penjelasan Program
Kebanyakan dari program diatas sudah dapat Anda pahami, karena mirip dengan proyek sebelumnya. Disini ada hal baru yaitu tipe data baru unsigned long

unsigned long changeTime = 0;

tipe data integer mampu menyimpan angka dari  −32,768 and 32,767, sementara long −2,147,483,648 to 2,147,483,647. kata keyword unsigned membuat variable changeTime mampu menampung angka 0 to 4,294,967,295. Pemilihan tipe data diatas agar variable tidak overflow dan program menjadi error secara logik.

Sempat terpikir oleh saya, mengapa gak semua pake tipe data long aja.. biar gak pusing. Nah, dikarenakan chip ATMega328  ini dibuat dengan resource yang minimum, kita harus pintar memilah tipe data agar tidak memboroskan resource.

Untuk menunggu input dari luar sistem, kita harus menentukan pin mana yang akan menjadi input.

pinMode(button, INPUT); // set pin sebagai input


Kemudian pada fungsi loop() kita menunggu input dari user, dan melakukan pengecekan, apakah ada input dari luar sistem.

void loop() {
  int state = digitalRead(button);
  /* check if button is pressed and it is over 5 seconds since last button press */
  if (state == HIGH && (millis() - changeTime) > 5000) {
    // Call the function to change the lights
    changeLights();
  }
}


Perintah if diatas akan melakukan cek, jika button ditekan dan waktu sekarang (semenjak Arduino menyala) - kurangi variable changeTime lebih besar dari 5000. Jika kedua syarat dipenuhi maka perintah fungsi changeLights() didalam blok if akan dijalankan.

Pada Proyek ini, kita juga belajar mengenai pull-down resistor. Untuk lebih detail mengenai pull-down resistor click disini.

Artikel Sebelumnya : Proyek Lampu Lalu Lintas
Artikel Selanjutnya : Proyek LED Chase Effect
Di project ke-5 kita akan membuat LED yang memiliki efek bergerak saling mengejar. Disini kita akan belajar mengenai konsep dari arrays.

Komponen yang diperlukan
  • 10 x 5mm RED LEDs
  • 10 x Current-Limiting Resistors


Skema




Sketch

// Project 5 - LED Chase Effect
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Create array for LED pins
int ledDelay = 65; // delay between changes
int direction = 1;
int currentLED = 0;
unsigned long changeTime;
 

void setup() {
  for (int x=0; x<10; x++) { // set all pins to output
    pinMode(ledPin[x], OUTPUT);
  }
  changeTime = millis();
}


void loop() {
  if ((millis() - changeTime) > ledDelay) { // if it has been ledDelay ms since last change
    changeLED();
    changeTime = millis();
  }
}


void changeLED() {
  for (int x=0; x<10; x++) { //turn off all LED's
    digitalWrite(ledPin[x], LOW);
  }
  digitalWrite(ledPin[currentLED], HIGH); //turn on the current LED
  currentLED += direction; //increment by the direction value
  // change direction if we reach the end
  if (currentLED == 9) {direction = -1;}
  if (currentLED == 0) {direction = 1;}
}



Penjelasan Sketch

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

Perintah diatas untuk mendeklarasikan variable dengan tipe array dengan tipe data byte. semua element dapat diakses melalui nama yang sama, dalam hal ini adalah variable ledPin. contoh ledPin[0] akan menunjukkan nilai 4.

Tanda [] setelah nama variable menunjukkan pada compiler tipe array adalah array variable. Pada array ini kita inisialisasi nilai untuk menunjukkan pin Arduino.

Jika hendak mengdeklarasikan array tanpa inisialisasi nilai, kita perlu memberi tahu Arduino besar dari array. Contoh:  byte ledPin[10];

Pada sketch kita, variable array ini digunakan untuk mengakses LED. Pada fungsi loop(), kita cek apakah ledDelay sudah dilewati sejak perubahan LED terakhir, jika sudah, maka fungsi ChangeLED() akan dipanggil.

Yang dilakukan fungsi ChangeLEDadalah mematikan semua LED dan menyalakan LED yg harus aktif saat ini., yang disimpan di variable currentLED.


Setelah currentLED dinyalakan, nilai currentLED akan ditambahkan atau dikurangkan, berdasar variable direction. Variable direction ditentukan oleh blok if, jika currentLED bernilai 9, direction akan -1, bila currentLED bernilai 0 maka direction akan +1;

Program kita akan membuat nyala LED bergerak bolak-balik.

Artikel Sebelumnya:  Proyek Lampu Lalulintas Advanced
Artikel Selanjutnya: Proyek Led Chase Advanced