Контролер для двух двигателей

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

  1. sanik

    sanik Гик

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

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

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

    Возможно, вам нужен еще пример, чтобы все встало на свои места. ОК, попробуем его изобразить...
    Не хотелось этого делать, но видимо придется таки пройтись по вашему коду с гребенкой. :D
     
  3. sanik

    sanik Гик

    Спасибо! Вам огромное вы меня просто выручите !!! Видео готового изделия вам лично выложу посмотреть! Дело в том что скорей всего это мой единственный проект когда выложу видео сами меня поймете почему я занялся им...:)
     
  4. Unixon

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

    А зачем у вас в программе постоянно копируются какие то строчки с последовательного порта?
    Кто их передает ардуине в строго нужное время?
     
  5. sanik

    sanik Гик

    Честно говоря я не знаю я думал это нужно для ЖК он работает с переходником I2C в примере было указано это чтение я подумал что для его работы нужно это чтение с порта:
    Код (Text):

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    /*-----( Объявлять Константы )-----*/
    /*-----( Объявлении объектов )-----*/
    LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27
    /*-----( Объявлении Переменных )-----*/
     
     
    void setup()    /*----( SETUP: ВЫПОЛНЯЕТСЯ ОДИН РАЗ )----*/
    {
      Serial.begin(9600);
      lcd.init();  // инициализация ЖК
    }
     
     
    void loop()  /*----( LOOP: РАБОТАЕТ ПОСТОЯННО )----*/
    {
        lcd.backlight();
      // Print a message to the LCD.
      lcd.setCursor(0, 0);
      lcd.print("2-Line DISPLAY");
      delay(1500);
      lcd.setCursor(0, 1);
      lcd.print("YourDuino: HI!");
    /*--(end setup )---*/
        // when characters arrive over the serial port...
        if (Serial.available())
          // wait a bit for the entire message to arrive
          delay(100);
          // очистить экран
          lcd.clear();
          // прочитать все доступные символы
          while (Serial.available() > 0)
            // выводим каждый символ с ЖК
            lcd.write(Serial.read());
          }
     
    }/* --(end main loop )-- */
     
    /*-----( Declare User-written Functions )-----*/
     
     
    /* ( THE END ) */
     
  6. Unixon

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

    ОК, понятно, не нужно оно. С кодом я почти закончил, скоро будет готово.
     
  7. Unixon

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

    Ну вот что-то такое должно быть:
    Код (Text):

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
     
    LiquidCrystal_I2C lcd(0x27,16,2);
     
    const byte PIN_POS_X = A0;
    const byte PIN_POS_Y = A1;
    int posX, posY = 0;
     
    const byte PIN_HALL_X = 10;
    const byte PIN_HALL_Y = 9;
     
    const byte PIN_BTN_SELECT = 5;
    const byte PIN_BTN_START  = 4;
    const byte PIN_BTN_STOP  = 2;
    const byte PIN_BTN_PLUS  = 7;
    const byte PIN_BTN_MINUS  = 6;
    const byte PIN_BTN_SYNC  = 8;
     
    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;
     
    const byte PIN_ENA = 11; // А2 НЕХ
    const byte PIN_IN1 = 12;
    const byte PIN_IN2 = 13;
    const byte PIN_ENB = 11;
    const byte PIN_IN3 = 16;             
    const byte PIN_IN4 = 17;
     
     
    void setup()
    {
     Serial.begin(9600);
     lcd.init(); lcd.backlight(); lcd.clear();
     
     pinMode(PIN_HALL_X, INPUT);
     pinMode(PIN_HALL_Y, INPUT);
     
     pinMode(PIN_BTN_SELECT, OUTPUT);
     pinMode(PIN_BTN_START, OUTPUT);
     pinMode(PIN_BTN_STOP, OUTPUT);
     pinMode(PIN_BTN_PLUS, OUTPUT);
     pinMode(PIN_BTN_MINUS, OUTPUT);
     pinMode(PIN_BTN_SYNC, OUTPUT);
     
     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()
    {
     lcd.setCursor(0, 0); lcd.print("Hello"); delay(200);
     lcd.setCursor(0, 1); lcd.print("SlideUno"); delay(200);
     delay(1500);
     lcd.clear(); lcd.setCursor(0,0); lcd.print("Analog"); delay(200);
    }
     
    int correction(const int x)
    {
     if(x >= 0 && x < 100) return -10;
     if(x > 100 && x < 300) return -5;
     if(x> 300 && x < 520) return -1;
     if(x > 535 && x < 700) return +1;
     if(x > 700 && x < 900) return +5;
     if(x > 900) return +10;
     return 0;
    }
     
    void processAnalog()
    {
     posX = analogRead(PIN_POS_X);
     posX += correction(posX);
     digitalWrite(PIN_IN3, HIGH);
     digitalWrite(PIN_IN4, LOW);
     analogWrite(PIN_ENB, posX/4);
     delay(50);
     
     posY = analogRead(PIN_POS_Y);
     posY += correction(posY);
     digitalWrite(PIN_IN1, HIGH);
     digitalWrite(PIN_IN2, LOW);
     analogWrite(PIN_ENA, posY/4);
     delay(50);
    }
     
    void syncronize()
    {
     for (int i = 0; i <= 255; i+=30)
     {
      digitalWrite(PIN_IN3, HIGH);
      digitalWrite(PIN_IN4, LOW);
      analogWrite(PIN_ENB, i);
      delay(analogRead(PIN_HALL_X));
     }
     for (int i = 0; i <= 255; i+=30)
     {
      digitalWrite(PIN_IN1, HIGH);
      digitalWrite(PIN_IN2, LOW);
      analogWrite(PIN_ENA, i);
      delay(analogRead(PIN_HALL_Y));
     }
    }
     
    void loop()
    {
     switch (mode)
     {
      case MODE_INIT:
      {
       hello();
       mode = MODE_MANUAL;
       break;
      }
      case MODE_MANUAL:
      {
       processAnalog();
       if (digitalRead(PIN_BTN_SELECT))
       {
        mode = MODE_SELECT_X;
        while (digitalRead(PIN_BTN_SELECT)) delay(1);
       }
       break;
      }
      case MODE_SELECT_X:
      {
       lcd.setCursor(0,0); lcd.print("Setup"); delay(200);
       lcd.setCursor(0,1); lcd.print("X "); delay(200);
       //
       if (digitalRead(PIN_BTN_PLUS))
       {
        if (posX < 1023) posX++;
        while (digitalRead(PIN_BTN_PLUS)) delay(1);
       }
       if (digitalRead(PIN_BTN_MINUS))
       {
        if (posX > 0) posX--;
        while (digitalRead(PIN_BTN_MINUS)) delay(1);
       }
       if (digitalRead(PIN_BTN_SELECT))
       {
        mode = MODE_SELECT_Y;
        while (digitalRead(PIN_BTN_SELECT)) delay(1);
       }
       break;
      }
      case MODE_SELECT_Y:
      {
       lcd.setCursor(0,0); lcd.print("Setup"); delay(200);
       lcd.setCursor(0,1); lcd.print("Y "); delay(200);
       //
       if (digitalRead(PIN_BTN_PLUS))
       {
        if (posY < 1023) posY++;
        while (digitalRead(PIN_BTN_PLUS)) delay(1);
       }
       if (digitalRead(PIN_BTN_MINUS))
       {
        if (posY > 0) posY--;
        while (digitalRead(PIN_BTN_MINUS)) delay(1);
       }
       if (digitalRead(PIN_BTN_SELECT))
       {
        mode = MODE_PROG;
        while (digitalRead(PIN_BTN_SELECT)) delay(1);
       }
       break;
      }
      case MODE_PROG:
      {
       lcd.setCursor(0,0); lcd.print("Programm"); delay(200);
       //
       if (digitalRead(PIN_BTN_START))
       {
        mode = MODE_SYNC;
        while (digitalRead(PIN_BTN_START)) delay(1);
       }
       if (digitalRead(PIN_BTN_STOP))
       {
        mode = MODE_STOP;
        while (digitalRead(PIN_BTN_STOP)) delay(1);
       }
       break;
      }
      case MODE_SYNC:
      {
       lcd.setCursor(0,1); lcd.print("start"); delay(200);
       //
       if (digitalRead(PIN_BTN_SYNC))
       {
        syncronize();
        while (digitalRead(PIN_BTN_SYNC)) delay(1);
       }
       if (digitalRead(PIN_BTN_STOP))
       {
        mode = MODE_STOP;
        while (digitalRead(PIN_BTN_STOP)) delay(1);
       }
       break;
      }
      case MODE_STOP:
      {
       lcd.setCursor(0,0); lcd.print("Programm"); delay(200);
       lcd.setCursor(0,1); lcd.print("stop"); delay(200);
       if (digitalRead(PIN_BTN_STOP))
       {
        mode = MODE_MANUAL;
        while (digitalRead(PIN_BTN_STOP)) delay(1);
       }
       break;
      }
     }
    }
     
     
  8. sanik

    sanik Гик

    Теперь надо разобраться что к чему!!:) Пошел листать книжку.... Спасибо вам огромное!!! Насчет Пива я серьезно...
     
  9. Unixon

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

    Там еще не все до конца сделано, как было описано в первом посте, пока я просто порядок навел. Но теперь, надеюсь, вам будет проще разобраться, что, куда и как дальше добавлять.
     
  10. sanik

    sanik Гик

    Да я теперь попробую разобраться, тем более наконец то дошла посылка с ардуиной завтра заберу её, осталось дождаться посылку с линейными подшипниками, и заказать в Амперке моторы которые присмотрел, кое что я уже понял и увидел свои ошибки встречаются непонятные места, поэтому опять перечитываю книги просто стало как то непривычно и упростилось... Спасибо вам за пинок в нужном направлении:)
     
  11. sanik

    sanik Гик

    Совсем запутался с этими учебниками))) можно вас попросить прокомментировать вот эти строчки а то некак не пойму что здесь происходит... ( Кроме печати на ЖК считывания датчиков и нажимания кнопок в этом я разобрался..)
    Код (Text):
     switch (mode)
    {
      case MODE_INIT:
      {
      hello();
      mode = MODE_MANUAL;
      break;
      }
      case MODE_MANUAL:
      {
      processAnalog();
      if (digitalRead(PIN_BTN_SELECT))
      {
        mode = MODE_SELECT_X;
        while (digitalRead(PIN_BTN_SELECT)) delay(1);
      }
      break;
      }
      case MODE_SELECT_X:
      {
      lcd.setCursor(0,0); lcd.print("Setup"); delay(200);
      lcd.setCursor(0,1); lcd.print("X "); delay(200);
      //
      if (digitalRead(PIN_BTN_PLUS))
      {
        if (posX < 1023) posX++;
        while (digitalRead(PIN_BTN_PLUS)) delay(1);
      }
      if (digitalRead(PIN_BTN_MINUS))
      {
        if (posX > 0) posX--;
        while (digitalRead(PIN_BTN_MINUS)) delay(1);
      }
      if (digitalRead(PIN_BTN_SELECT))
      {
        mode = MODE_SELECT_Y;
        while (digitalRead(PIN_BTN_SELECT)) delay(1);
      }
      break;
      }
      case MODE_SELECT_Y:
      {
      lcd.setCursor(0,0); lcd.print("Setup"); delay(200);
      lcd.setCursor(0,1); lcd.print("Y "); delay(200);
      //
      if (digitalRead(PIN_BTN_PLUS))
      {
        if (posY < 1023) posY++;
        while (digitalRead(PIN_BTN_PLUS)) delay(1);
      }
      if (digitalRead(PIN_BTN_MINUS))
      {
        if (posY > 0) posY--;
        while (digitalRead(PIN_BTN_MINUS)) delay(1);
      }
      if (digitalRead(PIN_BTN_SELECT))
      {
        mode = MODE_PROG;
        while (digitalRead(PIN_BTN_SELECT)) delay(1);
      }
      break;
      }
      case MODE_PROG:
      {
      lcd.setCursor(0,0); lcd.print("Programm"); delay(200);
      //
      if (digitalRead(PIN_BTN_START))
      {
        mode = MODE_SYNC;
        while (digitalRead(PIN_BTN_START)) delay(1);
      }
      if (digitalRead(PIN_BTN_STOP))
      {
        mode = MODE_STOP;
        while (digitalRead(PIN_BTN_STOP)) delay(1);
      }
      break;
      }
      case MODE_SYNC:
      {
      lcd.setCursor(0,1); lcd.print("start"); delay(200);
      //
      if (digitalRead(PIN_BTN_SYNC))
      {
        syncronize();
        while (digitalRead(PIN_BTN_SYNC)) delay(1);
      }
      if (digitalRead(PIN_BTN_STOP))
      {
        mode = MODE_STOP;
        while (digitalRead(PIN_BTN_STOP)) delay(1);
      }
      break;
      }
      case MODE_STOP:
      {
      lcd.setCursor(0,0); lcd.print("Programm"); delay(200);
      lcd.setCursor(0,1); lcd.print("stop"); delay(200);
      if (digitalRead(PIN_BTN_STOP))
      {
        mode = MODE_MANUAL;
        while (digitalRead(PIN_BTN_STOP)) delay(1);
      }
      break;
      }
    }
    }
     
  12. Unixon

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

    Как работает switch-case понятно?
     
  13. sanik

    sanik Гик

    Надеюсь я правильно понял? И хотелось бы узнать правильно ли сделал вывод значения posX++ на ЖК?:)

    Код (Text):

    {
     switch (mode)//cравнение
     {
      case MODE_INIT:
      {
       hello(); // выполняется когда mode
       mode = MODE_MANUAL;
       break;
      }
      case MODE_MANUAL://ожидание нажатия select
      {
       processAnalog();
       if (digitalRead(PIN_BTN_SELECT)) // чтение входа кн select
       {
        mode = MODE_SELECT_X;//ожидание 2ого нажатия кн select
        while (digitalRead(PIN_BTN_SELECT)) delay(1);//режим установки датчика Х
       }
       break;
      }
      case MODE_SELECT_X:
      {
       lcd.setCursor(4,0); lcd.print("Setup"); delay(200);
       lcd.setCursor(4,1); lcd.print("X %d "); delay(200);
       //
       if (digitalRead(PIN_BTN_PLUS))// чтение входа кн +
       {
        if (posX < 1023) posX++;
        while (digitalRead(PIN_BTN_PLUS)) delay(1);
            printf("X %d ",posX);
      //
     
  14. Unixon

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

    Нет конечно. Вы печатаете на экране "X %d " - именно так, без подстановок, а потом вызываете printf(), который будет делать... что, как вы думаете? На AVR, где нет стандартного устройства вывода, если его руками не сделать? И где, тем более, никто printf() к lcd не привязывал? Правильно, ничего. В крайнем случае где-то реализована отправка строки в UART...

    Поэтому все делаем ручками:
    Код (Text):

    case MODE_SELECT_X:
    {
      lcd.setCursor(4,0); lcd.print("Setup"); delay(200);
      lcd.setCursor(4,1); lcd.print("X "); delay(200);
      //
      if (digitalRead(PIN_BTN_PLUS))// чтение входа кн +
      {
        if (posX < 1023) posX++;
        while (digitalRead(PIN_BTN_PLUS)) delay(1);
        lcd.setCursor(4,1); lcd.print("X "); lcd.print(posX);
     
     
  15. sanik

    sanik Гик

    Вот что делают заумные статьи:) Оказывается все намного проще!!! Спасибо!!!
     
  16. sanik

    sanik Гик

    Наконец пришли все посылки собрал все в кучу, пробую разные варианты , застрял вот на чем:
    Как сбросить значения posX ,posY на ноль, остановить моторы отключить PIN_POS_X, PIN_POS_Y (не читать значения выводов) При нажатии PIN_BTN_SELECT ? У меня сбрасываются только значения на экране..

    Код (Text):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
     
    LiquidCrystal_I2C lcd(0x27,16,2);
     
    const byte PIN_POS_X = A0;
    const byte PIN_POS_Y = A1;
    int posX, posY = 0;
    int a = HIGH, b=LOW;
     
    const byte PIN_HALL_X = A2;
    const byte PIN_HALL_Y = A3;
     
    const byte PIN_BTN_SELECT = 5;
    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  = 8;
     
    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_ANALOG  = 6;
    byte mode = MODE_INIT;
     
    const byte PIN_ENA = 11; // А2 НЕХ
    const byte PIN_IN1 = 12;
    const byte PIN_IN2 = 13;
    const byte PIN_ENB = 3;
    const byte PIN_IN3 = 9;      
    const byte PIN_IN4 = 10;
     
     
    void setup()
    {
    Serial.begin(9600);
    lcd.init(); lcd.backlight(); lcd.clear();
     
    pinMode(PIN_HALL_X, INPUT);
    pinMode(PIN_HALL_Y, INPUT);
     
    pinMode(PIN_BTN_SELECT, OUTPUT);
    pinMode(PIN_BTN_START, OUTPUT);
    pinMode(PIN_BTN_ANALOG, OUTPUT);
    pinMode(PIN_BTN_PLUS, OUTPUT);
    pinMode(PIN_BTN_MINUS, OUTPUT);
    pinMode(PIN_BTN_SYNC, OUTPUT);
     
    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()
    {
    lcd.setCursor(1, 0); lcd.print("Hello TaimLaps"); delay(500);
    lcd.setCursor(1, 1); lcd.print("Slidecam Uno V1"); delay(200);
    delay(3000);
    lcd.clear(); lcd.setCursor(5,0); lcd.print("ANALOG"); delay(200);
    }
    //Тип данных int (целое число) для хранения чисел.
    int correction(const int x)//квалификатор переменной, только для чтения
    {
    if(x >= 0 && x < 100) return -10,a==HIGH,b==LOW;//if, используется в сочетании с операторами сравнения,
    if(x > 100 && x < 400) return -5,a==HIGH,b==LOW; //проверяет, достигнута ли истинность условия
    if(x> 400 && x < 530) return 0,a==HIGH,b==LOW; //return;Прекращает вычисления в функции и возвращает
    if(x > 535 && x < 700) return +1,a==LOW,b==HIGH;//значение из прерванной функции в вызывающую, если это нужно.
    if(x > 700 && x < 900) return +5,a==LOW,b==HIGH;
    if(x > 900) return +10,a==LOW,b==HIGH;
    return 0;
     
    }
     
     
     
    void processAnalog()// void используется при объявлении функций
    {
    lcd.clear(); lcd.setCursor(5,0); lcd.print("ANALOG"); delay(200);
    {
    posX = analogRead(PIN_POS_X);// переменая считывает PIN_POS_X
    posX += correction(posX);//данные пина + данные переменой posX
    digitalWrite(PIN_IN3, a); // направление мотора
    digitalWrite(PIN_IN4, b);
    analogWrite(PIN_ENB, posX/4);
    delay(50);
     
    posY = analogRead(PIN_POS_Y);
    posY += correction(posY);
    digitalWrite(PIN_IN1, a);
    digitalWrite(PIN_IN2, b);
    analogWrite(PIN_ENA, posY/4);
    delay(50);
    }
    }
    void syncronize()
      {
     
    {
    for (int i = 85; i <= 255; i+=85)
    {
      digitalWrite(PIN_IN3, HIGH);
      digitalWrite(PIN_IN4, LOW);
      analogWrite(PIN_ENB, i);
      delay(analogRead(posX));
    }
    for (int i = 85; i <= 255; i+=85)
    {
      digitalWrite(PIN_IN1, HIGH);
      digitalWrite(PIN_IN2, LOW);
      analogWrite(PIN_ENA, i);
      delay(analogRead(PIN_HALL_Y));
    }
     
    }
      }
    void loop()
    {
    switch (mode)//cравнение
    {
      case MODE_INIT:
      {
      hello(); // выполняется когда mode
      mode = MODE_MANUAL;
      break;
     
      }
      case MODE_MANUAL://ожидание нажатия select
      {
      processAnalog();
      if (digitalRead(PIN_BTN_SELECT)) // чтение входа кн select
      {
        mode = MODE_SELECT_X;//ожидание 2ого нажатия кн select
        while (digitalRead(PIN_BTN_SELECT)) delay(1);//режим установки датчика Х
     
      }
      break;
      }
      case MODE_SELECT_X:
      {
      lcd.setCursor(4,0); lcd.print("SETUP  "); delay(200);
      lcd.setCursor(4,1); lcd.print("X "); delay(200);
      //
        {
      if (posY=0);
      if (posX=0);
        }
      if (digitalRead(PIN_BTN_PLUS))// чтение входа кн +
      {
            if (posX < 1023) posX++;
        while (digitalRead(PIN_BTN_PLUS)) delay(1);
            lcd.setCursor(4,1); lcd.print("X "); lcd.print(posX);
      }
      if (digitalRead(PIN_BTN_MINUS))
      {
        if (posX > 0) posX--;
        while (digitalRead(PIN_BTN_MINUS)) delay(1);
            lcd.setCursor(4,1); lcd.print("X "); lcd.print(posX);
      }
      if (digitalRead(PIN_BTN_SELECT))
      {
        mode = MODE_SELECT_Y;
        while (digitalRead(PIN_BTN_SELECT)) delay(1);
      }
      break;
      lcd.clear();
      }
      case MODE_SELECT_Y:
     
      {
     
      lcd.setCursor(4,0); lcd.print("SETUP  "); delay(200);
      lcd.setCursor(4,1); lcd.print("Y "); delay(200);
      //
      if (digitalRead(PIN_BTN_PLUS))
      {
         
        if (posY < 1023) posY++;
        while (digitalRead(PIN_BTN_PLUS)) delay(1);
            lcd.setCursor(4,1); lcd.print("Y "); lcd.print(posY);
      }
      if (digitalRead(PIN_BTN_MINUS))
      {
        if (posY > 0) posY--;
        while (digitalRead(PIN_BTN_MINUS)) delay(1);
            lcd.setCursor(4,1); lcd.print("Y "); lcd.print(posY);
      }
      if (digitalRead(PIN_BTN_SELECT))
      {
        mode = MODE_PROG;
        while (digitalRead(PIN_BTN_SELECT)) delay(1);
      }
      break;
      }
      case MODE_PROG:
      {
      lcd.clear();
      lcd.setCursor(4,0); lcd.print("PROGRAMM "); delay(200);
      //
      if (digitalRead(PIN_BTN_START))
      {
        mode = MODE_SYNC;
        while (digitalRead(PIN_BTN_START)) delay(1);
      }
      if (digitalRead(PIN_BTN_ANALOG))
      {
        mode = MODE_ANALOG;
        while (digitalRead(PIN_BTN_ANALOG)) delay(1);
     
      }
      break;
      }
      case MODE_SYNC:
      {
      lcd.clear();
      lcd.setCursor(4,0); lcd.print("PROGRAMM "); delay(200);
      lcd.setCursor(5,1); lcd.print("START  "); delay(200);
     
      {
        static uint8_t prev_state = LOW;
        uint8_t state = digitalRead(9);
        if (state != prev_state)
        prev_state = state;
      }
     
      {
        static uint8_t prev_state = LOW;
        uint8_t state = digitalRead(10);
        if (state != prev_state)
        prev_state = state;
      }
     
        if (digitalRead(PIN_BTN_SYNC))
      {
        syncronize();
        while (digitalRead(PIN_BTN_SYNC)) delay(1);
      }
      if (digitalRead(PIN_BTN_ANALOG))
      {
        mode = MODE_ANALOG;
        while (digitalRead(PIN_BTN_ANALOG)) delay(1);
      }
      break;
      }
      case MODE_ANALOG:
      {
      lcd.clear();
      lcd.setCursor(4,0); lcd.print("PROGRAMM "); delay(200);
      lcd.setCursor(6,1); lcd.print("STOP  "); delay(200);
      if (digitalRead(PIN_BTN_ANALOG))
      {
        mode = MODE_MANUAL;
        while (digitalRead(PIN_BTN_ANALOG)) delay(1);
            processAnalog(); // analog
      }
      break;
      }
    }
    }
     
     
  17. Unixon

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

    Ну так у вас по схеме в режиме SELECT_ взаимодействия с двигателями не предусмотрено.
    Хоть бы рассказали зачем эти все махинации нужны...
     
  18. sanik

    sanik Гик

    Пытаюсь сделать универсальный слайдер для обычных съемок режим Analog и съемки Timelaps в режиме Programm моторы в этом режиме синхронизируются от фотокамеры.. В принцепе это не критично: просто когда регулятор скорости не вывернешь на ноль при нажатии setup мотры все равно двигаются, еще пока проблема с датчиками пробую взять алгоритм http://forum.amperka.ru/threads/Станок-2х-координатный.961/ пока не получается...
     
  19. sanik

    sanik Гик

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

    sanik Гик

    Я попробовал сделать так: Почему моторы не останавливаются? Ведь в MODE_SELECT_X я устанавливаю значения posX !:eek:

    Код (Text):
    void syncronize()
    {
     
      digitalWrite(PIN_IN3, HIGH);
      analogWrite(PIN_ENB, 200); //управление скоростью
      delay(posX); // задержка на заданное количество
      digitalWrite(PIN_IN1, HIGH);
      analogWrite(PIN_ENA, 200);
      delay(posY); //задержка на заданное количество
    {
      mode = MODE_SYNC;
     
          if (digitalRead(PIN_BTN_SYNC))
      {
        syncronize();
        while (digitalRead(PIN_BTN_SYNC)) delay(1);
      }
    }
    }