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

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

  1. Megakoteyka

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

    Можно на дисплее вводить в секундах, а в программе прибавлять/отнимать по 1000 мс ;)
     
  2. sanik

    sanik Гик

    Ок! Посмотрю ка это выглядит в принципе я понял как работает мотор с полуциклами например запусков больше чем остановок, мотор поедет быстрее а если остановок больше чем запусков то мотор замедляет ход, Только в каком месте его использовать...Здесь я походу дела опять неправильно сделал.((

    Код (Text):
    #include <Bounce.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,16,2);

    // время подавления дребезга кнопок, мс
    #define DEBOUNCE_INTERVAL 20
    // длительность цикла мотора "вращение+стояние" - 128 мс
    #define MOTOR_CYCLE 128
    // номера пинов для кнопок
    #define btn_SELECT 3
    #define btn_PLUS  7
    #define btn_MINUS  6
    #define btn_START  4
    #define btn_STOP 2
    // номера пинов мотора
    #define pin_A 10
    #define pin_B 11
    #define pin_ENABLE 12
    // пин потенциометра
    #define pin_dist A1
    // пин датчика концевиков
    #define pin_Rd A2
    // пин фотоинтераптора
    #define pin_pos
    // максимальные значения
    #define MAX_POS_VALUE  4000// для положения каретки
    #define MAX_PAUSE_VALUE  60000// для времени паузы
    #define MAX_EXPOSURE_VALUE  20000// для времени экспозиции
    #define MAX_SHOT_VALUE  4000
    // управление мотором
    #define MOTOR_MOVE 0
    #define MOTOR_STOP 1

    //деление шкалы значений потенциометра
    int motorPotScale = 1024 / MOTOR_CYCLE;
    // шаги алгоритма
    typedef enum STEPS {
      STEP1_HELLO,
      STEP2_GET_POTS,
      STEP3_GET_POSITION,
      STEP4_GET_PAUSE,
      STEP5_GET_EXPOSURE,
      STEP6_GET_COUNT,
      STEP7_GET_START
    };

    // текущий шаг алгоритма
    STEPS currentStep = STEP1_HELLO;

    // создаем "давилки дребезга" для кнопок
    Bounce bouncerBtnSelect(btn_SELECT, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnPlus(btn_PLUS, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnMinus(btn_MINUS, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnStart(btn_START, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnStop(btn_STOP, DEBOUNCE_INTERVAL);
    void setup()
    {
      Serial.begin(9600);
      // инициализация дисплея, включаем подсветку, очищаем экран
      lcd.init();
      lcd.backlight();
      lcd.clear();
      _motorStartTime = millis();
    }

    int potValue  = 0; // значение потенциометра 1
    int pot2Value  = 0; // значение потенциометра 1
    int posValue  = 0; // значение положения каретки
    int pauseValue = 0; // значение времени паузы
    int exposValue = 0; // значение времени экспозиции
    int countValue = 0; // значение количества кадров
    int shootValue = 0; //значение счетчика кадров
    int control = 0; //значение датчика концевиков
    int durationMove = 0;// длительность вращения мотора
    int durationStop = 128;// длительность остановки мотора
    int motorState = MOTOR_MOVE;// текущее состояние мотора
    long motorStartTime = 0;// время начала очередного полуцикла работы мотора *вращения или стояния*


    void hello()
    {
      lcd.setCursor(5, 0);lcd.print("Hello");delay(200);// установка курсора, печать надписи, задержка на 200 мс.
      lcd.setCursor(0, 1);lcd.print(" Slider Timelaps");delay(2000);
      lcd.clear();// очистка дисплея.
    }
    void RunMotor1()
    {
    digitalWrite (pin_A, LOW);
    digitalWrite(pin_B, HIGH);
    }
    void RunMotor2()
    {
      digitalWrite (pin_A, HIGH);
      digitalWrite(pin_B, LOW);
    }
    void StopMotor()
    {
      digitalWrite(pin_ENABLE, LOW);
    }
    void ENABLE()
    {
      potValue = analogRead(A0);// читаем потенциометр
      long currentTime = millis();// берем текущее время
     
      switch(motorState)
      {
        case MOTOR_MOVE:
        if(motorStartTime + durationMove >= currentTime)
        {
          MotorStop();
          motorStartTime = currentTime;
          motorState = MOTOR_STOP;
        }
        // стояние мотора
        case MOTOR_STOP:
        // если с момента начала полуцикла стояния прошло  больше, чем durationStop
        if(motorStartTime + durationStop >= currentTime)
        {
          MotorStart();//нужно запустить мотор,
          motorStartTime = currentTime; // изменить значение времени начала полуцикла на текущее
          //теперь это будет время начала вращения мотора
          motorState = MOTOR_MOVE; // и перейти ко второму полуциклу
          durationStop = (potValue - 511) / motorPotScale;// берем середину значений потенциометра (potValue - 511)
          // и приводим ее к длительностям вращения и стояния мотора таким образом,
          // чтобы в сумме длительности давали MOTOR_CYCLE мс.
          durationMove = MOTOR_CYCLE - durationStop;
        }
        break;
      }
    }
         
    void loop()
    {
      bouncerBtnSelect.update();
      bouncerBtnPlus.update();
      bouncerBtnMinus.update();
      bouncerBtnStart.update();
      bouncerBtnStop.update();
      switch(currentStep)
      {
        case STEP1_HELLO:
          hello();
          currentStep = STEP2_GET_POTS;
          break;
     
        case STEP2_GET_POTS:
        lcd.setCursor(0,0);lcd.print("    Manyal  ");
       
        potValue = analogRead(pin_dist);
        if(potValue >= 510 && potValue <= 520)// если rewX в пределах [510; 520] - остановить мотор
        StopMotor();
        if(potValue < 510)// если rewX в пределах (0; 510) - крутить в направлении 1
        RunMotor1();
        if(potValue > 520)// если rewX в пределах (520; 0) - крутить в направлении 2
        RunMotor2();
        control = analogRead(pin_Rd);// чтение кнцевика
        if(control>= 540 && control <= 550)// если положение 1
        // запрещаем крутить мотор в направлении 1
        if(control>= 450 && control <= 460)// если положение 2
        //запрещаем крутить мотор в направлении 2
        Serial.println("Каретка установлена! Переходим к шагу 3");
        if(bouncerBtnSelect.read() == HIGH)// проверяем, нажата ли кнопка
        currentStep = STEP3_GET_POSITION;
       
        break;
     
        case STEP3_GET_POSITION:
        lcd.setCursor(0,0); lcd.print("Setting position");
        // гоним каертку на исходную позицию
        RunMotor1();
        //читаем датчик концевик, и останавливаем каретку в крайней позиции
        control = analogRead(pin_Rd);
        if(control>= 540 && control <= 550)
        StopMotor();
          // кнопка нажата и значение меньше максимально допустимого?
          if(bouncerBtnPlus.read() == HIGH && posValue < MAX_POS_VALUE)
            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)
          {
            Serial.println("Установлено положение каретки! Переходим к шагу 4");
            currentStep = STEP4_GET_PAUSE;
          }
          break;
     
        case STEP4_GET_PAUSE:
        lcd.setCursor(0,0); lcd.print("Setting interval");
          if(bouncerBtnPlus.read() == HIGH && pauseValue < MAX_PAUSE_VALUE)
            pauseValue++;
            lcd.setCursor(0,1); lcd.print("Interval"); lcd.print(pauseValue);
          if(bouncerBtnMinus.read() == HIGH && pauseValue > 0)
            pauseValue--;
            lcd.setCursor(0,1); lcd.print("Interval"); lcd.print(pauseValue);
          if(bouncerBtnSelect.read() == HIGH)
          {
            Serial.println("...! Переходим к шагу 5");
            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++;
            lcd.setCursor(0,1); lcd.print("exp time"); lcd.print(exposValue);
          if(bouncerBtnMinus.read() == HIGH && exposValue > 0)
            exposValue--;
            lcd.setCursor(0,1); lcd.print("exp time"); lcd.print(exposValue);
          if(bouncerBtnSelect.read() == HIGH)
          {
            Serial.println("...! Переходим к шагу 6");
            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);
        {
          currentStep = STEP7_GET_START;
        }
          break;
      }
    }
     
  3. sanik

    sanik Гик

    Это так примерно pauseValue++1000; ?
     
  4. sanik

    sanik Гик

    Вначале ругался на _motorStartTime = millis(); переставил long motorStartTime = 0; выше и убрал нижнее подчеркивание_ перестал ругаться теперь ругань на MotorStop(); у меня выше указан void StopMotor() {digitalWrite(pin_ENABLE, LOW);} Что оставлять и что убирать?
     
  5. Megakoteyka

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

    Кстати, а что за моторы? А то ведь серве постоянного вращения ШИМом обычным скорость задают одной строкой кода, а мы тут велосипеды придумываем :)
     
  6. Megakoteyka

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

    Value += 1000 или value = value + 1000.
     
  7. Megakoteyka

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

  8. Megakoteyka

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

    Пересмотрел все ваши исходники внимательно. Вы же раньше ШИМом и управляли моторами, правильно?
    Я этот момент где-то пропустил.
    Тогда мой код упрощается на порядок. Не нужно считать задержки, нужно просто писать приведенное к шкале 0..255 значение потенциометра в ШИМ и задавать направление.
     
  9. sanik

    sanik Гик

    Мотор-редуктор с фотоитераптором. мотор.png
     
  10. sanik

    sanik Гик

    Ну так я и предполагал что создать типа void speed1 и void speed2 .
     
  11. sanik

    sanik Гик

    Ну вот как то так сделал:
    Код (Text):
    #include <Bounce.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,16,2);

    // время подавления дребезга кнопок, мс
    #define DEBOUNCE_INTERVAL 20

    // номера пинов для кнопок
    #define btn_SELECT 3
    #define btn_PLUS  7
    #define btn_MINUS  6
    #define btn_START  4
    #define btn_STOP 2
    // номера пинов мотора
    #define pin_A 10
    #define pin_B 11
    #define pin_ENABLE 12
    // пин потенциометра
    #define pin_dist A1
    // пин датчика концевиков
    #define pin_Rd A2
    // пин фотоинтераптора
    #define pin_pos
    // максимальные значения
    #define MAX_POS_VALUE  4000// для положения каретки
    #define MAX_PAUSE_VALUE  60000// для времени паузы
    #define MAX_EXPOSURE_VALUE  20000// для времени экспозиции
    #define MAX_SHOT_VALUE  4000
    // шаги алгоритма
    typedef enum STEPS {
      STEP1_HELLO,
      STEP2_GET_POTS,
      STEP3_GET_POSITION,
      STEP4_GET_PAUSE,
      STEP5_GET_EXPOSURE,
      STEP6_GET_COUNT,
      STEP7_GET_START
    };

    // текущий шаг алгоритма
    STEPS currentStep = STEP1_HELLO;

    // создаем "давилки дребезга" для кнопок
    Bounce bouncerBtnSelect(btn_SELECT, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnPlus(btn_PLUS, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnMinus(btn_MINUS, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnStart(btn_START, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnStop(btn_STOP, DEBOUNCE_INTERVAL);
    void setup()
    {
      Serial.begin(9600);
      // инициализация дисплея, включаем подсветку, очищаем экран
      lcd.init();
      lcd.backlight();
      lcd.clear();

    }

    int potValue  = 0; // значение потенциометра 1
    int pot2Value  = 0; // значение потенциометра 1
    int posValue  = 0; // значение положения каретки
    int pauseValue = 0; // значение времени паузы
    int exposValue = 0; // значение времени экспозиции
    int countValue = 0; // значение количества кадров
    int shootValue = 0; //значение счетчика кадров
    int control = 0; //значение датчика концевиков
    int a;

    void hello()
    {
      lcd.setCursor(5, 0);lcd.print("Hello");delay(200);// установка курсора, печать надписи, задержка на 200 мс.
      lcd.setCursor(0, 1);lcd.print(" Slider Timelaps");delay(2000);
      lcd.clear();// очистка дисплея.
    }
    void RunMotor1()
    {
    digitalWrite (pin_A, LOW);
    digitalWrite(pin_B, HIGH);
    }
    void RunMotor2()
    {
      digitalWrite (pin_A, HIGH);
      digitalWrite(pin_B, LOW);
    }
    void StopMotor()
    {
      digitalWrite(pin_ENABLE, LOW);
    }
    //void ENABLE()
       
    void loop()
    {
      bouncerBtnSelect.update();
      bouncerBtnPlus.update();
      bouncerBtnMinus.update();
      bouncerBtnStart.update();
      bouncerBtnStop.update();
      switch(currentStep)
      {
        case STEP1_HELLO:
          hello();
          currentStep = STEP2_GET_POTS;
          break;
     
        case STEP2_GET_POTS:
        lcd.setCursor(0,0);lcd.print("    Manyal  ");
       
        potValue = analogRead(pin_dist);
        if(potValue >= 510 && potValue <= 520)// если rewX в пределах [510; 520] - остановить мотор
              {
          a = (511 - potValue) * 2;
        }
        else
        {
          a = (potValue - 511) * 2;
        }
        StopMotor();
        if(potValue < 510)// если rewX в пределах (0; 510) - крутить в направлении 1
        RunMotor1();
        digitalWrite(pin_ENABLE,a/4);
        if(potValue > 520)// если rewX в пределах (520; 0) - крутить в направлении 2
        RunMotor2();
        digitalWrite(pin_ENABLE,a/4);
        control = analogRead(pin_Rd);// чтение кнцевика
        if(control>= 540 && control <= 550)// если положение 1
        // запрещаем крутить мотор в направлении 1
        if(control>= 450 && control <= 460)// если положение 2
        //запрещаем крутить мотор в направлении 2
        Serial.println("Каретка установлена! Переходим к шагу 3");
        if(bouncerBtnSelect.read() == HIGH)// проверяем, нажата ли кнопка
        currentStep = STEP3_GET_POSITION;
       
        break;
     
        case STEP3_GET_POSITION:
        lcd.setCursor(0,0); lcd.print("Setting position");
        // гоним каертку на исходную позицию
        RunMotor1();
        //читаем датчик концевик, и останавливаем каретку в крайней позиции
        control = analogRead(pin_Rd);
        if(control>= 540 && control <= 550)
        StopMotor();
          // кнопка нажата и значение меньше максимально допустимого?
          if(bouncerBtnPlus.read() == HIGH && posValue < MAX_POS_VALUE)
            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)
          {
            Serial.println("Установлено положение каретки! Переходим к шагу 4");
            currentStep = STEP4_GET_PAUSE;
          }
          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)
          {
            Serial.println("...! Переходим к шагу 5");
            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)
          {
            Serial.println("...! Переходим к шагу 6");
            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);
        {
          currentStep = STEP7_GET_START;
        }
          break;
      }
    }
     
  12. sanik

    sanik Гик

    Каким способом при срабатывании датчика запретить двигаться в одну сторону, а разрешить двигаться в другую?
    Код (Text):
     case STEP2_GET_POTS:
        lcd.setCursor(0,0);lcd.print("    Manyal  ");
       
        potValue = analogRead(pin_dist);
        if(potValue >= 510 && potValue <= 520)// если rewX в пределах [510; 520] - остановить мотор
        {
          a = (511 - potValue) * 2;
        }
        else
        {
          a = (potValue - 511) * 2;
        }
        StopMotor();
        if(potValue < 510)// если rewX в пределах (0; 510) - крутить в направлении 1
        RunMotor1();
        if(potValue > 520)// если rewX в пределах (520; 0) - крутить в направлении 2
        RunMotor2();
        control = analogRead(pin_Rd);// чтение кнцевика
        if(control>= 540 && control <= 550)// если положение 1
        // запрещаем крутить мотор в направлении 1
        if(control>= 450 && control <= 460)// если положение 2
        //запрещаем крутить мотор в направлении 2
        Serial.println("Каретка установлена! Переходим к шагу 3");
        if(bouncerBtnSelect.read() == HIGH)// проверяем, нажата ли кнопка
        currentStep = STEP3_GET_POSITION;
       
        break;
     
  13. Megakoteyka

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

    Я посмотрел на
    Код (Text):
    void RunMotor1()
    {
      digitalWrite (pin_A, LOW);
      digitalWrite(pin_B, HIGH);
    }
    и почему-то решил, что мотор просто включается либо в одном направлении, либо в другом на полную скорость. А потом посмотрел старые версии вашего кода и заметил analogWrite().
    Извините, виноват (( Не хотел запутать.

    Нужно ввести переменную, в которой будет храниться направление движения мотора.
    Если сработал один датчик - записываем в эту переменную противоположное направление. И аналогично со вторым датчиком.
    А когда нужно покрутить мотор, смотрим на эту переменную и в зависимости от ее состояния меняем состояние ножек, управляющих направлением вращения мотора.

    if(сработал концевик 1)
    направление = влево;
    if(сработал концевик 2)
    направление = вправо;
    ...
    // крутим мотор
    if(направление == влево)
    {
    digitalWrite (pin_A, LOW);
    digitalWrite(pin_B, HIGH);
    }
    else
    {
    digitalWrite (pin_A, HIGH);
    digitalWrite(pin_B, LOW);
    }
     
  14. sanik

    sanik Гик

    Мне кажется в мануальном режиме так не пойдет так как потенциометром мы говорим крутиться в одну сторону, а датчиком приказываем в другую мне кажеться надо остановить мотор и создать условие, что в эту сторону больше не едим, а ждем когда вывернем потенциометр в другую сторону.
    Вот полный код все что пока смог сделать
    Код (Text):
    #include <Bounce.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,16,2);

    // время подавления дребезга кнопок, мс
    #define DEBOUNCE_INTERVAL 20

    // номера пинов для кнопок
    #define btn_SELECT 3
    #define btn_PLUS  7
    #define btn_MINUS  6
    #define btn_START  4
    #define btn_STOP 2
    // номера пинов мотора
    #define pin_A 10
    #define pin_B 11
    #define pin_ENABLE 12
    // пин потенциометра
    #define pin_dist A1
    //пин реле
    #define pin_foc 8
    #define pin_shot 9
    // пин датчика концевиков
    #define pin_Rd A2
    // пин фотоинтераптора
    #define pin_pos 13
    // максимальные значения
    #define MAX_POS_VALUE  4000// для положения каретки
    #define MAX_PAUSE_VALUE  60000// для времени паузы
    #define MAX_EXPOSURE_VALUE  20000// для времени экспозиции
    #define MAX_SHOT_VALUE  4000
    // шаги алгоритма
    typedef enum STEPS {
      STEP1_HELLO,
      STEP2_GET_POTS,
      STEP3_GET_POSITION,
      STEP4_GET_PAUSE,
      STEP5_GET_EXPOSURE,
      STEP6_GET_COUNT,
      STEP7_GET_START,
      STEP8_PAUSE,
      STEP9_EXP,
      STEP_10MOT
    };

    // текущий шаг алгоритма
    STEPS currentStep = STEP1_HELLO;

    // создаем "давилки дребезга" для кнопок
    Bounce bouncerBtnSelect(btn_SELECT, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnPlus(btn_PLUS, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnMinus(btn_MINUS, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnStart(btn_START, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnStop(btn_STOP, DEBOUNCE_INTERVAL);
    void setup()
    {
      Serial.begin(9600);
      // инициализация дисплея, включаем подсветку, очищаем экран
      lcd.init();
      lcd.backlight();
      lcd.clear();

    }

    int potValue  = 0; // значение потенциометра 1
    int pot2Value  = 0; // значение потенциометра 1
    int posValue  = 0; // значение положения каретки posY = 0;
    int pauseValue = 0; // значение времени паузы
    int exposValue = 0; // значение времени экспозиции
    int countValue = 0; // значение количества кадров
    int shootValue = 0; //значение счетчика кадров
    int control = 0; //значение датчика концевиков
    int pulse = 0; // значение счетчика фотоитераптора counterY = 0;
    int a;//значение скорости мотора
    int prevState = LOW;

    void hello()
    {
      lcd.setCursor(5, 0);lcd.print("Hello");delay(200);// установка курсора, печать надписи, задержка на 200 мс.
      lcd.setCursor(0, 1);lcd.print(" Slider Timelaps");delay(2000);
      lcd.clear();// очистка дисплея.
    }
    void RunMotor1()
    {
    digitalWrite (pin_A, LOW);
    digitalWrite(pin_B, HIGH);
    digitalWrite(pin_ENABLE,a/4);
    }
    void RunMotor2()
    {
      digitalWrite (pin_A, HIGH);
      digitalWrite(pin_B, LOW);
      digitalWrite(pin_ENABLE,a/4);
    }
    void StopMotor()
    {
      digitalWrite(pin_ENABLE, LOW);
    }
    //void ENABLE()
       
    void loop()
    {
      bouncerBtnSelect.update();
      bouncerBtnPlus.update();
      bouncerBtnMinus.update();
      bouncerBtnStart.update();
      bouncerBtnStop.update();
      switch(currentStep)
      {
        case STEP1_HELLO:
          hello();
          currentStep = STEP2_GET_POTS;
          break;
     
        case STEP2_GET_POTS:
        lcd.setCursor(0,0);lcd.print("    Manyal  ");
       
        potValue = analogRead(pin_dist);
        if(potValue >= 510 && potValue <= 520)// если rewX в пределах [510; 520] - остановить мотор
        {
          a = (511 - potValue) * 2;
        }
        else
        {
          a = (potValue - 511) * 2;
        }
        StopMotor();
        if(potValue < 510)// если rewX в пределах (0; 510) - крутить в направлении 1
        RunMotor1();
        if(potValue > 520)// если rewX в пределах (520; 0) - крутить в направлении 2
        RunMotor2();
        control = analogRead(pin_Rd);// чтение кнцевика
        if(control>= 540 && control <= 550)// если положение 1
        // запрещаем крутить мотор в направлении 1
        if(control>= 450 && control <= 460)// если положение 2
        //запрещаем крутить мотор в направлении 2
        Serial.println("Каретка установлена! Переходим к шагу 3");
        if(bouncerBtnSelect.read() == HIGH)// проверяем, нажата ли кнопка
        currentStep = STEP3_GET_POSITION;
       
        break;
     
        case STEP3_GET_POSITION:
        lcd.setCursor(0,0); lcd.print("Setting position");
        // гоним каертку на исходную позицию
        RunMotor1();
        //читаем датчик концевик, и останавливаем каретку в крайней позиции
        control = analogRead(pin_Rd);
        if(control>= 540 && control <= 550)
        StopMotor();
          // кнопка нажата и значение меньше максимально допустимого?
          if(bouncerBtnPlus.read() == HIGH && posValue < MAX_POS_VALUE)
            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)
          {
            Serial.println("Установлено положение каретки! Переходим к шагу 4");
            currentStep = STEP4_GET_PAUSE;
          }
          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)
          {
            Serial.println("...! Переходим к шагу 5");
            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)
          {
            Serial.println("...! Переходим к шагу 6");
            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);
        {
          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);
          // отсчет таймера pauseValue
          // время вышло
          {
            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
          }
          break;
          case STEP9_EXP:
          lcd.setCursor(0,0); lcd.print("Start shooting");
          lcd.setCursor(0,1);lcd.print("shut shots");lcd.print(shootValue);
          digitalWrite (pin_foc, HIGH);
          // задержка 20 мс.
          digitalWrite (pin_shot, HIGH);
          // отсчет таймера 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
          }
          break;
          case STEP_10MOT:
          // отсчет таймера pauseValue
          control = analogRead(pin_Rd);
          if(control>= 540 && control <= 550)// если положение 1 - крутить в направлении 1
          for(a = 25 ; a <= a; a+=30) // плавный разгон
          a *= 4; // так как значение а на пине делим на 4 соответсвено умножаем на 4
          RunMotor1();
          if(control>= 450 && control <= 460)// если положение 2 - крутить в направлении 2
          for(a = 25 ; a <= a; a+=30) // плавный разгон
          a *= 4; // так как значение а на пине делим на 4 соответсвено умножаем на 4
          RunMotor2();
          pulse = 0;// сброс счетчика на 0
          //считаем количество импульсов
          {
            bool currentState = digitalRead(pin_pos);// Читаем пин фотоитераптора
            if(currentState != prevState)
            prevState = currentState;
            pulse++;
            if(pulse == posValue)//если импульсы сравнялись с заданым значением
            {
              pulse = 0;
              StopMotor();
            }
          }
          // время вышло
          // StopMotor();
          {
            currentStep = STEP9_EXP; //Переходим к шагу 9
          }
          if(bouncerBtnStop.read() == HIGH)
          StopMotor();
          lcd.setCursor(0,0);lcd.print("    Manyal  ");
          lcd.setCursor(0,1);lcd.print("Stop shooting");
          {
            currentStep = STEP2_GET_POTS; //Переходим к шагу 2
          }
          break;
      }
    }
     
  15. sanik

    sanik Гик

    Заодно посмотрите нигде не накосячил..:)
     
  16. Megakoteyka

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

    Можно тогда по срабатыванию концевика ставить флаг и снимать его, когда концевик отпустится.
    При вращении мотора учитывать: если направление вправо и сработал правый концевик - не вращаем.
    Понадобится по переменной для хранения флага для каждого концевика.
    boolean stop1 = false;
    boolean stop2 = false;
    ...
    stop1 = control>= 540 && control <= 550; //есть сигнал с концевика 1
    stop2 = control>= 450 && control <= 460; //есть сигнал с концевика 2
     
  17. sanik

    sanik Гик

    Дело в том что концевик не отпускается остается в сработаном положении Это выключатель переделан на подобии тумблера.
     
  18. sanik

    sanik Гик

    Теперь я понял что схему немного неправильно нарисовал, один из контактов всегда замкнут
     
  19. sanik

    sanik Гик

    Сейчас возьмусь её рисовать.
     
  20. sanik

    sanik Гик

    А вот так нормально будет?
    Код (Text):
        potValue = analogRead(pin_dist);
        if(potValue >= 510 && potValue <= 520)// если rewX в пределах [510; 520] - остановить мотор
        {
          a = (511 - potValue) * 2;
        }
        else
        {
          a = (potValue - 511) * 2;
        }
        StopMotor();
        if(potValue < 510)// если rewX в пределах (0; 510) - крутить в направлении 1
        RunMotor1();
        if(potValue > 520)// если rewX в пределах (520; 0) - крутить в направлении 2
        RunMotor2();
        control = analogRead(pin_Rd);// чтение кнцевика
        if(control>= 540 && control <= 550)// если положение 1
        // запрещаем крутить мотор в направлении 1
        StopMotor();
        if(potValue > 520)
        RunMotor2();
        if(control>= 450 && control <= 460)// если положение 2
        //запрещаем крутить мотор в направлении 2
        StopMotor();
        if(potValue < 510)
        RunMotor1();