И снова о контроллере двух моторов прошу помощи! - ФОРУМ ДВ Робот dvrobot.ru
Понедельник, 25.06.2018, 04:12
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 2
    • 1
    • 2
    • »
    Модератор форума: Serg, GRACH  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » И снова о контроллере двух моторов прошу помощи! (Методом ошибок и долгих мучений я все таки ке что смог)
    И снова о контроллере двух моторов прошу помощи!
    sanikДата: Среда, 09.10.2013, 07:38 | Сообщение # 1
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    Помогите пожалуйста!
    Не могу разобраться почему некорректно работает void syncronize() При нажатии кнопки PIN_BTN_START сразу начинают вращаться моторы
    без остановки!.. Задумано так при нажатии кнопки PIN_BTN_START высвечивается надпись Programm и идет ожидание нажатия кнопки PIN_BTN_SYNC
    после этого запускаются моторы и в зависимости от установки ранее MODE_SELECT_X и MODE_SELECT_Y останавливаются и опять ждут нажатие кнопки PIN_BTN_SYNC и так далее пока не нажата кнопка PIN_BTN_ANALOG.

    Пробовал загрузить код датчиков отдельно все работает

    Код
    #define DISTy_PIN 0
    int posX = 200;
    int prevStateX = LOW;
    int counterX = 0;
    const byte PIN_IN4 = 8;
    const byte PIN_IN3 = 9;
    const byte PIN_ENB = 10;
    void setup()
    {
        pinMode(PIN_IN3, OUTPUT);
        digitalWrite(PIN_IN3,LOW);
        pinMode(PIN_IN4, OUTPUT);
        digitalWrite(PIN_IN4, HIGH);
        analogWrite(PIN_ENB, 200);
        pinMode(PIN_ENB, OUTPUT);
          
       pinMode(DISTy_PIN, INPUT);
    }
    void loop()
    {
        bool currentState = digitalRead(DISTy_PIN);
        if(currentState != prevStateX)
        {
          prevStateX = currentState;
          counterX++;
          if(counterX == posX)
          {
            counterX = 0;
                analogWrite(PIN_ENB, 0);
            // остановить мотор
          }
        }
    }

    А в общем скетче не хотит (код составлен из маленьких отдельных кодов) Так как я не разбираюсь в программировании то составлял маленькие коды побывал потом вставлял в общий код. Прошу вас помогите так как уже скоро год будет а я все мучаюсь без результатно!!
    Код
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2);

    #define DISTx_PIN 1  //Пин фотоинтераптора х, каретка
    int posX = 0;  //Установка количества импульсов
    int prevStateX = LOW;
    int counterX = 0;// перменная сравнения поступающих импульсов

    #define DISTy_PIN 0 //Пин фотоинтераптора y, голова
    int posY = 0;
    bool prevStateY = LOW;
    int counterY = 0;

    const byte PIN_POS_X = A0; //Пин потенциомера Х
    const byte PIN_POS_Y = A1; //Пин потенциомера Y
    int rewX; // переменая для замера сопротивления Х
    int rewY; // переменая для замера сопротивления У
    int a; // переменая скорости вращения двигателя 1
    int c; // переменая чтения потенциомера Х для реверса
    int d; // переменая скорости вращения двигателя 2
    int x; // переменая чтения потенциомера У для реверса
    // переменные для состояния направления двигателя   
    int PinLOWx;
    int PinHIGHx;
    int PinLOWy;
    int PinHIGHy;

    // const byte Rd = A2; //Пин датчика направления
    // int rewerSd;//переменная для датчика направления в режиме PROGRAMM

    // кнопки
    const byte PIN_BTN_SELECT = 3;
    const byte PIN_BTN_START  = 4;
    const byte PIN_BTN_ANALOG  = 2;
    const byte PIN_BTN_PLUS  = 7;
    const byte PIN_BTN_MINUS  = 6;
    const byte PIN_BTN_SYNC  = 5;
    // драйвер двигателей
    const byte PIN_IN1 = 12;
    const byte PIN_IN2 = 13;
    const byte PIN_ENA = 11;//каретка
    const byte PIN_IN4 = 8;
    const byte PIN_IN3 = 9;
    const byte PIN_ENB = 10; //голова

    const byte MODE_INIT    = 0;
    const byte MODE_MANUAL  = 1;
    const byte MODE_SELECT_X = 2;
    const byte MODE_SELECT_Y = 3;
    const byte MODE_PROG    = 4;
    const byte MODE_SYNC    = 5;
    const byte MODE_STOP    = 6;
    byte mode = MODE_INIT;


    Ну не знаю я

    Сообщение отредактировал sanik - Четверг, 10.10.2013, 19:55
     
    SergДата: Среда, 09.10.2013, 18:09 | Сообщение # 2
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    sanik, я б помог, но сейчас завал в универе. Куча долгов перед сессией.
     
    sanikДата: Четверг, 10.10.2013, 19:56 | Сообщение # 3
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    Serg, Спасибо! Жаль что времени нет! Похоже кроме вас некому помочь)

    Добавлено (10.10.2013, 19:56)
    ---------------------------------------------
    Раз уж никто больше не отвечает тогда уберу код.


    Ну не знаю я
     
    loriДата: Пятница, 11.10.2013, 07:45 | Сообщение # 4
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Уважаемый Sanik, выложите, пожалуйста, код вашей программы целиком, а то какие то отрывки из обрывков, разве можно в таком коде разобраться?!
     
    sanikДата: Пятница, 11.10.2013, 07:56 | Сообщение # 5
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, С кодом с горем пополам я разобрался и отладил Если не сложно то помогите мне разобраться с счетчиком
    У меня с  пульта на аналоговый вход приходит два импульса мне нужно лишний импульс отсеч то есть все действия   digitalWrite должны начинаться со второго импульса
    Код
    int camPin =12;//Реле затвора
    int focusPin =13;//Реле фокуса
    int PIN_BTN_SYNC = 11;//выход управления   
    int timePin = A0;//вход пульта
    int prevStateX = LOW;
    int counterX = 0; //переменая счетчика
    void setup()
    {
       analogReference(DEFAULT);
        pinMode(camPin, OUTPUT);
        pinMode(focusPin, OUTPUT);
        pinMode(PIN_BTN_SYNC, OUTPUT);

    }
    void loop()
    {   
        int posX = 2;
        //получение значения сенсора и сохранение в переменую sunhr
       bool sunhr = analogRead(timePin);
       if(sunhr < 150) // если значение меньше 150,появился импульс, то
       if(sunhr != prevStateX) // инвертируем значение
         prevStateX = sunhr; // записываем значение в currentState
          counterX++;  // прибавляем единицу
          if(counterX == posX)//если_счетчик_достиг_максимального_значения, то
       {
         counterX = 0;//обнулить_счетчик
       digitalWrite(focusPin, HIGH );
       delay(20);
       digitalWrite(camPin, HIGH);
       delay(100);
       digitalWrite(focusPin, LOW);
       digitalWrite(camPin, LOW);
       delay(100);
       digitalWrite(PIN_BTN_SYNC, HIGH);
       delay(50);
    digitalWrite(PIN_BTN_SYNC, LOW);
       delay(100);
      }
    }


    Ну не знаю я

    Сообщение отредактировал sanik - Пятница, 11.10.2013, 08:15
     
    loriДата: Пятница, 11.10.2013, 08:08 | Сообщение # 6
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Ну снова не весь программный код. Sanik, вы сами посмотрите на опубликованный вами код, начала цикла void loop() имеется, а конец то где?
     
    sanikДата: Пятница, 11.10.2013, 08:17 | Сообщение # 7
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Так это весь код и есть ниже скобки идут думаю они не критичны smile

    Добавлено (11.10.2013, 08:17)
    ---------------------------------------------
    lori, В данный момент работает постоянно не обращая внимания на импульсы


    Ну не знаю я
     
    loriДата: Пятница, 11.10.2013, 08:19 | Сообщение # 8
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Вы щелкните мышкой на вашем программном коде затем нажмите Ctri+a (a - латинская), после этой операции выделится весь ваш код, затем нажмите Ctrl+c, эта операция скопирует выделенную область в буфер. Дальше вставьте из буфера код программы в ответ на сайте.
     
    sanikДата: Пятница, 11.10.2013, 08:23 | Сообщение # 9
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Уже исправил давно  вот еще раз вставляю)))
    Код
    int camPin =12;//Реле затвора  
      int focusPin =13;//Реле фокуса  
      int PIN_BTN_SYNC = 11;//выход управления   
      int timePin = A0;//вход пульта  
      int prevStateX = LOW;  
      int counterX = 0; //переменая счетчика  
      void setup()  
      {  
       analogReference(DEFAULT);  
        pinMode(camPin, OUTPUT);  
        pinMode(focusPin, OUTPUT);  
        pinMode(PIN_BTN_SYNC, OUTPUT);  

      }  
      void loop()  
      {   
        int posX = 2;  
        //получение значения сенсора и сохранение в переменую sunhr  
       bool sunhr = analogRead(timePin);  
       if(sunhr < 150) // если значение меньше 150,появился импульс, то  
       if(sunhr != prevStateX) // инвертируем значение  
         prevStateX = sunhr; // записываем значение в currentState  
          counterX++;  // прибавляем единицу  
          if(counterX == posX)//если_счетчик_достиг_максимального_значения, то  
       {  
         counterX = 0;//обнулить_счетчик  
       digitalWrite(focusPin, HIGH );  
       delay(20);  
       digitalWrite(camPin, HIGH);  
       delay(100);  
       digitalWrite(focusPin, LOW);  
       digitalWrite(camPin, LOW);  
       delay(100);  
       digitalWrite(PIN_BTN_SYNC, HIGH);  
       delay(50);  
      digitalWrite(PIN_BTN_SYNC, LOW);  
       delay(100);  
      }  
      }


    Ну не знаю я
     
    loriДата: Пятница, 11.10.2013, 08:26 | Сообщение # 10
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Вот, теперь все есть, разберусь с кодом, отпишусь.
    smile
     
    sanikДата: Пятница, 11.10.2013, 08:27 | Сообщение # 11
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Буду очень признателен! smile

    Ну не знаю я
     
    loriДата: Пятница, 11.10.2013, 10:09 | Сообщение # 12
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Sanik, что за пульт вы используете в своем проекте, и что это за два импульса приходящие с пульта?
     
    sanikДата: Пятница, 11.10.2013, 15:39 | Сообщение # 13
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Пульт с таймером Twin1 ISR подключен проводом к аналоговому входу с пультом проблем нету все работает, при срабатывании в сериал порт выдается два нуля, соответственно  фотик делает два снимка вместо одного. С работой пульта и рэле у меня нет проблем у меня проблемма с таймером

    Ну не знаю я

    Сообщение отредактировал sanik - Пятница, 11.10.2013, 15:41
     
    sanikДата: Пятница, 11.10.2013, 16:15 | Сообщение # 14
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    Вот картинка с сериал порта задача усложняется так как иногда приходит то три то четыре нуля.
    Прикрепления: 3612882.jpg(45.3 Kb)


    Ну не знаю я

    Сообщение отредактировал sanik - Пятница, 11.10.2013, 16:16
     
    loriДата: Пятница, 11.10.2013, 18:07 | Сообщение # 15
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Если я правильно понял (судя по скриншоту), нули это как раз тот импульс который выдает ваш пульт. А почему вы используете аналоговый вход ардуино, разве на выходе пульта аналоговый сигнал?

    Добавлено (11.10.2013, 18:07)
    ---------------------------------------------
    Вообще, самый простой путь, из того что приходит в голову сделать большую временную задержку. Например, в строке 37. вашей программы вместо delay(100); написать delay(1000);. Это обеспечит переход к следующей итерации цикла с задержкой в 1 секунду, думаю этого будет достаточно чтобы все лишние шумы погасить. Скажу честно, это не самый грамотный подход с точки зрения программирования, но самый простой. Если хотите чтобы программа была не только работоспособной но и правильной, и красивой, то в этом случае мне нужна дополнительная информация.

     
    sanikДата: Пятница, 11.10.2013, 19:24 | Сообщение # 16
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Временем на задержку сильно ограничен не более 400 мс. на весь процесс так как за время минимальной паузы 1сек., между кадрами фотика нужно выполнить еще некоторые действия оставшиеся 600мс... Дело в том что на пульте неизвестно какой стоит выходной ключ, оптрон или транзистор, я не знаю каким способом управляется фотоаппарат с этого пульта Замерял напряжение на выходе в режиме покоя 0,49в при срабатывании 0в. Я что бы не рискуя спалить его подключил один вывод на gnd  второй на на пин.. Если б я был силен в программировании не было б проблем я просто даже не представляю каким способом можно отсечь лишние импульсы.

    Добавлено (11.10.2013, 19:15)
    ---------------------------------------------
    Я вот думаю может сделать задержку после чтения аналогово входа?

    Добавлено (11.10.2013, 19:24)
    ---------------------------------------------
    Не помогает.. Что интересно с таким кодом с пульта приходит стабильно два импульса как только пытаюсь организовать счетчик так стабильность импульсов нарушается , мне кажется надо просто правильно организовать счетчик чего я делать не умею... Примерно с такой логикой читаем вход 1 импульс счетчик -1 второй импульс, сброс счетчика и запуск релешек! Как правильно это записать я не знаю...
    Код
    int camPin =12;//Реле затвора  
    int focusPin =13;//Реле фокуса
    int PIN_BTN_SYNC = 11;//выход управления двигателями
    int timePin = A0;//вход таймера
    void setup()
    {
       Serial.begin(9600);
       analogReference(DEFAULT);
        pinMode(camPin, OUTPUT);
        pinMode(focusPin, OUTPUT);
        pinMode(PIN_BTN_SYNC, OUTPUT);

    }
    void loop()
    {  //получение значения сенсора и сохранение в переменую sunhr
       int sunhr = analogRead(timePin);
       delay(100);
       if(sunhr < 150)
       {
       digitalWrite(focusPin, HIGH );
       delay(50);
       digitalWrite(camPin, HIGH);
       delay(100);
       digitalWrite(focusPin, LOW);
       digitalWrite(camPin, LOW);
       delay(100);
       }
    }


    Ну не знаю я

    Сообщение отредактировал sanik - Пятница, 11.10.2013, 19:31
     
    loriДата: Пятница, 11.10.2013, 20:30 | Сообщение # 17
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Sanik, если все так плохо, то есть предложение.
    Очень жаль, что я не могу реально увидеть как у вас все это работает, но давайте попробуем дистанционно со всем разобраться и настроить ваш скетч под ваши требования. Для начала, я не пойму, почему у вас постоянно разный код выкладывается, или это просто разные версии одного кода (в смысле "творческий поиск"). Давайте на чем то остановимся и начнем его править! Если договорились, то мне нужна самая свежая версия программного кода и именно его и начнем модифицировать.
    Согласны????
     
    SergДата: Пятница, 11.10.2013, 22:11 | Сообщение # 18
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    а зачем использовать аналоговый вход для чтения байтов?
     
    loriДата: Пятница, 11.10.2013, 22:24 | Сообщение # 19
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Думаю там не байты читаются, а просто уровни -0- и -1-, хотя может этисигналы нужно только к нужным уровням напряжения подогнать.
     
    sanikДата: Суббота, 12.10.2013, 00:01 | Сообщение # 20
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Разные коды потому что я пробую варианты, самый последний в принцепе рабочий, единственое это то что мешает второе срабатывание реле, Пульт другим способом не заставить работать, Прицип такой Первый раз условие int sunhr = analogRead(timePin); Запускаем работу реле второй  раз условие int sunhr = analogRead(timePin); игнорируем, я хотел применить счетчик в 17 строке но я не знаю как этот чертов счетчик реализуется программно... Для эксперемента просто будем считать что вместо пульта стоит фоторезистор и он очень быстро перекрывается два раза просто подскажите как правильно записать код счетчика...Пожалуйста.

    Добавлено (11.10.2013, 23:43)
    ---------------------------------------------
    На цифровой вход пульт сажать опасно! Для самого пульта.

    Добавлено (11.10.2013, 23:48)
    ---------------------------------------------
    Еще один момент Этот скрин без подключеных нагрузок на контроллер когда подключены  нагрузки  уровни вместо 570 становяатся от 200 до 350 поэтому в коде использован меньше 150

    Добавлено (12.10.2013, 00:01)
    ---------------------------------------------
    Еще проскачила мысля запоминать что первый "0" уже пришел и на следующих уже ничего не делать, пока не придет не "о". Как это все реализовать?


    Ну не знаю я
     
    loriДата: Суббота, 12.10.2013, 01:05 | Сообщение # 21
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Предлагаю следующее:
    если нули следуют последовательно, без перерыва, один за другим, значит в программе можно просто использовать следующую схему:
    ожидаем появления -0- на входе analogRead и пока там висит ноль ожидаем другого уровня (отличного от нуля), как только появился не ноль, переходим в режим дальнейшей обработки кода, и снова ждем -0-.

    while (analogRead(timePin) = 0) {}; //пустой оператор, т.е. пока на timePin будет -0- программа будет ожидать другого символа.

    Добавлено (12.10.2013, 00:54)
    ---------------------------------------------
    sanik, отлично, пять баллов, ваше предложение совершенно совпало с моим, значит если пришел ноль, ждем пока он не завершится, по завершении нуля ожидаем следующего. пробуйте, если не получится, пишите, мне это тоже весьма интересно победить.
    smile

    Добавлено (12.10.2013, 01:05)
    ---------------------------------------------
    При этом по приходе очередного импульса производим обработку (выдаем управление на фотик) и спокйно ожидаем завершения нуля, а потом переходим в режим чтения буфера, снова ожидаем, и цикл повторяется.

     
    sanikДата: Суббота, 12.10.2013, 02:20 | Сообщение # 22
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Так как я дуб в коде подскажите в какую строку это вставить?  while (analogRead(timePin) = 0) {}; //пустой оператор, т.е. пока на timePin будет -0- программа будет ожидать другого символа.

    Добавлено (12.10.2013, 01:19)
    ---------------------------------------------
    попытка привела к ошибке  error: lvalue required as left operand of assignment
    непонятно чего он требует?

    Добавлено (12.10.2013, 01:43)
    ---------------------------------------------
    Понял чего требовал надо было ==0

    Добавлено (12.10.2013, 01:54)
    ---------------------------------------------
    Все равно не помогает! Я вот тут прочитал про нового зверя цикл do....while
    do ... while
    Цикл do работает так же, как и цикл while, за исключением того, что условие проверяется в конце цикла, таким образом, цикл do будет всегда выполняться хотя бы раз.
    Как его применить в моем случае? (Как всегда все кратко никаких подробностей angry )

    Код
    do
    {
       delay(50);          // подождать, пока датчики стабилизируются
       x = readSensors(); // проверить датчики
    } while (x < 100);

    Добавлено (12.10.2013, 02:20)
    ---------------------------------------------
    Ура!! Победил! Спасибо за пинок в нужную сторону!

    Код
    int camPin =12;//Реле затвора
    int focusPin =13;//Реле фокуса
    int PIN_BTN_SYNC = 11;//выход управления двигателями
    int timePin = A0;//вход таймера
    void setup()
    {
      analogReference(DEFAULT);
       pinMode(camPin, OUTPUT);
       pinMode(focusPin, OUTPUT);
       pinMode(PIN_BTN_SYNC, OUTPUT);

    }
    void loop()
    {  //получение значения сенсора и сохранение в переменую sunhr
      do
      {
        delay(300);// подождать, пока датчики стабилизируются
        analogRead(timePin);// проверить датчики  
      }
    while (analogRead(timePin) > 150);  //пустой оператор, т.е. пока на timePin будет -0- программа будет ожидать другого символа.
      {
      digitalWrite(focusPin, HIGH );
      delay(10);
      digitalWrite(camPin, HIGH);
      delay(50);
      digitalWrite(focusPin, LOW);
      digitalWrite(camPin, LOW);
      delay(100);
      digitalWrite(PIN_BTN_SYNC, HIGH);
      delay(100);
    digitalWrite(PIN_BTN_SYNC, LOW);
    }


    Ну не знаю я
     
    loriДата: Суббота, 12.10.2013, 10:32 | Сообщение # 23
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Ну вот, я рад за вас

    Добавлено (12.10.2013, 10:29)
    ---------------------------------------------
    Только вот участок кода:

     do
      {
        delay(300);// подождать, пока датчики стабилизируются
        analogRead(timePin);// проверить датчики  
      }
     while (analogRead(timePin) > 150);

    лучше все же переписать так:

     do
      {
        delay(300);// подождать, пока датчики стабилизируются
        sunhr = analogRead(timePin);// проверить датчики  
      }
     while (sunhr) > 150);

    ну и соответственно в начале программы создать переменную  sunhr

    int sunhr;

    Так будет лучше.

    Но тем не менее у вашего кода есть небольшой недостаток, хотя он может вас и не волновать если вы не собираетесь расширять возможности программы. Вам будет сложно добавлять в программный код дополнительные возможности, какой то новый функционал. Дело в том что основное время работы программа крутится в цикле ожидания прихода импульса и если вам нужно будет добавлять новый код для обработки событий в промежутках между импульсами, то вам придется вставлять этот код в тело цикла, а это не всегда удобно да и в общем то не является правилом "хорошего тона" в программировании, а если вставляемый код будет еще и длинным, то высока вероятность возникновения ошибки.
    Лучше переделать код так, чтобы основное время работы программы, а у вас это ожидание импульса происходило не внутри цикла do while, а в основном теле кода программы void loop(), обработку же импульса стоит производить только по факту его поступления. Таким образом вы освободите ресурсы программы под будущие нужды и упростите себе работу в написании кода.
    Хотя, все это только мои предложения, если вас устраивает как работает ваш код, то лучше ничего не менять, ведь как говорят "лучшее враг хорошего" smile

    Добавлено (12.10.2013, 10:32)
    ---------------------------------------------
    Опечатку допустил
    вместо
     while (sunhr) > 150);
    нужно
     while (sunhr > 150);
    скобка лишняя

     
    sanikДата: Вторник, 15.10.2013, 20:57 | Сообщение # 24
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Спасибо за советы!

    Добавлено (15.10.2013, 20:57)
    ---------------------------------------------
    lori, А можно к вам обратиться с просьбой привести код в порядок он в прицепе работает но как то не стабильно и немного тупит я понимаю что это не идеал но просто на большее я не способен убито куча времени а это больше чем полгода с бессонными ночами и нормального отдыха Я понятия не имею как например как применять в коде millis() как правильно оформить ту или иную функцию все что до меня дошло я применил, в общем суть такова привести его в порядок. Если согласитесь то подробное описание работы и фото устройства я вышлю чтоб было представление о чем идет речь...Просто обидно стало что затратил немалую сумму убил столько времени и все практически в холостую... sad


    Ну не знаю я
     
    loriДата: Вторник, 15.10.2013, 22:13 | Сообщение # 25
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Я перепешу ваш код, но проблема в том, что мне сложно т.к я не могу опробовать как он будет работать. Пидется работать в режиме offline, т.е е высылаю код, вы его тэстите, и отписываетесь как работает, я его корректирую и снова высылаю, вы снова тестите, и так пока не отладим. Единственное это может занять много времени.
    Согласны?
     
    sanikДата: Среда, 16.10.2013, 00:46 | Сообщение # 26
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Да я уже согласен на все лишь бы запустить его Начал делать изменения так как с пультом затея не очень хорошая убирается управление одного из двигателей вместо него ставим реле и добавляем интервалометр, куда скинуть код?

    Алгоритм такой
    1.  При включении приветствие, переходим в режим
    2.

    2. Крутим потенциометром, устанавливая желаемое положение каретки. Чем
    больше потенциометр повернут от среднего положения, тем больше скорость
    перемещения каретки, ожидаем нажатие кнопки select. Если каретка дошла до
    концевика останавливаем
    пока не будет повернут потенциометр в другоенаправление. По нажатию кнопки
    select, переходим в режим 3.

    3. Задаем, (количество импульсов с фотоитераптора) на сколько должна продвинуться
    каретка,
    нажатием кнопок plus или minus, по нажатию кнопки stop, сбрасываемнастройки движения
    каретки, ждем нажатие кнопки select. Выводим значение на экран. По нажатию
    кнопки select,
    переходим в режим 4.

    4. Устанавливаем время (с шагом 1 сек) отсчета таймера pause нажатием, кнопок
    plus или minus в секундах,
    ждем нажатие кнопки select. Выводим значение наэкран По нажатию кнопки select, переходим в режим 5.

    5. Устанавливаем время (с шагом 1 сек)  отсчета таймера exposure нажатием, кнопок plus
    или
    minus в секундах, ждем нажатие кнопки select. Выводим значение на экран По
    нажатию кнопки
    select, переходим в режим 6.

    6. устанавливаем количество кадров shutter нажатием кнопок кнопок plus или
    minus, ждем нажатие кнопки select. Выводим значение на экран По нажатию кнопки
    select, переходим в режим 7.

    7.Ожидание нажатия кнопки start, ожидание нажатия кнопки stop, По
    нажатию кнопки start, переходим в режим 8. , По нажатию кнопки stop
    переходим в режим 2.

    8. Запускаем таймер pause в соответствии установленных параметров
    режимом 4., ожидание нажатия кнопки stop, по окончанию отсчета таймера
    pause, переходим в режим 9., , По нажатию кнопки stop переходим в
    режим 2.

    9. Запускаем таймер exposure в соответствии установленных параметров
    режимом 5. управляем срабатыванием реле focus ждем немного и реле shutter, уменьшаем
    значение 
    счетчика количество кадровshutter на единицу заданого в режиме 6. Выводим на экран остаток кадров
    ,
    ожидание нажатия кнопки stop, по окончанию отсчета таймера exposure, отпускаемоба реле одновременно,
    переходим в режим 10., По нажатию кнопки stop  отпускаем оба реле переходим в режим 2. Приобнулении
    счетчика количество кадров shutter отпускаем оба реле переходим врежим 2.

    10.Запускаем таймер pause в соответствии установленных параметров режимом
    4., двигаем каретку в соответствии установленных параметров режимом 3.
    ожидание нажатия кнопки stop, ожидание срабатывание датчика направления
    каретки, останавливаем каретку  в
    соответствии установленных
    параметров режимом 3. Переходим в режим 9. По нажатию кнопки stop
    переходим в режим 2. При срабатывание датчика направления каретки
    переходим в режим 11.

    11.Устанавливаем движение каретки в обратном направлении, двигаем каретку в
    соответствии установленных
    параметров режимом 3,  останавливаем каретку  в соответствии установленных параметров режимом 3 переходим в режим 9.


    Ну не знаю я

    Сообщение отредактировал sanik - Пятница, 25.10.2013, 05:32
     
    sanikДата: Среда, 16.10.2013, 00:49 | Сообщение # 27
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    Это слайдер для сьемки тайлапсов имеет два режима сьемка видео и тайлапса

    Прикрепления: 5954094.jpg(249.1 Kb)


    Ну не знаю я
     
    loriДата: Среда, 16.10.2013, 08:07 | Сообщение # 28
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    sanik, поясните алгоритм.

    1. "Приветствие", что за приветствие как вы его себе представляете?

    2. Я так полагаю, что вы вы хотите на этом шаге с помощью потенциометра выставить каретку в нужное положение? Это возможно реализовать, но если вы находитесь возле устройства не проще ли (и точнее) будет передвинуть каретку рукой?

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

    4. Не понятен шаг настройки таймера (секунда, минута, час, день ...), кроме того вы это будете устанавливать вслепую? Я имею в виду то, что нужно будет видеть выставляемые показания на каком то дисплее, а значит его нужно будет приобрести и подключить к ардуино и тоже запрограммировать.

    5. те же вопросы что и к п.4

    6. На сколько я понял все операции до этого пункта были программированием алгоритма работы вашего устройства?

    7. Начиная с этого пункта устройство должно работать по ранее запрограммированному алгоритму? Здесь вроде все понятно.

    8. Как вы пишете "запускаем таймер exposure" из п.5 - это есть, но описания настройки реле focus и реле shutter в п.5 я не обнаружил?

    9. Так, здесь еще появляется датчик направления каретки, что это за датчик, для чего он нужен если мы и так уже запрограммировали направление движения? Если это концевой датчик, что видно из п.10 то для чего тогда в п.3 мы "Задаем, на сколько должна продвинуться каретка, нажатием кнопок 
    plus или minus"?

    В общем мне ПОЧТИ все понятно, но нужны ваши пояснения по моим вопросам. Алгоритм не очень сложный. Но возможно вопросы будут еще.
     
    sanikДата: Среда, 16.10.2013, 20:14 | Сообщение # 29
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Я как рас и ждал вопросов потому что все за раз описать ничего не упустив сложновато сложновато

    1.Приветсвие такого плана [code][/code]void hello()
    {
    lcd.setCursor(0, 0);lcd.print("     Hello");delay(200);// установка курсора, печать надписи, задержка на 200 мс.
    lcd.setCursor(0, 1);lcd.print(" Slider Timelaps");delay(2000);
    lcd.clear();// очистка дисплея,
    }
    2. Вывод на экран сообщения что мы в ручном режиме ( вручную двигать каретку с плавным ходом сложно все равно получается неравномерно по всей длине которая составляет около двух метров. В каком то месте одна скорость в каком то другая получится)

    3.Обратная связь есть стоит фотоинтераптор вот количество поступающих с него логических едениц и регулируем и не важно сколько выйдет в мм. так как 1 через механику получится меньше мм.

    4. шаг настройки таймеров в секундах и минутах самое большое 99мин 99сек (Вопрос придется ли докупать внешний таймер?) Дисплей есть работает по протоколу I2C
    5. C первого раза я упустил еще одну настройку добавил её пунктом 11. между 5 и 6.

    8. Настройки реле реле focus срабатывает первым небольшая пауза для начала 20мс. подом можно будет настроить ну думаю этого должно хватить потм срабатывает второе реле о отпускаем оба в конце отсчета таймера.  В 8 пункте добавлен счетчик кадров (Взгляните еще раз на алгоритм, Упустил сразу)

    9.Так как это концевик для обратного направления так как из пункта 9 мы переходим в п8. и повторяем это пока не нажата кнопка стоп или не обнулиться счетчик кадров каретка будет двигаться по Х мм. до самого конца тут наезжает на концевик и в том же духе идет обратно пока не нажму кнопку стоп или не обнулиться счетчик кадров.. Принцип такой пауза фокусировка сьемка закрыли затвор проехали пауза фокусировка съмека закрыли затвор проехали и т д

    Добавлено (16.10.2013, 10:36)
    ---------------------------------------------
    Вот еще раз скину алгоритм с пунктом 11

    1.  При включении приветствие, переходим в режим
    2.

    2. Крутим потенциометром, устанавливая желаемое положение каретки. Чем
    больше потенциометр повернут от среднего положения, тем больше скорость
    перемещения каретки, ожидаем нажатие кнопки select. Если каретка дошла до
    концевика останавливаем пока не будет повернут потенциометр в другое
    направление. По нажатию кнопки
    select, переходим в режим 3.

    3. Задаем, (количество импульсов с фотоитераптора) на сколько должна продвинуться
    каретка, нажатием кнопок plus или minus, по нажатию кнопки stop, сбрасываем
    настройки движения
    каретки, ждем нажатие кнопки select. Выводим значение на экран. По нажатию
    кнопки select,
    переходим в режим 4.

    4. Устанавливаем время (с шагом 1 сек) отсчета таймера pause нажатием, кнопок
    plus или minus в секундах, ждем нажатие кнопки select. Выводим значение на
    экран По нажатию кнопки select, переходим в режим 5.

    5. Устанавливаем время (с шагом 1 сек)  отсчета таймера exposure нажатием, кнопок plus
    или
    minus в секундах, ждем нажатие кнопки select. Выводим значение на экран По
    нажатию кнопки
    select, переходим в режим 6.

    6. устанавливаем количество кадров shutter нажатием кнопок кнопок plus или
    minus, ждем нажатие кнопки select. Выводим значение на экран По нажатию кнопки
    select, переходим в режим 7.

    7.Ожидание нажатия кнопки start, ожидание нажатия кнопки stop, По
    нажатию кнопки start, переходим в режим 8. , По нажатию кнопки stop
    переходим в режим 2.

    8. Запускаем таймер pause в соответствии установленных параметров
    режимом 4., ожидание нажатия кнопки stop, по окончанию отсчета таймера
    pause, переходим в режим 9., , По нажатию кнопки stop переходим в
    режим 2.

    9. Запускаем таймер exposure в соответствии установленных параметров
    режимом 5. управляем срабатыванием реле focus ждем немного и реле shutter, уменьшаем
    значение  счетчика количество кадров
    shutter на единицу заданого в режиме 6. Выводим на экран остаток кадров
    ,ожидание нажатия кнопки stop, по окончанию отсчета таймера exposure, отпускаем
    оба реле одновременно, переходим в режим 10., По нажатию кнопки stop  отпускаем оба реле переходим в режим 2. При
    обнулении счетчика количество кадров shutter отпускаем оба реле переходим в
    режим 2.

    10.Запускаем таймер pause в соответствии установленных параметров режимом
    4., двигаем каретку в соответствии установленных параметров режимом 3.
    ожидание нажатия кнопки stop, ожидание срабатывание датчика направления
    каретки, останавливаем каретку  в
    соответствии установленных
    параметров режимом 3. Переходим в режим 9. По нажатию кнопки stop
    переходим в режим 2. При срабатывание датчика направления каретки
    переходим в режим 11.

    11.Устанавливаем движение каретки в обратном направлении, двигаем каретку в
    соответствии установленных параметров режимом 3, останавливаем каретку  в соответствии установленных
    параметров режимом 3 переходим в режим 9.

    Добавлено (16.10.2013, 20:14)
    ---------------------------------------------


    Ну не знаю я

    Сообщение отредактировал sanik - Пятница, 25.10.2013, 05:36
     
    sanikДата: Четверг, 17.10.2013, 05:17 | Сообщение # 30
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    lori, Так наверное лучше будет

    Прикрепления: 5950534.png(96.7 Kb)


    Ну не знаю я
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » И снова о контроллере двух моторов прошу помощи! (Методом ошибок и долгих мучений я все таки ке что смог)
    • Страница 1 из 2
    • 1
    • 2
    • »
    Поиск:

    ДВ Робот - Чат