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

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

  1. sanik

    sanik Гик

    У меня так и не получилось её применить Вот что я сделал код конечно сократил))
    Но что то не хватает отказывается работать..
    Код (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;
    int 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;


    int VAL_BTN_SELECT=0, VAL1_BTN_SELECT=0, BUTSTATE_BTN_SELECT=0;
    int VAL_BTN_PLUS=0, VAL1_BTN_PLUS=0, BUTSTATE_BTN_PLUS=0;
    int VAL_BTN_MINUS=0, VAL1_BTN_MINUS=0, BUTSTATE_BTN_MINUS=0;
    int VAL_BTN_START=0, VAL1_BTN_START=0, BUTSTATE_BTN_START=0;
    int VAL_BTN_ANALOG=0, VAL1_BTN_ANALOG=0, BUTSTATE_BTN_ANALOG=0;

    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 hello()


    void processAnalog()



    void syncronize()


    void loop()
    {
      switch (mode)
      {
        case MODE_INIT:
        {
          hello();
          mode = MODE_MANUAL;
          break;
        }
        case MODE_MANUAL:
        {
          processAnalog();
          VAL_BTN_SELECT=digitalRead(PIN_BTN_SELECT); // Считываем значение конпки в VAL
          delay(10);  // задержка 10мс для устранения дребезга контактов
          VAL1_BTN_SELECT=digitalRead(PIN_BTN_SELECT); // убеждаемся, что мы читаем стабильное состояние кнопки
          if (VAL_BTN_SELECT==VAL1_BTN_SELECT)  // Затем проверяем, равны ли значения VAL и VAL1
          {
            if (VAL_BTN_SELECT!=BUTSTATE_BTN_SELECT) //изменилось ли состояние конпки относительно предыдущего
            {
              if (VAL_BTN_SELECT==HIGH)//  смотрим - состояние кнопки, если высокий, то
              {
                mode = MODE_SELECT_X;
                while (digitalRead(PIN_BTN_SELECT)) delay(1);
              }
            }
          }
          BUTSTATE_BTN_SELECT=digitalRead(PIN_BTN_SELECT);
          break;
        }
        case MODE_SELECT_X: //Установка количества импульсов для датчика X
        {
          lcd.setCursor(0,0); lcd.print("    Setup X "); delay(200);
          lcd.setCursor(0,1); lcd.print("      X ");
       
          VAL_BTN_PLUS=digitalRead(PIN_BTN_PLUS); //Считываем значение конпки в VAL
          VAL_BTN_MINUS=digitalRead(PIN_BTN_MINUS);
          delay(10);
          VAL1_BTN_PLUS=digitalRead(PIN_BTN_PLUS);
          VAL1_BTN_MINUS=digitalRead(PIN_BTN_MINUS);
       
          if (VAL_BTN_PLUS==VAL1_BTN_PLUS)
          {
            if (VAL_BTN_MINUS!=BUTSTATE_BTN_MINUS)
            {
              if (VAL_BTN_PLUS==HIGH)
              {
                if (posX < 1023) posX++;
                while (digitalRead(PIN_BTN_PLUS)) delay(1);
                BUTSTATE_BTN_PLUS=digitalRead(PIN_BTN_PLUS);
                lcd.setCursor(0,1); lcd.print("      X "); lcd.print(posX);
              }
            }
          }
          if (VAL_BTN_PLUS==VAL1_BTN_MINUS)
          {
            if (VAL_BTN_MINUS!=BUTSTATE_BTN_MINUS)
            {
              if (VAL_BTN_MINUS==HIGH)
              {
                if (posX > 0) posX--;
                while (digitalRead(PIN_BTN_MINUS)) delay(1);
                BUTSTATE_BTN_PLUS=digitalRead(PIN_BTN_MINUS);
                lcd.setCursor(0,1); lcd.print("      X "); lcd.print(posX);
              }
            }
          }
       
          VAL_BTN_ANALOG=digitalRead(PIN_BTN_ANALOG);
          delay(10);
          VAL1_BTN_ANALOG=digitalRead(PIN_BTN_ANALOG);
          if (VAL_BTN_ANALOG==VAL1_BTN_ANALOG)  // убеждаемся, что мы читаем стабильное состояние кнопки
          {
            if (VAL_BTN_ANALOG!=BUTSTATE_BTN_ANALOG)
            {
              if (VAL_BTN_ANALOG==HIGH)
              {
                posX = 0;
                while (digitalRead(PIN_BTN_ANALOG)) delay(1);
                BUTSTATE_BTN_ANALOG=digitalRead(PIN_BTN_ANALOG);
                lcd.setCursor(0,1); lcd.print("      X "); lcd.print(posX);
              }
            }
          }
          if (VAL_BTN_SELECT==VAL1_BTN_SELECT)
          {
            if (VAL_BTN_SELECT!=BUTSTATE_BTN_SELECT)
            {
              if (VAL_BTN_SELECT==HIGH)
              {
                mode = MODE_SELECT_Y;
                while (digitalRead(PIN_BTN_SELECT)) delay(1);
              }
            }
          }
          BUTSTATE_BTN_SELECT=digitalRead(PIN_BTN_SELECT);
          break;
        }
        case MODE_SELECT_Y:
        {
          lcd.setCursor(0,0); lcd.print("    Setup Y "); delay(200);
          lcd.setCursor(0,1); lcd.print("      Y ");
       
          if (VAL_BTN_PLUS==VAL1_BTN_PLUS)
          {
            if (VAL_BTN_MINUS!=BUTSTATE_BTN_MINUS)
            {
              if (VAL_BTN_PLUS==HIGH)
              {
                if (posY < 1023) posY++;
                while (digitalRead(PIN_BTN_PLUS)) delay(1);
                BUTSTATE_BTN_PLUS=digitalRead(PIN_BTN_PLUS);
                lcd.setCursor(0,1); lcd.print("      Y "); lcd.print(posY);
              }
            }
          }
          if (VAL_BTN_PLUS==VAL1_BTN_MINUS)
          {
            if (VAL_BTN_MINUS!=BUTSTATE_BTN_MINUS)
            {
              if (VAL_BTN_MINUS==HIGH)
              {
                if (posY > 0) posY--;
                while (digitalRead(PIN_BTN_MINUS)) delay(1);
                BUTSTATE_BTN_PLUS=digitalRead(PIN_BTN_MINUS);
                lcd.setCursor(0,1); lcd.print("      Y "); lcd.print(posY);
              }
            }
          }
          if (VAL_BTN_ANALOG==VAL1_BTN_ANALOG)
          {
            if (VAL_BTN_ANALOG!=BUTSTATE_BTN_ANALOG)
            {
              if (VAL_BTN_ANALOG==HIGH)
              {
                posY = 0;
                while (digitalRead(PIN_BTN_ANALOG)) delay(1);
                BUTSTATE_BTN_ANALOG=digitalRead(PIN_BTN_ANALOG);
                lcd.setCursor(0,1); lcd.print("      Y "); lcd.print(posY);
              }
            }
          }
          if (VAL_BTN_SELECT==VAL1_BTN_SELECT)
          {
            if (VAL_BTN_SELECT!=BUTSTATE_BTN_SELECT)
            {
              if (VAL_BTN_SELECT==HIGH)
              {
                mode = MODE_PROG;
                while (digitalRead(PIN_BTN_SELECT)) delay(1);
              }
            }
          }
          BUTSTATE_BTN_SELECT=digitalRead(PIN_BTN_SELECT);
          break;
        }
        case MODE_PROG:
        {
          lcd.setCursor(0,0); lcd.print("    Programm  "); delay(200);
          lcd.setCursor(0,1); lcd.print(" Press  start "); delay(200);
       
          VAL_BTN_START=digitalRead(PIN_BTN_START);
          delay(10);
          VAL1_BTN_START=digitalRead(PIN_BTN_START);
       
          if (VAL_BTN_START==VAL1_BTN_START)
          {
            if (VAL_BTN_START!=BUTSTATE_BTN_START)
            {
              if (VAL_BTN_START==HIGH)
              {
                mode = MODE_SYNC;
                BUTSTATE_BTN_START=digitalRead(PIN_BTN_START);
                while (digitalRead(PIN_BTN_START)) delay(1);
              }
            }
          }
          if (VAL_BTN_ANALOG==VAL1_BTN_ANALOG)
          {
            if (VAL_BTN_ANALOG!=BUTSTATE_BTN_ANALOG)
            {
              if (VAL_BTN_ANALOG==HIGH)
              {
                mode = MODE_STOP;
                BUTSTATE_BTN_ANALOG=digitalRead(PIN_BTN_ANALOG);
                while (digitalRead(PIN_BTN_ANALOG)) delay(1);
              }
            }
          }
          break;
          case MODE_SYNC:
          lcd.setCursor(0,1); lcd.print("      start    "); delay(200);
          if (digitalRead(PIN_BTN_SYNC)) delay(1);
          {
            syncronize();
            while (digitalRead(PIN_BTN_SYNC)) delay(1);
          }
          if (VAL_BTN_ANALOG==VAL1_BTN_ANALOG)
          {
            if (VAL_BTN_ANALOG!=BUTSTATE_BTN_ANALOG)
            {
              if (VAL_BTN_ANALOG==HIGH)
              {
                mode = MODE_STOP;
                while (digitalRead(PIN_BTN_ANALOG)) delay(1);
              }
            }
          }
          BUTSTATE_BTN_ANALOG=digitalRead(PIN_BTN_ANALOG);
          break;
        }
        case MODE_STOP:
        {
          lcd.setCursor(0,0); lcd.print("    Programm"); delay(200);
          lcd.setCursor(0,1); lcd.print("      stop  "); delay(200);
       
          if (VAL_BTN_ANALOG==VAL1_BTN_ANALOG)
          {
            if (VAL_BTN_ANALOG!=BUTSTATE_BTN_ANALOG)
            {
              if (VAL_BTN_ANALOG==HIGH)
              {
                mode = MODE_MANUAL;
                while (digitalRead(PIN_BTN_ANALOG)) delay(1);
              }
            }
          }
          BUTSTATE_BTN_ANALOG=digitalRead(PIN_BTN_ANALOG);
        }
        break;
      }
    }
     
    Последнее редактирование: 13 окт 2013
  2. Unixon

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

    Код.
     

    Вложения:

    • sanik2.c.zip
      Размер файла:
      1,5 КБ
      Просмотров:
      286
    sanik нравится это.
  3. sanik

    sanik Гик

    Спасибо! Вот пытались научить меня одному а на самом деле код совсем другой
    Попытаюсь изучить его...
     
    Последнее редактирование: 13 окт 2013
  4. Unixon

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

    В каком смысле не получается?
     
  5. sanik

    sanik Гик

    Я файл блокнотом открыл вот сижу разбираюсь может получиться разобраться Еще раз спасибо огромное!
     
  6. sanik

    sanik Гик

    Пробовал загрузить где то ошибка при включении на экране режимы Analog и Setup сменяют друг друга. А должно высвечиваться только Analog пока не нажмешь кнопку установки в режиме program работает нормально..
     
  7. Unixon

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

    Ну гляньте условия смены режимов. У вас такая каша в коде была, что я мог и упустить в ней что-то важное.
     
  8. sanik

    sanik Гик

    Даже попробовал применить #define DEBOUNCE_INTERVAL 10 в своем коде то же самое!
     
  9. sanik

    sanik Гик

    Сравнивал со своим кодом вроде ничего не упущено сейчас еще раз посмотрю
     
  10. sanik

    sanik Гик

    Там со скобками проблема была! А как в вашем коде запускается мотор в право или лево? Какими командами?


    Код (Text):
    void processAnalog()
    {
      lcd.setCursor(0,0);lcd.print("    Analog  ");delay(200);
      lcd.setCursor(0,1);lcd.print(" X ");lcd.print(rewX);delay(1);
      lcd.setCursor(8,1);lcd.print(" Y ");lcd.print(rewY);delay(1);
      {
        x = analogRead(PIN_DIST_X); // считываем сзначение потециомера и записываем в переменую х
        if(x <= 511) // если х меньше или равно 511 то,
        {
          a = (511 - x) * 2;  // считаное показание умножаем на 2 получаем 1022 записываем в переменую а
        }
        else
        {
          a = (x - 511) * 2;
        }
        rewX = analogRead(PIN_DIST_X); // читаем показания потециомера и записываем в rewX
        if (rewX > 500)  // если показания меньше 520 то,
      {
        // запускаем мотор в одном направлении
      }
      if (rewX < 530 )  // если показания больше 520 то
      {
        // реверсим мотор
      }
      else if(rewX >= 500 && rewX < 530) //иначе если показания между 510 и 520 то,
      {
      motorControl(MOTOR_X,0,0); // останавливаем мотор
      }
     
    Последнее редактирование: 14 окт 2013
  11. Unixon

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

    Вообще то интерфейс функции motorControl() и определенные в самом начале макросы сами за себя говорят. :)
     
  12. sanik

    sanik Гик

    Не разобраться Скорость понятно как.
     
  13. sanik

    sanik Гик

    Я правильно понял?

    Код (Text):
    motorControl(MOTOR_X,DIR_FORWARD,a/4); // запускаем мотор в одном направлении
    motorControl(MOTOR_X,DIR_BACKWARD,a/4); // реверсим мотор
     
     
  14. Unixon

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

    Да, только "a/4" это что такое?
     
  15. sanik

    sanik Гик

    Это 1024 пол ученое с потенциометра деленная на 4
     
  16. sanik

    sanik Гик

    Ну вот вобще не работает чем дальше тем хуже, выходит больше 10т. да + больше чем полгода!!!! времени потрачены зря и все можно выкинуть на помойку!!!! Что б я взялся еще что нибудь делать... Лучше бы готовый купил пусть немного не так работает но за меньшие деньги . :( Не arduino а заманиловка какая то ...
     
  17. Megakoteyka

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

    Не надо опускать руки!!! Вы по крайней мере делаете что-то сами, учитесь новому, в отличие от многих. Нужно только проявить терпение и разобраться. Иногда стоит пересмотреть идею и попробовать начать с самого начала - немного иначе.
    Самый первый шаг и самый важный - формализовать задачу. Сформулировать все предельно четко и ясно.
    Опишите свою установку, желаемую логику ее работы, нарисуйте картинку.
     
    Unixon и Refresh нравится это.
  18. Unixon

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

    Да, рисунок установки хотя бы от руки накидайте.
     
  19. Unixon

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

    Знаете ли, методом тыка и случайным комбинированием кусков скетчей может и дольше ничего не получаться. Хорошо, что вы это поняли.

    Нет, просто теперь вы знаете, что получается, когда отсутствует системный подход к проектированию. А выкидывать ничего не нужно! Установка собрана. Проблема только в программе, так?

    Да вы уже почти все сделали, насколько я понимаю, но на последней ступеньке споткнулись изза малого опыта в программировании. Ничего страшного, это поправимо. Ваш проект можно закончить совместными усилиями, но только если вы будете внимательно слушать и следовать советам.
     
    Megakoteyka нравится это.
  20. sanik

    sanik Гик

    Рисунок не могу так как сканера нет на компе долго могу фото скинуть Это слайдер универсальный для съемки видео и таймлапсов Две направляющие по ним движется каретка на каретки поворотная голова В режиме видео управляется от потенциометров влево право, середина остановка моторов, в режиме таймлапс управляется программно, к контролеру подключается фотоаппарат и интервальный пульт в устройстве две атмеги первая управляет фотоаппаратом и подает на PIN_BTN_SYNC единицу после экспонирования каретка проезжает несколько милиметров (задается в саse) останавливается и опять ждет PIN_BTN_SYNC
    Была мысля еще в первой атмеге организовать интервалометр но решил готовый пульт подключить, на пульте задается время выдержки и время паузы во время выдержки идет экспонирование кадра, а во время паузы как раз двигается каретка при достижении края срабатывает датчик и каретка так же движется в обратном направлении... Вот коды которые пытался сделать я сам работают но не стабильно
    Код (Text):
    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()
    {
      do
      {
        delay(400);// подождать, пока датчики стабилизируются
        analogRead(timePin);// проверить датчики
      }
      while (analogRead(timePin) > 150);//проверка условия
      {
        digitalWrite(focusPin, HIGH );// включаем реле фокуса
        delay(10);
        digitalWrite(camPin, HIGH);// включаем реле затвора
        delay(50);
        digitalWrite(focusPin, LOW);// выключаем реле фокуса
        digitalWrite(camPin, LOW);// выключаем реле затвора
        delay(600);
        digitalWrite(PIN_BTN_SYNC, HIGH);// подаем сигнал управления
        delay(100);
        digitalWrite(PIN_BTN_SYNC, LOW);//выключаем сигнал управления

      }
    }