• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
 
Сверху Снизу