• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

WebServer CustomStepper

gerkimuyda

New member
kab, по принципу работы библиотеки необходимым условием является постоянный запуск
[inline]stepper.run(); // Этот метод обязателен в блоке loop. Он инициирует работу двигателя, когда это необходимо[/inline]
в цикле loop(), но управление ему ТС не передает, а выходит из цикла раньше времени. надо stepper.run(); поднять вверх в начало цикла.

Хорошей затеей для ТС будет почитать статью Как писать программы без ошибок [PIC24]
 

kab

New member
kab, по принципу работы библиотеки необходимым условием является постоянный запуск
[inline]stepper.run(); // Этот метод обязателен в блоке loop. Он инициирует работу двигателя, когда это необходимо[/inline]
в цикле loop(), но управление ему ТС не передает, а выходит из цикла раньше времени. надо stepper.run(); поднять вверх в начало цикла.
Не уверен, что проблема в этом, но:
"надо stepper.run(); поднять вверх в начало цикла"
сделать это не сложно и не повредит - точно.
UPD!!!
А нет - если отвалится клиент, тогда будет бесконечно повторяться последняя команда.

Это нехорошо
 

IgorFX

New member
Продолжаем набор на спиритические сеансы экстрасенсов :)))

Как думаете, что данная строка у вас выполняет?
[inline] if (!client) { return; } [/inline]
Я предполагаю, что она, наверное, не дает запускаться [inline]stepper.run()[/inline] а вы как считаете?

И еще, вам не кажется, что в приведенном тексте написано
двигатель за один оборот осуществляет 4075.7728395 шага. Данный двигатель поддерживает полушаговый режим и за один полный оборот может совершать 4076 шага,
А у вас полушаговый режим? И тут надо найти правильный вариант? (но это так, незначительный отступ от темы...)
Вариант правильный библиотека рабочая. Тут скорее с подключением проблема, где-то на англоязычном сайте находил. После запроса идёт отключение клиента что и не даёт запустить двигатель. Вообщем беда второй Wemos глюкнул не видит его Arduino IDE. Эксперименты закончились. Ждём посылку))
 

IgorFX

New member
в Вашем скетче, в отличии от скетча примера, присутствуют такие настройки. Подозреваю, что они и приводят к изменению поведения
Если скачать библиотеку там есть пример там именно так и прописана последовательность. Этот пример работает.
 

gerkimuyda

New member
А нет - если отвалится клиент, тогда будет бесконечно повторяться последняя команда.
stepper.run() - это не повтор последней команды, а движок библиотеки, которые выполняет всё необходимые действия. А если действия закончились - тогда ничего не делает.
Именно он и просчитывает что надо делать двигателю и когда остановится (помните, там еще задается скорость в оборотах в минуте). Поэтому и указано, что он обязан быть в цикле.
А когда нет входящих запросов, очередь к нему не доходит, т.к. по команде return процесс вываливается из loop().

Остальные рекомендации по отладке я уже давал (особенно вывод отладочной инфы в терминале). При желании, ТС может внимательнее подойти к изучению своей программы и разобраться в ситуации.
А вот почему накрылась плата - надо выяснить обязательно!!! Питание сколько хомякает двигатель? И откуда отбирает питание платка перед двигателем? Она на 5в, а esp 5в не переваривает (только с asm1117 на пин Vin).

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

IgorFX

New member
Питание двигателя отдельно. Вемос запитан по USB. Первый вемос и вышел из строя что питание двигателя бралось с него( плохой контакт на 5в.
В общем я так понял надо добавить
if (!client) && stepper.isDone()
т.е. если клиент не подключен и ничего не выполняется выходим из loop
 
Последнее редактирование:

kab

New member
Этот пример работает
А когда нет входящих запросов, очередь к нему не доходит, т.к. по команде return процесс вываливается из loop().
Так, если нет входящих запросов, то нет и команд на движок - так что в этом случае вываливаться на return, либо идти на stepper.run() - одинаково ничего не будет происходить. Это я к тому, что в структуре программы менять ничего не надо. А вот надо понять, почему
в stepper.rotate(2) 2 - это стало число не оборотов, а шагов
и, повторяюсь, можно попробовать использовать
stepper.rotateDegrees(720)
 

gerkimuyda

New member
Так, если нет входящих запросов, то нет и команд на движок - так что в этом случае вываливаться на return, либо идти на stepper.run() - одинаково ничего не будет происходить.
stepper.run() позволит закончить движку поворот (который длиться долго, в зависимости от количество оборотов и от скорости, а потому - он не блокирует процесс, как сделали бы ламеры, а отрабатывается в цикле давая возможность и другим процессам работать.

Давайте посмотрим в код библиотеки, что делает stepper.run() ?
Код:
 if (this->timer <= micros() && micros() < this->timer + this->time)
    this->step();
Т.е. - делает следующий шаг, пока не надо будет остановится. Поэтому и необходимо его постоянно запускать в цикле!
Если поворот надо окончить -запустится следующая ниже функция и stepper.run() при следующих вызовах ничего делать больше не будет
Код:
void CustomStepper::disable()
{
  this->time = 0;
  digitalWrite(this->pin1, LOW);
  digitalWrite(this->pin2, LOW);
  digitalWrite(this->pin3, LOW);
  digitalWrite(this->pin4, LOW);
  this->done = true;
 

kab

New member
stepper.run() позволит закончить движку поворот (который длиться долго, в зависимости от количество оборотов и от скорости, а потому - он не блокирует процесс, как сделали бы ламеры, а отрабатывается в цикле давая возможность и другим процессам работать.

Давайте посмотрим в код библиотеки, что делает stepper.run() ?
Код:
 if (this->timer <= micros() && micros() < this->timer + this->time)
    this->step();
Т.е. - делает следующий шаг, пока не надо будет остановится. Поэтому и необходимо его постоянно запускать в цикле!
Если поворот надо окончить -запустится следующая ниже функция и stepper.run() при следующих вызовах ничего делать больше не будет
Код:
void CustomStepper::disable()
{
  this->time = 0;
  digitalWrite(this->pin1, LOW);
  digitalWrite(this->pin2, LOW);
  digitalWrite(this->pin3, LOW);
  digitalWrite(this->pin4, LOW);
  this->done = true;
Т. е. по Вашему выводу, если у нас рвётся сеанс связи на середине движения мотора, то он застывает, не докончив действие? Хотя команда и была уже получена? Спорить не буду, т.к., честно говоря, глубоко вникнуть не смог. И жалко, что на макете проверить тоже не могу... Придется поверить:)
 

gerkimuyda

New member
Код изначально построен не правильно :)
Там еще есть цикл, который блокирует всю работу (включая и двигатель)
86 строка [inline]while(!client.available()){delay(1);}[/inline]
 

IgorFX

New member
Истина где-то рядом оч жаль что контроллер вышел из строя. Читал где-то что именно delay ибивает весь процесс, нужно использовать millis. Убрать delay , а правильно ли это будет? Или while заменить if. А нужно ли нам проверять клиента? В общем пилим матчасть пока едут контроллеры)
 

kab

New member
Истина где-то рядом оч жаль что контроллер вышел из строя. Читал где-то что именно delay ибивает весь процесс, нужно использовать millis. Убрать delay , а правильно ли это будет? Или while заменить if. А нужно ли нам проверять клиента? В общем пилим матчасть пока едут контроллеры)
@gerkimuyda очень тщательно проверил код - но разные замечания имеют разную степень влияния на конечный результат работы программы.

Если пойти по пути наименьших исправлений (так называемый "костыль" - :) рискую получить кучу критики от @gerkimuyda), то должно сработать следующее:
- в строке 132 вместо

stepper.run();

написать

while(!stepper.isDone()) stepper.run();

:D или, чтобы получить меньше замечаний

while(!stepper.isDone()) {stepper.run();}
 

IgorFX

New member
@gerkimuyda очень тщательно проверил код - но разные замечания имеют разную степень влияния на конечный результат работы программы.

Если пойти по пути наименьших исправлений (так называемый "костыль" - :) рискую получить кучу критики от @gerkimuyda), то должно сработать следующее:
- в строке 132 вместо

stepper.run();

написать

while(!stepper.isDone()) stepper.run();

:D или, чтобы получить меньше замечаний

while(!stepper.isDone()) {stepper.run();}
Надо будет попробовать. Нашёл в городе недорогой АтМега. Вечером пересоберу схему. Огромнейшее всем кто пнул в правильную сторону. Ну а если не получится будем работать с исходником заточенным под драйвер двигателя tb6612fng со стандартной библиотекой stepper.
 
Сверху Снизу