Скроллер на ардуино

Тема в разделе "Закажу проект", создана пользователем Сергей_Михайлович, 27 мар 2016.

  1. Задача: Написать код для ардуинки.
    Железо (что есть в наличии у меня): Ардуино уно; два драйвера для шаговых моторов (управление по step/dir); два ШД; два датчика (концевик, скорее всего индуктивный).
    Цель: Научить ардуинку крутить два вала, на которых намотаны кадры изображений (4-6 кадров), причем каждый кадр должен останавливаться на 5-10 секунд. Показ кадров чередуется (сперва накручивается полотно на верхний вал, затем на нижний.
    Концевики - служат для защиты от обрыва полотна.


    При исчезновении питания (при включении) скроллер должен смотать полотно на нижний вал (до сработки концевика) и запустить просмотр всех плакатов по программе.

    Вот как-то так...
    Не бесплатно, труд должен оплачиваться, самому нет времени заниматься.
     
  2. litvin

    litvin Нерд

  3. Unixon

    Unixon Оракул Модератор

    В первом приближении:
    Код (C++):
    #define PIN_UP_LIM_SW 2
    #define PIN_UP_M_DIR  3
    #define PIN_UP_M_STEP 4
    #define PIN_DN_LIM_SW 5
    #define PIN_DN_M_DIR  6
    #define PIN_DN_M_STEP 7

    #define N_FRAME_STEPS 1000
    #define DELAY_STEP_US 100
    #define DELAY_FRAME_S 10

    bool forward = true;

    void rewind()
    {
      digitalWrite(PIN_UP_M_DIR, LOW);
      digitalWrite(PIN_DN_M_DIR, LOW);
      while (!digitalRead(PIN_UP_LIM_SW))
      {
        digitalWrite(PIN_UP_M_STEP, HIGH);
        digitalWrite(PIN_DN_M_STEP, HIGH);
        digitalWrite(PIN_UP_M_STEP, LOW);
        digitalWrite(PIN_DN_M_STEP, LOW);
        delayMicroseconds(DELAY_STEP_US);
      }
    }

    void fastforward()
    {
      digitalWrite(PIN_UP_M_DIR, HIGH);
      digitalWrite(PIN_DN_M_DIR, HIGH);
      while (!digitalRead(PIN_DN_LIM_SW))
      {
        digitalWrite(PIN_UP_M_STEP, HIGH);
        digitalWrite(PIN_DN_M_STEP, HIGH);
        digitalWrite(PIN_UP_M_STEP, LOW);
        digitalWrite(PIN_DN_M_STEP, LOW);
        delayMicroseconds(DELAY_STEP_US);
      }
    }

    bool prev()
    {
      long int n = 0;
      digitalWrite(PIN_UP_M_DIR, LOW);
      digitalWrite(PIN_DN_M_DIR, LOW);
      while (!digitalRead(PIN_UP_LIM_SW) && (n < N_FRAME_STEPS))
      {
        digitalWrite(PIN_UP_M_STEP, HIGH);
        digitalWrite(PIN_DN_M_STEP, HIGH);
        digitalWrite(PIN_UP_M_STEP, LOW);
        digitalWrite(PIN_DN_M_STEP, LOW);
        delayMicroseconds(DELAY_STEP_US);
        n++;
      }
      return (n>=N_FRAME_STEPS);
    }

    bool next()
    {
      long int n = 0;
      digitalWrite(PIN_UP_M_DIR, HIGH);
      digitalWrite(PIN_DN_M_DIR, HIGH);
      while (!digitalRead(PIN_DN_LIM_SW) && (n < N_FRAME_STEPS))
      {
        digitalWrite(PIN_UP_M_STEP, HIGH);
        digitalWrite(PIN_DN_M_STEP, HIGH);
        digitalWrite(PIN_UP_M_STEP, LOW);
        digitalWrite(PIN_DN_M_STEP, LOW);
        delayMicroseconds(DELAY_STEP_US);
        n++;
      }
      return (n>=N_FRAME_STEPS);
    }


    void setup()
    {
      pinMode(PIN_UP_LIM_SW, INPUT);
      pinMode(PIN_UP_M_DIR, OUTPUT);
      pinMode(PIN_UP_M_STEP, OUTPUT);
      pinMode(PIN_DN_LIM_SW, INPUT);
      pinMode(PIN_DN_M_DIR, OUTPUT);
      pinMode(PIN_DN_M_STEP, OUTPUT);
      //
      rewind();
    }

    void loop()
    {
      delay(DELAY_FRAME_S);
      if (forward)
      {
        if (!next())
        {
          forward = false;
          prev();
        }
      }
      else
      {
        if (!prev())
        {
          forward = true;
          next();
        }
      }
    }
     
    Securbond нравится это.
  4. vvr

    vvr Инженерище

  5. Скорость и кол-во шагов уже выставлю сам под сделанную конструкцию, нужен только понятный и работающий код.
     
  6. Сейчас посчитал и нужно ввести поправку на намотку/размотку.
    Объясню:
    Пусть все кадры намотаны на нижний вал, тогда при перемотке на верхний вал - он будет увеличиваться в диаметре, а нижний наоборот-уменьшаться. Поправка как по скорости вращения, так и по количеству шагов.

    Получается:
    При толщине материала в 0,2мм и диаметре трубы в 25мм каждый новый виток будет прибавлять длине окружности 2,5мм, когда будет смотан один кадр, то набежит уже 62,5 мм, умножим на 5 кадров, то вообще набежит 312,5 мм
     
  7. Unixon

    Unixon Оракул Модератор

    Возможно ли ввести метки границы кадров, регистрируемые с помощью еще одного такого же концевика?
     
  8. Onkel

    Onkel Гуру

    посмотрите, как были устроены кинопроекторы в прошлом веке. Там эта проблема была уже решена.
     
  9. Кинопроектор - это не то.... там наматывает на катушку один мотор, та которая разматывается -она свободно вращается.
    Вообще хотел все без датчиков организовать. Если ставить еще датчик, то возникнет проблема (возможно при перемотке само полотно будет немного колыхаться и та самая метка просто может "проскочить" датчик.

    Нужно применить логарифмический принцип расчета шагов.
     
  10. Onkel

    Onkel Гуру

    вот видите, вы и не знаете, как работает кинопроектор.
    В общем резюме - в настоящем виде задача в явном виде не сформулирована, а сформулирована лишь хотелка.
     
  11. Unixon

    Unixon Оракул Модератор

    Идея понятна, над реализацией нужно подумать.
     
  12. Onkel

    Onkel Гуру

    а по -моему задача решается в целых числах, ну еще на пи помножить.
     
  13. Задача написать код, а при одинаковых скоростях на валах ШД явно будет некорректная работа всей системы.

    Я указал на проблему, которая возникнет при тестировании и чтобы её избежать на начальном этапе написания программы и чтобы сам программист понимал.
     
  14. Onkel

    Onkel Гуру

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

    Уважаемый, я поставил задачу, если берётесь, то решайте её, смотрите как реализовано в кинопроекторах или ещё где, это не моя проблема.... мне нужен код.
    Я ведь пишу, что работа будет оплачена.
    А может полной синхронизации и не потребуется, даже вполне уверен.

    Дополнение к ТЗ может пригодится:
    Изготовлена рама, размер по габаритам 900*2000 мм (Ш*В)
    Размер одного кадра 850*1800 мм (всего 5 кадров)
    Диаметр валов 25 мм, расположены горизонтально у основания внизу конструкции и вверху
    Толщина материала 0,2 мм (банерная ткань)
    Прямой привод т.е. один конец вала насажен через переходную втулку на ШД, второй опирается на подшипник.
     
  16. ostrov

    ostrov Гуру

    Что из себя представляет "полотно"? Может быть проще нанести на него метки, например перфорация по краю для считывания оптопарой. Расчет положения путем точного вычисления оборотов шаговика путь ИМХО неверный, нужно постоянно обеспечивать натяг, иначе точность упадет, а при натяге полотно будет усиленно изнашиваться.
     
  17. Unixon

    Unixon Оракул Модератор

    Тут скорее алгоритм Брезенхэма на неоднородной сетке.
    Учитывая дискретность шага, в целых числах оно решается неизбежно. :)
     
  18. Onkel

    Onkel Гуру

    Я немного другое имел в виду- нам не нужна функция логарифм для вычисления, достаточно 4 действий арифметики. По Брезенхему имхо перебор - вряд ли стоит усложнять просту одномерную задачу, тем более в неправильно построенной модели.
     
  19. Unixon

    Unixon Оракул Модератор

    Меня другое смущает - как в этом приближении делать сматывание при инициализации. Тут без аппаратной поддержки не обойтись, нужно добавлять развязку по питанию, чтобы МК успевал записать в EEPROM последние координаты полотна. А если перед включением намотано будет неправильно (в несоответствии с запомненным состоянием), то перемотать на начало не ослабив и не порвав полотно вообще просто так не получится.
     
  20. Я сам такой код напишу