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

Тема в разделе "Arduino & Shields", создана пользователем Azret, 10 апр 2017.

  1. Azret

    Azret Нуб

    Здравствуйте! Проблема при запуске шагового двигателя с кнопки, если говорить точнее, нужно при нажатии кнопки провернуть шаговый двигатель на N-ое число оборотов. По аналогии с диодами, я написал скетч, только чтобы повернуть двигатель нужно держать зажатой кнопку, т.е. должен поступать непрерывно сигнал HIGH. У меня сложности именно в том, чтобы просто при одном клике кнопки, двигатель провернулся на указанные мною N-оборотов, потом при повторном нажатии двигатель опять провернулся на эти N- оборотов.. Подскажите, какую логическую функцию я должен создать, чтобы программа воспринимала один клик для старта двигателя. Спасибо.
     
  2. olegoriy

    olegoriy Гик

    Нету под рукой шаговика, но на вскидку как то так:
    Код (C++):

      #include <AccelStepper.h>
       AccelStepper Stepper1(1,13,12); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988)
       int KNOPKA = A0;               // пин кнопки
       int steeps = 1000;              // количество шагов
       long KNO1 = 0;                // Исходное значение для таймера.
       long KNO2 = 200;              // 200 милисекунд предотвращения повторного нажатия
       int dir = 1;                 //используется для смены направления

    void setup() {

      Stepper1.setMaxSpeed(1000);     //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
      Stepper1.setAcceleration(700);  //устанавливаем ускорение (шагов/секунду^2)
      pinMode(KNOPKA, INPUT_PULLUP);   // включаем внутренний подтягивающий резистор
      }

    void loop() {

      unsigned long r = millis();

       if(digitalRead(KNOPKA) == 0){
      if(r - KNO1 > KNO2){
        dir = dir*(-1);
        Stepper1.move(steeps*dir);
        KNO1 = r;}}

      Stepper1.run();

    }
    Если используете другой драйвер то измените во 2-ой строчке значения под свой драйвер и пины.
     
    Последнее редактирование: 10 апр 2017
  3. olegoriy

    olegoriy Гик

    Ой. Выше код при котором при нажатии будет ездить туда сюда.
    Чтобы в одну сторону вот так можно попробовать и с другой библиотекой
    Код (C++):
     #include <Stepper.h>
    int KNOPKA = A0;                 // пин кнопки
    const int INX1 = A1;             // пины двигателя Х
    const int INX2 = A2;
    const int INX3 = A3;
    const int INX4 = A5;
    long KNO1 = 0;                // Исходное значение для таймера.
    long KNO2 = 200;              // 200 миллисекунд предотвращения повторного нажатия
    const int steps = 500;       // количество шагов
    Stepper myStepperX(steps, INX1, INX2, INX3, INX4);


    void setup() {
      myStepperX.setSpeed(1000);
      pinMode(KNOPKA, INPUT_PULLUP);
      }

    void loop() {


      unsigned long r = millis();
      if(digitalRead(KNOPKA) == 0){
        if(r - KNO1 > KNO2){
          for (int i=0; i < steps; i++){
             myStepperX.step(1);
             };
        KNO1 = r;}}
        }
     
    Последнее редактирование: 10 апр 2017
  4. Azret

    Azret Нуб


    спастбо, сейчас попробую)
     
  5. Azret

    Azret Нуб

    #include <AccelStepper.h>
    AccelStepper Stepper1(4, 8, 9, 10, 11); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988)
    int KNOPKA = 7; // пин кнопки
    int steeps = 5000; // количество шагов
    long KNO1 = 0; // Исходное значение для таймера.
    long KNO2 = 200; // 200 милисекунд предотвращения повторного нажатия
    int dir = 1; //используется для смены направления

    void setup() {

    Stepper1.setMaxSpeed(1000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
    Stepper1.setAcceleration(700); //устанавливаем ускорение (шагов/секунду^2)
    pinMode(KNOPKA, INPUT_PULLUP); // включаем внутренний подтягивающий резистор
    }

    void loop() {

    unsigned long r = millis();

    if(digitalRead(KNOPKA) == 1)
    {
    if(r - KNO1 > KNO2)
    {
    // dir = dir*(-1);
    Stepper1.moveTo(steeps*dir);
    KNO1 = r;
    }

    }

    Stepper1.run();

    }

    При клике запускается, но при повторном нажатии - тишина...
     
  6. olegoriy

    olegoriy Гик

    откуда перед dir взялось // ???
     
  7. Azret

    Azret Нуб

     
  8. olegoriy

    olegoriy Гик

    попробуйте так:
    if(digitalRead(KNOPKA)==0){
    if(r - KNO1 > KNO2){
    Stepper1.move(steeps);
    steeps = steeps + steeps;
    KNO1 = r;}}
     
  9. Azret

    Azret Нуб

    спасибо) только правильно оказалось

    steeps=steeps*1