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

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

  1. sanik

    sanik Гик

    1. Я же вам обьясняю что с английским у меня плохо поэтому что увижу то и пишу...
    2. Не спорю поспешил.
    3. А это не я писал. Я даже понятия не имел как делать обработчик.
     
  2. sanik

    sanik Гик

    Так подскажите пожалуйста где, а то я тут сижу и дело не двигается и с места...
     
  3. sanik

    sanik Гик

    Вы имели ввиду установку pinMode Тогда просто убрать её и ничего не ставить?
     
  4. sanik

    sanik Гик

    А зачем 127 мне не обороты считать иначе за один оборот каретка уедет далеко...
     
  5. lerik2703

    lerik2703 Оракул

    для наглядности работы прерывания!и на сколько мм продвинется каретка за один оборот мотора?
    сейчас
    Код (Text):
    void RunMotor1()
    {
    digitalWrite (pin_A, LOW);
    digitalWrite(pin_B, HIGH);
    digitalWrite(pin_ENABLE,a/4);
    }
    должно
    void RunMotor1()
    {
    digitalWrite (pin_A, LOW);
    digitalWrite(pin_B, HIGH);
    analogWrite()(pin_ENABLE,a/4);
    }
     
  6. sanik

    sanik Гик

    В общем в итоге опять каша в голове и ещё больше непонимания
    Проверьте до меня правильно дошло насчет прерываний? В шаге 10 .
    Код (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 5
    // номера пинов мотора
    #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
    // пин фотоинтераптора
    int posInt = 0; //Пин 2
    // максимальные значения
    #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();
      pinMode (btn_SELECT, INPUT);
      pinMode (btn_PLUS, INPUT);
      pinMode (btn_MINUS, INPUT);
      pinMode (btn_START, INPUT);
      pinMode (btn_STOP, INPUT);
      pinMode (pin_A, OUTPUT);
      pinMode (pin_B, OUTPUT);
      attachInterrupt(posInt, handleInt0, RISING);
    }

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

    void hello()
    {
      // установка курсора, печать надписи, задержка на 200 мс.
      lcd.setCursor(5, 0);
      lcd.print("Hello");
      delay(200);
      lcd.setCursor(0, 1);
      lcd.print(" Slider Timelaps");
      delay(2000);
      lcd.clear();// очистка дисплея.
    }
    void handleInt0() // функция прерывания
    {
      pulse++; //при поступлении импульса увеличиваем счетчик на 1
    }
    void RunMotor1()
    {
     digitalWrite (pin_A, LOW);
     digitalWrite(pin_B, HIGH);
     analogWrite(pin_ENABLE,a/4);
    }
    void RunMotor2()
    {
      digitalWrite (pin_A, HIGH);
      digitalWrite(pin_B, LOW);
      analogWrite(pin_ENABLE,a/4);
    }
    void StopMotor()
    {
      digitalWrite(pin_ENABLE, LOW);
    }  
    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)// если potValue в пределах [510; 520] - остановить мотор
      {
      a = (511 - potValue) * 2;
      }
      else
      {
      a = (potValue - 511) * 2;
      }
      StopMotor();
      if(potValue < 510)// если potValue в пределах (0; 510) - крутить в направлении 1
      RunMotor1();
      if(potValue > 520)// если potValue в пределах (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();
      for(a = 25 ; a <= a; a+=30) // плавный разгон
      a *= 4; // так как значение а на пине делим на 4 соответсвено умножаем на 4
      //читаем датчик концевик, и останавливаем каретку в крайней позиции
      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);
      // Отсчет кличества кадров
      // значение кадров достигнуто выставленному Переходим к шагу 2
      // отсчет таймера 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 <= 150; 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();
      //считаем количество импульсов
      if (pulse == posValue)//достигли значение
      {
      pulse=0; // сброс счетчика на 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;
      }
    }
     
     
    Последнее редактирование: 25 окт 2013
  7. sanik

    sanik Гик

    Вот спросите чего делаю???
    Скорей всего так
    Код (Text):
          break;
          case STEP_10MOT:
          // отсчет таймера pauseValue
          control = analogRead(pin_Rd);
          if(control>= 540 && control <= 550)// если положение 1 - крутить в направлении 1
          for(a = 25 ; a <= 150; 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();
           if (pulse == posValue)//достигли значение
          {
           pulse=0; // сброс счетчика на 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;
      }
     
    Последнее редактирование: 25 окт 2013
  8. sanik

    sanik Гик

    Опять неизвестность:( Никто не отвечает....
     
  9. sanik

    sanik Гик

    Все ошибки устранены или еще что-то не так?
     
  10. lerik2703

    lerik2703 Оракул

    так не торопитесь :)
    в целом не плохо но работать как задумано не будет! об этом потом..
    конечно нет я не проверяю весь код на ошибки а иду по шагово
    и так дальше все тот же 2-й параграф

    Код (Text):
     potValue = analogRead(pin_dist);
        if(potValue >= 510 && potValue <= 520)// если potValue в пределах [510; 520] - остановить мотор
        {
          a = (511 - potValue) * 2;
        }
        else
        {
          a = (potValue - 511) * 2;
        }
        StopMotor();
        if(potValue < 510)// если potValue в пределах (0; 510) - крутить в направлении 1
        RunMotor1();
        if(potValue > 520)// если potValue в пределах (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;
    как программа исполняет код допустим значение potValue 511 (центр)
    соответственно if(potValue >= 510 && potValue <= 520) оператор вернет истину соответственно выполняем расчет a = (511 - potValue) * 2; это будет ноль дальше переменная а будет использоваться в установке ШИМ сигнала!оператор мы закрыли и уже за условием вызываем функцию остановки мотора !вроде все хорошо мотор стоит.. но повернули ручку влево до позиции 300 например,тогда if(potValue >= 510 && potValue <= 520) оператор уже вернет лож и согласно условию else выполняем расчет a = (potValue - 511) * 2; не сложно посчитать получаться -105 !если же повернем в право здесь все нормально в "плюсе" но у нас получаться мотор сначала останавливается потом условием if(potValue > 520) опять запускаем его...
     
  11. sanik

    sanik Гик

    Так тогда как же выставить диапазон в котором должен стоять мотор? Ведь ручкой сложно поймать ровно 511.
    Значит получается нужно делать так? if(potValue >= 511 && potValue <= 512)
     
  12. lerik2703

    lerik2703 Оракул

    я не про значения условия я про то что формула a = (511 - potValue) * 2; вычесываться только тогда когда потенциометр приблизительно стоит в центре!ладно сейчас что нибудь попробую навоять )))
    да нет оставьте как есть!
     
  13. sanik

    sanik Гик

    Не пойму, ведь как то надо сделать мертвую зону, в пределах хотя бы 10ти значений.. Что бы от центра и влево и в право был небольшой холостой ход ручки.
     
  14. Megakoteyka

    Megakoteyka Оракул

    Код (Text):
    if(potValue >= 520)
    {
      // поехали в одну сторону
    }
    if(potValue <= 510)
    {
      // поехали в другую сторону
    }
    Больше ничего в этом шаге не делаем.
     
  15. sanik

    sanik Гик

    А что если так?
    Код (Text):
    #define pin_dist A1
    #define pin_ENABLE 12

    #define pin_A 10
    #define pin_B 11

    const int MAX_POS = 1023; // VR выдает значения от 0 до 1023
    const int MAX_ANGLE = 180; // Джойстик отклоняется на угол 0..180
    const int MAX_VALUE = 255; // Максимальное подаваемое на ШИМ значение
    const int START_VALUE = 20; // Начальное подаваемое на ШИМ значение
    int shift;
    void setup()
    {
    Serial.begin(9600);
    pinMode(pin_ENABLE, OUTPUT);
    pinMode(pin_A, OUTPUT);
    pinMode(pin_B, OUTPUT);

    }

    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, 0);
      digitalWrite(pin_A, LOW);
      digitalWrite(pin_B, LOW);
    }
    void Enable()
    {
      analogWrite(pin_ENABLE, START_VALUE + shift);
    }

    void loop()
    {
    // Вычисляем угол поворота потенциометра
    int potValue = analogRead(pin_dist);
    // Переводим выходные данные VRy в угол поворота потенциометра (от 0 до 180)
    float Angle = 1.0 * potValue * MAX_ANGLE / MAX_POS;
    int startValue = 150;


    // Если потенциометр в изначальном положении (90 градусов с погрешностью 5)
    if (Angle > 85 && Angle < 95)
    {
    // Выключаем движки
    StopMotor();
    // Если ручка потенциометра повернут влево
    } else if (Angle <= 85)
    {
    // Включаем движок
    RunMotor1();
    int value = 0;
    Angle = 85 - Angle;
    // Подаем на ШИМ значение в зависимости от угла поворота
    float shift = 1.0 * (MAX_VALUE - START_VALUE) / 85 * Angle;
    analogWrite(pin_ENABLE, START_VALUE + shift);
    Enable();
    // Если ручка потенциометра повернут вправо, действуем аналогично
    } else
    {
    void RunMotor2();
    int value = 0;
    Angle = Angle - 95;
    float shift = 1.0 * (MAX_VALUE - START_VALUE) / 85 * Angle;
    Enable();

    }

    }
     
    Последнее редактирование: 25 окт 2013
  16. sanik

    sanik Гик

    А что будем делать с флагами? На концевики?

    Я имею ввиду как ими пользоваться как их снимать?

    boolean stop1 = false;
    boolean stop2 = false;
    ...
    stop1 = control>= 540 && control <= 550; //есть сигнал с концевика 1
    stop2 = control>= 450 && control <= 460; //есть сигнал с концевика 2
     
  17. lerik2703

    lerik2703 Оракул

    Код (Text):
    // номера пинов мотора
    #define pin_A 10
    #define pin_B 11
    #define pin_ENABLE 12
    int potValue  = 0;
    // пин потенциометра
    #define pin_dist A1
    void setup(){
      pinMode (pin_A, OUTPUT);
      pinMode (pin_B, OUTPUT);
       }
    void loop()
    {
      potValue = analogRead(pin_dist);
      if(potValue >= 480 && potValue <= 530)//подбор опытным путем
      {
        StopMotor();
      }
      else if(potValue <= 490){
        RunMotor1(map(potValue, 0, 490, 255, 10));
        }
     
      else if(potValue >= 530){
        RunMotor2(map(potValue, 530, 1023, 10, 255));
     
      }

      }
    void RunMotor1(byte a)
    {
      digitalWrite (pin_A, LOW);
      digitalWrite(pin_B, HIGH);
      analogWrite(pin_ENABLE,a);
    }
    void RunMotor2(byte a)
    {
      digitalWrite (pin_A, HIGH);
      digitalWrite(pin_B, LOW);
      analogWrite(pin_ENABLE,a);
    }
    void StopMotor()
    {
      analogWrite(pin_ENABLE,0);
    }
     
    работает надо на моторе проверь !
     
  18. sanik

    sanik Гик

    Спасибо! Я раньше встречал такой пример, только от того что не знал как пользоваться map Я показания с потенциометров делил на 4.
     
  19. sanik

    sanik Гик

    Ругается слишком мало аргументов , что бы это значило?
    kontroller_SlideunoV3_proba.ino: In function 'void loop()':
    kontroller_SlideunoV3_proba:104: error: too few arguments to function 'void RunMotor1(byte)'
     
  20. lerik2703

    lerik2703 Оракул

    в скетче ошибок нет!а что за 104 строка?