Концевики и шаговый двигатель

Тема в разделе "Arduino & Shields", создана пользователем Airo, 4 июн 2023.

  1. Airo

    Airo Нерд

    Почти работает. Я только поменял
    if(!digitalRead(leftSensor)), if(!digitalRead(rightSensor)) на if(digitalRead(leftSensor)), if(digitalRead(rightSensor)) так как концевик работает немного по другому изначально в инверсии.
    Вы поняли то что я хотел но есть 1 проблема это дребезг. По сути пока кнопка зажата проиходит дребезг но как только она отжимается все работает как надо.
     
  2. Airo

    Airo Нерд

    С трудом вас понимаю. Но да. Есть только проблема с циклами если я буду использовать for то все что после него не будет работать пока не выйду из цикла. А там еще есть другой двигатель работающий по другим принципам. Еще планирую добавить LCD дисплей с инкодером и сделать свеого рода меню для управления скоростью двигателей, временем и режимами работы.
     
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Под циклом здесь понимается - главный цикл - работа программы - Loop{}. Просто компилятор скрывает от нас команду в коде безусловного перехода из конца программы в начало.
     
    Последнее редактирование: 6 июн 2023
  4. Sergku

    Sergku Нерд

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


    Код (C++):
    if(!digitalRead(leftSensor)){
            processTmr = millis();
            currentDirection = !currentDirection;
            digitalWrite(dirPin, currentDirection);
            digitalWrite(stepPin, HIGH);
        }
     
    Последнее редактирование: 6 июн 2023
  5. ivan_alexoff

    ivan_alexoff Гик

    Это не флаг, это - тряпка. Флаг это когда кОретко приехала, допустим, вправо и когда сработал правый концевик вы подняли right_flag=1; left_flag=0. Дальше пишется условие if (все планеты сошлись и right_flag==1) едем влево и нам пофиг на КЛАЦ-КЛАЦ-КЛАЦ концевика. Приехали влево, сработал концевик, меняем флаги right_flag=0; left_flag=1 и дальше все повторяется, но уже в другую сторону
     
  6. Airo

    Airo Нерд

    Интересно звучит. А можете показать как это отобразить в коде.
     
  7. parovoZZ

    parovoZZ Гуру

    Я бы все это делал на машине состояний.
     
  8. Airo

    Airo Нерд

    К сожалению, дребезг остался. Как только достигает концевика, начинает дребезжать на месте туда-сюда.
     
  9. Sergku

    Sergku Нерд

    тогда так :
    Код (C++):

    if(digitalRead(leftSensor)){
            processTmr = millis();
            currentDirection = false;
        }

        if(!digitalRead(rightSensor)){
            processTmr = millis();
            currentDirection = true;
        }
    или на оборот (я про направление ложь/истина).
     
  10. Airo

    Airo Нерд

    Наработает. Менял и ложь/истина и !digitalRead
     
  11. Sergku

    Sergku Нерд

    А точно там все правильно подключено? Пины, напряжения? Если да, то у меня больше мыслей нет, по этому поводу
     
  12. Airo

    Airo Нерд

    Проверил все подключено нормально. Я думаю может какую то маленькую задержку поставить при контакте с концевиком 50 или 100мсек.
     
  13. Airo

    Airo Нерд

    Я попробовал банальный делей поставить и все заработало, но конечно делей не вариант тут использовать. Все таки он замедляет работу.
    Код (C++):
    if(digitalRead(leftSensor)){
            processTmr = millis();
            currentDirection = true;
            delay(100);
        }

        if(digitalRead(rightSensor)){
            processTmr = millis();
            currentDirection =false ;
            delay(100);

        }
     
  14. Sergku

    Sergku Нерд

    можно попробовать, как писали выше, steppin сигнал инвертировать. Видимо в этом проблема. У меня под рукой железяк нет, поэтому могу только предполагать
     
  15. Airo

    Airo Нерд

    Я не совсем понимаю что значит "steppin сигнал инвертировать". Я думал
    currentDirection = true; это и есть инверсия.
     
  16. Sergku

    Sergku Нерд

    это направление. а есть еще тики для шагов
    Код (C++):
    digitalWrite(stepPin, !digitalRead(stepPin));
    но можно, при смене направления по датчикам сдвинуть внутренний таймер моторов (чтоб без делай)
    Код (C++):

    if(digitalRead(leftSensor)){
            currentDirection =true;
            processTmr = millis();
            motorTmr = millis() + 90;
       }
    if(digitalRead(rightSensor)){
            currentDirection =false;
            processTmr = millis();
            motorTmr = millis() + 90;
       }
    в таком случае, он подождет 100 мс и начнет крутить в другую сторону (а не 10 мс)
     
  17. Airo

    Airo Нерд

    Я попробовал, но что-то не так он просто зависает и двигатель начинает просто пищать. При этом ни каких движения не происходит.
     
    Последнее редактирование: 7 июн 2023
  18. Sergku

    Sergku Нерд

    вообще, движки дело тонкое и индивидуальное, я когда настраивал свои, брал приличное время переключения обмоток (пин степ), затем его уменьшал, и смотрел как он себя ведет. Не пропускает ли шаги, не долбит ли на 1 месте, не греется и т.п. Тут за переключение обмоток отвечает время motorDelay =10;// Для обмоток мотора. поэтому советую с ним поиграться.
     
  19. ivan_alexoff

    ivan_alexoff Гик

    Код (C++):
    if(digitalRead(leftSensor) && left_flag){
      left_flag=0;
      right_flag=1;
            processTmr = millis();
            currentDirection = true;
           }

        if(digitalRead(rightSensor) && right_flag){
          left_flag=1;
          right_flag=0;
            processTmr = millis();
            currentDirection =false ;
            }
     
  20. Airo

    Airo Нерд

    Проверил ваш код. Он ни чего не дал. Концевики в этом случае вообще ни как не влияют на работу как будто их и нет. Может я конечно не так отобразил ваш код.
    Код (C++):
    unsigned long
      motorTmr = 0,
      processTmr= 0;
           
    float
      processDelay = 630, // Общее вращение
      motorDelay = 1; // Для обмоток мотора

    bool
        currentDirection = false,
        left_flag = false,
        right_flag = false;

    const byte
      leftSensor = 8,
      rightSensor = 9,
      dirPin = 3,
      stepPin = 2;

    void setup(){
      pinMode(leftSensor, INPUT_PULLUP);
      pinMode(rightSensor, INPUT_PULLUP);
      pinMode(dirPin, OUTPUT);
      pinMode(stepPin, OUTPUT);
      motorTmr = processTmr = millis();
    }

    void loop(){

       if(digitalRead(leftSensor) && left_flag){
      left_flag=0;
      right_flag=1;
            processTmr = millis();
            currentDirection = true;
           }

        if(digitalRead(rightSensor) && right_flag){
          left_flag=1;
          right_flag=0;
            processTmr = millis();
            currentDirection =false ;
            }
     
        if (millis() - processTmr <= processDelay){
            if(millis() - motorTmr >= motorDelay){
                motorTmr = millis();
                digitalWrite(dirPin, currentDirection);
                digitalWrite(stepPin, !digitalRead(stepPin));
            }  
        } else {
            processTmr = millis();
            currentDirection = !currentDirection;
        }
    }