Помогите реализовать проект в жизнь
- Войдите на сайт для отправки комментариев
Узнал про ардуино придумал применение, купил неделю назад и начал изучать программирование. Код полюбому кривой так, что наберитесь терпения
Проблема: работаю на заводе где много сварки но нет оборудования для перемотки сварочной проволоки.
Пояснение: перемотка сварочной проволоки представляет собой аналогию перемотки нитки с катушки на шпулю швейной машины.
Оборудование: имеется древнее оборудования без начинки.
Идея: на основе шагового двигателя, дисплея сделать оборудование для перемотки проволоки.
Сначала сделал такой код:
#include <LiquidCrystal.h> //Подключение ЛСД библиотеки int in1 = 11;//orange pin Stepper int in2 = 8;//yelow pin Stepper int in3 = 10;//pink pin Stepper int in4 = 9;//blue pin Stepper LiquidCrystal LCD(7, 6, 5, 4, 3, 2); //Инициализация дисплея // Инициализация кнопок, переменных хранения значений кнопок, предыдущие значения кнопок int ButtonMenu=A0; int ButtonMenuUp=A1; int ButtonMenuDown=A2; int MenuCurrent=LOW; int MenuUpCurrent=LOW; int MenuDownCurrent=LOW; int MenuLast=LOW; int MenuUpLast=LOW; int MenuDownLast=LOW; // Инициализация переменых управления меню int MenuP=1; int MenuN=1; float MenuD=0.8; int StepStart=0; void setup() { pinMode(ButtonMenu,INPUT); pinMode(ButtonMenuUp,INPUT); pinMode(ButtonMenuDown,INPUT); LCD.clear(); LCD.begin(16,2); //Задаем значение стобцов(16) и строк(2) LCD.setCursor(1,0); //Устанавливаем курсор в столбец 0 и строку 0 (Исчbление начинается с 0) LCD.print("N=");// Печатаем постоянный заголовок для вывода значения оборотов LCD.setCursor(1,1);// Устанавливаем курсок в столбец 0 строку 1 LCD.print("D=");// Печатаем постоянный заголовок для вывода значения диаметра LCD.setCursor(7,0);// Устанавливаем курсок в столбец 0 строку 1 LCD.print("Stat");// Печатаем постоянный заголовок для вывода значения диаметра LCD.setCursor(13,0); LCD.print("OFF"); Serial.begin(9600); pinMode(in1,OUTPUT); pinMode(in2,OUTPUT); pinMode(in3,OUTPUT); pinMode(in4,OUTPUT); } void loop() { MenuCurrent=digitalRead(ButtonMenu); //Переменные для хранения и измены значения кнопки MenuUpCurrent=digitalRead(ButtonMenuUp); MenuDownCurrent=digitalRead(ButtonMenuDown); Serial.println(MenuP); //<--------------------------------------------------------------------------> if(MenuCurrent==HIGH && MenuLast==LOW)// Задание переменной выбора пункта меню { if(MenuCurrent=!MenuLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuCurrent=HIGH; MenuLast=HIGH; MenuP++; } else { if(MenuCurrent==LOW) MenuLast=LOW; } if(MenuP>3) MenuP=1; //<------------------------------------------------------------> if(MenuP==1) { LCD.setCursor(0,0); LCD.print("-"); } else { LCD.setCursor(0,0); LCD.print(" "); } if(MenuP==2) { LCD.setCursor(0,1); LCD.print("-"); } else { LCD.setCursor(0,1); LCD.print(" "); } if(MenuP==3) { LCD.setCursor(6,0); LCD.print("-"); } else { LCD.setCursor(6,0); LCD.print(" "); } //------------------------------------------------------ if(MenuP==1) { if(MenuUpCurrent==HIGH && MenuUpLast==LOW)// Задание переменной выбора пункта меню { if(MenuUpCurrent=!MenuUpLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuUpCurrent=HIGH; MenuUpLast=HIGH; MenuN++; } else { if(MenuUpCurrent==LOW) MenuUpLast=LOW; } if(MenuDownCurrent==HIGH && MenuDownLast==LOW)// Задание переменной выбора пункта меню { if(MenuDownCurrent=!MenuDownLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuDownCurrent=HIGH; MenuDownLast=HIGH; MenuN--; } else { if(MenuDownCurrent==LOW) MenuDownLast=LOW; } } LCD.setCursor(3,0); LCD.print(MenuN); if (MenuN>50) { LCD.setCursor(4,0); LCD.print(" "); MenuN=1; } if(MenuN<10) { LCD.setCursor(4,0); LCD.print(" "); } if (MenuN==0) MenuN=1; //--------------------------------------------------- if(MenuP==2) { if(MenuUpCurrent==HIGH && MenuUpLast==LOW)// Задание переменной выбора пункта меню { if(MenuUpCurrent=!MenuUpLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuUpCurrent=HIGH; MenuUpLast=HIGH; MenuD=MenuD+0.2; } else { if(MenuUpCurrent==LOW) MenuUpLast=LOW; } if(MenuDownCurrent==HIGH && MenuDownLast==LOW)// Задание переменной выбора пункта меню { if(MenuDownCurrent=!MenuDownLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuDownCurrent=HIGH; MenuDownLast=HIGH; MenuD=MenuD-0.2; } else { if(MenuDownCurrent==LOW) MenuDownLast=LOW; } } LCD.setCursor(3,1); LCD.print(MenuD); if (MenuD>3) { LCD.setCursor(4,1); LCD.print(" "); MenuD=0.8; } if (MenuD<0.8) MenuD=0.8; //----------------------------------------------- int StepSpeed=((60000/4096)/MenuN); if(MenuP==3) { if(MenuUpCurrent==HIGH && MenuUpLast==LOW)// Задание переменной выбора пункта меню { if(MenuUpCurrent=!MenuUpLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuUpCurrent=HIGH; MenuUpLast=HIGH; StepStart++; } else { if(MenuUpCurrent==LOW) MenuUpLast=LOW; } if(StepStart>1) { StepStart=0; } if(StepStart==1) { LCD.setCursor(13,0); LCD.print("ON "); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, HIGH ); digitalWrite( in4, HIGH ); delay(StepSpeed); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, HIGH ); digitalWrite( in4, LOW ); delay(StepSpeed); digitalWrite( in1, LOW ); digitalWrite( in2, HIGH ); digitalWrite( in3, HIGH ); digitalWrite( in4, LOW ); delay(StepSpeed); digitalWrite( in1, LOW ); digitalWrite( in2, HIGH ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); delay(StepSpeed); digitalWrite( in1, HIGH ); digitalWrite( in2, HIGH ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); delay(StepSpeed); digitalWrite( in1, HIGH ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); delay(StepSpeed); digitalWrite( in1, HIGH ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, HIGH ); delay(StepSpeed); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, HIGH ); delay(StepSpeed); } if(StepStart==0) { LCD.setCursor(13,0); LCD.print("OFF"); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); } } }
Здесь в меню я задаю угловую скорость (обороты в минуту) и запускаю и отключаю моторчик. Этого не достаточно для работы устройства.
Мне нужно задавать скорость намотки проволоки допустим метры/минуту. Задать общее количество необхоимых оборотов для намотки проволоки на 1 катушку.
Задаю параметры катуши: int d, int D, int B.
Меняю MenuN на MenuV - задаю параметр скорости намотки проволоки
byte StepN=(1000*MenuV)/(3.14*d);//Частота оборотв шагового двигателя
byte SummOborot=((B/MenuD)*(D/MenuD));/*Тут определяю необходимое колличество оборотов
Так как при намотке будет меняться Диаметр "d" ( то есть каждый слой =d+диаметр проволоки) то и угловая скорость тоже должна меняться чтобы скорость намотки оставалась константа
Короче получилось такое нихрена не работающие (после КОДА БУДУТ КАК РАЗ ВОПРОСЫ К ВАМ)
#include <LiquidCrystal.h> //Подключение ЛСД библиотеки int in1 = 11;//orange pin Stepper int in2 = 8;//yelow pin Stepper int in3 = 10;//pink pin Stepper int in4 = 9;//blue pin Stepper LiquidCrystal LCD(7, 6, 5, 4, 3, 2); //Инициализация дисплея // Инициализация кнопок, переменных хранения значений кнопок, предыдущие значения кнопок int ButtonMenu=A0; int ButtonMenuUp=A1; int ButtonMenuDown=A2; int MenuCurrent=LOW; int MenuUpCurrent=LOW; int MenuDownCurrent=LOW; int MenuLast=LOW; int MenuUpLast=LOW; int MenuDownLast=LOW; // Инициализация переменых управления меню int MenuP=1; int MenuV=1; float MenuD=0.8; //Задания диаметра проволоки которую нужно перемотать int StepStart=0; // Здесь параметры катушки на которую наматывается проволока int d=55; //Внутрений диаметр посадочного места, он же начальный диаметр намотки int D=200; //наружный диаметр посадочного места, он же конечный диаметр намотки int B=55; //Ширина катушки void setup() { pinMode(ButtonMenu,INPUT); pinMode(ButtonMenuUp,INPUT); pinMode(ButtonMenuDown,INPUT); LCD.clear(); LCD.begin(16,2); //Задаем значение стобцов(16) и строк(2) LCD.setCursor(1,0); //Устанавливаем курсор в столбец 0 и строку 0 (Исчbление начинается с 0) LCD.print("V=");// Печатаем постоянный заголовок для вывода значения оборотов LCD.setCursor(1,1);// Устанавливаем курсок в столбец 0 строку 1 LCD.print("D=");// Печатаем постоянный заголовок для вывода значения диаметра LCD.setCursor(7,0);// Устанавливаем курсок в столбец 0 строку 1 LCD.print("Stat");// Печатаем постоянный заголовок для вывода значения диаметра LCD.setCursor(13,0); LCD.print("OFF"); Serial.begin(9600); pinMode(in1,OUTPUT); pinMode(in2,OUTPUT); pinMode(in3,OUTPUT); pinMode(in4,OUTPUT); } void loop() { MenuCurrent=digitalRead(ButtonMenu); //Переменные для хранения и измены значения кнопки MenuUpCurrent=digitalRead(ButtonMenuUp); MenuDownCurrent=digitalRead(ButtonMenuDown); //<--------------------------------------------------------------------------> if(MenuCurrent==HIGH && MenuLast==LOW)// Задание переменной выбора пункта меню { if(MenuCurrent=!MenuLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuCurrent=HIGH; MenuLast=HIGH; MenuP++; } else { if(MenuCurrent==LOW) MenuLast=LOW; } if(MenuP>3) MenuP=1; //<------------------------------------------------------------> if(MenuP==1) { LCD.setCursor(0,0); LCD.print("-"); } else { LCD.setCursor(0,0); LCD.print(" "); } if(MenuP==2) { LCD.setCursor(0,1); LCD.print("-"); } else { LCD.setCursor(0,1); LCD.print(" "); } if(MenuP==3) { LCD.setCursor(6,0); LCD.print("-"); } else { LCD.setCursor(6,0); LCD.print(" "); } //------------------------------------------------------ if(MenuP==1) { if(MenuUpCurrent==HIGH && MenuUpLast==LOW)// Задание переменной выбора пункта меню { if(MenuUpCurrent=!MenuUpLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuUpCurrent=HIGH; MenuUpLast=HIGH; MenuV++; } else { if(MenuUpCurrent==LOW) MenuUpLast=LOW; } if(MenuDownCurrent==HIGH && MenuDownLast==LOW)// Задание переменной выбора пункта меню { if(MenuDownCurrent=!MenuDownLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuDownCurrent=HIGH; MenuDownLast=HIGH; MenuV--; } else { if(MenuDownCurrent==LOW) MenuDownLast=LOW; } } LCD.setCursor(3,0); LCD.print(MenuN); if (MenuV>50) { LCD.setCursor(4,0); LCD.print(" "); MenuV=1; } if(MenuV<10) { LCD.setCursor(4,0); LCD.print(" "); } if (MenuV==0) MenuV=1; //--------------------------------------------------- if(MenuP==2) { if(MenuUpCurrent==HIGH && MenuUpLast==LOW)// Задание переменной выбора пункта меню { if(MenuUpCurrent=!MenuUpLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuUpCurrent=HIGH; MenuUpLast=HIGH; MenuD=MenuD+0.2; } else { if(MenuUpCurrent==LOW) MenuUpLast=LOW; } if(MenuDownCurrent==HIGH && MenuDownLast==LOW)// Задание переменной выбора пункта меню { if(MenuDownCurrent=!MenuDownLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuDownCurrent=HIGH; MenuDownLast=HIGH; MenuD=MenuD-0.2; } else { if(MenuDownCurrent==LOW) MenuDownLast=LOW; } } LCD.setCursor(3,1); LCD.print(MenuD); if (MenuD>3) { LCD.setCursor(4,1); LCD.print(" "); MenuD=0.8; } if (MenuD<0.8) MenuD=0.8; //----------------------------------------------- int Step=1; byte StepN=(1000*MenuV)/(3.14*d);//Частота оборотв шагового двигателя byte SummOborot=((B/MenuD)*(D/MenuD));/*Тут определяю необходимое колличество оборотов для намотки проволоки*/ if(MenuP==3) { if(MenuUpCurrent==HIGH && MenuUpLast==LOW)// Задание переменной выбора пункта меню { if(MenuUpCurrent=!MenuUpLast) delay(50); //Доп защита от дребезга (Помимо подтягивающего резистора) MenuUpCurrent=HIGH; MenuUpLast=HIGH; StepStart++; } else { if(MenuUpCurrent==LOW) MenuUpLast=LOW; } if(StepStart>1) StepStart=0; if(StepStart==1) { LCD.setCursor(13,0); LCD.print("ON "); while(Step<=4096) { delay(StepSpeed); Step++; } switch(Step) { case 1: digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, HIGH ); digitalWrite( in4, HIGH ); break; case 2: digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, HIGH ); digitalWrite( in4, LOW ); break; case 3: digitalWrite( in1, LOW ); digitalWrite( in2, HIGH ); digitalWrite( in3, HIGH ); digitalWrite( in4, LOW ); break; case 4: digitalWrite( in1, LOW ); digitalWrite( in2, HIGH ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); break; case 5: digitalWrite( in1, HIGH ); digitalWrite( in2, HIGH ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); break; case 6: digitalWrite( in1, HIGH ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); break; case 7: digitalWrite( in1, HIGH ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, HIGH ); break; case 8: digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, HIGH ); break; } } if(StepStart==0) { LCD.setCursor(13,0); LCD.print("OFF"); digitalWrite( in1, LOW ); digitalWrite( in2, LOW ); digitalWrite( in3, LOW ); digitalWrite( in4, LOW ); } } Serial.println(Step); }
Нужно заставить шаговик делать общее количество оборотов. Каждый оборот прибавляет к диаметру намотки на величину диаметра проволоки, что в свою очередь должно менять угловую скорость. И я пардон нихрена не могу понять как эти величины можно согласовать между собой и заставить работать. Помогите с реализацией, подкиньте идеи, может ссылочки где для ТУПЫХ все разжевано, ибо я встал и смотрю на то что я написал как баран на новые вороты и ничего сделать не могу.
с подающего барабана проволока сама не разматывается?
Endurist, как я понимаю, выхотите перематывать проволоку с бухты на кассеты для полуавтомата или автомата (трактора). Надеюсь, проволока в бухте уже подготовлена (почищена) и выправлена, а не в "состоянии поставки". :) Для этого нужна не Ардуина с дисплейчиком, а нормальный перемоточный станок. Катушки мотаются обычно до заполнения. Отслеживать можно визуально, а можно щупом с микриком. Чтобы не пережимать проволоку, катушку крутят через фрикционную муфту, а саму проволку протаскивают через приводные ролики с постоянной скоростью. Для предотвращения западания витков делают принудительную раскладку. Тут не ардуинщик нужен, а понимающий нач. рем. базы, у которого еще остались конструктор и работяги. Или купить у кого-нибудь нормальный станок. Хоть б/у.
зачем на сварщика налетел?
человек хочет автоматизировать процесс - и это похвально.
а механика и кинематика вроде не обсуждается...
зачем на сварщика налетел?
Отнюдь. Человек заявил техническую задачу. Я показал, как она решается.
человек хочет автоматизировать процесс - и это похвально.
Человек хочет повозиться с Ардуино. И это похвально. И этого достаточно само по себе, чтобы об этом объявить и задавать вопросы, тем более, на форуме по Ардуино. Для самомотивации он декларирует "серьезную" задачу, решение которой к Ардуино не имеет никакого отношения. Я просто хочу, чтобы он это осознал.
а механика и кинематика вроде не обсуждается...
Это то и плохо. Заявляют (для весомости) одну задачу, а обсуждают другую.
Поправка, я это делаю с целью получения навыков программирования, а думается мне проще когда есть какая нибудь абстрактная, а лучше реальная задача (или почти реальная). Естесно чтобы станок работал просто ардуинки не хватит и нужна кинематика, с этим согласен спору нет.
Подключал стандартную библиотеку, все крутиться но нет возможности остановить процесс пока цикл не завершиться.
Заявил я о задаче чтобы было проще понять что я хочу реализовать в коде... Как бэ так
Не понял, зачем скорость намотки должна быть константой?
Поправка, я это делаю с целью получения навыков программирования, а думается мне проще когда есть какая нибудь абстрактная, а лучше реальная задача (или почти реальная).
"Придумать" себе задачу, чтобы было легче учить новый материал, вполне нормальный ход. Так многие делают, и я в том числе. :) На этом строятся лабораторные работы, что в средней школе, что в высшей. Просто заявленная Вами первоначальная задача (перемотка проволоки) настолька далека и по размеру и по путям решения от реальной задачи (обучение программированию Ардуино), что будет только мешать. Сделайте сами себе лабораторную работу по изучению реального маленького шагового двигателя. Задача будет учебной, но в этом ее преимущество. Вы себе и другим сформулируете настоящую задачу и объявите выбранные Вами способы ее достижения. Опишите, что делали, и что не получилось. Зададите конкретный вопрос. Так Вам и помочь будет легче.
Первый шаг Вами уже сделан. Появилась реалистичная формулировка первого вопроса к форуму:
Теперь следующий шаг (он должен был быть предшествующим): поищите по форуму аналогичные обсуждения. Я на форуме встречал очень похожие вопросы.
Одним словом: "Дерзайте!" :)
Проволоку при перемотке из бухты на катушку еще и чистят, и правят. Для этого. Если по-хорошему. Нельзя допустить дерганий проволки в подающем устройстве при сварке (для этого правят), ровно как и попадания в ванну грязи с проволки (для этого чистят). Иначе не шов будет, а "кака".
Понял, спасибо.