Привет, друзья. Сегодня мы делаем автоматическую машинку по нарезке проволоки с помощью Arduino Nano. Нам захотелось сделать аналог устройства от ребят с одного Youtube-канала под названием "Must Love Science" (их вариант машины можно посмотреть по ссылке). Что мы в итоге должны получить можно увидеть в нашем видео на последнем шаге.
Сразу сделаем некоторые комментарии по процессам создания нашей машины.
Входные данные, такие как длина провода и количество проводов, выбираемые нажатием кнопок, могут считываться и отображаться в реальном времени на 16-дюймовом ЖК-дисплее. На более профессиональном уровне лучше использовать изготовленную на заказ печатную плату вместо использования макетной платы. В целом стоимость наборов печатных плат доступны всего за пару долларов США на Али или в других магазинах, поэтому почему бы не использовать их для проектов. Например, на сайте www.jlcpcb.com вы можете получить 10 печатных плат всего за 2$.
Все входные данные обрабатываются Arduino Nano и дают команду шаговому двигателю для подачи необходимой длины провода, а также указывают сервоприводу сделать разрез необходимого количества. Шаговый двигатель, сервопривод и резак являются конечными выходными компонентами.
Шаг 1: Требуемые комплектующие
Ниже перечислено всё что нам необходимо. Отдельные фото выше - для понимания всех комплектующих.
- Arduino nano
- Шаговый двигатель
- Модуль управления двигателем
- 16x2 ЖК-дисплей
- Сервопривод
- Резак
- Терминал PCB (печатная плата)
- Кнопки
Шаг 2: Печатная плата
Компоновка печатной платы подготовлена в программном обеспечении fritzing. Затем спроектируйте PCB и экспортируйте файл типа gerber.
Этот полученный файл gerber, загрузите, например, на сайт www.jlcpcb.com для заказа печатной платы. Как только вы получите печатную плату (PCB) вам нужно припаять несколько выводов для подключения arduino nano, ЖК-дисплея и модуля. Также припаяйте терминал 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: Итоговый результат
В итоге у нас получилось очень крутое устройство. Машина готова к запуску. Вам нужно нажать кнопки для навигации для выбора желаемых данных.
Надеемся, что очередной урок вам понравился. Подписывайтесь на нашу группу ВКонтакте, впереди нас ждет еще много интересного!
27 июня 2020 в 07:46
Можете такой отрезной стоночек на заказ сделать
3 сентября 2020 в 11:13
Прошу прощения, а есть ли еще подробней инструкция, куда что принять, есть желание собрать, но опыта в этом 0 .
3 сентября 2020 в 11:14
Опечатка выше, припаять
29 ноября 2020 в 23:36
Можете такой отрезной стоночек на заказ сделать?
12 ноября 2021 в 11:20
Доброго дня.
на заказ можете сделать?
2 ноября 2022 в 22:25
Сделал такую штуку недавно. На макетке. Работает. Все нормально. В корпусе, прям как заводская штука. Единственно из за длинных проводов к дисплею он иногда краказябры начинает показывать.
23 мая 2023 в 16:37
Не получается разрезать провод -резак бездействует, пока подача отмеряет количество проводов, указанные в мм. Может ошибка в программе?
6 января 2024 в 08:29
добавьте первой строкой в программе-
#include