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

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

  1. sanik

    sanik Гик

    Прошу помощи! Подскажите почему контроллер игнорирует импульсы с фотоинтерапторов? Весь скетч работает как надо только какая то ошибка в void syncronize() может неправильно скобки стоят? В общем при нажатии кнопки старт PIN_BTN_START двигателя начинают двигаться, хотя должны ждать сигнал с кнопки PIN_BTN_SYNC после отсчета импульсов DISTx_PIN должен остановиться и опять ждать PIN_BTN_SYNC помогите пожалуйста!!
    Код (Text):
    #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;

    void setup()
    {
      Serial.begin(9600);
      lcd.init();lcd.backlight();lcd.clear();
      pinMode(DISTx_PIN, INPUT);
      pinMode(DISTy_PIN, INPUT);
      pinMode(PIN_BTN_SELECT, INPUT); //установка кнопки select
      pinMode(PIN_BTN_START, INPUT); //установка кнопки start
      pinMode(PIN_BTN_ANALOG, INPUT); //установка кнопки analog
      pinMode(PIN_BTN_PLUS, INPUT); //установка кнопки +
      pinMode(PIN_BTN_MINUS, INPUT); //установка кнопки -
      pinMode(PIN_BTN_SYNC,INPUT);
      pinMode(PIN_IN1, OUTPUT);
      pinMode(PIN_IN2, OUTPUT);
      pinMode(PIN_ENA, OUTPUT);
      pinMode(PIN_IN3, OUTPUT);
      pinMode(PIN_IN4, OUTPUT);
      pinMode(PIN_ENB, OUTPUT);
    }


    void syncronize()
    {
      {
        PinLOWy = LOW;
        PinHIGHy = HIGH;
        PinLOWx = LOW;
        PinHIGHx = HIGH;
      }
      {
        digitalWrite(PIN_IN3, PinLOWx);
        digitalWrite(PIN_IN4, PinHIGHx);
        analogWrite(PIN_ENB,150);
        {
          bool currentState = digitalRead(DISTx_PIN); //чтение импульсов фотоитераптора
          if(currentState != prevStateX)
          {
            prevStateX = currentState;
            counterX++;
            if(counterX == posX)
            {
              counterX = 0;
              analogWrite(PIN_ENB,0);
            }
          }
        }
        digitalWrite(PIN_IN1, PinLOWy);
        digitalWrite(PIN_IN2, PinHIGHy);
        analogWrite(PIN_ENA,150);
        {
        bool currentState = digitalRead(DISTy_PIN);
        if(currentState != prevStateY)
        {
          prevStateY = currentState;
          counterY++;
          if(counterY == posY)
          {
            counterY = 0;
            analogWrite(PIN_ENA,0);
          }
        }
        }
      }
      mode = MODE_SYNC;
      if (digitalRead(PIN_BTN_SYNC))
      {
        syncronize();
        while (digitalRead(PIN_BTN_SYNC)) delay(1);
      }
    }
     
     
    Последнее редактирование: 13 окт 2013
  2. Unixon

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

    Не понял... у вас syncronize() из себя рекурсивно вызывает syncronize(). Зачем?
     
  3. sanik

    sanik Гик

    Изначально было без вызова контроллер отрабатывал только один раз мне нужно зацикленное syncronize() до нажатия кнопки стоп. Таким способом я попытался исправить это что меня удивляет отдельными участками все работает как надо стоило мне все объединить как этот режим отказывается работать Вы думаете в этом причина?
     
  4. Megakoteyka

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

    Бесконечный рекурсивный вызов функции приводит к переполнению стека и разрушению памяти программы. Результат - зависание, уход в ресет, непредсказуемое поведение.
    Рекурсия может быть использована только в отдельных случаях с ограничением глубины вызовов при условии абсолютного понимания поведения рекурсивного кода. А лучше ее вообще не трогать.
     
  5. sanik

    sanik Гик

    Понятно! Спасибо за подсказку!
    А что тогда еще не так? Моторы все равно само по себе запускаться и не останавливаются в нужном месте...
    Код (Text):


    void syncronize()
    {
      {
        PinLOWy = LOW;
        PinHIGHy = HIGH;
        PinLOWx = LOW;
        PinHIGHx = HIGH;
      }
      {
        digitalWrite(PIN_IN3, PinLOWx);
        digitalWrite(PIN_IN4, PinHIGHx);
        analogWrite(PIN_ENB,150);
        {
          bool currentState = digitalRead(DISTx_PIN); //чтение импульсов фотоитераптора
          if(currentState != prevStateX)
          {
            prevStateX = currentState;
            counterX++;
            if(counterX == posX)
            {
              counterX = 0;
              analogWrite(PIN_ENB,0);
            }
          }
        }
        digitalWrite(PIN_IN1, PinLOWy);
        digitalWrite(PIN_IN2, PinHIGHy);
        analogWrite(PIN_ENA,150);
        {
        bool currentState = digitalRead(DISTy_PIN);
        if(currentState != prevStateY)
        {
          prevStateY = currentState;
          counterY++;
          if(counterY == posY)
          {
            counterY = 0;
            analogWrite(PIN_ENA,0);
          }
        }
        }
      }

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

    sanik Гик

    Как же все таки заставить моторы работать как надо? Заливаю такой скетч то все отрабатывает как надо!
    Код (Text):
    #define DISTx_PIN 1
    int posX = 10;
    int prevStateX = LOW;
    int counterX = 0;
    const byte PIN_IN1 = 12;
    const byte PIN_IN2 = 13;
    const byte PIN_ENA = 11;
    void setup()
    {
      pinMode(PIN_IN1, OUTPUT);
      digitalWrite(PIN_IN1,LOW);
      pinMode(PIN_IN2, OUTPUT);
      digitalWrite(PIN_IN2, HIGH);
      analogWrite(PIN_ENA, 200);
      pinMode(PIN_ENA, OUTPUT);
     
    pinMode(DISTx_PIN, INPUT);
    }
    void loop()
    {
      bool currentState = digitalRead(DISTx_PIN);
      if(currentState != prevStateX)
      {
        prevStateX = currentState;
        counterX++;
        if(counterX == posX)
        {
          counterX = 0;
              analogWrite(PIN_ENA, 0);
          // остановить мотор
        }
      }
    }
     
  7. sanik

    sanik Гик

    Что же, получается помощи не дождусь!(
     
  8. Megakoteyka

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

    В последнем скетче Вы сразу запускаете мотор, затем считаете импульсы и по достижении определенного числа останавливаете мотор. Тогда осталось изменить код так, чтобы запуск происходил только по нажатию нужной кнопки. У меня мотора под рукой нет, отладить и проверить не могу.
    Чтобы проверить правильность работы Вашего кода, нужно вставить в интересующие места отладочный вывод в монитор и анализировать полученный лог.
     
  9. sanik

    sanik Гик

    Я бы так и сделал но проблемма в том что пины RX и TX заняты И мне уже не справится... А вместо моторов в начальном этапе я подключал три светодиода два зеленых PIN_IN1 и PIN_IN2 и один красный PIN_ENA таким способом я отладил режим аналог когда еще не было драйвера...
     
  10. Unixon

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

    А чем у вас TX/RX заняты?
     
  11. sanik

    sanik Гик

    Датчиками фотоитерапторами
     
  12. sanik

    sanik Гик

    Добавил чтение кнопки теперь двигатель запускается как надо но не останавливается
    Код (Text):
    void syncronize()
    {
      if (digitalRead(PIN_BTN_SYNC))
      {
      PinLOWy = LOW;
      PinHIGHy = HIGH;
      PinLOWx = LOW;
      PinHIGHx = HIGH;
     
      digitalWrite(PIN_IN3, PinLOWx);
      digitalWrite(PIN_IN4, PinHIGHx);
      analogWrite(PIN_ENB,150);
      {
        bool currentState = digitalRead(DISTx_PIN);
        if(currentState != prevStateX)
        {
          prevStateX = currentState;
          counterX++;
          if(counterX == posX)
          {
            counterX = 0;
            analogWrite(PIN_ENB,0);
          }
        }
        digitalWrite(PIN_IN1, PinLOWy);
        digitalWrite(PIN_IN2, PinHIGHy);
        analogWrite(PIN_ENA,150);
        {
          bool currentState = digitalRead(DISTy_PIN);
          if(currentState != prevStateY)
          {
            prevStateY = currentState;
            counterY++;
            if(counterY == posY)
            {
              counterY = 0;
              analogWrite(PIN_ENA,0);
            }
          }
        }
      }
    }
    }
     
  13. Unixon

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

    Так может вы фотоинтеррапторы на другие ноги переместите?
     
  14. sanik

    sanik Гик

    С удовольствием да только все занято!!! Остался только один аналоговый пин
     
  15. Unixon

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

    Ну так отключите то-нибудь другое пока отлаживаете эту функцию, потом вернете на место.
     
  16. sanik

    sanik Гик

    Я просто не знаю что еще с этим делать на данный момент датчики не отрабатывают почему не могу понять,
    Код (Text):
    void syncronize()
    {
      if (digitalRead(PIN_BTN_SYNC))
      {
      PinLOWy = LOW;
      PinHIGHy = HIGH;
      PinLOWx = LOW;
      PinHIGHx = HIGH;
      digitalWrite(PIN_IN3, PinLOWx);
      digitalWrite(PIN_IN4, PinHIGHx);
      analogWrite(PIN_ENB,150);
      {
        bool currentState = digitalRead(DISTx_PIN);
        if(currentState != prevStateX)
        {
          prevStateX = currentState;
          counterX++;
          if(counterX == posX)
          {
            counterX = 0;
            analogWrite(PIN_ENB,0);
          }
        }
        digitalWrite(PIN_IN1, PinLOWy);
        digitalWrite(PIN_IN2, PinHIGHy);
        analogWrite(PIN_ENA,150);
        {
          bool currentState = digitalRead(DISTy_PIN);
          if(currentState != prevStateY)
          {
            prevStateY = currentState;
            counterY++;
            if(counterY == posY)
            {
              counterY = 0;
              analogWrite(PIN_ENA,0);
            }
          }
        }
      }
    }
    }

    а насчет сериал порта мне его не включить так как плата контроллера самодельная с минимальным обвесом и нет соединения с компом
     
  17. Unixon

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

    Вот это - зачем? Почему именно так?
    Код (Text):
    PinLOWy = LOW;
    PinHIGHy = HIGH;
    PinLOWx = LOW;
    PinHIGHx = HIGH;
     
  18. sanik

    sanik Гик

    Для последующего кода для отработки реверса у меня эти строки пока закоментированы
    а скорость в этом режиме должна быть постоянна

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

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

    Нарисуйте алгоритм работы всей системы.
    Например, с помощью визуального языка ДРАКОН.
     
    Megakoteyka нравится это.
  20. sanik

    sanik Гик

    Вот я когда то рисовал кода с меню разбирались
     
    Последнее редактирование: 10 окт 2013