MASIGNALPHAS2101
6680671983845063762

Cara Membuat Vending Machine dengan Arduino

Cara Membuat Vending Machine dengan Arduino
Add Comments
12/06/2018

VENDING MACHINE

Vending Machine merupakan alat yang dirancang sebagai alternatif penjualan secara otomatis.

Introduction

Untuk dapat mengoperasikan vending machine ini pengguna harus memasukan koin ke lubang yang sudah disediakan terlebih dahulu. Ketika koin sudah dimasukkan maka koin tersebut akan melewati jalur yang sudah terpasang sensor IR FC-51 (Infrared Obstacle Detaction Sensor Module). Kegunaan dari sensor IR FC-51 adalah mendeteksi ada atau tidaknya koin yang dimasukkan. Setelah koin dimasukkan kemudian pengguna dapat memilih 1 dari 4 makanan ringan yang dipajang dengan cara memasukkan pilihannya lewat tombol yang sudah disediakan. Tombol menandakan posisi makanan ringan yang paling kiri, tombol 2 menandakan makanan ringan yang berada di posisi kanan. Bila pengguna sudah memilih makanan ringan yang dikehendaki, maka motor servo dan sistem mekanik akan mendorong makanan ringan tersebut hingga makanan masuk kedalam box delivery dan akan mengantarkan ke box pengambilan.

HARDWARE

  1. 1x Arduino Mega2560,
  2. 2xDriver Motor Stepper A4988,
  3. 1x IR FC-51 (Infrared Obstacle Detaction Sensor Module),
  4. 2x Motor Stepper
  5. 4x Motor Servo Continue,
  6. 4x Button,
  7. 2x Limit Swit
  8. LED (Light emiting Diode),
  9. LCD (Liquid Crystal Display).

SOFTWARE

1. IDE Arduino (Integrated Developtment Enviroenment), Software processing yang digunakan untuk menulis program kedalam perangkat keras yaitu Arduino. Prosessing sendiri merupakan penggabungan antara bahasa C++ dan Java.
2. EAGLE (Easily Applicable Graphical Layout Editor), merupakan sebuah aplikasi gratis untuk mendesain skematik elektronika maupun PCB (Printed Circuit Board).

DIAGRAM BLOK

Sebelum melakukan perancangan sistem terlebih dahulu dibuat diagram blok sebagai langkah awal pembuatan sistem. Diagram blok menggambarkan secara umum bagaimana cara kerja rangkaian secara keseluruhan, blok diagram dapat dilihat pada gambar dibawah ini :
Diagram Blok Sistem

PERANCANGAN BOX

Dalam perancangan mekanis diperlukan pengukuran yang tepat, terutama dalam menggabungkan beberapa komponen tambahan yang diperlukan untuk membangun alat sesuai dengan sistem yang di inginkan. Berikut adalah desain prototipe fisik box:
Box

DESAIN SKEMATIK DENGAN FRITZING

Fritzing adalah salah satu dari perangkat lunak gratis yang dapat dipergunakan dengan baik untuk belajar elektronika. Perangkat lunak ini bisa bekerja baik di lingkungan sistem operasi GNU/Linux maupun Microsoft Windows.
Tampilan Awal Software Fritzing Beta
Rangkaian ini berfungsi untuk menjalankan mikrokontroller agar dapat bekerja/berfungsi sesuai dengan kebutuhan user, dimana perancangannya bertujuan untuk mempermudah penggunaan mikrokontroler serta meminimalisasikan rangkaian kabel.
Schematic Vending Machine

PROGRAM

VENDING_MACINE.INO (Download)
#include 
#include 
#include 
LiquidCrystal_I2C lcd(0x3f, 16, 2);
Servo servo1, servo2, servo3, servo4;

// Stepper motors pins
#define dirPinVertical 5
#define stepPinVertical 4
#define dirPinHorizontal 7
#define stepPinHorizontal 6

#define coinDetector 9

#define button1 13
#define button2 12
#define button3 11
#define button4 10

#define microSwitchV 15
#define microSwitchH 14
int buttonPressed;
const int ledPin =  53;
const int buzzerPin = 51;

////////////////////////////////////////////////////////////////////////////
// == Fungsi kustom ==

void moveUp (int steps) {
  digitalWrite(dirPinVertical, LOW);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
}
void moveDown (int steps) {
  digitalWrite(dirPinVertical, HIGH);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
}
void moveLeft (int steps) {
  digitalWrite(dirPinHorizontal, HIGH);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}
void moveRight (int steps) {
  digitalWrite(dirPinHorizontal, LOW);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}

//////////////////////////////////////////////////////////////////////////

void setup() {
  lcd.begin(); // Menginisialisasi antarmuka ke layar LCD, dan menentukan dimensi (lebar dan tinggi) dari tampilan
  lcd.print(" SELAMAT DATANG ");
  delay (2000);
  lcd.clear();
  lcd.print("DI MESIN PENJUAL");
  lcd.setCursor(0, 1);
  lcd.print("    OTOMATIS    ");
  delay (2000);
  lcd.clear();
  lcd.print("DIRANCANG OLEH:");
  lcd.setCursor(0, 1);
  lcd.print("  Robe Arta S.  ");
  delay (2500);
  lcd.clear();
  lcd.print("AMIK MITRA GAMA ");
  lcd.setCursor(0, 1);
  lcd.print("      2018      ");
  delay (1000);

  lcd.clear();
  lcd.print("     MOHON     ");
  lcd.setCursor(0, 1);
  lcd.print("Tunggu.........!");
  delay (2000);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai.........");
  delay (1000);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai.");
  delay (1500);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai.. ");
  delay (1000);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai... ");
  delay (1000);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai....");
  delay (500);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai.....");
  delay (500);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai......");
  delay (400);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai.......");
  delay (300);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai........");
  delay (200);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Memulai..........");
  delay (100);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Selesai..........");

  servo1.attach(0);
  servo2.attach(1);
  servo3.attach(2);
  servo4.attach(3);
  

  pinMode(dirPinVertical, OUTPUT);
  pinMode(stepPinVertical, OUTPUT);
  pinMode(dirPinHorizontal, OUTPUT);
  pinMode(stepPinHorizontal, OUTPUT);

  pinMode(coinDetector, INPUT);

  // Mengaktifkan pin digital PULLUP
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  pinMode(button3, INPUT_PULLUP);
  pinMode(button4, INPUT_PULLUP);
  pinMode(microSwitchV, INPUT_PULLUP);
  pinMode(microSwitchH, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  // Posisi awal vertikal
  digitalWrite(dirPinVertical, HIGH); // Atur stepper untuk bergerak ke arah tertentu
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // Jika saklar mikro ditekan, pindahkan platform sedikit ke atas dan keluar dari loop sementara
      moveUp(70);
      break;
    }
    // Pindahkan pengantar ke atas hingga saklar mikro ditekan
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  //Posisi awal Horizontal
  digitalWrite(dirPinHorizontal, LOW);
  while (true) {
    if (digitalRead(microSwitchH) == LOW) {
      moveLeft(350);
      break;
    }
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}

void loop() {
  // Print "Masukkan Coin!" on the LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Masukkan Koin..!");
  digitalWrite(ledPin, LOW);
  digitalWrite(buzzerPin, LOW);

  // Tunggu hingga koin terdeteksi
  while (true) {
    if (digitalRead(coinDetector) == LOW) { // Jika koin terdeteksi, keluar dari loop sementara
      digitalWrite(ledPin, HIGH);
      digitalWrite(buzzerPin, HIGH);
      break;
    }
  }
  delay(300);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Silahkan Pilih ");
  lcd.setCursor(0, 1);
  lcd.print(" 1, 2, 3 atau 4?");
  digitalWrite(ledPin, LOW);
  digitalWrite(buzzerPin, LOW);


  // Tunggu hingga tombol ditekan
  while (true) {
    if (digitalRead(button1) == LOW) {
      buttonPressed = 1;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Item 1 dipilih");
      digitalWrite(ledPin, HIGH);
      digitalWrite(buzzerPin, HIGH);
      break;
    }
    if (digitalRead(button2) == LOW) {
      buttonPressed = 2;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Item 2 dipilih");
      digitalWrite(ledPin, HIGH);
      digitalWrite(buzzerPin, HIGH);
      break;
    }
    if (digitalRead(button3) == LOW) {
      buttonPressed = 3;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Item 3 dipilih");
      digitalWrite(ledPin, HIGH);
      digitalWrite(buzzerPin, HIGH);
      break;
    }
    if (digitalRead(button4) == LOW) {
      buttonPressed = 4;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Item 4 dipilih");
      digitalWrite(ledPin, HIGH);
      digitalWrite(buzzerPin, HIGH);
      break;
    }
  }

  // Print "Mengambil..."
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Mengambil.......");
  digitalWrite(ledPin, LOW);
  digitalWrite(buzzerPin, LOW);

  // Tergantung pada tombol yang ditekan, gerakkan wadah ke posisi itu dan mendorong item yang dipilih
  switch (buttonPressed) {
    case 1:
      // Pindahkan penampung ke rak 1
      moveUp(12450); // Memindahkan 12450 putaran (Catatan: motor stepper diatur dalam resolusi setel Kuartal)
      delay(200);
      moveLeft(17); // Pindah ke kiri 17 putaran
      delay(300);
      // mendorong item yang dipilih
      servo1.writeMicroseconds(3000); // berputar
      delay(950);
      servo1.writeMicroseconds(2000);  // berhenti
      delay(500);
      // Pindahkan wadah kembali ke posisi awal
      moveRight(17);
      delay(200);
      moveDown(12350);
      break;

    case 2:
      // Pindahkan penampung ke rak 2
      moveUp(12350);
      delay(200);
      // mendorong item yang dipilih
      servo2.writeMicroseconds(2500); // berputar
      delay(950);
      servo2.writeMicroseconds(2000);  // berhenti
      delay(500);
      moveDown(12350);
      break;

    case 3:
      // Pindahkan penampung ke rak 3
      moveUp(6250);
      delay(200);
      moveLeft(17);
      delay(300);
      // mendorong item yang dipilih
      servo3.writeMicroseconds(2500); // berputar
      delay(950);
      servo3.writeMicroseconds(2000);  // berhenti
      delay(500);
      // Pindahkan wadah kembali ke posisi awal
      moveRight(17);
      delay(200);
      moveDown(6250);
      break;

    case 4:
      // mendorong item yang dipilih 4
      moveUp(6250); // Pindahkan secara vertikal 6250 putaran
      delay(200);
      // mendorong item yang dipilih
      servo4.writeMicroseconds(2500); // berputar
      delay(950);
      servo4.writeMicroseconds(2000);  // berhenti
      delay(500);
      moveDown(6250);
      break;
  }

  lcd.clear(); // Hapus tampilan
  lcd.setCursor(0, 0);
  lcd.print("Item Sampai....!"); // tampilkan data pada LCD
  digitalWrite(ledPin, HIGH);
  digitalWrite(buzzerPin, HIGH);
  //lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Silahkan Ambil.!");
  delay(1500);
  lcd.clear(); // Hapus tampilan
  lcd.setCursor(0, 0);
  lcd.print("TERIMAKASIH....!"); // tampilkan data pada LCD
  delay(2000);
}
Silahkan Share dan tinggalkan komentar, Semoga bermanfaat.
HASIL test button bisa dilihat di link Youtube:

SELAMAT BERKARYA...!

Hestech Indonesia

Innovasi di bidang Teknologi, Listrik, Teknik Komputer dan gaya Hidup. Info lainnya tentang praktik konservasi berbasis Sains, inovasi, dan kearifan lokal