Помогите реализовать проект в жизнь
- Войдите на сайт для отправки комментариев
Узнал про ардуино придумал применение, купил неделю назад и начал изучать программирование. Код полюбому кривой так, что наберитесь терпения
Проблема: работаю на заводе где много сварки но нет оборудования для перемотки сварочной проволоки.
Пояснение: перемотка сварочной проволоки представляет собой аналогию перемотки нитки с катушки на шпулю швейной машины.
Оборудование: имеется древнее оборудования без начинки.
Идея: на основе шагового двигателя, дисплея сделать оборудование для перемотки проволоки.
Сначала сделал такой код:
#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, как я понимаю, выхотите перематывать проволоку с бухты на кассеты для полуавтомата или автомата (трактора). Надеюсь, проволока в бухте уже подготовлена (почищена) и выправлена, а не в "состоянии поставки". :) Для этого нужна не Ардуина с дисплейчиком, а нормальный перемоточный станок. Катушки мотаются обычно до заполнения. Отслеживать можно визуально, а можно щупом с микриком. Чтобы не пережимать проволоку, катушку крутят через фрикционную муфту, а саму проволку протаскивают через приводные ролики с постоянной скоростью. Для предотвращения западания витков делают принудительную раскладку. Тут не ардуинщик нужен, а понимающий нач. рем. базы, у которого еще остались конструктор и работяги. Или купить у кого-нибудь нормальный станок. Хоть б/у.
зачем на сварщика налетел?
человек хочет автоматизировать процесс - и это похвально.
а механика и кинематика вроде не обсуждается...
зачем на сварщика налетел?
Отнюдь. Человек заявил техническую задачу. Я показал, как она решается.
человек хочет автоматизировать процесс - и это похвально.
Человек хочет повозиться с Ардуино. И это похвально. И этого достаточно само по себе, чтобы об этом объявить и задавать вопросы, тем более, на форуме по Ардуино. Для самомотивации он декларирует "серьезную" задачу, решение которой к Ардуино не имеет никакого отношения. Я просто хочу, чтобы он это осознал.
а механика и кинематика вроде не обсуждается...
Это то и плохо. Заявляют (для весомости) одну задачу, а обсуждают другую.
Поправка, я это делаю с целью получения навыков программирования, а думается мне проще когда есть какая нибудь абстрактная, а лучше реальная задача (или почти реальная). Естесно чтобы станок работал просто ардуинки не хватит и нужна кинематика, с этим согласен спору нет.
Подключал стандартную библиотеку, все крутиться но нет возможности остановить процесс пока цикл не завершиться.
Заявил я о задаче чтобы было проще понять что я хочу реализовать в коде... Как бэ так
Не понял, зачем скорость намотки должна быть константой?
Поправка, я это делаю с целью получения навыков программирования, а думается мне проще когда есть какая нибудь абстрактная, а лучше реальная задача (или почти реальная).
"Придумать" себе задачу, чтобы было легче учить новый материал, вполне нормальный ход. Так многие делают, и я в том числе. :) На этом строятся лабораторные работы, что в средней школе, что в высшей. Просто заявленная Вами первоначальная задача (перемотка проволоки) настолька далека и по размеру и по путям решения от реальной задачи (обучение программированию Ардуино), что будет только мешать. Сделайте сами себе лабораторную работу по изучению реального маленького шагового двигателя. Задача будет учебной, но в этом ее преимущество. Вы себе и другим сформулируете настоящую задачу и объявите выбранные Вами способы ее достижения. Опишите, что делали, и что не получилось. Зададите конкретный вопрос. Так Вам и помочь будет легче.
Первый шаг Вами уже сделан. Появилась реалистичная формулировка первого вопроса к форуму:
Теперь следующий шаг (он должен был быть предшествующим): поищите по форуму аналогичные обсуждения. Я на форуме встречал очень похожие вопросы.
Одним словом: "Дерзайте!" :)
Проволоку при перемотке из бухты на катушку еще и чистят, и правят. Для этого. Если по-хорошему. Нельзя допустить дерганий проволки в подающем устройстве при сварке (для этого правят), ровно как и попадания в ванну грязи с проволки (для этого чистят). Иначе не шов будет, а "кака".
Понял, спасибо.