"Нолик" просит помощи в коде для шаговика

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Gvozd, 20 мар 2016.

Метки:
  1. Gvozd

    Gvozd Нуб

    Всем привет.
    Имеем:
    Wantai Stepper Motor 42BYGHW208, 0,4 А, 9В, 200 шагов,
    драйвер pololu A4988,
    Iskra mini.
    Необходимо в полношаговом режиме вращать ось (шпилька М8) при нажатии на кнопку 1 вниз, если отпустить кнопку нужно получить движение вверх, если нажали кн.1 снова то двигаемся вниз. необходимо два концевика: верхний (кн.2) - если нажат, то выключаем двигатель, если нажали кн.1, то идём вниз, если дошли до нижнего концевика (кн.3), то движение вверх. И так постоянно.
    Программирование - это не моё - всё на что хватило фантазии ниже.

    Код (C++):
    const byte stepPin = 13;
    const byte directionPin = 12;
    const byte enablePin = 11;
    //кнопки подключаются между пином и GND
    const byte buttonPin1 = 2; //если нажата, то включить двигатель digitalWrite(enablePin, HIGH), двигатся до концевика 3 или до
    // отпускания кнопки
    const byte buttonPin2 = 3;//если нажат, то отключить двигло digitalWrite(enablePin, LOW)
    const byte buttonPin3 = 4;//если нажат, меняем направление движения, двигаемся до концевика 2 или до нажатия кнопки 1



    // Выдержка для регулировки скорости вращения
    unsigned int delayTime = 20;

    void setup()
    {
      // Настраиваем нужные контакты на вход и выход
      pinMode(buttonPin1, INPUT_PULLUP);
      pinMode(buttonPin2, INPUT_PULLUP);
      pinMode(buttonPin3, INPUT_PULLUP);
     
      pinMode(stepPin, OUTPUT);
      pinMode(directionPin, OUTPUT);
      pinMode(enablePin, OUTPUT);
      // Отключаем двигатель
      digitalWrite(enablePin, LOW);
    }

    void loop()
    {
      // если кнопка 1 нажата
      if(!digitalRead(buttonPin1))
      {
        // Подаём питание на двигатель
        digitalWrite(enablePin, HIGH);

        // Задаём направление вращения по часовой стрелке
        digitalWrite(directionPin, HIGH);
     
       
        }

     

        // Отключаем двигатель
        digitalWrite(enablePin, LOW);
      }
    }
    подключение.png drayver-shagovogo-dvigatelja-dlja-3d-printerov-robotale-a4988-154048948.jpg
     
  2. Megakoteyka

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

    В loop() две открывающиеся фигурные скобки и три закрывающиеся, так нельзя.
    Попробуйте сперва просто покрутить шаговик хотя бы в одну сторону, потом уже начинайте условия добавлять.
     
  3. Gvozd

    Gvozd Нуб

    Да вот с условиями и прочим беда, не умею я прогит. Помогите.
     
  4. Limoney

    Limoney Гик

    Учитесь
     
  5. Megakoteyka

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

    Код (C++):
    if(нажата_кнопка)
    {
      if(не_нажат_концевик_1)
        сделать_шаг_вниз();
    }
    else
    {
      if(не_нажат_концевик_2)
        сделать шаг_вверх();
    }

    ждать_20_мс();
    Направление переключайте, когда нужно сделать очередной шаг и не забывайте дергать за step.
     
  6. Gvozd

    Gvozd Нуб

    У простил себе задачу: крутить в одну сторону от нажатия кнопки: нажал на кнопку - загорелся светик на 13 пине и закрутился двигатель.
    А получилось: подал напряжение - загорелся светик - закрутился двигатель; кнопку вообще не нажимал.
    Код (C++):
    #define LED_PIN 13
    const byte stepPin = 12;
    const byte directionPin = 11;
    const byte enablePin = 10;
    //кнопки подключаются между пином и GND
    const byte buttonPin1 = 2; //если нажата, то включить двигатель digitalWrite(enablePin, HIGH), двигатся до концевика 3 или до
    // Выдержка для регулировки скорости вращения
    unsigned int delayTime = 10;

    void setup()
    {
      // Настраиваем нужные контакты на вход и выход
      pinMode(buttonPin1, INPUT_PULLUP);
      pinMode(stepPin, OUTPUT);
      pinMode(directionPin, OUTPUT);
      pinMode(enablePin, OUTPUT);
      pinMode(LED_PIN, OUTPUT);
      // Отключаем двигатель
      digitalWrite(enablePin, LOW);

    }

    void loop()
    {
      // если кнопка 1 нажата
      if(digitalRead(buttonPin1))
      { digitalWrite(LED_PIN, HIGH);
        // Подаём питание на двигатель
        digitalWrite(enablePin, HIGH);
        // Задаём направление вращения по часовой стрелке
        digitalWrite(directionPin, HIGH);
        // крутим двигло
        for (int i = 0; i < 400; ++i)
          { digitalWrite(stepPin, HIGH);
            delay(delayTime);
            digitalWrite(stepPin, LOW);
            delay(delayTime);
          }
       }
     
    }
     
  7. Megakoteyka

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

    А если нажать кнопку и держать - останавливается?
     
  8. Gvozd

    Gvozd Нуб

    нет всё остается без изменений
     
  9. Megakoteyka

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

    Как кнопку подключали? Ничего не перепуталось?
     
  10. Gvozd

    Gvozd Нуб

    Кнопка в данном случае приметив - провод с пина 2 и провод с земли - замкнул два провода, разомкнул - типо нажал кнопку.
     
  11. Gvozd

    Gvozd Нуб

    Да если вообще кнопку физически отключить - то подал напряжение - LED на пине 13 горит, двигло вращается.
     
  12. Gvozd

    Gvozd Нуб

    Наверно неправильно читаю кнопку: if(digitalRead(buttonPin1))
    Может так: if(digitalRead(buttonPin1)== HIGH)
     
  13. Megakoteyka

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

    Можно и так, и сяк.
    Попробуйте на другой пин перейти и уберите весь код шаговика. Оставьте просто включение светодиода по кнопке. Работает в таком виде?
     
  14. Gvozd

    Gvozd Нуб

    Спасибо за помощь. Сейчас проверить не могу - я с планшета, а комп у детей спят.
    После проверки отпишусь.
    Буду дальше мучить Яндекс и свой мозг.
     
  15. Gvozd

    Gvozd Нуб

    Всем привет. Попробовал такой код
    Код (C++):
    #define LED_PIN 13

    const byte button1 = 2;
    void setup()
    {  pinMode(button1, INPUT_PULLUP);
       pinMode(LED_PIN, OUTPUT);
    }

    void loop()
    {
      if(digitalRead(button1)== HIGH)
      { digitalWrite(LED_PIN, HIGH);
       }
     
    }
    Всё безрезультатно: есть или нет кнопка физически - светодиод на пине 13 горит сразу.
    Итакой:
    Код (C++):
    void setup()
    {
       pinMode(13, OUTPUT);
    }

    void loop()
    {
      digitalWrite(13,analogRead(A0)); //состояние входа равно состоянию выхода
    }
    С таким кодом светодиод горит сразу, при нажатии кнопки начинает мерцать (ярче, слабее, но не гаснет).
     
  16. Gvozd

    Gvozd Нуб

    Попробовал всё тоже на Искра Нео - результат один в один, как с Мини.
     
  17. SirYorik

    SirYorik Нуб

    я бы удостоверился что провода хорошо контачат(а похоже что не очень), и что второй провод точно на земле а не гдето еще.

    потом INPUT_PULLUP заменил бы на INPUT а резюк с пина на +vcc сделал внешний на 2-10ком.

    если не поможет - перейти на другой пин.(не ваш случай)

    не равно. analogRead выдает цифру от 0 до 1023 а не HIGH|LOW, всё что больше 1 должно считаться за HIGH(true). для защиты от мерцания надо подавление дребезга "кнопки" прикрутить

    ну так а где вывод LOW в пин?
    HIGH сам по себе не сбросится - светодиод не погаснет.
    а поскольку кнопка коротит на землю, то в первом-же проходе led включается и более не выключается. если при включении ардуины кнопку нажать - то led потухший, отпустить - засветился навсегда.
     
    Последнее редактирование: 25 мар 2016