Автоламинатор на ШД

Вопросы об управлении шаговыми двигателями
Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Автоламинатор на ШД

Сообщение Kidd_Death » 08 дек 2017, 21:00

Доброго времени суток!


Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 08 дек 2017, 21:39

Доброго времени суток, Эдуард !
Попался нам как-то на работе заказ : клеить по периметру двухсторонний скотч на узкое изделие (6-10х60-90 см). И всё бы ничего, да количество - 1/2/3/5 тысяч штук! Ну, напряглись всей командой, сделали. Потом еще раз заказ. Тут уже по длинной стороне сразу 2 полосы стали накатывать с помощью ламинатора - быстрее намного, но не более 1 тыс.шт., да это еще 2 человека нужно отнять от работы, ламинатор в простое, а есть и другие заказы, ну человеческий фактор присутствует в виде " не успел доставить лист"/" слишком рано всунул лист" и т.п.
Поучаствовав лично пару раз в этих забегах мне стало жалко ребят и я решился собрать автоматический/полуавтоматический мини ламиминатор. Но в виду отсутствия времени начал уже махать рукой на это дело, и тут - Ваши уроки! Это меня взбодрило, появились сдвиги в понимании программы, появилась надежда! :)
Однако, спустя время, я понял, что даже простые вещи гораздо сложнее в реализации, чем в голове! В общем больше, чем за неделю (сегодня таки), смог добиться корректной остановки ШД, но не более :oops: . Хотя на данном этапе задача простая, вроде бы : ШД ждет сигнала от щелевого оптрона, ждет 0.5 сек., работает, пока оптрон неактивный, досылает N шагов, ждет нового листа. Пробовал метод с кнопкой, но , почему-то, результат или нулевой или обратный ожиданиям. Кстати именно с Вашей библиотекой ШД смог добиться стабильного останова ШД! Хотя есть и минусы : ШД не всегда может стартовать ( думаю не хватает тока на обмотках), поэтому нужно колхозить хотя бы подобие ускорения на старте, чтобы ШД не залип на старте.
Скетч мне выкладывать тут стыдно, если честно, но если у Вас есть интерес и время помочь и поучаствовать я буду крайне благодарен ибо есть желание на этом не останавливаться и творить дальше!
Из железа :
- UNO R3;
- CNC sheeld V3;
- DRV8825 ;
- японские ШД с непонятными параметрами, известно, что 200 шагов/оборот, 0.5 Ом/обмотку, 57/56х76мм габариты, производитель (предположительно) SHINANO KENSHI. Почему именно эти - их много и они есть.

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Автоламинатор на ШД

Сообщение Эдуард » 08 дек 2017, 22:35

Здравствуйте!
Помогу. Спрашивайте, в чем конкретно проблема. Может вам поможет эта тема http://mypractic-forum.ru/viewtopic.php?t=62. Мне кажется, там похожая задача. По крайней мере можно структуру программы оттуда взять.

Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 09 дек 2017, 12:52

Там сенсор на АЦП, я на нем проверял оптрон( уровни сигнала, после чего переставил на цифровой пин. Так-то, вроде, похоже, но не совсем та логика работы. Нужно подумать, как адаптировать для пробы. Усреднение, мне кажется тут по вред будет - нужно четко отработать по датчику, чтобы не было произвольных промежутков, между листами.

Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 15 дек 2017, 21:07

Вобщем пока так получилось. Но не смог прикрутить повышение скорости, только 2 ступени и работает как-то странно.
#include <StepDirDriverL.h>
#include <MsTimer2.h>
//int state;
int lastState;

bool state;

int c = 0;
int volatile count;
int dir_pin = 6;
int step_pin = 3 ;
int dataPin = 12;
int enablePin = 8;
StepDirDriverL stepperq(3, 6, 8);

void setup() {
MsTimer2::set(1, timerInt);
MsTimer2::start();
stepperq.setMode(0, false);
digitalWrite(enablePin, HIGH);
Serial.begin(115200);
stepperq.setDivider(4);
pinMode(dataPin, INPUT_PULLUP);
}
void loop () {

int sensor = 0;

sensor = digitalRead(dataPin);
Serial.print("Data:");
Serial.print(sensor);
Serial.print("\n");
// Serial.print("State:");
// Serial.print(state);
// Serial.print("\n");

state = false;

if (sensor == 1) {
state = true;
if (state == true) {
//stepperq.setDivider(4);
stepperq.step(-sensor * 10);
stepperq.setDivider(2);
Serial.println(stepperq.readSteps());
lastState == true;
}
}
if (sensor == 0) {
if (lastState == true) {
stepperq.step(-75);
Serial.println("movingCounter");
lastState == false;
Serial.print("LastState:");
Serial.print(lastState);
Serial.print("\n");
}
}
lastState = state;

}
void timerInt () {
// Serial.println(count);
stepperq.control();
count++;
}


Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 15 дек 2017, 22:05

Видео работы
https://youtu.be/1B402KK-GYE

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Автоламинатор на ШД

Сообщение Эдуард » 15 дек 2017, 22:36

Здравствуйте!
Как-то все запутано. Вы четко выделили режимы. Создайте для них скелет и заполняйте.
Например, вот такая структура.

Код: Выделить всё

byte mode=0;  // режим

void setup() {
}

void loop() {

  if(mode == 0) {
    // ожидание сигнала от датчика
   
  }

  else if(mode == 1) {
    // пауза 0,5 сек
   
  }

  else if(mode == 2) {
    // вращение двигателя с начальной скоростью
   
  }

  else if(mode == 3) {
    // вращение двигателя, ожидания сигнала от датчика
   
  }

  else if(mode == 4) {
    // ожидание окончания дополнительных шагов
   
  }

  else mode=0;

}


Программа ходит в основном цикле по одному из программных блоков. Какой блок определяет переменная mode. Для перехода в другой блок достаточно изменить эту переменную. Я выделили следующие режимы. Вы можете добавить свои.

Теперь надо заполнить режимы. Примерно это выглядит так. Я мог ошибиться. Вы можете заполнять блоки по очереди и проверять работу части программы. Все блоки заполните и проверите - будет рабочая программа. Если надо, отладочные данные на компьютер отсылайте в момент перехода на новый блок.

Код: Выделить всё

#include <TimerOne.h>
#include <StepDirDriverL.h>

unsigned int count;
int dir_pin = 6;
int step_pin = 3 ;
int dataPin = 12;
int enablePin = 8;
StepDirDriverL stepperq(3, 6, 8);

byte mode=0;  // режим

void setup() {
  Timer1.initialize(500);  // инициализация таймера 1, период 500 мкс
  Timer1.attachInterrupt(timerInt, 500);  // задаем обработчик прерываний}
  stepperq.setMode(0, false);
  digitalWrite(enablePin, HIGH);
  Serial.begin(115200);
  stepperq.setDivider(4);
  pinMode(dataPin, INPUT_PULLUP);
}

void loop() {

  if(mode == 0) {
    //--------------------------------------- ожидание сигнала от датчика
    if(digitalRead(dataPin) == HIGH) {
      // переход на режим 1
      count=0;
      mode=1;
    }
  }

  else if(mode == 1) {
    //--------------------------------------- пауза 0,5 сек
    if(count > 1000) {
      // прошли 0,5 сек, переход на режим 2
      stepperq.setDivider(10);  // начальная скорость вращения
      stepperq.step(-20); // число шагов начальной скорости
      mode=2;
    }
  }

  else if(mode == 2) {
    //--------------------------------------- вращение двигателя с начальной скоростью
    if(stepperq.readSteps() == 0) {
      // двигатель остановился, переход на режим 3
      stepperq.setDivider(5);  // скорость вращения
      stepperq.step(-30000); // постоянное вращение
      mode=3;       
    }
  }

  else if(mode == 3) {
    //--------------------------------------- вращение двигателя, ожидания сигнала от датчика
    stepperq.step(-30000); // постоянное вращение

    if(digitalRead(dataPin) == LOW) {
      // переход на режим 4
      stepperq.step(-100); // дополнительные шаги
      count=0;
      mode=4;
    }
   
  }

  else if(mode == 4) {
    //--------------------------------------- ожидание окончания дополнительных шагов
    if(stepperq.readSteps() == 0) {
      // двигатель остановился, переход на режим 0
      mode=0;       
    }
   
  }

  else mode=0;

}

void timerInt () {
  stepperq.control();
  count++;
}


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

Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 15 дек 2017, 22:55

Ну, код да, на букву Г, согласен, но там многое для отладки, чтобы видеть, что происходит в цикле. Да и не я писал, я настаивал на алгоритмах обработки и Ваших библиотеках ( изначально другие не подошли - не стабильная точка остановки, долгий разгон/торможение). И этот скетч пока только делает часть алгоритма, хотя в ручном режиме уже 1 человек может делать эту работу , а не 2 и ламинатор ( большой) в работе.
В Вашей библиотеки странность - скорость есть только после установки 10 шагов, и не сбрасывается в ноль. Если меньше 10 шагов за цикл, то мотор работает медленно и рывками. Может это из-за работы с ком портом?

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Автоламинатор на ШД

Сообщение Эдуард » 15 дек 2017, 23:02

Не знаю. Я проверял тщательно. В уроке 35 есть даже программа верхнего уровня (на компьютере) для проверки библиотеки.

Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 15 дек 2017, 23:32

Скорее всего, как я пока понял, останов нужно инициировать в прерывании, иначе 10 шагов обрабатывает до конца. Непонятно, как разгонять - ступень работает только одна почему-то. А в Вашей программе по управлению мотором через АТ команды. Смог выжать порядка 6к импульсов, что не фонтан, но скорость хорошая.

Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 16 дек 2017, 00:08

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

Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 16 дек 2017, 00:17

Теперь вот думаю ехать завтра на работу проверить Ваш код))

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Автоламинатор на ШД

Сообщение Эдуард » 16 дек 2017, 00:19

Этот код для примера. Значения шагов, скоростей взяты от фонаря. Надо просмотреть каждый блок и подкорректировать.

Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 16 дек 2017, 00:30

Значения и скорости неважны, важна четкая последовательность. Тем более, что это так, набросок - дальше 2 потока , автоподача, разрез деталей друг от друга. Промотрел Ваш код - элегантно, буду пилить так, даже, если его код будет работать нужно пилить свой.

Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 29 дек 2017, 19:03

Залил Ваш код сегодня ( отобрали под другой проект ) заработал сразу! Потом начал пробовать плавно ускорять ШД. Тут не получилось. Хотя, как мне сейчас кажется, что нужно было добавить еще один блок режимов и еще пару счётчиков и всё получится))) . кстати вот видео работы : https://youtu.be/KF48Wfv-uvk

Kidd_Death
Сообщения: 19
Зарегистрирован: 08 дек 2017, 19:59

Re: Автоламинатор на ШД

Сообщение Kidd_Death » 31 дек 2017, 15:18

С наступающим новым годом! как уже показал - Ваш код работает отлично и легко настраивать! буду играться с ним в январе. Огромное СПАСИБО Вам!


Вернуться в «Шаговые двигатели и драйверы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей