Помогите реализовать проект в жизнь

Endurist
Offline
Зарегистрирован: 24.09.2015

Узнал про ардуино придумал применение, купил неделю назад и начал изучать программирование. Код полюбому кривой так, что наберитесь терпения

Проблема: работаю на заводе где много сварки но нет оборудования для перемотки сварочной проволоки.

Пояснение: перемотка сварочной проволоки представляет собой аналогию перемотки нитки с катушки на шпулю швейной машины.

Оборудование: имеется древнее оборудования без начинки.

Идея: на основе шагового двигателя, дисплея сделать оборудование для перемотки проволоки.

Сначала сделал такой код:



#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);
}


     

Нужно заставить шаговик делать общее количество оборотов. Каждый оборот прибавляет к диаметру намотки на величину диаметра проволоки, что в свою очередь должно менять угловую скорость. И я пардон нихрена не могу понять как эти величины можно согласовать между собой и заставить работать. Помогите с реализацией, подкиньте идеи, может ссылочки где для ТУПЫХ все разжевано, ибо я встал и смотрю на то что я написал как баран на новые вороты и ничего сделать не могу.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

с подающего барабана проволока сама не разматывается?

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Endurist, как я понимаю, выхотите перематывать проволоку с бухты на кассеты для полуавтомата или автомата (трактора). Надеюсь, проволока в бухте уже подготовлена (почищена) и выправлена, а не в "состоянии поставки". :) Для этого нужна не Ардуина с дисплейчиком, а нормальный перемоточный станок. Катушки мотаются обычно до заполнения. Отслеживать можно визуально, а можно щупом с микриком. Чтобы не пережимать проволоку, катушку крутят через фрикционную муфту, а саму проволку протаскивают через приводные ролики с постоянной скоростью. Для предотвращения западания витков делают принудительную раскладку. Тут не ардуинщик нужен, а понимающий нач. рем. базы, у которого еще остались конструктор и работяги. Или купить у кого-нибудь нормальный станок. Хоть б/у.

vvadim
Offline
Зарегистрирован: 23.05.2012

зачем на сварщика налетел?

человек хочет автоматизировать процесс - и это похвально.
а механика и  кинематика вроде не обсуждается...

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

vvadim пишет:

зачем на сварщика налетел?

Отнюдь. Человек заявил техническую задачу. Я показал, как она решается.

vvadim пишет:

человек хочет автоматизировать процесс - и это похвально.

Человек хочет повозиться с Ардуино. И это похвально. И этого достаточно само по себе, чтобы об этом объявить и задавать вопросы, тем более, на форуме по Ардуино. Для самомотивации он декларирует "серьезную" задачу, решение которой к Ардуино не имеет никакого отношения. Я просто хочу, чтобы он это осознал.

vvadim пишет:

а механика и  кинематика вроде не обсуждается...

Это то и плохо. Заявляют (для весомости) одну задачу, а обсуждают другую.

Endurist
Offline
Зарегистрирован: 24.09.2015

Поправка, я это делаю с целью получения навыков программирования, а думается мне проще когда есть какая нибудь абстрактная, а лучше реальная задача (или почти реальная). Естесно чтобы станок работал просто ардуинки не хватит и нужна кинематика, с этим согласен спору нет.

Подключал стандартную библиотеку, все крутиться но нет возможности остановить процесс пока цикл не завершиться.

Заявил я о задаче чтобы было проще понять что я хочу реализовать в коде... Как бэ так

 

Joiner
Offline
Зарегистрирован: 04.09.2014

Не понял, зачем скорость намотки должна быть константой?

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Endurist пишет:

Поправка, я это делаю с целью получения навыков программирования, а думается мне проще когда есть какая нибудь абстрактная, а лучше реальная задача (или почти реальная).

"Придумать" себе задачу, чтобы было легче учить новый материал, вполне нормальный ход. Так многие делают, и я в том числе. :) На этом строятся лабораторные работы, что в средней школе, что в высшей. Просто заявленная Вами первоначальная задача (перемотка проволоки) настолька далека и по размеру и по путям решения от реальной задачи (обучение программированию Ардуино), что будет только мешать. Сделайте сами себе лабораторную работу по изучению реального маленького шагового двигателя. Задача будет учебной, но в этом ее преимущество. Вы себе и другим сформулируете настоящую задачу и объявите выбранные Вами способы ее достижения. Опишите, что делали, и что не получилось. Зададите конкретный вопрос. Так Вам и помочь будет легче.

Первый шаг Вами уже сделан. Появилась реалистичная формулировка первого вопроса к форуму:

Endurist пишет:
Подключал стандартную библиотеку, все крутиться но нет возможности остановить процесс пока цикл не завершиться.

Теперь следующий шаг (он должен был быть предшествующим): поищите по форуму аналогичные обсуждения. Я на форуме встречал очень похожие вопросы.

Одним словом: "Дерзайте!" :)

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Joiner пишет:
Не понял, зачем скорость намотки должна быть константой?

Проволоку при перемотке из бухты на катушку еще и чистят, и правят. Для этого. Если по-хорошему. Нельзя допустить дерганий проволки в подающем устройстве при сварке (для этого правят), ровно как и попадания в ванну грязи с проволки (для этого чистят). Иначе не шов будет, а "кака".

Joiner
Offline
Зарегистрирован: 04.09.2014

Понял, спасибо.