Helpp. Помогите справиться с двгателем!

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем zzzkrestzzz, 14 окт 2017.

?

В чем может быть проблема?

  1. Код

    50,0%
  2. Подключение

    50,0%
  3. Я тупень

    100,0%
Можно выбрать сразу несколько вариантов.
  1. zzzkrestzzz

    zzzkrestzzz Нуб

    При регулировки резистора скорость меняют оба одновременно.
     
  2. DIYMan

    DIYMan Guest

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

    1. Получили значения с резисторов;
    2. Установили скорость вращения моторов;
    3. Начали шагать первым мотором с его скоростью. Пока он не отшагает - второй мотор НЕ ШАГАЕТ;
    4. Потом шагает второй мотор, с его скоростью.

    Т.е. с точки зрения формальной логики - всё более-менее ок, хотя лично мне не нравится блокирующее исполнение функции шагания в библиотеке - нет возможности шагать двумя моторами одновременно.

    Если что-то работает не так, как планировалось - надо добавлять отладочный код: выводить в монитор порта всё, что только можно - показания датчиков, добавить между двумя вызовами шагания вывод в сериал и задержку секунды на две - короче, сделать всё так, чтобы вам было визуально более наглядней пронаблюдать, что происходит.
     
  3. zzzkrestzzz

    zzzkrestzzz Нуб

    Добрый вечер! Посмотрел значения резисторов, резисторы корректно работают (меняют значения вне зависимости друг от друга).
     
  4. DIYMan

    DIYMan Guest

    Блин, сюр какой-то, чесслово :) Вот смотрю в код библы, и не понимаю, почему так. Ок, давайте попробуем понять, что происходит:
    Код (C++):
    void Stepper::setSpeed(long whatSpeed)
    {
      this->step_delay = 60L * 1000L * 1000L / this->number_of_steps / whatSpeed;
    }
     
    У нас number_of_steps в вашем случае - 64, переменную whatSpeed примем как 50 (центр вашего диапазона от 0 до 100). Получаем задержку:
    Код (C++):
    this->step_delay = 60L * 1000L * 1000L / 64 / 50;
    Получаем, путём нехитрых вычислений, параметр 18750, в микросекундах. Далее шагаем два шага с этой задержкой между шагами. Всё корректно.

    Если для второго мотора взять переменную whatSpeed в 10, то получим задержку в 93750 микросекунд между шагами, всё корректно.

    Вывод - должны шагать с разной скоростью. Вопрос: приведите ещё раз актуальный код скетча, плз.
     
  5. rkit

    rkit Гуру

    Да чего же вы такие все бестолковые. Они оба шагают по два шага за луп. То, что эти два шага происходят с разным интервалом между собой - иррелевантно, потому что это происходит слишком быстро для человеческого глаза. А средняя скорость одинаковая, хоть ты тресни - один сделал два шага, другой сделал два шага.
    Ни один из шаговиков никогда не убежит вперед, как ни крути понтенциомеры. Так понятно?
     
    Последнее редактирование: 15 окт 2017
  6. DIYMan

    DIYMan Guest

    Ну да, простите, о великий, мы забыли, кто тут у нас самый толковый :)
    Согласен.
    Согласен.

    Но: ТС утверждает, что СКОРОСТЬ ШАГАНИЯ изменяется для ДВУХ шаговиков, если крутить ОДИН потенциометр. При чём тут ваше ВНЕЗАПНОЕ и не относящееся к делу просветление о том, что шаговики шагают одинаковое кол-во шагов? Это только сейчас вам стало понятно, штоле?

    Вопрос - про СКОРОСТЬ шагания. И если вводные ТС верны, то первый шаговик должен делать ДВА шага с одной скоростью, а второй - с ДРУГОЙ скоростью. Поскольку loop крутится быстро, и функции шагания - блокирующие, то визуально на малом количестве шагов это оценить сложно, согласен.

    Вывод для ТС: попробуйте увеличить кол-во шагов с 2 на 2000 - и гляньте, вставив код подсчёта времени шагания, реально ли шаговики шагают с одной скоростью, или вам так только кажется.

    Вывод для rkit - какой же вы бестолковый, всё-таки :)
     
  7. rkit

    rkit Гуру

    Давайте не будем придуриваться. Никто не говорит про скорость робота как про скорость в квант времени во время переходного процесса.
     
  8. zzzkrestzzz

    zzzkrestzzz Нуб

    Давайте не будем спорить, как поменять код? что изменить? Я полный нуб. Уже сижу дня 4 туплю.
     
  9. DIYMan

    DIYMan Guest

    И не думал. Смотрите, дано:

    1. шаговик №1 делает два шага за секунду;
    2. шаговик номер 2 делает два шага за 5 секунд.

    Вопрос: скорости шагания у них разные, или нет? Вы понимаете, о чём я? Шагают они одинаково, а скорость - это другая песня ;) ТС именно про скорость и писал.
     
  10. rkit

    rkit Гуру

    Понимаю. И даже объяснил почему это неправильно. Но вы продолжаете придуриваться.
     
  11. DIYMan

    DIYMan Guest

    Вот полный код:

    Код (C++):
    #include <Stepper.h>

    const int stepsPerRevolution = 64;
    Stepper motor1(stepsPerRevolution, 6, 8, 7, 9);
    Stepper motor2(stepsPerRevolution, 2, 3, 4, 5);

    void setup()
    {
        Serial.begin(9600);
    }

    void loop()
    {
      int sensor1 = analogRead(A0);
      int sensor2 = analogRead(A1);
      int motor1Speed = map(sensor1, 0, 1023, 0, 100);
      int motor2Speed = map(sensor2, 0, 1023, 0, 100);

      Serial.print(F("Motor 1 speed: "));
      Serial.println(motor1Speed);

      Serial.print(F("Motor 2 speed: "));
      Serial.println(motor2Speed);

      motor1.setSpeed(motor1Speed);
      motor2.setSpeed(motor2Speed);

      unsigned long startTime = millis();
      motor1.step(2000);
      unsigned long motor1DoneTime = millis() - startTime;

      startTime = millis();
      motor2.step(2000);
      unsigned long motor2DoneTime = millis() - startTime;

      Serial.print(F("Motor 1 work time: "));
      Serial.println(motor1DoneTime);

      Serial.print(F("Motor 2 work time: "));
      Serial.println(motor2DoneTime);

    }
    Закачайте его, и посмотрите в мониторе порта - если при вращении одного потенциометра время работы моторов, нужное для шагания 2000 шагов - одинаковое, то продолжим. Если оно разное - значит, проблемы нет, и вы просто неправильно оценивали происходящее. Выхлоп из монитора порта - можно сюда, под спойлер.
     
  12. DIYMan

    DIYMan Guest

    Млять, вы прикалываетесь или как? СКОРОСТЬ, сестра, СКОРОСТЬ. Это производная по времени, ясно? Если для шагания 2 шагов одному мотору надо 1 секунду, а второму - 2 секунды, то скорость шагания первого мотора в 2 раза ВЫШЕ, чем второго.

    ТС спрашивал про СКОРОСТЬ, прекратите курить просроченную дурь, в конце-то концов. Я даже выделю:
    Другой вопрос - как ТС оценивал эту скорость. Функция шагания - блокирующая, и если задать большое кол-во шагов, то скорость шагания можно вполне себе заметить ВИЗУАЛЬНО в одном прогоне цикла loop - когда один шаговик покрутился ДВЕ секунды, а второй, ПОСЛЕ ТОГО, как первый выключился - покрутился ОДНУ секунду. Потом, естественно, всё по-новой, на новый заход в loop.

    Скорость, сестра, СКОРОСТЬ.
     
    Последнее редактирование модератором: 15 окт 2017
  13. rkit

    rkit Гуру

    Мне повториться? Никто не говорит про скорость, как про скорость в квант времени во время переходного процесса. Когда говорят про скорость, имеют в виду настолько большую Δt, что переходные процессы иррелевантны. Когда специально указывают что нужна моментальная скорость - другой разговор.
     
  14. ostrov

    ostrov Гуру

    Не, все верно rkit говорит. За один луп и тот и другой движок делают два шага, только один быстрее, а другой медленнее. С такой библиотекой иначе и не получится. Надо чтобы они шагали одновременно, но с разными интервалами!
     
  15. DIYMan

    DIYMan Guest

    Ясно, щас будем отбрыкиваться, вместо того, чтобы просто написать "простите, я балбес". Я убеждён, что ТС похер на иррелевантность и переходные процессы - он оценил происходящее как одновременное увеличение скорости шагания двух шаговиков. Почему так? Да потому, что они шагают всего по 2 шага за проход loop, и дельта их скоростей - мизерная. Что я и предложил исправить, пронаблюдав, как они шагают большое кол-во шагов, замерив время выполнения, из которого, в свою очередь, можно инструментальными средствами оценить скорость БОЛЕЕ грамотно, чем на глаз.

    Вы же начали нести какую-то хню о выдуманной ситуации, будто бы кто-то там из нас решил, что один шаговик начнёт убегать вперёд. Потом, и это за вами не впервой - начали, попросту говоря, отбрехиваться. Зря я вас из игнора убрал - очень печально, когда человек неспособен признать свои ошибки в понимании ПОСТАНОВКИ вопроса.
     
  16. DIYMan

    DIYMan Guest

    Блин. Это - ОЧЕВИДНО всем. Ключевое - один быстрее, другой - медленнее, т.е. - СКОРОСТЬ, блин. ТС утверждает, что при изменении настроек скорости (два РАЗНЫХ потенциометра) - оба движка ВСЕГДА проходят переданное кол-во шагов за одинаковый квант времени, т.е. - с ОДИНАКОВОЙ скоростью.

    При чём тут "шагали одновременно"? Строго говоря - они НИКОГДА при такой библиотеке не будут шагать ОДНОВРЕМЕННО, т.к. делают это СТРОГО друг за другом.
     
  17. rkit

    rkit Гуру

    Нет, это вам похер на иррелевантность. А тс, как раз, нужен релевантный ответ, а не ваши некорректные придирки к формулировке.
     
  18. DIYMan

    DIYMan Guest

    Какие придирки к формулировке, вы больны совсем что ли? Я процитировал автора вопроса, это вас понесло куда-то в Монголию, с вашими "один убегает от другого". Дичь, просто дичь.
     
  19. ostrov

    ostrov Гуру

    ТС надо взять секундомер, задать шаговикам шагов по 100 и засекать сколько времени жужжит каждый. Если разное, то все верно, при разных положениях резисторов, разумеется.
     
  20. DIYMan

    DIYMan Guest

    Читай выше код, который я привёл - там именно про это ;)