Счетчик перемещения на основе Arduino YUN

Тема в разделе "Закажу проект", создана пользователем Konst, 3 авг 2016.

  1. Konst

    Konst Нуб

    Добрый день!

    Есть такая задача: Крыльчатка с прорезями в четырех местах стоит на валу печатной машины, необходимо с помощью щелевых датчиков, либо других от предложений не откажемся, посчитать линейное перемещение этого вала куда прикреплена крыльчатка и передать данные по http.

    Плата Arduino YUN.

    Находимся в Москве, для тестов необходимо будет подъехать.
    Написать скетч можно удаленно, все данные предоставлю необходимые для этого.
    Жду ценовых предложений

    Заранее спасибо,
    Константин
     
  2. Vetrinus

    Vetrinus Гик

    Эх, жаль, только Москва.
     
  3. Konst

    Konst Нуб

    Посещение Москвы в принципе не обязательно, если сможете посоветовать что и где купить для реализации проекта, то мы тут все сами сделаем.
     
  4. Konst

    Konst Нуб

    Фото как уже стоит прилагаю
     

    Вложения:

  5. DIYMan

    DIYMan Guest

    Куда передавать? Посредством чего - есть пожелания? Можно и ESP юзать, и W5100, и GPRS - вариантов есть.

    Если отвлечься от передачи данных, то для подсчёта кол-ва оборотов (и пересчёта в линейное перемещение чего-то, что стоит на валу) нужен щелевой датчик (выдирается из любого старого сканера/принтера) и свободный пин 2 или 3 ардуины. Остальное - дело техники. Однако, чтобы пересчитать кол-во оборотов в линейное перемещение - надо как минимум знать передаточное отношение - чего у вас там на валу, каретка какая? Слабо понял вот эту фразу:
    Сам вал, как правило, только крутится, он никуда не перемещается ;)
     
  6. DIYMan

    DIYMan Guest

    Посмотрел фото, точно как я и предполагал: надо передаточное отношение знать, там вроде от первичного вала идёт ремень на вторичный, бОльшего диаметра. А то кол-во оборотов в секунду посчитать-то можно, а вот дальше, без знания конкретики - получится в попугаях всё ;)

    И да - требования к точности расчётов какие? Если уточните по поводу железа, которое планируется юзать для передачи по HTTP - будет сильно понятней и можно будет оценить трудозатраты и предварительную стоимость ;)
     
  7. Konst

    Konst Нуб

    Передавать на веб сервис 1C по средствам apache.
    Щелевые датчики уже стоят, как видно на фотках, и работают. Проблема только в том, что при сборе данных и передаче одновременно на веб сервис ардуина начинает не справляться и пропускает значения.
    Сейчас идет передача голых данных в 1С, мы хотели там обрабатывать полученную информацию, но есть предположение, что ее лучше обрабатывать на стороне ардуино и передавать уже линейную длину.

    По поводу вала... По формуле L=2ПR ( И тогда мы заставим его ходить)
    Он может крутиться, как вперед, так и назад. Для этого установили два датчика рядом, чтобы отслеживать и либо прибавлять, либо вычитать линейное перемещение.
     
  8. Konst

    Konst Нуб

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

    Если вы под железом имели ввиду способ передачи, то по Wi-fi. Сигнал стабильный, сеть видит без проблем
     
  9. DIYMan

    DIYMan Guest

    Так у вас проблема в коде только? Т.е. уже есть, работает, но плохо? Давайте код, глянем, что к чему, возможно, сразу получится найти тонкие моменты.
     
  10. Konst

    Konst Нуб

    Код взят из интернета
    #include <Encoder.h>
    #include <Bridge.h>
    #include <HttpClient.h>

    HttpClient client;
    int ID = 1;

    Encoder knobLeft(5, 6);
    Encoder knobRight(7, 8);

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

    long positionLeft = -999;
    long positionRight = -999;

    void loop() {
    long newLeft, newRight;
    newLeft = knobLeft.read();
    newRight = knobRight.read();
    if (newLeft != positionLeft || newRight != positionRight) {
    Serial.print("Left = ");
    Serial.print(newLeft);
    Serial.print(", Right = ");
    Serial.print(newRight);
    Serial.println();

    client.get("http://apache:apache123!@192.168.1.246/enigma/hs/arduino/data?foto1=" + String(newLeft) + "&foto2=" + String(newRight) + "&arduino=" + String(ID));

    positionLeft = newLeft;
    positionRight = newRight;
    }

    }


    Писали сами, но от тоже тормозил, в идеале датчик с прерыванием, только не из принтера (их можно купить и где), код лучше новый писать, здесь библиотека какая-то прикреплена <Encoder.h>
     
  11. DIYMan

    DIYMan Guest

    Дайте ссылку на библиотеку энкодера , а то их как грязи разных. По коду - если подсчёт не на прерываниях сделан - всё печально.

    Купить щелевой датчик: http://ru.aliexpress.com/af/%D1%89%...3092557&SearchText=щелевой+датчик&blanktest=8

    З.Ы. И да, для вставки кода есть кнопочка "code" на панели инструментов редактора ;)
     
  12. Konst

    Konst Нуб

    Наши датчики не захотели работать на прерывание, но мы хотели бы на основе прерываний считать.
    P.S. По этой причине и обратились к специалистам
    Библиотеку прикрепил.
     

    Вложения:

    • Encoder.zip
      Размер файла:
      13,6 КБ
      Просмотров:
      253
  13. DIYMan

    DIYMan Guest

    Библиотека, что вы прикрепили, поддерживает работу по прерываниям, достаточно только обявить
    Код (C++):
    #define ENCODER_USE_INTERRUPTS
    до подключения
    Код (C++):
    #include <Encoder.h>
    И я немного не понял, зачем, собственно, библиотеку для энкодера юзать? У вас стоит задача определять ещё и направление вращения? Для подсчёта кол-ва оборотов в секунду достаточно только считать смену фронтов на пине в прерываниях, код намного проще:
    Код (C++):

    #define INTERRUPT_PIN 2 // на каком пине прерывание
    #define INTERRUPTS_PER_ROTATION 10 // сколько прерываний на один оборот крыльчатки

    volatile uint16_t revolutions = 0;
    int rpm = 0;
    unsigned long lastMillis = 0;

    void interruptTrigger()
    {
        revolutions++;
    }

    void setInterrupt()
    {
        attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), interruptTrigger, FALLING);
    }

    void clearInterrupt()
    {
        detachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN));
    }

    void setup()
    {
        setInterrupt();
    }

    void loop()
    {
        unsigned long curMillis = millis();
     
        if(curMillis - lastMillis > 1000)
        {
            lastMillis = curMillis;
            clearInterrupt();
         
            rpm = revolutions * (60/INTERRUPTS_PER_ROTATION);
            revolutions = 0;
         
            setInterrupt();
         
            Serial.print("RPM =\t");
            Serial.println(rpm);
        }
    }
     
    Вот навскидку код, который изменяет кол-во оборотов в минуту, основываясь на кол-ве прерываний на полный оборот (т.е. кол-ве прорезей на крыльчатке вашей). Можете проверить у себя. Если заработает как надо - продолжим ;)
     
  14. Konst

    Konst Нуб

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

    У нас машины печатают баннеры и для автоматического подсчета длины мы заморочились ардуино. А сама суть сделать порулонный учет, для этого нужно считать длину отпечатанного материала.
     
  15. DIYMan

    DIYMan Guest

    Понятно. Вот что значит нечёткое ТЗ. Согласитесь, из первоначального поста совершенно непонятен тот факт, что нужно ещё определять, в какую сторону движется вал. Вот на таких мелочах и горим. А то, что вы позже написали - как-то пропустилось благополучно :)