Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Mesin Penjual Otomatis DIY – Proyek Mekatronika berbasis Arduino

Dalam proyek ini kita akan belajar cara membuat mesin penjual otomatis DIY berbasis Arduino. Saya akan menunjukkan kepada Anda seluruh proses pembuatannya, mulai dari memotong dan merakit papan MDF, hingga menghubungkan semua komponen elektronik menjadi satu dan menulis kode Arduino.

Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini.

Ringkasan

Mesin penjual otomatis memiliki empat unit pengosongan yang dikendalikan melalui empat motor servo rotasi kontinu, sistem pembawa yang dikendalikan melalui motor stepper, LCD, empat tombol untuk memilih item, dan detektor koin.

Anda mungkin berpikir sekarang bahwa pembawa barang tidak begitu berguna untuk mesin penjual otomatis ini, dan ya, Anda mungkin benar. Tapi ide saya di sini adalah untuk membuat proyek ini lebih menarik atau sedikit lebih kompleks sehingga Anda dapat mempelajari lebih banyak hal baru. Menurut saya, ide proyek ini sangat bagus untuk siswa elektronik atau mekatronik yang mempertimbangkan untuk membuatnya sebagai proyek tahun terakhir mereka, serta untuk semua penggemar Arduino.

Membuat mesin penjual otomatis

Saya mulai dengan memotong papan MDF tick berukuran 8 mm.

Saya sebelumnya membuat model mesin 3D dari mana saya mendapatkan semua pengukuran.

Anda dapat menemukan dan mengunduh model 3D ini, serta menjelajahinya di browser Anda di Thangs.

Untuk memotong MDF saya menggunakan gergaji bundar. Sebenarnya ini adalah meja kerja buatan sendiri yang menampilkan gergaji bundar, router, dan gergaji ukir, yang dibuat oleh partner saya Marija dan ada video DIY untuk itu di saluran YouTube-nya, Kreativitas Pahlawan.

Setelah memotong semua panel menggunakan gergaji bundar saya lanjutkan dengan membuat bukaan di beberapa panel menggunakan gergaji terbalik.

Sebenarnya gergaji ukir bahkan dapat digunakan untuk langkah sebelumnya jika Anda tidak memiliki gergaji bundar. Saya juga menggunakan Jigsaw untuk memotong bagian yang lebih kecil yang memiliki beberapa potongan. Namun, perhatikan bahwa ini adalah mesin yang berbahaya sehingga Anda harus sangat berhati-hati saat menggunakannya.

Setelah semua bagian MDF siap, saya mulai merakitnya menggunakan lem kayu dan sekrup. Untuk mengencangkan panel saya menggunakan klem sudut 90 derajat. Dengan menggunakan bor tanpa kabel, pertama-tama saya membuat lubang pilot, kemudian membuat counter sink dan memasang sekrup 3 mm pada tempatnya. Saya menggunakan metode yang sama untuk merakit semua panel dan untuk beberapa di antaranya saya juga menggunakan beberapa klem F.

Sistem kereta

Pada titik perakitan ini saya akan melanjutkan dengan membuat sistem rel. Untuk tujuan itu saya menggunakan tabung aluminium yang saya potong sesuai ukuran menggunakan gergaji tangan logam. Diameter tabung untuk rel horizontal adalah 16 mm, sedangkan untuk rel vertikal diameternya adalah 20 mm. Pada papan kayu solid 18 mm saya membuat slot untuk tabung menggunakan mata bor Forstner dan kemudian memasang tabung ke sana.

Rel horizontal dibuat dari dua pipa sepanjang 27 cm, sedangkan rel vertikal dibuat dari tiga pipa sepanjang 45 cm.

Berikutnya adalah penggeser dan inilah cara saya membuatnya. Saya menggunakan papan kayu berukuran 21 x 21 cm yang saya buat lubang 8 mm.

Kemudian saya memasukkan batang berulir 8 mm melalui lubang ini dan menggunakan ring dan mur saya mengamankan bantalan 22 mm. Untuk penggeser horizontal, saya menggunakan metode yang sama tetapi dengan bantalan yang lebih kecil dengan diameter luar 16 mm.

Setelah saya memasukkan penggeser di antara rel tabung, saya perhatikan bahwa itu agak longgar. Untuk mengatasi masalah ini saya harus mengurangi jarak antara dua rel. Jadi pertama saya memperluas slot tabung, kemudian membuat slot tegak lurus melalui tabung, dan akhirnya menggunakan batang berulir mengikat kedua rel tabung lebih dekat satu sama lain. Setelah ini, bilah geser tidak lagi longgar dan berfungsi dengan baik.

Namun, pada titik ini saya harus membongkar rel untuk menambahkan elemen lain ke dalamnya. Pertama saya menambahkan baut 5mm di sisi kiri rel tempat saya akan memasang katrol untuk timing belt horizontal, serta dua bantalan lagi yang akan meluncur di rel vertikal kiri.

Di sisi kanan lain rel saya harus memasang motor stepper untuk gerakan horizontal. Pertama-tama saya kencangkan motor pada papan MDF 8 mm, lalu tambahkan sepotong kayu pendukung, dan juga kencangkan bagian slotnya. Akhirnya saya memasang seluruh rakitan ini ke penggeser vertikal menggunakan lem kayu dan dua sekrup.

Selanjutnya, saya melanjutkan dengan menambahkan wadah pada penggeser horizontal. Untuk itu saya menggunakan beberapa potongan kayu kecil yang saya gabungkan dengan menggunakan lem kayu. Setelah saya selesai dengan ini, saya siap untuk merakit sistem rel. Saya menggunakan beberapa epoksi di slot rel dan menambahkan papan kayu tambahan ke sisi rel untuk membuat seluruh sistem rel lebih kaku.

Pada langkah berikutnya, saya memasukkan rakitan di antara rel vertikal dan mengamankannya di tempatnya juga. Hasil akhir dari sistem penggeser dan rel ternyata bekerja dengan sangat baik.

Saya melanjutkan dengan memasang timing belt horizontal. Saya mengukur panjang yang saya butuhkan, memotongnya sesuai ukuran, dan mengencangkannya ke penggeser menggunakan dasi ritsleting. Sedangkan untuk penggeser vertikal, saya pasang motor stepper di bagian atas mesin menggunakan sepotong MDF dan beberapa baut. Di bagian bawah, saya memasang katrol dan dengan cara yang sama memasang sabuk waktu.

Unit debit

Selanjutnya, saya pindah ke unit pemakaian item. Saya membuat gulungan heliks dari kawat logam tick 3 mm dengan membungkusnya di sekitar kaleng cat semprot berdiameter 7 cm.

Setelah itu menggunakan lem tembak saya kencangkan ke motor servo yang berputar terus menerus.

Panel depan

Selanjutnya adalah panel pintu depan yang saya pasang pada vending machine menggunakan engsel sederhana, dan untuk menguncinya saya menggunakan magnetic door catcher. Kemudian saya menggunakan akrilik tick 5mm untuk menutupi bukaan depan yang besar, sedangkan untuk bukaan yang lebih kecil di sisi kanan saya menggunakan pelat aluminium yang sangat timah. Di sini saya membuat 4 lubang untuk tombol, serta lubang untuk koin dan layar LCD. Saya menggunakan bor dan gergaji besi untuk membuatnya. Setelah saya memasang komponen elektronik ke pelat aluminium, saya pasang kemudian ke panel pintu depan menggunakan baut 5 mm.

Untuk memposisikan pembawa ke posisi awal saya memasang dua sakelar mikro dan untuk koin saya menempelkan panduan yang akan memandu koin untuk meluncur ke bagian bawah mesin.

Detektor koin adalah sensor jarak inframerah sederhana, jadi ketika koin lewat di dekatnya, sensor akan memberi kita umpan balik positif.

Skema Sirkuit

Berikutnya adalah bagian yang menyenangkan, menghubungkan semua komponen elektronik ke papan Arduino. Berikut skema rangkaian lengkap untuk proyek mesin penjual otomatis DIY ini.

Jadi kita membutuhkan catu daya 12V, dengan minimal 2 amp. Kami membutuhkan 12V untuk dua motor stepper, serta lampu strip LED yang nantinya akan saya pasang di pintu depan. Namun, untuk semua komponen lain kita membutuhkan 5V jadi karena itu saya menggunakan konverter uang untuk menurunkan 12V ke 5V. Motor servo rotasi terus menerus DS04-NFC ditenagai dengan 5V dan dikendalikan melalui sinyal PWM yang berasal dari papan Arduino, sedangkan motor stepper dikendalikan melalui driver A4988. Empat tombol dan dua sakelar mikro terhubung ke Ground dan pin digital Arduino, sehingga dengan menggunakan resistor pull up internal papan Arduino, kita dapat dengan mudah mendeteksi saat ditekan.

Anda bisa mendapatkan komponen yang diperlukan untuk Tutorial Arduino ini dari link di bawah ini:

  • Konverter Buck DC-DC LM2596 …………..
  • LCD 16×2 …………………………………………..
  • Motor Servo Kontinu 360 Derajat …
  • Motor Stepper NEMA 17 ……………………….
  • Pengemudi Motor Stepper A4988 ……………….
  • Sensor Kedekatan IR ………………………………..
  • Tombol …………………………………………………….
  • Saklar Batas Mikro ………………………………….
  • Dewan Arduino …………………………………………

Saya menghubungkan komponen elektronik menggunakan beberapa kabel lompat. Itu menjadi sedikit berantakan dengan banyak kabel tetapi semuanya bekerja dengan baik. Pada akhirnya saya memasang dua strip lampu LED di panel pintu untuk menerangi bagian dalam mesin penjual otomatis.

Kode Arduino

Yang tersisa sekarang adalah memprogram Arduino dan inilah kode yang saya buat untuk proyek ini. Di bawah ini ada deskripsi kodenya.

/*     DIY Vending Machine - Arduino based Mechatronics Project

    by Dejan Nedelkovski, www.HowToMechatronics.com

*/

#include <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <Servo.h>

LiquidCrystal lcd(27, 26, 25, 24, 23, 22); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
Servo servo1, servo2, servo3, servo4;   // DS04-NFC motors

// Stepper motors pins
#define dirPinVertical 0
#define stepPinVertical 1
#define dirPinHorizontal 2
#define stepPinHorizontal 3

#define coinDetector 9

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

#define microSwitchV 15
#define microSwitchH 14

int buttonPressed;

void setup() {
  lcd.begin(16, 2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display

  servo1.attach(4);
  servo2.attach(5);
  servo3.attach(6);
  servo4.attach(7);

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

  pinMode(coinDetector, INPUT);

  // Activating the digital pins pull up resistors
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  pinMode(button3, INPUT_PULLUP);
  pinMode(button4, INPUT_PULLUP);

  pinMode(microSwitchV, INPUT_PULLUP);
  pinMode(microSwitchH, INPUT_PULLUP);

  // Vertical starting position
  digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop
      moveUp(70);
      break;
    }
    // Move the carrier up until the micro switch is pressed
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  // Horizontal starting position
  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 "Insert a coin!" on the LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Insert a coin!");
  
  // Wait until a coin is detected
  while (true) {
    if (digitalRead(coinDetector) == LOW) { // If a coin is detected, exit the from the while loop
      break;
    }
  }
  
  delay(10);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Select your item");
  lcd.setCursor(0, 1);
  lcd.print(" 1, 2, 3 or 4?");
  
  // Wait until a button is pressed
  while (true) {
    if (digitalRead(button1) == LOW) {
      buttonPressed = 1;
      break;
    }
    if (digitalRead(button2) == LOW) {
      buttonPressed = 2;
      break;
    }
    if (digitalRead(button3) == LOW) {
      buttonPressed = 3;
      break;
    }
    if (digitalRead(button4) == LOW) {
      buttonPressed = 4;
      break;
    }
  }
  
  // Print "Delivering..." 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Delivering...");
  
  // Depending on the pressed button, move the carrier to that position and discharge the selected item 
  switch (buttonPressed) {
    case 1:
      // Move the container to location 1
      moveUp(4900); // Move up 4900 steps (Note: the stepper motor is set in Quarter set resolution)
      delay(200);
      moveLeft(1700); // Move left 1700 steps
      delay(300);
      // Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(4900);
      break;
      
     case 2:
      // Move the container to location 2
      moveUp(4900);
      delay(200);
      // Rotate the helix, push the selected item
      servo2.writeMicroseconds(2000); // rotate
      delay(950);
      servo2.writeMicroseconds(1500);  // stop
      delay(500);
      moveDown(4900);
      break;

      case 3:
      // Move the container to location 3
      moveUp(2200); 
      delay(200);
      moveLeft(1700);
      delay(300);
      // Rotate the helix, push the selected item
      servo3.writeMicroseconds(2000); // rotate
      delay(950);
      servo3.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(2200);
      break;

      case 4:
      // Move the container to location 4
      moveUp(2200); // Move verticaly 4800 steps
      delay(200);
      // Rotate the helix, push the selected item
      servo4.writeMicroseconds(2000); // rotate
      delay(950);
      servo4.writeMicroseconds(1500);  // stop
      delay(500);
      moveDown(2200);
      break;
  }
  
  lcd.clear(); // Clears the display
  lcd.setCursor(0, 0);
  lcd.print("Item delivered!"); // Prints on the LCD
  delay(2000);
}

// == Custom functions ==

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);
  }
}Code language: Arduino (arduino)

Penjelasan kode sumber

Pertama kita perlu menyertakan perpustakaan Servo dan LiquidCrystal, menentukan pin LCD, empat motor servo, pin motor stepper, detektor koin serta empat tombol dan dua sakelar mikro.

Di bagian pengaturan, kami mengatur mode pin untuk setiap pin yang disebutkan di atas. Kami dapat mencatat bahwa untuk tombol dan pin sakelar mikro, kami mengaktifkan resistor pull up internal. Ini berarti level logika pada pin ini akan selalu HIGH, dan setelah kita menekannya, level logika akan turun ke LOW.

Sebelum kita memasuki loop utama, kita juga mengatur pembawa ke posisi awal yang ditentukan oleh dua sakelar mikro. Jadi dengan loop while kita terus memindahkan pembawa ke posisi awal dan begitu dua sakelar mikro ditekan, motor akan berhenti dan pindah ke posisi awal yang diinginkan.

// Vertical starting position
  digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop
      moveUp(70);
      break;
    }
    // Move the carrier up until the micro switch is pressed
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  // Horizontal starting position
  digitalWrite(dirPinHorizontal, LOW);
  while (true) {
    if (digitalRead(microSwitchH) == LOW) {
      moveLeft(350);
      break;
    }
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }Code language: Arduino (arduino)

Pada program utama, dengan memulai dengan mencetak pada LCD pesan “Insert a coin”. Kemudian kita terjebak dalam loop while. Setelah koin dimasukkan dan melewati dekat sensor jarak, status logika pada pin detektor koin akan turun ke RENDAH dan dalam hal ini kita akan keluar dari loop while menggunakan pernyataan break.

// Wait until a coin is detected
  while (true) {
    if (digitalRead(coinDetector) == LOW) { // If a coin is detected, exit the from the while loop
      break;
    }
  }Code language: Arduino (arduino)

Kemudian kami mencetak pesan “Pilih item Anda” dan kami terjebak di loop while lainnya.

// Wait until a button is pressed
  while (true) {
    if (digitalRead(button1) == LOW) {
      buttonPressed = 1;
      break;
    }
    if (digitalRead(button2) == LOW) {
      buttonPressed = 2;
      break;
    }
    if (digitalRead(button3) == LOW) {
      buttonPressed = 3;
      break;
    }
    if (digitalRead(button4) == LOW) {
      buttonPressed = 4;
      break;
    }
  }Code language: Arduino (arduino)

Perulangan while ini menunggu kita untuk menekan salah satu dari empat tombol, dan setelah kita melakukannya, kita keluar dari situ dan mencetak pesan “Delivering”.

Sekarang tergantung pada tombol yang ditekan, kami mengeksekusi satu kali kasus dalam pernyataan sakelar. Jika kita telah menekan tombol pertama, operator akan mulai bergerak ke atas menggunakan fungsi “moveUp()” yang dibuat khusus.

switch (buttonPressed) {
    case 1:
      // Move the container to location 1
      moveUp(4900); // Move up 4900 steps (Note: the stepper motor is set in Quarter set resolution)
      delay(200);
      moveLeft(1700); // Move left 1700 steps
      delay(300);
      // Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(4900);
      break;
}Code language: Arduino (arduino)

Jika kita melihat fungsi ini, kita dapat melihat bahwa itu hanya mengatur motor stepper untuk bergerak ke arah tertentu, dan menjadikan jumlah langkah yang kita masukkan sebagai argumen.

void moveUp (int steps) {
  digitalWrite(dirPinVertical, LOW);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
}Code language: Arduino (arduino)

Kami dapat mencatat di sini bahwa saya mengatur driver stepper A4988 untuk bekerja dalam resolusi seperempat langkah, dan dengan beberapa pencicipan saya menyimpulkan bahwa saya membutuhkan 4900 langkah agar pembawa dapat mencapai posisi atas. Dengan cara yang sama kita pindahkan carrier ke kiri hingga mencapai lokasi nomor 1.

Tepat setelah itu kami memutar motor putaran terus menerus selama 950 milidetik sehingga kumparan heliks membuat satu siklus penuh.

// Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stopCode language: Arduino (arduino)

Perhatikan di sini bahwa nilai-nilai ini terkadang dapat bervariasi dan tergantung pada motor itu sendiri. Menggunakan fungsi kustom moveRight() dan moveDown() , kami membawa operator kembali ke posisi awal. Dengan cara yang sama kita dapat melepaskan keempat item tersebut.

Pada akhirnya kami hanya mencetak pesan “Item terkirim”.

Jadi sesederhana itu, dan saya harap Anda menikmati video ini dan belajar sesuatu yang baru. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah dan periksa Koleksi Proyek Arduino saya.


Proses manufaktur

  1. Mesin Penjual Otomatis
  2. Membuat Mesin Tulis Pekerjaan Rumah DIY di Rumah
  3. Konsol Pengeditan Photoshop DIY menggunakan Arduino Nano RP 2040
  4. Membuat Monitor Ambilight Menggunakan Arduino
  5. Mesin ULTRASONIC LEVITATION Menggunakan ARDUINO
  6. Voltmeter DIY Menggunakan Arduino dan Smartphone
  7. Sensor Detak Jantung Inframerah DIY menggunakan Arduino
  8. Tech-TicTacToe
  9. Voltmeter DIY dengan Arduino dan Tampilan Nokia 5110
  10. Jam Digital di Arduino Menggunakan Mesin Finite State