Автоматическая машина для резки проволоки на Arduino

Привет, друзья. Сегодня мы делаем автоматическую машинку по нарезке проволоки с помощью Arduino Nano. Нам захотелось сделать аналог устройства от ребят с одного Youtube-канала под названием "Must Love Science" (их вариант машины можно посмотреть по ссылке). Что мы в итоге должны получить можно увидеть в нашем видео на последнем шаге.

Сразу сделаем некоторые комментарии по процессам создания нашей машины.

Входные данные, такие как длина провода и количество проводов, выбираемые нажатием кнопок, могут считываться и отображаться в реальном времени на 16-дюймовом ЖК-дисплее. На более профессиональном уровне лучше использовать изготовленную на заказ печатную плату вместо использования макетной платы. В целом стоимость наборов печатных плат доступны всего за пару долларов США на Али или в других магазинах, поэтому почему бы не использовать их для проектов. Например, на сайте www.jlcpcb.com вы можете получить 10 печатных плат всего за 2$.

Все входные данные обрабатываются Arduino Nano и дают команду шаговому двигателю для подачи необходимой длины провода, а также указывают сервоприводу сделать разрез необходимого количества. Шаговый двигатель, сервопривод и резак являются конечными выходными компонентами.

Шаг 1: Требуемые комплектующие

Ниже перечислено всё что нам необходимо. Отдельные фото выше - для понимания всех комплектующих.

  1. Arduino nano
  2. Шаговый двигатель
  3. Модуль управления двигателем
  4. 16x2 ЖК-дисплей
  5. Сервопривод
  6. Резак
  7. Терминал PCB (печатная плата)
  8. Кнопки

Шаг 2: Печатная плата

Компоновка печатной платы подготовлена в программном обеспечении fritzing. Затем спроектируйте PCB и экспортируйте файл типа gerber.

Gerber — файловый формат, представляющий собой способ описания проекта печатной платы для изготовления фотошаблонов на самом разнообразном оборудовании. Практически все современные системы автоматизации проектных работ для электроники позволяют генерировать выходные файлы в формате Gerber; с другой стороны — почти всё современное оборудование позволяет считывать данные в этом формате.

Этот полученный файл gerber, загрузите, например, на сайт www.jlcpcb.com для заказа печатной платы. Как только вы получите печатную плату (PCB) вам нужно припаять несколько выводов для подключения arduino nano, ЖК-дисплея и модуля. Также припаяйте терминал PCB для подключения источника питания к печатной плате и для подключения шагового двигателя к печатной плате. Ниже можно скачать все необходимые файлы куда вы можете внести необходимые изменения.

Скачать PCB

Скачать доп.файлы

Шаг 3: Процесс

Как только будут доступны все компоненты вы сможете начать собирать машину. Для основания машины был использован 3 мм толстый белый акриловый лист. Первым просверлили отверстия на листе для монтажа печатной платы, шагового двигателя с комплектом экструдера, резака и серводвигателя. Все компоненты плотно закрепили на листе. Далее мы можем перейти к программированию нашего ардуино.

Шаг 4: Программируем Arduino

Загрузите код в Arduino (ниже). Теперь подключите 12 В постоянного тока на клемме печатной платы для шагового двигателя и подключите USB к arduino nano, - это подаст питание самому arduino и сервомотору.

//------------------------------- librarys ----------------------------------

#include <LiquidCrystal.h>
#include <Servo.h>
 
//------------------------------- lcd ----------------------------------
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);
 
//------------------------------- stepper ----------------------------------
#define stepPin 7
#define dirPin 8
 
//------------------------------- servo ----------------------------------
Servo snippers;
#define servo 10
#define openAngle 180
#define closedAngle 0
 
//------------------------------- input ----------------------------------
 
#define leftButton 14
#define rightButton 9
#define upButton 15
#define downButton 6
 
//------------------------------- user settings ----------------------------------
unsigned int wireLength = 0;
unsigned int wireQuantity = 0;
 
//------------------------------- system settings ----------------------------------
int state = 0;
int incrementSpeed = 1;
int previousWireLength = 0;
int previousWireQuantity = 0;
float mmPerStep = 0.18096;
 
 
void setup() {
  Serial.begin(9600);
 
 
  lcd.begin(16, 2); //LCD columns and rows
 
 
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(leftButton, INPUT_PULLUP);
  pinMode(rightButton, INPUT_PULLUP);
 
  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);
 
  snippers.attach(servo);
 
  snippers.write(openAngle);
   
  delay(1000);
}
 
void loop() {
  if (!digitalRead(rightButton)){
    if(state == 5){
      state = 0;
    }
    else{
      state += 1;
    }
    delay(200);
    lcd.clear();
  }
  if (!digitalRead(leftButton) && state > 0 && state < 4){
    state -=1;
    delay(200);
    lcd.clear();
  }
 
 
  switch (state){
    case 0:
      homeScreen();
      break;
    case 1:
       chooseWireLength();
       break;
    case 2:
      chooseWireQuantity();
      break;
    case 3:
      confirm();
      break;
    case 4:
      currentlyCutting();
      break;
    case 5:
      finishedCutting();
      break;
  }
 
}
 
 
void homeScreen(){
  lcd.setCursor(0, 0);
  lcd.print("WIRE CUTTER");
  lcd.setCursor(11, 1);
  lcd.print("NEXT>");
  delay(100);
}
 
 
void chooseWireLength(){
  wireLength = changeValue(wireLength);
 
  //clear LCD if required
  if(previousWireLength != wireLength){
    lcd.clear();
    previousWireLength = wireLength;
  }
 
  //Display information on LCD
  lcd.setCursor(0, 0);
  lcd.print("LENGTH:" + (String)wireLength + "mm");
  displayNavigation();
}
 
void chooseWireQuantity(){
  wireQuantity = changeValue(wireQuantity);
 
  //clear LCD if required
  if(previousWireQuantity != wireQuantity){
    lcd.clear();
    previousWireQuantity = wireQuantity;
  }
 
  //Display information on LCD
  lcd.setCursor(0, 0);
  lcd.print("QUANTITY:" + (String)wireQuantity);
  displayNavigation();
}
 
void confirm(){
  lcd.setCursor(0, 0);
  lcd.print((String)wireLength + "mm x " + (String)wireQuantity + "pcs");
  lcd.setCursor(0, 1);
  lcd.print("<BACK");
  lcd.setCursor(10, 1);
  lcd.print("START>");
  delay(100);
}
 
void currentlyCutting(){
  lcd.setCursor(0, 0);
  lcd.print((String)0 + "/" + (String)wireQuantity);
  lcd.setCursor(0, 1);
  lcd.print("???s");
  int stepsToTake = (int)wireLength/mmPerStep;
  for(int i = 0; i < wireQuantity; i++){
    unsigned long timeForOneCycle = millis();
    digitalWrite(dirPin,HIGH);
    for(int x = 0; x < stepsToTake; x++) {
      digitalWrite(stepPin,HIGH);
      delayMicroseconds(500);
      digitalWrite(stepPin,LOW);
      delayMicroseconds(500);
    }
   
    lcd.setCursor(0, 0);
    lcd.print((String)(i+1) + "/" + (String)wireQuantity);
   
    snippers.write(closedAngle);
    delay(600);
    snippers.write(openAngle);
    delay(600);
 
   
    lcd.setCursor(0, 1);
 
    unsigned long timeRemaining = ((millis() - timeForOneCycle)*(wireQuantity - (i+1)))/1000;
    lcd.print((String)timeRemaining + "s    ");
   
  }
  wireLength = 0;
  wireQuantity = 0;
  state = 5;
}
 
void finishedCutting(){
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("CUTTING COMPLETE");
  lcd.setCursor(11, 1);
  lcd.print("NEXT>");
  delay(100);
}
 
 
int changeValue(int currentValue){
  if (!digitalRead(upButton)) {
    delay(100);
    currentValue += incrementSpeed;
    
  }
  if (!digitalRead(downButton)) {
    if(currentValue - incrementSpeed >= 0){
      delay(100);
      currentValue -= incrementSpeed;
    
    }
    else{
      currentValue = 0;
    }
  }
  if (!digitalRead(downButton) && !digitalRead(upButton)){
    incrementSpeed = 1;
  }
  return currentValue;
}
 
void displayNavigation(){
  lcd.setCursor(0, 1);
  lcd.print("<BACK");
  lcd.setCursor(11, 1);
  lcd.print("NEXT>");
  delay(100);
}

 

Шаг 5: Итоговый результат

В итоге у нас получилось очень крутое устройство. Машина готова к запуску. Вам нужно нажать кнопки для навигации для выбора желаемых данных.

Надеемся, что очередной урок вам понравился. Подписывайтесь на нашу группу ВКонтакте, впереди нас ждет еще много интересного!

24 января 2018 в 18:03 | Обновлено 7 декабря 2019 в 02:19 (редакция)
Опубликовано:
Уроки, ,

8 комментариев

  1. Алексей
    27 июня 2020 в 07:46

    Можете такой отрезной стоночек на заказ сделать

    Ответить
  2. Дима
    3 сентября 2020 в 11:13

    Прошу прощения, а есть ли еще подробней инструкция, куда что принять, есть желание собрать, но опыта в этом 0 .

    Ответить
  3. Дима
    3 сентября 2020 в 11:14

    Опечатка выше, припаять

    Ответить
  4. Сергей
    29 ноября 2020 в 23:36

    Можете такой отрезной стоночек на заказ сделать?

    Ответить
  5. Дмитрий
    12 ноября 2021 в 11:20

    Доброго дня.
    на заказ можете сделать?

    Ответить
  6. Jožin z bažin
    2 ноября 2022 в 22:25

    Сделал такую штуку недавно. На макетке. Работает. Все нормально. В корпусе, прям как заводская штука. Единственно из за длинных проводов к дисплею он иногда краказябры начинает показывать.

    Ответить
  7. Вячеслав
    23 мая 2023 в 16:37

    Не получается разрезать провод -резак бездействует, пока подача отмеряет количество проводов, указанные в мм. Может ошибка в программе?

    Ответить
    1. Вячеслав
      6 января 2024 в 08:29

      добавьте первой строкой в программе-
      #include

      Ответить

Добавить комментарий

Ваш E-mail не будет никому виден. Обязательные поля отмечены *