Где может быть ошибка кода?

Тема в разделе "Arduino & Shields", создана пользователем sanik, 8 окт 2013.

  1. lerik2703

    lerik2703 Гик

    Код (Text):
      stop1 = control>= 540 && control <= 550; //есть сигнал с концевика 1
      stop2 = control>= 450 && control <= 460; //есть сигнал с концевика 2
      if (stop1 || stop2)StopMotor();
    для чего лишняя проверка,условие выполниться когда одна из переменных станет истинной!но это проблему с обратным движением не решает т.к. скорость выполнения программы быстрей работы мотора :)
     
    sanik нравится это.
  2. sanik

    sanik Гик

    :) Ну дак туплю
     
  3. sanik

    sanik Гик

    Как же все таки считать количество кадров?
    int countValue = 0; // значение количества кадров
    int shootValue = 0; //значение счетчика кадров

    case STEP9_EXP:
    lcd.setCursor(0,0); lcd.print("Start shooting");
    lcd.setCursor(0,1);lcd.print("shut shots");lcd.print(shootValue);
    currentTime = millis();// считываем время, прошедшее с момента запуска программы
    digitalWrite (pin_foc, HIGH);
    if (currentTime >= (TimeLag + LagValue)) // сравниваем текущий таймер с переменной LagValue
    digitalWrite (pin_shot, HIGH);
    TimeLag = currentTime; // в currentTime записываем новое значение
    // Отсчет кличества кадров
    // значение кадров достигнуто выставленному Переходим к шагу 2
    if (currentTime >= (TimeExposure + exposValue)) // сравниваем текущий таймер с переменной exposValue
    digitalWrite (pin_foc, LOW);
    digitalWrite (pin_shot, LOW);
    {
    currentStep = STEP_10MOT;
    }
    if(bouncerBtnStop.read() == HIGH)
    digitalWrite (pin_foc, LOW);
    digitalWrite (pin_shot, LOW);
    lcd.setCursor(0,0);lcd.print(" Manyal ");
    lcd.setCursor(0,1);lcd.print("Stop shooting");
    {
    currentStep = STEP2_GET_POTS; //Переходим к шагу 2
    }
    TimeExposure = currentTime; // в currentTime записываем новое значение
    break;
     
  4. lerik2703

    lerik2703 Гик

    чем не вариант!?только сначала расставите правильно скобки а то не понятно какие действия должны идти после условий!
     
  5. sanik

    sanik Гик

    А вот с этим у меня проблема, я попробую... А вы если что потом подправьте пожалуйста.
     
  6. sanik

    sanik Гик

    Взгляните пожалуйста ничего не напутал со скобками и подсчета кадров? И что делать фотоинтерраптором?

    if (pulse == posValue)

    {

    pulse=0; // сброс счетчика на 0

    StopMotor();
    }

    Код (Text):
    void loop()
    {
      // обновление состояния кнопки
      bouncerBtnSelect.update();
      bouncerBtnPlus.update();
      bouncerBtnMinus.update();
      bouncerBtnStart.update();
      bouncerBtnStop.update();

      switch(currentStep)
      {
      case STEP1_HELLO:
        hello();
        currentStep = STEP2_GET_POTS;
        break;

      c
          posValue++;
          lcd.setCursor(0,1);
          lcd.print("Position");
          lcd.print(posValue);
        }
        // кнопка нажата и значение больше минимально допустимого (нуля)?
        if(bouncerBtnMinus.read() == HIGH && posValue > 0)
        {
          posValue--;
          lcd.setCursor(0,1);
          lcd.print("Position");
          lcd.print(posValue);
        }
        if(bouncerBtnSelect.read() == HIGH)
        {
          currentStep = STEP4_GET_PAUSE; // переходим к шагу 4
        }
        break;

      case STEP4_GET_PAUSE:
        lcd.setCursor(0,0);
        lcd.print("Setting interval");
        if(bouncerBtnPlus.read() == HIGH && pauseValue < MAX_PAUSE_VALUE)
        {
          pauseValue+=1000;
          lcd.setCursor(0,1);
          lcd.print("Interval");
          lcd.print(pauseValue/1000);
        }
        if(bouncerBtnMinus.read() == HIGH && pauseValue > 0)
        {
          pauseValue-=1000;
          lcd.setCursor(0,1);
          lcd.print("Interval");
          lcd.print(pauseValue/1000);
        }
        if(bouncerBtnSelect.read() == HIGH)
        {
          currentStep = STEP5_GET_EXPOSURE;
        }
        break;
      case STEP5_GET_EXPOSURE:
        lcd.setCursor(0,0);
        lcd.print("Setting exposure");
        if(bouncerBtnPlus.read() == HIGH && exposValue < MAX_EXPOSURE_VALUE)
          exposValue+=1000;
        lcd.setCursor(0,1);
        lcd.print("exp time");
        lcd.print(exposValue/1000);
        if(bouncerBtnMinus.read() == HIGH && exposValue > 0)
          exposValue-=1000;
        lcd.setCursor(0,1);
        lcd.print("exp time");
        lcd.print(exposValue/1000);
        if(bouncerBtnSelect.read() == HIGH)
        {
          currentStep = STEP6_GET_COUNT;
        }
        break;

      case STEP6_GET_COUNT:
        lcd.setCursor(0,0);
        lcd.print("Setting shooting");
        if(bouncerBtnPlus.read() == HIGH && shootValue < MAX_SHOT_VALUE)
        {
          shootValue++;
          lcd.setCursor(0,1);
          lcd.print("num shots");
          lcd.print(shootValue);
        }
        if(bouncerBtnMinus.read() == HIGH && shootValue > 0)
        {
          shootValue--;
          lcd.setCursor(0,1);
          lcd.print("num shots");
          lcd.print(shootValue);
        }
        if(bouncerBtnSelect.read() == HIGH)
        {
          currentStep = STEP7_GET_START;//Переходим к шагу 7
        }
        break;

      case STEP7_GET_START:
        lcd.setCursor(0,0);
        lcd.print("Start shooting");
        if(bouncerBtnStop.read() == HIGH)
          lcd.setCursor(0,0);
        lcd.print("    Manyal  ");
        lcd.setCursor(0,1);
        lcd.print("Stop shooting");
        {
          currentStep = STEP2_GET_POTS;//Переходим к шагу 2
        }
        if(bouncerBtnStart.read() == HIGH)
        {
          currentStep = STEP8_PAUSE;//Переходим к шагу 8
        }
        break;
      case STEP8_PAUSE:
        lcd.setCursor(0,0);
        lcd.print("Start shooting");
        lcd.setCursor(0,1);
        lcd.print("shut shots");
        lcd.print(shootValue);
        currentTime = millis();// считываем время, прошедшее с момента запуска программы
        if (currentTime >= (TimePause + pauseValue)) // сравниваем текущий таймер с переменной TimePause
        {
          currentStep = STEP9_EXP;//Переходим к шагу 9
        }
        if(bouncerBtnStop.read() == HIGH)
          lcd.setCursor(0,0);
        lcd.print("    Manyal  ");
        lcd.setCursor(0,1);
        lcd.print("Stop shooting");
        {
          currentStep = STEP2_GET_POTS; //Переходим к шагу 2
        }
        TimePause = currentTime; // в currentTime записываем новое значение
        break;

      case STEP9_EXP:
        lcd.setCursor(0,0);
        lcd.print("Start shooting");
        lcd.setCursor(0,1);
        lcd.print("shut shots");
        lcd.print(shootValue);
        currentTime = millis();// считываем время, прошедшее с момента запуска программы
        digitalWrite (pin_foc, HIGH);
        if (currentTime >= (TimeLag + LagValue)) // сравниваем текущий таймер с переменной LagValue
        {
          digitalWrite (pin_shot, HIGH);
          TimeLag = currentTime; // в currentTime записываем новое значение
        }
        if( shootValue > 0)// Отсчет кличества кадров
        {
          countValue++;
        }
        // значение кадров достигнуто выставленному Переходим к шагу 2
        if(shootValue==countValue)
        {
          digitalWrite (pin_foc, LOW);
          digitalWrite (pin_shot, LOW);
          lcd.setCursor(0,0);
          lcd.print("    Manyal  ");
          lcd.setCursor(0,1);
          lcd.print("Stop shooting");
       
          currentStep = STEP2_GET_POTS; //Переходим к шагу 2
        }
        if(currentTime >= (TimeExposure + exposValue)) // сравниваем текущий таймер с переменной exposValue
        {
          digitalWrite (pin_foc, LOW);
          digitalWrite (pin_shot, LOW);

          currentStep = STEP_10MOT;
        }
        if(bouncerBtnStop.read() == HIGH)
        {
          digitalWrite (pin_foc, LOW);
          digitalWrite (pin_shot, LOW);
          lcd.setCursor(0,0);
          lcd.print("    Manyal  ");
          lcd.setCursor(0,1);
          lcd.print("Stop shooting");

          currentStep = STEP2_GET_POTS; //Переходим к шагу 2

          TimeExposure = currentTime; // в currentTime записываем новое значение
        }
        break;

      case STEP_10MOT:
        currentTime = millis();// считываем время, прошедшее с момента запуска программы
        digitalWrite (pin_Pit, HIGH);// включаем питание фотоинтерраптора
        control = analogRead(pin_Rd);
        limit1();// если положение 1 - крутить в направлении 1
        for(int x = 25; x<=150; x +=30) // плавный разгон
          RunMotor1(x);
        limit2();// если положение 2 - крутить в направлении 2
        for(int x = 25; x<=150; x +=30) // плавный разгон
          RunMotor2(x);
        if (pulse == posValue)//считаем количество импульсов,достигли значение
        {
          pulse=0; // сброс счетчика на 0
          StopMotor();
        }
        if (currentTime >= (TimePause + pauseValue)) // сравниваем текущий таймер с переменной TimePause
        {
          StopMotor();
          digitalWrite (pin_Pit, LOW);

          currentStep = STEP9_EXP; //Переходим к шагу 9
        }
        if(bouncerBtnStop.read() == HIGH)
        {
          StopMotor();
          lcd.setCursor(0,0);
          lcd.print("    Manyal  ");
          lcd.setCursor(0,1);
          lcd.print("Stop shooting");
          digitalWrite (pin_Pit, LOW);

          currentStep = STEP2_GET_POTS; //Переходим к шагу 2

          TimePause = currentTime;
        }

        break;
      }
    }
     
     
    Последнее редактирование: 31 окт 2013
  7. Megakoteyka

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

    После съемки каждого кадра прибавлять счетчик кадров на единичку, затем проверка: если счетчик достиг желаемого значения, переходим на следующий шаг, иначе возвращаемся на тот шаг, где начинается съемка кадра.
     
  8. sanik

    sanik Гик

    Я думаю примерно, так как переходить на начало съемки не надо , нужно продолжать и переходить к шагу 10
    а если счетчик достиг желаемого значения, переходим к шагу 2
    case STEP9_EXP:
    lcd.setCursor(0,0);
    lcd.print("Start shooting");
    lcd.setCursor(0,1);
    lcd.print("shut shots");
    lcd.print(shootValue);
    currentTime = millis();// считываем время, прошедшее с момента запуска программы
    digitalWrite (pin_foc, HIGH);
    if (currentTime >= (TimeLag + LagValue)) // сравниваем текущий таймер с переменной LagValue
    {
    digitalWrite (pin_shot, HIGH);
    TimeLag = currentTime; // в currentTime записываем новое значение
    }
    if( shootValue > 0)// Отсчет кличества кадров
    {
    countValue++;
    }
    // значение кадров достигнуто выставленному Переходим к шагу 2
    if(shootValue==countValue)
    {
    digitalWrite (pin_foc, LOW);
    digitalWrite (pin_shot, LOW);
    lcd.setCursor(0,0);
    lcd.print(" Manyal ");
    lcd.setCursor(0,1);
    lcd.print("Stop shooting");

    currentStep = STEP2_GET_POTS; //Переходим к шагу 2
    }

    if(currentTime >= (TimeExposure + exposValue)) // сравниваем текущий таймер с переменной exposValue
    {
    digitalWrite (pin_foc, LOW);
    digitalWrite (pin_shot, LOW);

    currentStep = STEP_10MOT;
    }
    if(bouncerBtnStop.read() == HIGH)
    {
    digitalWrite (pin_foc, LOW);
    digitalWrite (pin_shot, LOW);
    lcd.setCursor(0,0);
    lcd.print(" Manyal ");
    lcd.setCursor(0,1);
    lcd.print("Stop shooting");

    currentStep = STEP2_GET_POTS; //Переходим к шагу 2

    TimeExposure = currentTime; // в currentTime записываем новое значение
    }
    break;
     
  9. lerik2703

    lerik2703 Гик

    Код (Text):
    #define MAX_POS_VALUE  4000// для положения каретки
    ...
        // кнопка нажата и значение меньше максимально допустимого?
        if(bouncerBtnPlus.read() == HIGH && posValue < MAX_POS_VALUE)
        {
          posValue++;

     
    это надо 4000 раз нажать на кнопу чтоб до максимума дойти,пальчик не устанет [​IMG]
     
  10. sanik

    sanik Гик

    Когда проверю сколько импульсов на мм переделаю. Вы лучше пройдитесь по коду все ли там в порядке? И вы говорили насчет фотоинтерраптора что работать как надо не будет так лучше скажите что с ним делать?:(
     
  11. lerik2703

    lerik2703 Гик

    может так все-же limit1();// если положение 1 - крутить в направлении 2?
     
  12. Megakoteyka

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

    Если добавить строчку
    Код (Text):
    bouncerBtnPlus.rebounce(...);
    в основном цикле, то можно нажать один раз и держать - оно само повторные нажатия будет генерировать с желаемым интервалом.
     
    sanik нравится это.
  13. lerik2703

    lerik2703 Гик

    ну не 4000 все-таки какой же интервал надо поставить чтоб не проскочить нужное значение?
     
  14. Megakoteyka

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

    Как сказал ТС, интервал будет соответствовать перемещению каретки на заданное расстояние и позже будет определен экспериментально.
     
  15. sanik

    sanik Гик

    Спасибо дельный совет пригодиться!А в скобках указывать интервал?
     
  16. sanik

    sanik Гик

    Не нравится ему
    Код (Text):
    Bounce bouncerBtnSelect.rebounce(btn_SELECT, DEBOUNCE_INTERVAL);
     
  17. Megakoteyka

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

    И не должно нравиться. Вам все же нужно прежде всего сосредоточиться на изучении языка.
    Bounce bouncerBtnSelect - это объявление объекта класса Bounce.
    В одной строке и то, и другое писать нельзя.
    bouncerBtnSelect.rebounce(REBOUNCE_INTERVAL) - вызов функции из класса Bounce применительно к объекту bouncerBtnSelect. REBOUNCE_INTERVAL - время в миллисекундах, через которое будет сгенерировано повторное нажатие на кнопку, если за это время она не была отпущена.
     
  18. sanik

    sanik Гик

    В том то и проблема что русскоязычных объяснений очень мало в интернете да и если есть то все очень скудно. Вот пытаюсь сейчас найти и ничего толком нет так и не понял(((
     
  19. sanik

    sanik Гик

    Да долго пришлось голову поломать над этими заумными словами!
    Код (Text):
    if(bouncerBtnPlus.read() == HIGH && posValue < MAX_POS_VALUE)
        {
          bouncerBtnPlus.rebounce(100);
          posValue++;
          lcd.setCursor(0,1);
          lcd.print("Position");
          lcd.print(posValue);
        }
     
    Последнее редактирование: 29 окт 2013
  20. Megakoteyka

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

    Есть куча русскоязычных книг по С++. Я в своё время учился по учебнику Подбельского - есть во многих магазинах и скачать не проблема. Есть Керниган и Риччи, есть даже серия "программирование для чайников", но это уже перебор :)