в Вашем скетче, в отличии от скетча примера, присутствуют такие настройки. Подозреваю, что они и приводят к изменению поведения(byte[]){8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001}, 4075.7728395, 12, CW
в Вашем скетче, в отличии от скетча примера, присутствуют такие настройки. Подозреваю, что они и приводят к изменению поведения(byte[]){8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001}, 4075.7728395, 12, CW
Не уверен, что проблема в этом, но:kab, по принципу работы библиотеки необходимым условием является постоянный запуск
[inline]stepper.run(); // Этот метод обязателен в блоке loop. Он инициирует работу двигателя, когда это необходимо[/inline]
в цикле loop(), но управление ему ТС не передает, а выходит из цикла раньше времени. надо stepper.run(); поднять вверх в начало цикла.
Вариант правильный библиотека рабочая. Тут скорее с подключением проблема, где-то на англоязычном сайте находил. После запроса идёт отключение клиента что и не даёт запустить двигатель. Вообщем беда второй Wemos глюкнул не видит его Arduino IDE. Эксперименты закончились. Ждём посылку))Продолжаем набор на спиритические сеансы экстрасенсов ))
Как думаете, что данная строка у вас выполняет?
[inline] if (!client) { return; } [/inline]
Я предполагаю, что она, наверное, не дает запускаться [inline]stepper.run()[/inline] а вы как считаете?
И еще, вам не кажется, что в приведенном тексте написано
двигатель за один оборот осуществляет 4075.7728395 шага. Данный двигатель поддерживает полушаговый режим и за один полный оборот может совершать 4076 шага,
А у вас полушаговый режим? И тут надо найти правильный вариант? (но это так, незначительный отступ от темы...)
Читать статьи полезно вообще - только поддерживаю. Без Но!Хорошей затеей для ТС будет почитать статью
Второй - это уже нехорошая тенденция. Может с блоком питания проблемы? Или что-то еще по схемному решению?Вообщем беда второй Wemos глюкнул
Явного отключения клиента в скетче не вижуПосле запроса идёт отключение клиента
Обязательно прочту. Только я ничего не пишу есть примеры и библиотека. Надо как-то все соединитьЧитать статьи полезно вообще - только поддерживаю. Без Но!
Если скачать библиотеку там есть пример там именно так и прописана последовательность. Этот пример работает.в Вашем скетче, в отличии от скетча примера, присутствуют такие настройки. Подозреваю, что они и приводят к изменению поведения
stepper.run() - это не повтор последней команды, а движок библиотеки, которые выполняет всё необходимые действия. А если действия закончились - тогда ничего не делает.А нет - если отвалится клиент, тогда будет бесконечно повторяться последняя команда.
- я под теми словами имел ввиду, что если число задано в шагах, а у вас полушаги, то двигатель может выполнить половину нужного перемещения. В описании библиотеки там нет однозначности с этим. Надо проверять на деле.Вариант правильный
Этот пример работает
Так, если нет входящих запросов, то нет и команд на движок - так что в этом случае вываливаться на return, либо идти на stepper.run() - одинаково ничего не будет происходить. Это я к тому, что в структуре программы менять ничего не надо. А вот надо понять, почемуА когда нет входящих запросов, очередь к нему не доходит, т.к. по команде return процесс вываливается из loop().
и, повторяюсь, можно попробовать использоватьв stepper.rotate(2) 2 - это стало число не оборотов, а шагов
stepper.rotateDegrees(720)
Как я понимаю, Wemos - это типа NodeMcu - берут питание от USBоткуда отбирает питание платка
Был неправ - торопился смотать с работы... плохо подумал...UPD!!!
А нет - если отвалится клиент, тогда будет бесконечно повторяться последняя команда
stepper.run() позволит закончить движку поворот (который длиться долго, в зависимости от количество оборотов и от скорости, а потому - он не блокирует процесс, как сделали бы ламеры, а отрабатывается в цикле давая возможность и другим процессам работать.Так, если нет входящих запросов, то нет и команд на движок - так что в этом случае вываливаться на return, либо идти на stepper.run() - одинаково ничего не будет происходить.
if (this->timer <= micros() && micros() < this->timer + this->time)
this->step();
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;
Т. е. по Вашему выводу, если у нас рвётся сеанс связи на середине движения мотора, то он застывает, не докончив действие? Хотя команда и была уже получена? Спорить не буду, т.к., честно говоря, глубоко вникнуть не смог. И жалко, что на макете проверить тоже не могу... Придется поверить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 очень тщательно проверил код - но разные замечания имеют разную степень влияния на конечный результат работы программы.Истина где-то рядом оч жаль что контроллер вышел из строя. Читал где-то что именно delay ибивает весь процесс, нужно использовать millis. Убрать delay , а правильно ли это будет? Или while заменить if. А нужно ли нам проверять клиента? В общем пилим матчасть пока едут контроллеры)
Надо будет попробовать. Нашёл в городе недорогой АтМега. Вечером пересоберу схему. Огромнейшее всем кто пнул в правильную сторону. Ну а если не получится будем работать с исходником заточенным под драйвер двигателя tb6612fng со стандартной библиотекой stepper.@gerkimuyda очень тщательно проверил код - но разные замечания имеют разную степень влияния на конечный результат работы программы.
Если пойти по пути наименьших исправлений (так называемый "костыль" - рискую получить кучу критики от @gerkimuyda), то должно сработать следующее:
- в строке 132 вместо
stepper.run();
написать
while(!stepper.isDone()) stepper.run();
или, чтобы получить меньше замечаний
while(!stepper.isDone()) {stepper.run();}