Mahir Arduino Sketch dan Elektro secara praktek

Pendahuluan
Pada projek ini akan digunakan LCD untuk menampilkan text dan simbol. Tipe display ini sering digunakan untuk kalkulator atau jam alarm. Banyak contoh proyek Ardunino menggunakan juga, jadi adalah penting untuk memahami dan tahu bagaimana cara menggunakan LCD.

Untuk mengontrol LCD diperlukan driver chip, chip ini sudah built in didalam modul LCD. Driver chip yang paling popular adalah Hitachi HD44780 (or compatible), dan paling umum digunakan.

Membuat proyek berbasiskan LCD cukup mudah karena sudah tersedia library yang bisa digunakan untuk mengakses LCD.

Arduino IDE sendiri sudah tersedia library, LiquidCrystal.h, dimana sudah memiliki fitur-fitur penting untuk mengakses LCD. Pada proyek ini, kita akan gunakan library ini.


Komponen
  • 16x2 Backlit LCD
  • Current Limiting Resistor (Backlight)
  • Contrast Setting Resistor atau pot


LCD yang digunakan adalah LCD dengan HD44780 driver. Silakan memilih warna yang diinginkan, dipasaran tersedia berbagai warna seperti text merah background hitam, atau tulisan hitam dengan background hijau atau biru. Yang penting, LCD yang akan digunakan memiliki backlight dan bisa menampilkan 16 kolom dan 2 baris karakter text.

Skema




Skema pada proyek kali ini cukup simple. Yang diperlukan adalah datasheet LCD yang digunakan. Silakan perhatikan tabel diatas untuk pin yang digunakan.

Data pins 0 to 3 tidak digunakan, karena kita akan menggunakan mode 4-bit. Untuk LCD umumnya skema pada gambar diatas bisa langsung digunakan. (Namun untuk keamanan, cek data sheet LCD yang digunakan)

Contrast Adjustment pin pada LCD harus dihubungkan dengan current-limiting resistor untuk mengatur contrast yang diinginkan. Resistor dengan nilai sekitar 10KΩ sudah bisa digunakan.

Jika kesulitan mencari resistor dengan nilai tersebut, gunakan potentiometer denga value antara 4KΩ - 10KΩ dengan kaki kiri dihubungkan dengan +5V,  kaki kanan dihubungkan dengan ground, dan kaki tengah dihubungkan dengan contrast adjustment pin (pin 3 pada kasus ini, bisa berbeda pada LCD yang Anda gunakan).

Dengan menggunakan potentiometer, kita dapat memutar knob untuk melakukan adjustment contrast.

Backlight dari LCD yang digunakan pada artikel ini membutuhkan 4.2V, oleh karena itu ditambahkan current-limiting resistor antara +5V dan LED power supply pin (pin 15 pada kasus ini).

Tentu saja kita bisa menggunakan PWM pin pada Arduino, namun untuk proyek ini, kita tidak menggunakan cara ini.

Setelah skema sudah sesuai, kita sudah bisa memasukan kode.

Code

#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // create an lcd object and assign the pins

void setup() {
  lcd.begin(16, 2); // Set the display to 16 columns and 2 rows
}

void loop() {
  // run the 7 demo routines
  basicPrintDemo();
  displayOnOffDemo();
  setCursorDemo();
  scrollLeftDemo();
  scrollRightDemo();
  cursorDemo();
  createGlyphDemo();
}

void basicPrintDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Basic Print"); // print some text
  delay(2000);
}

void displayOnOffDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Display On/Off"); // print some text
  for(int x=0; x < 3; x++) { // loop 3 times
    lcd.noDisplay(); // turn display off
    delay(1000);
    lcd.display(); // turn it back on again
    delay(1000);
  }
}

void setCursorDemo() {
  lcd.clear(); // Clear the display
  lcd.print("SetCursor Demo"); // print some text
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(5,0); // cursor at column 5 row 0
  lcd.print("5,0");
  delay(2000);
  lcd.setCursor(10,1); // cursor at column 10 row 1
  lcd.print("10,1");
  delay(2000);
  lcd.setCursor(3,1); // cursor at column 3 row 1
  lcd.print("3,1");
  delay(2000);
}

void scrollLeftDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Left Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(7,0);
  lcd.print("Beginning");
  lcd.setCursor(9,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayLeft(); // scroll display left 16 times
    delay(250);
  }
}

void scrollRightDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Right");
  lcd.setCursor(0,1);
  lcd.print("Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.print("Beginning");
  lcd.setCursor(0,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayRight(); // scroll display right 16 times
    delay(250);
  }
}

void cursorDemo() {
  lcd.clear(); // Clear the display
  lcd.cursor(); // Enable cursor visible
  lcd.print("Cursor On");
  delay(3000);
  lcd.clear(); // Clear the display
  lcd.noCursor(); // cursor invisible
  lcd.print("Cursor Off");
  delay(3000);
  lcd.clear(); // Clear the display
  lcd.cursor(); // cursor visible
  lcd.blink(); // cursor blinking
  lcd.print("Cursor Blink On");
  delay(3000);
  lcd.noCursor(); // cursor invisible
  lcd.noBlink(); // blink off
}

void createGlyphDemo() {
  lcd.clear();
  byte happy[8] = { // create byte array with happy face
    B00000,
    B00000,
    B10001,
    B00000,
    B10001,
    B01110,
    B00000,
    B00000};

  byte sad[8] = { // create byte array with sad face
    B00000,
    B00000,
    B10001,
    B00000,
    B01110,
    B10001,
    B00000,
    B00000};

  lcd.createChar(0, happy); // create custom character 0
  lcd.createChar(1, sad); // create custom character 1
  for(int x=0; x<5; x++) { // loop animation 5 times
    lcd.setCursor(8,0);
    lcd.write((byte)0); // write custom char 0
    delay(1000);
    lcd.setCursor(8,0);
    lcd.write(1); // write custom char 1
    delay(1000);
  }
}


Pembahasan Kode
Pertama kita panggil library yang digunakan untuk mengontrol LCD. Arduino IDE sudah menyediakan library teserbut, yaitu LiquidCrystal.h. Library ini bagus dan mudah dimengerti dan digunakan.

Ada banyak librari lainnya, contoh dari type LCD juga dapat dilihat di http://www.arduino.cc/playground/Code/LCD

#include <LiquidCrystal.h>


Selanjutnya kita membuat object LiquidCrystal object dengan nama lcd dan mengatur pin yang digunakan.

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 

2 parameter pertama adalah pin untuk RS (Register Select) dan Enable. 4 parameter terakhir adalah data pin  D4 ke D7. Karena kita menggunakan mode 4-bit, kita hanya menggunakan 4 dari 8 datapins yang tersedia.

Perbedaan antara 4-bit dan 8-bit adalah pada mode 8-bit kita bisa mengirim data 1 byte dalam 1 waktu, pada mode 4-bit kita harus membagi menjadi 4-bit (disebut nibbles). Ini membuat kode menjadi lebih besar dan kompleks.

Namun, dikarenakan kita menggunakan library yang sudah mendukung, kita tidak perlu khawatir akan hal tersebut. Namun bila proyek concern akan space dan waktu, ada baiknya menggunakan mode 8-bit.

Menggunakan 4-bit ada keuntungan yaitu menghemat 4 pins, dimana sangat berguna bila proyek kita memerlukan pin lainnya untuk peralatan lainnya.

Pada fungsi setup(), kita inisialisasi kukuran display, pada contoh ini 16 kolom dan 2 baris.

void setup() {
  lcd.begin(16, 2); // Set the display to 16 columns and 2 rows

}

Pada loop kita akan menjalankan 7 demo rutin,  demo ini menunjukan rutin yang didukung librari LiquidCrystal.h.

void loop() {
  // run the 7 demo routines
  basicPrintDemo();
  displayOnOffDemo();
  setCursorDemo();
  scrollLeftDemo();
  scrollRightDemo();
  cursorDemo();
  createGlyphDemo();

}


basicPrintDemo() digunakan untuk menunjukan cara menggunakan perintah print(). Demo ini sederhana, menunjukan cara menghapus layar denga perintah lcd.clear(), kemudian menulis ke display dengan perintah lcd.print().

Perhatian, jika Anda menginisialisasi object LiquidCrystal object dengan nama contohnya lcd1 maka perintah yang digunakan adalah lcd1.clear() dan lcd1.print()

Perintah print() akan menulis apapun yang diinput dalam tanda kurung pada cursor aktif terakhir. Default awal kursor selalu di kolom 0 dan baris 0, yang berarti ada di kiri atas.

Ketika perintah print() digunakan, text yang kita kirim akan ditulis dilayar, lalu kursor akan berpindah pada akhir text. Setiap text berikutnya ditambahkan akan mulai dari posisi terakhir tersebut.

Cursor akan kembali ke default setiap kita melakukan perintah clear().

void basicPrintDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Basic Print"); // print some text
  delay(2000);

}


Demo kedua untuk menunjukan cara menggunakan perintah display() dan noDisplay().  Perintah ini adalah untuk enable atau disable display.

void displayOnOffDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Display On/Off"); // print some text
  for(int x=0; x < 3; x++) { // loop 3 times
    lcd.noDisplay(); // turn display off
    delay(1000);
    lcd.display(); // turn it back on again
    delay(1000);
  }

}


Demo berikutnya menunjukan cara mengatur kursor dengan perintah setCursor(). Perintah ini untuk mengarahkan kursor pada kolom dan baris tertentu.

Perintah setCursor() penting untuk mengatur layout dan memastikan kita bisa menulis di posisi yang kita inginkan.

void setCursorDemo() {
  lcd.clear(); // Clear the display
  lcd.print("SetCursor Demo"); // print some text
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(5,0); // cursor at column 5 row 0
  lcd.print("5,0");
  delay(2000);
  lcd.setCursor(10,1); // cursor at column 10 row 1
  lcd.print("10,1");
  delay(2000);
  lcd.setCursor(3,1); // cursor at column 3 row 1
  lcd.print("3,1");
  delay(2000);

}

Ada dua cara untuk scrolling text, yaitu scrollDisplayLeft() dan scrollDisplayRight(). Dari namanya cukup jelas scroll ke kiri dan ke kanan. Demo ini akan menunjukan penggunaan perintah ini, pertama akan menulis “Beginning Arduino” pada sebelah kanan displaydan ke kiri sebanyak 16 kali, dimana tulisan akan hilang dari layar.

void scrollLeftDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Left Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.setCursor(7,0);
  lcd.print("Beginning");
  lcd.setCursor(9,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayLeft(); // scroll display left 16 times
    delay(250);
  }

}


Demo berikut ini sama, hanya saja mulai menulis di sebelah kiri layar dan di-scroll ke kanan sebanyak 16 kali.

void scrollRightDemo() {
  lcd.clear(); // Clear the display
  lcd.print("Scroll Right");
  lcd.setCursor(0,1);
  lcd.print("Demo");
  delay(1000);
  lcd.clear(); // Clear the display
  lcd.print("Beginning");
  lcd.setCursor(0,1);
  lcd.print("Arduino");
  delay(1000);
  for(int x=0; x<16; x++) {
    lcd.scrollDisplayRight(); // scroll display right 16 times
    delay(250);
  }
}


Sejauh ini cursor tidak tampak. Ada disana namun tidak terlihat  Setiap kita clear layar maka kurso akan kembali ke  kolom 0 dan baris 0. Setelah print, cursor akan ada tepat sesudah karakter terakhir. Demo berikut akan menghapus layar dan menyalakan cursor dengan perintah cursor() dan menulis teks. Cursor akan tampak sesudah text dengan simbol underscore ( _ ).


void cursorDemo() {
  lcd.clear(); // Clear the display
  lcd.cursor(); // Enable cursor visible
  lcd.print("Cursor On");
  delay(3000);
  lcd.clear(); // Clear the display
  lcd.noCursor(); // cursor invisible
  lcd.print("Cursor Off");
  delay(3000);
  lcd.clear(); // Clear the display
  lcd.cursor(); // cursor visible
  lcd.blink(); // cursor blinking
  lcd.print("Cursor Blink On");
  delay(3000);
  lcd.noCursor(); // cursor invisible
  lcd.noBlink(); // blink off
}


Demo terakhir adalah  membuat karakter khusus. Umumnya LCDs punya kemampuan untuk menampilkan karakter tertentu. LCD 16x2  memilik ruang untutk 8 karakter khusus untuk disimpan dalam memory

Karakter ini memiliki ukuran lebar 5 pixels dan tinggi 8 pixels. Display di clear kemudia 2 array dengan tipe byte akan di inisialisasi dengan binary pattern  wajah gembira dan sedih. Binary patterns  memiliki lebar 5 bits.

void createGlyphDemo() {
  lcd.clear();
  byte happy[8] = { // create byte array with happy face
    B00000,
    B00000,
    B10001,
    B00000,
    B10001,
    B01110,
    B00000,
    B00000};

  byte sad[8] = { // create byte array with sad face
    B00000,
    B00000,
    B10001,
    B00000,
    B01110,
    B10001,
    B00000,
    B00000};

  lcd.createChar(0, happy); // create custom character 0
  lcd.createChar(1, sad); // create custom character 1
  for(int x=0; x<5; x++) { // loop animation 5 times
    lcd.setCursor(8,0);
    lcd.write((byte)0); // write custom char 0
    delay(1000);
    lcd.setCursor(8,0);
    lcd.write(1); // write custom char 1
    delay(1000);
  }
}


Artikel sebelumnya  Led Dot Matrix Basic
Artikel selanjutnya LCD display Temperature
Proyek ini akan mendemonstrasikan penggunaan LCD untuk menampilkan informasi yang berguna, pada kasus ini akan menampilkan suhu yang dibaca dari analog temperature sensor.  Kita akan menambahkan tombol untuk menampilkan dalam centigrade atau farenheit. Dan menambahkan informasi suhu maksimum dan minimum pada baris kedua.

Komponen
  • 16x2 Backlit LCD
  • Current-Limiting Resistor (Backlight)
  • Contrast-Setting Resistor
  • Pull-Down Resistor
  • Pushbutton
  • Analog Temp Sensor

Skema



Code


#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // create an lcd object and assign the pins
int maxC=0, minC=100, maxF=0, minF=212;
int scale = 1;
int buttonPin=8;

void setup() {
  lcd.begin(16, 2); // Set the display to 16 columns and 2 rows
  analogReference(INTERNAL);
  // analogReference(INTERNAL1V1); If you have an Arduino Mega
  pinMode(buttonPin, INPUT);
  lcd.clear();

}

void loop() {
  lcd.setCursor(0,0); // set cursor to home position

  int sensor = analogRead(0); // read the temp from sensor

  int buttonState = digitalRead(buttonPin); // check for button press

  switch (buttonState) { // change scale state if pressed
    case HIGH:
      scale=-scale; // invert scale
      lcd.clear();

  }

  switch (scale) { // decide if C or F scale
    case 1:
      celsius(sensor);
      break;
    case -1:
      fahrenheit(sensor);
  }

  delay(250);

}

void celsius(int sensor) {
  lcd.setCursor(0,0);

  int temp = sensor * 0.1074188; // convert to C

  lcd.print(temp);
  lcd.write(B11011111); // degree symbol
  lcd.print("C ");

  if (temp>maxC) {maxC=temp;}

  if (temp<minC) {minC=temp;}

  lcd.setCursor(0,1);
  lcd.print("H=");
  lcd.print(maxC);
  lcd.write(B11011111);
  lcd.print("C L=");
  lcd.print(minC);
  lcd.write(B11011111);
  lcd.print("C ");

}

void fahrenheit(int sensor) {
  lcd.setCursor(0,0);

  float temp = ((sensor * 0.1074188) * 1.8)+32; // convert to F

  lcd.print(int(temp));
  lcd.write(B11011111); // print degree symbol
  lcd.print("F ");

  if (temp>maxF) {maxF=temp;}

  if (temp<minF) {minF=temp;}

  lcd.setCursor(0,1);
  lcd.print("H=");
  lcd.print(maxF);
  lcd.write(B11011111);
  lcd.print("F L=");
  lcd.print(minF);
  lcd.write(B11011111);
  lcd.print("F ");

}

Pembahasan code
Seperti pada proyek sebelumnya, library LiquidCrystal  kita load kedalam sketch. Kemudian inisialisasi object lcd  dengan mengatur pin yang digunakan

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // create an lcd object and assign the pins

Inisialisasi beberapa variable integer untuk menyimpan data suhu maximum and minimum pada deraja celcius dan farenheit. Nilai ini akan langsung diupdate saat program berjalan pertama kali.

int maxC=0, minC=100, maxF=0, minF=212;

Inisialisasi variable scale dengan tipe int dengan nilai 1. variable ini akan digunakan untuk menentukan skala apa yang akan digunakan. Default diset 1, yaitu Celsius. Dapat diganti menjadi -1 jika ingin defaultnya Fahrenheit.

int scale = 1;

Inisialisai variable integer untuk menyimpan pin yang digunakan untuk tombol .

int buttonPin=8;

Pada fungsi setup()  kita atur display dalam format 16 kolom and 2 baris.

  lcd.begin(16, 2); // Set the display to 16 columns and 2 rows

Atur referensi analog pin  ke INTERNAL.
  analogReference(INTERNAL);

Jika menggunakan Arduino Mega gunakan perintah berikut analogReference(INTERNAL1v1);

Dengan menggunakan pin analog seperti ini memberikan kita jangkauan yang lebih baik pada Arduino ADC (analog to digital convertor) hingga meningkatkan akurasi dan sensitifitas rangkaian.

Set button pin sebagai input dan bersihkan layar

  pinMode(buttonPin, INPUT);
  lcd.clear();

Pada main loop, atur cursor pada posisi home

  lcd.setCursor(0,0); // set cursor to home position

Baca nilai dari sensor suhu pada analog pin 0.

  int sensor = analogRead(0); // read the temp from sensor

Baca status dari tombol dan simpan pada variable buttonState.
  int buttonState = digitalRead(buttonPin); // check for button press

Kemudian kita hitung berdasarkan status button apakah perhitungan menggunakan skala celcius atau farenheit. Bila celcius maka kita akan menmanggil fungsi perhitungan celcius, atau bila farenheit program akan memanggil fungsi perhitungan farenheit. Kemudian beri perintah delay sebentar.

  switch (buttonState) { // change scale state if pressed
    case HIGH:
      scale=-scale; // invert scale
      lcd.clear();
  }

  switch (scale) { // decide if C or F scale
    case 1:
      celsius(sensor);
      break;
    case -1:
      fahrenheit(sensor);
  }
  delay(250);

void celsius(int sensor) {
  lcd.setCursor(0,0);
  int temp = sensor * 0.1074188; // convert to C
  lcd.print(temp);
  lcd.write(B11011111); // degree symbol

  lcd.print("C ");
  if (temp>maxC) {maxC=temp;}
  if (temp<minC) {minC=temp;}
  lcd.setCursor(0,1);
  lcd.print("H=");
  lcd.print(maxC);
  lcd.write(B11011111);
  lcd.print("C L=");
  lcd.print(minC);
  lcd.write(B11011111);
  lcd.print("C ");
}

void fahrenheit(int sensor) {
  lcd.setCursor(0,0);
  float temp = ((sensor * 0.1074188) * 1.8)+32; // convert to F
  lcd.print(int(temp));
  lcd.write(B11011111); // print degree symbol
  lcd.print("F ");
  if (temp>maxF) {maxF=temp;}
  if (temp<minF) {minF=temp;}
  lcd.setCursor(0,1);
  lcd.print("H=");
  lcd.print(maxF);
  lcd.write(B11011111);
  lcd.print("F L=");
  lcd.print(minF);
  lcd.write(B11011111);
  lcd.print("F ");
}


Nah, semoga artikel ini bermanfaat dalam menambah pengetahuan menggunakan LCD dan komponen sensor suhu.

Artikel Sebelumnya LCD Basic
Artikel Selanjutnya Servo Control
Pada proyek ini adalah pengenalan bagaiman mengatur 1 servo menggunaka potentiometer. (Baca juga Artikel :Pengenalan Servo Control)

Komponen
  • Standard RC Servo
  • Rotary Potentiometer
  • 220 ohm resistor


Skema



Sketch
#include <Servo.h>
Servo servo1;
void setup(){
  servo1.attach(5);
}


void loop(){
  int angle = analogRead(0); // Read the pot value
  angle=map(angle, 0, 1023, 0, 180);
  servo1.write(angle); // Write the angle to the servo
  delay(15); // Delay of 15ms to allow servo to reach position
}


Pembahasan Kode

Pertama kita include library yang digunakan
#include <Servo.h>

Kemudian deklarasi objek servo:
Servo servo1; // Create a servo object

Pada fungsi loop, attach servo1 pada pin 5
  servo1.attach(5);

Perintah attach digunakan objek servo untuk mengatur pin yang digunakan. Pada proyek digunakan 1 parameter saja, yaitu pin. Namun perintah attach bisa menerima 3 parameter, yaitu, parameter pertama adalah pin, parameter kedua adalah sudut minimum (0 derajat) (default adalah 544), parameter adalah sudut maksimum (180 derajat) (default adalah 2400).

Untuk kebutuhan umum, cukup menggunakan 1 parameter saja, yaitu parameter pin.

Kita dapat menghubungkan 12 servo pada Arduino Duemilanove (atau sejenis) dan hingga 48 servos pada Arduino Mega—cocok untuk aplikasi robotik.

Perhatian
Library ini mendisable fungsi analogWrite (PWM) function pada pin 9 dan 10. Pada Arduino Mega kita dapat menggunakan 12 motors tanpa menginterfensi fungsi PWM. 

Pada main loop, baca nilai analog dari potentiometer yang terhubung ke pin analog 0.
  int angle = analogRead(0); // Read the pot value

Petakan nilai bacaan dari potentiometer pada jangkauan 0 -180, dimana akan mengubah sudut dari lengan servo.
  angle=map(angle, 0, 1023, 0, 180);

Setelah diketahui nilai sudut, kita perintahkan servo untuk mengubah lengannya ke sudut tersebut
  servo1.write(angle); // Write the angle to the servo

Kemudian beri waktu 15 ms untuk memberi waktu bagi servo menggerakan keposisi yang diperintahkan.
  delay(15); // Delay of 15ms to allow servo to reach position

Sebagai tambahan, kita dapat menggunakan perintah detach() servo dari pin, hingga pin dapat untuk keperluan lainnya. Atau kita juga bisa menggunakan perintah read()  untuk membaca sudut saat ini.

Untuk lebih lanjut mengenai library servo, bisa dibaca di http://arduino.cc/en/Reference/Servo.

Nah, semoga artikel pengenalan servo ini bermanfaat. Selamat berkreasi.

Artikel Sebelumnya : Display Suhu
Artikel Berkaitan Pengenalan Servo Control
Projek kali ini simple, menghubungkan stepper motor dengan Arduino dan mengontrolnya.

Komponen
  • Stepper Motor
  • L293D atau SN754410 motor driver IC
  • 2 x 0.01 micro farad Ceramic Capacitor
  • Resistor


Skema

Pastikan Arduino dan L293 terhubung ke power supply DC eksternal agar tidak membebani
Arduino. Arduino tidak perlu dihubungkan dengan suplai eksternal, L293 (atau SN754410).

koneksi power supply positif mengarah langsung ke breadboard dan pin 8 dari L293, dan untuk ground dihubungkan dari breadboard ke arduino.

Kapasitor bersifat opsional dan membantu memuluskan arus dan mencegah interferensi dengan Arduino.
Dapat juga menggunakan kapasitor elektrolit nilai rendah, tetapi pastikan menghubungkannya dengan benar (+ untuk memasok, - ke ground) karena dapat merusak atau meledak jika dihubungkan terbalik!

Resistor pembatas arus antara catu daya dan power supply yang memasok SN754410 atau chip L293D. Gunakan catu daya yang sesuai yang berada dalam rentang tegangan dan arus untuk motor Anda. Juga pastikan bahwa peringkat daya dari setiap resistor yang membatasi arus yang Anda gunakan di atas arus yang diperlukan oleh motor atau resistor akan memanas dan terbakar. Perhatikan bahwa tegangan penggerak motor juga akan lebih rendah daripada tegangan input (bahkan tanpa resistor) karena tegangan turun di internal driver (yang menambahkan hingga 1,5 hingga 4 volt, tergantung pada arus dan hal lainnya).


Pin 5v pada Arduino dihubungkan ke pin 16 (VSS) dari pin driver motor dan dua chip inhibit pin (1 dan 9) dihubungkan dengan 3.3v untuk membuat mereka menjadi HIGH, memastikan tidak ada setengah dari chip driver dihambat.

Pin Vin (Voltage in) pada Arduino dihubungkan ke pin 8 dari driver IC (VC). Pin 4, 5, 12, dan 13 semua dihubungkan ke ground.

Setelah semuanya terhubung sebagaimana mestinya, masukan kode berikut.


Sketch

#include <Stepper.h>
// steps value is 360 / degree angle of motor
#define STEPS 200
// create a stepper object on pins 4, 5, 6 and 7
Stepper stepper(STEPS, 4, 5, 6, 7);

void setup()
{}

void loop(){
  stepper.setSpeed(60);
  stepper.step(200);
  delay(100);
  stepper.setSpeed(20);
  stepper.step(-50);
  delay(100);
}


Pembahasan Kode

Program pada proyek ini sederhana dan clean, karena kerja berat sudah dikerjakan oleh library stepper.h

Pertama kita load library stepper.h

#include <Stepper.h>

Lalu define steps, ini tergantung dari stepper motor yang digunakan. Umumnya stepper motor memiliki angle step 7.5 atau 1.8 derajat. Pada proyek ini digunakan stepper motor 1.8 derajat.

Untuk menentukan berapa banyak step yang diperlukan oleh stepper motor, bagi 360 derajat (1 putaran penuh) dengan angle step, dalam hal ini 1.8 derajat, maka hasilnya adalah 200 step.

#define STEPS 200

Lalu kita buat objek stepper motor, kita beri nama stepper dan assign pins untuk coil dari stepper motor

Stepper stepper(STEPS, 4, 5, 6, 7);


Untuk menentukan kecepatan motor dalam rpm (revolution per minute), digunakan fungsi .setSpeed()

  stepper.setSpeed(60);

Perintah untuk memutar motor adalah .step()

  stepper.step(200);

Anda dapat memasukan angka negatif juga pada perintah .step(), silakan dicoba untuk melihat bagaimana arah putaran motor bila diberi angka negatif.

Saya kira, sketch diatas sudah cukup menjelaskan tanpa perlu dibahas lebih detail karena tutorial ini kesannya akan bertele-tele.

Silakan bereksperimen dengan memainkan parameter speed dan step. Semoga bermanfaat.


Semoga bermanfaat.

Artikel Sebelumnya Display Suhu

Artikel Berkaitan

Pada proyek kali ini akan menggunakan motor shield untuk mengatur 2 motor secara terpisah. Disini kita akan belajar mengatur kecepatan dan arah masing-masing motor. Lalu akan kita aplikasikan untuk mengatur gerak 2-wheel robot.

Komponen

  • Motor Shield
  • 2 x DC Motor atau 2 wheel robot base (lihat gambar berikut)
  • Battery Pack

gambar 1 - two wheeled robot base



Skema
Pada proyek kali ini tidak ada skema rumit, lebih ke plug and play. Pasangkan motor shield pada arduino. Dan hubungkan kabel dari DC motor dari robot base.

Perhatian, gunakan daya eksternal untuk motor shield dan motor (jangan diambil dari Arduino board).

Pada contoh proyek ini, digunakan official Arduino motor shield yang dirancang untuk mengendalikan 2 motor. Banyak shield lainnya, seperti dari Adafruit yang disertai library yang bangus (AFMotor.h). Jika Anda menggunakan produk shield lain, kode/sketch pada proyek ini harus diubah sesuai dengan library yang tersedia.

Sketch

#define QUARTER_SPEED 64 
#define HALF_SPEED 128 
#define FULL_SPEED 255 
// Set the pins for speed and direction of each motor 
int speed1 = 3; 
int speed2 = 11; 
int direction1 = 12; 
int direction2 = 13; 

void stopMotor() {   
  // turn both motors off   
  analogWrite(speed1, 0);   
  analogWrite(speed2, 0); 


void setup(){   
  // set all the pins to outputs   
  pinMode(speed1, OUTPUT);   
  pinMode(speed2, OUTPUT);   
  pinMode(direction1, OUTPUT);   
  pinMode(direction2, OUTPUT); 
}  


void loop(){   
  // Both motors forward at 50% speed for 2 seconds   
  digitalWrite(direction1, HIGH);   
  digitalWrite(direction2, HIGH);   
  analogWrite(speed1, HALF_SPEED);   
  analogWrite(speed2, HALF_SPEED);   

  delay(2000);   
  stopMotor(); 
  delay(1000); 

  // Left turn for 1 second   
  digitalWrite(direction1, LOW);   
  digitalWrite(direction2, HIGH);   
  analogWrite(speed1, HALF_SPEED);   
  analogWrite(speed2, HALF_SPEED);   

  delay(1000);   
  stopMotor(); 
  delay(1000); 

  // Both motors forward at 50% speed for 2 seconds   
  digitalWrite(direction1, HIGH);   
  digitalWrite(direction2, HIGH);   
  analogWrite(speed1, HALF_SPEED);   
  analogWrite(speed2, HALF_SPEED);   

  delay(2000);   
  stopMotor(); 
  delay(1000); 

  // rotate right at 25% speed   
  digitalWrite(direction1, HIGH);   
  digitalWrite(direction2, LOW);   
  analogWrite(speed1, QUARTER_SPEED);   
  analogWrite(speed2, QUARTER_SPEED);   

  delay(2000);   
  stopMotor(); 
  delay(1000); 
}

Penjelasan Kode
Sketch diatas sudah cukup jelas dan tidak terlampau rumit.  Semoga bermanfaat.

Related article
Artikel sebelumnya: Basic Stepper Control
Led Dot-matrix unit umumnya memiliki spesifikasi 5 × 7 atau  8 × 8 matrix LED. LED terhubung

LED disambungkan dalam matriks sedemikian rupa sehingga anoda atau katoda dari masing-masing LED tergabung di setiap baris. Setiap baris dari LED, seluruh anoda akan terhubung satu sama lain. Dan setiap katoda dari LED akan terhubung satu sama lain dalam setiap kolom.

Untuk 8 x 8 dot-matrix Single Color LED akan memiliki 16 pins, 8 untuk baris dan 8 untuk kolom.

Alasan LED dihubungkan dengan cara baris dan kolom adalah untuk mengurangi jumlah pin yang digunakan. Bila tidak menggunakan cara ini, makan untuk 8 x 8 dot-matrix LED akan membutuhkan 65 pins.

Namun, sekarang timbul masalah jika kita hendak menyalakan LED tertentu. Sebagai contoh, Anda menyalakan led pada posisi 5, 3 ( kolom ke-5, baris ke-3). Kita harus memberikan tegangan positif ke pin di baris ke-3 dan ground pada pin kolum ke-5. Dan LED pada posisi 5, 3 akan menyala.



Sekarang kita tingkatkan, misalnya kita juga ingin menyalakan LED di kolom 3, baris 5. Kita akan meberikan tegangan positif pada baris ke 5 dan ground untuk kolom ke 3. LED pada posisi 3, 5 akan menyala. Tapi tunggu, LED pada kolom 3 baris 3 dan LED pada kolom 5 dan baris 5 pun jadi ikut menyala.


Ini terjadi karena kita memberikan arus pada baris 3 dan 5, ground pada kolom 3 dan 5. Kita tida dapat mematikan LED yang tidak kita inginkan tanpa mematikan LED yang kita inginkan menyala.

Sepertinya tidak mungkin kita dapat menyalakan LED yang kita inginkan tadi karena setiap baris dan setiap kolom terhubung bersama. Satu-satunya cara adalah bila setiap LED memiliki pinout masing-masing. Dengan cara ini, maka jumlah pin akan menjadi 65 buah.

Sebuah dot-matrix LED unit dengan 65 pin, akan sangat sulit dihubungkan dan diatur, karena kita akan memerlukan microcontroller dengan minimal 64 digital output.

Untuk mengatasi masalah ini, digunakan cara multiplexing (muxing).


Multiplexing

Adalah teknik switching 1 baris display pada 1 waktu. Dengan menghubungkan ground pada kolom dari LED yang akan dinyalakan, lalu memberikan tegangan positif hanya pada baris yang akan dinyalakan saja. LED yang diharapkan akan menyala. Kemudian baris tadi akan di matikan dan kemudian baris selanjutnya akan dinyalakan, dan dengan kolom yang diharapkan akan dihubungkan dengan ground dan LED kedua akan menyala. Dilakukan berulang untuk setiap baris sampai kita mencapai baris terakhir dan mulai lagi dari atas.

Jika dilakukan dengan kecepatan tinggi (lebih dari 100hz, atau 100 kali per second) maka tampak dimata kita kedua LED tersebut menyala, padahal sebetulnya setiap LED tersebut menyala kemudian mati secara berurutan. (karena retina masih menyimpan gambar kurang lebih 1/25 second).

Dengan menggunakan teknik ini, kita dapat menyalakan LED tertentu tanpa menyalakan LED lainnya. Sebagai contoh, jika kita akan menampilkan image berikut pada matrix LED


Maka setiap baris akan dinyalakan dengan urutan seperti berikut



Mulai dari baris paling atas, nyalakan LED yang diharapkan, kemudian matikan. Lanjut ke baris selanjutnya nyalakan LED yang diharapkan, kemudian matikan. Terus begitu hingga sampai baris terakhir, lalu kembali ke baris awal.

Seperti yang telah dijelaskan diatas, dengan kecepatan tinggi, maka mata kita "ditipu" seolah melihat gambar hati.