Управление сотней Шаговиков. Подскажите направление мысли.

Тема в разделе "Флудилка", создана пользователем Toutlemond, 13 ноя 2019.

  1. ostrov

    ostrov Гуру

    Отличная идея!

    А еще у каждого цвета ШИМ, т.е., теоретически, один чип может управлять тремя сервами.
     
  2. Onkel

    Onkel Гуру

    Das ist fantastisch und einfach.
     
  3. Onkel

    Onkel Гуру

    Не, а dir?
     
  4. asam

    asam Гик

    Если двигать надо чем-то не слишком тяжелым, тогда можно использовать сервы. К одной нане можно подключить 6 серв и тогда на 100 серв нужно будет 17 нан. соединить их по I2C Тогда на передачу позиций на все 100 сервы потребуется около 2.5 мс даже на стандартной частоте I2C А ее можно еще поднять.
     
  5. Onkel

    Onkel Гуру

    А можно и 17, оставив два пина на связь (i2c или usart).
     
  6. Toutlemond

    Toutlemond Нуб

    Хмм... интересное решение.
    Но ведь придется тогда постоянно ими дергать (0 - 1 шаг )ибо как я понял(из текста - даташит не читал пока - сейчас гляну) там ШИМ на выходах.
    А нам на драйвере шаговика шим не нужен - там на STEP переход с низкого на высокий считается шагом. А DIR грубо говоря Высокий - право, низкий - лево.
    То есть если нам надо - 1 двиг повернуть на 2000 шагов в вправо,двиги 2-30 оставить в нуле а 31-й повернуть на 2000 в лево нам придтся 2000 раз послать посылку на все ... то есть грубо говоря в посылке будет (255,255,255)(0,0,0)-29раз,(255,0,255) и так 2000 раз?
    Или я не верно понял идею? Возможно с сервами - это самое то - ибо они ШИМом управляются. Или нужны другие драйвера шаговиков отличные от DRV8825 и подобных.
     
  7. ostrov

    ostrov Гуру

    Зачем серве dir?

    Кстати, да, а при загрузке очередного положения драйверу шаговика скачка не будет? Что происходит с ногами пока команды через чип проходят дальше?
     
  8. Onkel

    Onkel Гуру

    Если нужно сделать 2000 шагов- то нужно послать 4000 команд. А что, это же не Вы лично посылаете, микроконтроллеру что посылать, что не посылать.
     
    Toutlemond нравится это.
  9. parovoZZ

    parovoZZ Гуру

    Сидят в защелке, пока не придет команда на обновление (длинная пауза в передаче данных) и опять защелка.
     
  10. Toutlemond

    Toutlemond Нуб

    Onkel А ну да, 4000. нужно же и 0 обратно передать. Ну вот как то меня это пока настораживает...
    Хотя с другой стороны весьма удобно - все будет управляться с мастера!
    На мастере постоянно будет формироваться массив а ля
    {
    { R, 0, L , L, L ... R },
    { R, R, R, R, L ... R},
    ....
    { 0, 0, 0, 0, 0 ... 0 }
    };
    Каждые сколько нибудь миллисекунд и посылаться на моторы... А они будут шагать туда или сюда. или стоять! И так постоянно! Клево!
    Но тут возникает проблема обратной связи и сброса положения моторов в ноль . Ну в точку отсчета. Ибо так или иначе возможны пропуски шагов и еще какие то косяки с накопленной ошибкой. И нам нужно периодически сбрасывать их в ноль.
    Сейчас то у меня при каждом включении каждая Slave платка гонит свои моторы до срабатывания концевика - и считает что это ноль. И шлет мастеру - мол я в порядке посылай мне свои команды.
     
  11. Onkel

    Onkel Гуру

    Концевики и диоды спасут.
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Могу себе представить (!!!) какой суммарный пусковой ток 200 движков потребуют от БП. Точнее - не могу. А если не использовать ШИМ регулирование тока обмоток - какой суммарный ток потечет в схеме !!! К чему эти страсти ? К тому, что устаканивание этой проблемы будет задавать схемотехнику и софт управления этой оравой. И начинать надо с этого конца.
    Гуглите PBL3775 и PBL3717. Знаю что есть более интегрированное, но не могу вспомнить.
    Вроде бы видел на Али такое, но че-то кроме примитивных Н-мостов ничего не находится.
     
    Последнее редактирование: 2 дек 2019
  13. ostrov

    ostrov Гуру

    ws2811 оптимально для управления, остальное дело схемотехники.
     
  14. Toutlemond

    Toutlemond Нуб

    Ariadna-on-Line Так а зачем ? Драйвер DRV8825 прекрасно с этим сам справляется . токи моторов текут только в цепи БП->Драйвер->Мотор.
    На линии с 10ю моторами сейчас стоит 700 ваттный БП от компа.10 штук крутятся нормально. Да 12 вольт, и есть просадка некоторая, в идеале можно поднять напряжение до 19-20. Если линий 10 то просто к каждой линии свой бп.
     
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ну да, вроде эти я на Али видел. Более-менее правильные из Самоделкиных.
     
  16. Toutlemond

    Toutlemond Нуб

    Ну чтож - меня предупреждали что это та еще задница - но я не верил. :) И вот я в эту жопу вступил.
    Дело вот в чем. 10 или сотня моторов по схемотехнике или там связи меж платами вопросов не вызывает. Сделал по SPI как советовали на 1 странице - 10 плат по 10 моторов и одна плата мастер.
    И даже задать положение не представляет труда.

    Логика такая - мастер плата шлет сперва символ который задает дальнейшее поведение Статика или Динамика.
    Если статика - то следом идет массив положений моторов каждое размером в байт. и шаги рассчитываются по каждому мотору в зависимости от настроек .
    Ну и далее мотор шагает пересчитав число (от 0 до 254) в число шагов и занимает это положение.
    Ну а там библиотечка AccelSteper (да вы скажите какие нафиг библиотечки в таком деле и будете правы. но об этом позже) и все моторы занимают свое положение причем очень быстро. Ну примерно 15 об в секунду они фигачат.
    И застывают в нужном положении. Все отлично .
    А теперь сложности - Это если Динамика.

    Ну грубо говоря вот как в видео про бмв - Если нарисовать машинку - это статика а динамика это если нужно пустить волну им по этой плоскости шаров. А значит динамично шевелить всеми моторами в разные стороны.
    Сперва я просто отправлял массивы с тем же байтом положений моторов Раз в N миллисекунд.Для регулировки вывел себе резистор и настроил от 1 до 500 мс.
    И там так же шагал ацельстепером.
    Уменьшая паузу между оправками пакетов движки шагали все быстрее и быстрее но при 60 мс. они переставали это делать и пищали аки бешенные мыши!

    Ок подумал я - видать 60 мс это время нужное библиотеке на то чтоб все это разобрать и шагнуть моторчиком + сам ход мотора.
    Ну и потом оно весьма дергано крутит.

    Кода там был простой -

    Код (C++):
    void loop (void)
    {
      if (process_it) {
        motorsPositionFuture [pos] = 0;
        pos = 0;
        process_it = false;
        currentValue = map(motorsPositionFuture[0], 0, 254, 0, motor1MaxSteps); //Замапим приходящие значения в диапазон шагов мотора. Приходить будет байт так что 254
        memcpy(motorsPosition, motorsPositionFuture, sizeof(motorsPositionFuture));
        if (stepper.distanceToGo() == 0) {
          stepper.moveTo(currentValue);
        }
      }
      stepper.run();
    }
    Ну тут для одного мотора представлено но и для 10 разница невелика. Ну то есть получили прерывание Spi пересчитали полученное и шагнули сколько нужно.
    В таком режиме мы получаем мин отправку пакета 60 мс и скорость примерно оборот в секунду. Что маловато особенно после 15 оборотов при статическом методе.

    Ок, подумал я - оставим библиотеку для статики - Все же она удобна и там полностью себя оправдывает. А в динамике будем всю калькуляцию делать на мастер-плате а передавать лишь сигнал к шагу. Ну тоесть право, лево, стоп. И посылать так часто как можно .
    А на Слейв-Платах - библиотека тут не участвует, будем просто подавать высокий уровень на ногу шага и низкий на ногу направления если вправо и оба высоких если влево .
    Сказано - сделано (И тут вы тоже скажете - Какой нахер digitalWrite в таком деле - пиши прям в регистры и будете совершенно правы.)
    Код (C++):
    void loop (void)
    {
      if (process_it)
      {
        motorsPositionFuture [pos] = 0;
        pos = 0;
        process_it = false;
        if (motorsPositionFuture[0] == 82) {
          motorOneStepRight();
        } else if (motorsPositionFuture[0] == 76) {
          motorOneStepLeft();
        }
      }
    }
    И сам шаг примитивно до безобразия -

    Код (C++):
    void motorOneStepRight() {
      digitalWrite(stepPin, HIGH);   // подаем HIGH на выход
      delayMicroseconds(stepDelay);        // ожидаем 1 микросекунду
      digitalWrite(stepPin, LOW);    // устанавливаем LOW на выходе
    // delayMicroseconds(pauseDelay);        // ожидаем 2 микросекунды

    }
    Но тут возникают проблемы в синхронизации вот этих пауз между хай и лоу и частотой отправки по Spi.Ну и да - диджиталВрайт - Медленный.

    Сейчас перепишу на запись в регистр порта, Правда надо немного схемотехнику поменять и лапки дирекшан перевешать на другой порт..
    Но мне все кажется что это нифига не даст :) И надо действовать как то иначе...

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

    Ну вот как то так.
    Не то чтоб прошу помощи - так поразмышлять. :)
     
  17. Daniil

    Daniil Гуру

    Мне кажется, что проблема еще может быть в синхронизации. Что если каждому управляющему устройству отправлять данные и ждать когда оно ответит "принято!" (см. протокол modbus).
    Еще и библиотека, да. Для средней задачи она норм, но ваша задача очень требовательна к скорости, поэтому стоит попробовать написать простую, но быструю либу самому.
     
    Toutlemond нравится это.