Библиотека Accelstepper

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

  1. b707

    b707 Гуру

    нет, неправильно. Вы путаете координаты и скорость Команда moveTo(1500) просто переместит мотор в точку 1500, скорость при этом останется прежней - 1000.
     
  2. AlexArt

    AlexArt Нуб

    в примерах нету примера... как плавно повысить (или понизить) скорость не останавливая мотор.... Может я что то пропустил... подскажите... если знаете... спасибо... По поводу форума... всегда считал .. что тут могут подсказать и направить...
     
  3. b707

    b707 Гуру

    Покопался в Гугле (хотя это должны были делать Вы) и что-то прихожу к выводу, что библиотека не умеет менять установки скорости во время движения. Если вы хотите иметь такую возможность - надо разбивать интервал перемещения на отрезки и перед каждым из них задавать свое значение скорости.
    Но если делать так - то непонятно, нафига вообще нужна библиотека, если плавное изменение скорости задавать вручную Эта задача довольно просто решается и без библиотек ,, особенно если управлять мотором через драйвер типа 4988. В этом случае все что нам нужно для вращения мотора - это давать импульсы на пин STEP. Делая эти импульсы чаще или реже - вы получаете в свои руки полный контроль над скоростью и ускорением мотора в любой момент времени

    Вот кстати дискуссия, где участник говорит тоже самое почти теми же словами...
    https://forum.arduino.cc/index.php?topic=254463.0
     
    Последнее редактирование: 14 авг 2019
  4. AlexArt

    AlexArt Нуб


    Спасибо за то.. что потратили свое время... Программно я умею... запрограммировать и плавную остановку и изменение скорости на ходу.... это я все могу ручками написать... с помощью циклов и проверок.. так и всегда делал... Но недавно узнал что в библиотеке есть некоторые команды которыми можно это все делать двумя... тремя операторами... (спасибо... подсказал Onkel Гуру) а.. если я пишу циклы... программный код увеличивается в 5-6 раз длиннее.. Думал кто то подскажет упрощенный вариант команд.... что бы можно было сократить писанину.... Вот такие делы))
     
  5. Добрый день!
    Царапаю небольшой проектик на ардуино. Со многим вроде разобрался, но сейчас просто уперся в стену(((
    Имеется небольшая установка которая через винт поднимает узел до датчика, затем опускает на выставленную величину, одновременно включая вращение 2го ШД. На пульте имеется экранчик и кнопки выставления скорости движения привода и соответственно расстояния. Двигатель должен останавливаться в момент обнуления по датчику или по кнопке стоп, затем по достижению заданного расстояния либо по кнопке стоп.

    Суть проблемы такова: двигатель обнуляется по датчику (либо по нажатию кнопки стоп), а вот на заданное расстояние реагирует как зря (при заданном 5мм может проехать 40мм, потом при увеличении до 10мм -45, потом зависимость увеличения заданного расстояния и дейсвительного пропадает и т.д.)

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

    вот мой корявый скейч:
    Код (C++):
    #include <LiquidCrystal.h>
    #include <EEPROM.h>
    #include <AccelStepper.h>
    #include <MultiStepper.h>
    LiquidCrystal lcd(34, 36, 38, 40, 42, 44); // (RS, E, DB4, DB5, DB6, DB7)
    AccelStepper motor1(1, A0, A1); //
    AccelStepper motor2(1, A2, A3);

    #define pod_plus 20  // кнопка подача
    #define pod_minus 18 // кнопка подача
    #define but_start 30 //кнопка пуск
    #define but_stop 21 //кнопка стоп
    #define but_vverh 28 //кнопка вверх
    #define but_vniz 24 //кнопка вниз
    #define dlin_plus 32 //длинна +
    #define dlin_minus 26 //длинна -
    #define dat_verh 8 //верхний датчик
    #define dat_niz 9 //нижний датчик
    #define but_reset 19 //реле память-reset
    #define rele_reset 7
    #define rele_tvch 6
    #define rele_voda 5
    int a = 10000; // ускоренная
    int b=8000;//обнуление
    int shagi=1;
    int counter = 1;//минимальная подача

    void setup() {
    pinMode (pod_plus, INPUT);
    pinMode (pod_minus, INPUT);
    pinMode (but_start, INPUT);
    pinMode (but_stop, INPUT);
    pinMode (but_vverh, INPUT);
    pinMode (but_vniz, INPUT);
    pinMode (dlin_plus, INPUT);
    pinMode (dlin_minus, INPUT);
    pinMode (dat_verh, INPUT);
    pinMode (dat_niz, INPUT);
    pinMode (but_reset, INPUT);
    pinMode (rele_reset, OUTPUT);
    pinMode (rele_tvch, OUTPUT);
    pinMode (rele_voda, OUTPUT);
    pinMode(but_start, INPUT);

    motor1.setMaxSpeed(10000);
    motor1.setAcceleration(5000);
    motor2.setMaxSpeed(10000);
    motor2.setSpeed(5000);

      lcd.begin(16, 2);
      lcd.clear();
      lcd.setCursor(0, 0);      
      lcd.print("PODACHA:");      
      lcd.setCursor(0, 1);        
      lcd.print("DLINNA:");        
             
    digitalWrite(rele_tvch,HIGH);
    digitalWrite(rele_voda,HIGH);
    digitalWrite(rele_reset,HIGH);
    }

    void loop() {

      static unsigned long last_time3;
    if(millis()- last_time3 >= 150&(shagi)<=60&digitalRead(dlin_plus) == HIGH )
      {
      shagi=shagi+1;
      last_time3 = millis();
      }

      static unsigned long last_time4;
    if(millis()- last_time4 >= 150&(shagi)>=1&digitalRead(dlin_minus) == HIGH )
      {
      shagi=shagi-1;
      last_time4 = millis();
      }

      static unsigned long last_time1;
    if(millis()- last_time1 >= 150&(counter)<=19&digitalRead(pod_plus) == HIGH )
      {
      counter=counter+1;
      last_time1 = millis();
      }

      static unsigned long last_time2;
    if(millis()- last_time2 >= 150&(counter)>=1&digitalRead(pod_minus) == HIGH )
      {
      counter=counter-1;
      last_time2 = millis();
      }

      float conprint=counter;
      float dlin=shagi*5;

      motor1.moveTo(shagi*3200);

      lcd.setCursor(14, 0);              
      lcd.print(conprint);
      lcd.setCursor(8, 1);              
      lcd.print(dlin);
      lcd.setCursor(14, 1);
      lcd.print("mm");

    if (digitalRead(but_start) == HIGH) //цикл подачи
      {
     
      while(digitalRead(but_stop) == LOW&digitalRead(dat_verh) == LOW)
        {
          motor1.setSpeed(-b);
          motor1.runSpeed();
          }

          digitalWrite(rele_tvch,LOW);
          delay(1000);
          digitalWrite(rele_voda,LOW);
       
      while (digitalRead(but_stop) == LOW&motor1.currentPosition() != shagi*3200)
         {
      motor1.setSpeed(counter*500);
      motor1.runSpeed();
      motor2.runSpeed();
          }
          digitalWrite(rele_tvch,HIGH);
          digitalWrite(rele_voda,HIGH);
          delay(500);

      }

    }
    В коде используются пока еще не все кнопки объявленные...

    Если меняю часть кода и прописываю обнуление, вылезает другая проблема - все нормально работает до расстояния 50мм (т.е. пока переменная shagi не примет значение больше 10ти)
    Код (C++):
    digitalWrite(rele_tvch,LOW);
          motor1.setCurentPosition(0);
          delay(1000);
          digitalWrite(rele_voda,LOW);
       
      while (digitalRead(but_stop) == LOW&motor1.currentPosition() != shagi*3200)
         {
      motor1.moveTo(shagi*3200);
      motor1.setSpeed(counter*500);
      motor1.runSpeed();
      motor2.runSpeed();
          }
          digitalWrite(rele_tvch,HIGH);
          digitalWrite(rele_voda,HIGH);
          delay(500);

      }
     
    Последнее редактирование: 11 сен 2019
  6. nupaT

    nupaT Нуб

    Добрый день. Решил поковыряться с шаговым двигателем 28BYJ-48 с драйвером ULN2003.
    Уже на первом примере возникли вопросы. Вот код:
    Код (C++):
    // подключение библиотеки
       #include<AccelStepper.h>
       // создаем экземпляр AccelStepper
       #define IN1 2
       #define IN2 3
       #define IN3 4
       #define IN4 5
       AccelStepper motor1(8, IN1, IN3, IN2, IN4);
     
       void setup(){
       motor1.setMaxSpeed(600.0);
       motor1.setAcceleration(300.0);
       motor1.setSpeed(400);
       motor1.moveTo(400);
       Serial.begin(9600);
       }

       void loop(){
       // Изменяем направление, если пройдено заданное число шагов
       if(motor1.distanceToGo()==0)
           motor1.moveTo(-motor1.currentPosition());
       motor1.run();
    // выводим расстояние до конца дистанции
       Serial.print("ToGo = ");
      Serial.println(motor1.distanceToGo());
    // выводим пройденное расстояние
      Serial.print("Pos = ");
      Serial.println(motor1.currentPosition());
       }
    Казалось бы все нормально, НО при достижении окончания дистанции, двигатель начинает вращаться в обратную сторону на расстояние в 2 раза большее.
    Это видно при выводе в Serial.
    Я так понял что при достижении distanceToGo == 0, currentPosition становится 400, а moveTo всегда 400 отсюда distanceToGo после смены направления 400+400.
    Подскажите как бороться.
    Пример исполнен как в реале так и в протеусе.
     
  7. vvr

    vvr Инженерище

    вы бы написали что хотите получить от шаговика.
    не понятно с чем бороться.
     
  8. nupaT

    nupaT Нуб

    Скетч из примера. Крутит на заданное количество шагов в одну сторону, потом в другую.
    Но при первом проходе он крутит от 0 до moveTo, а при последующих от -moveTo до +moveTo.
    Вообще всеми надоевшая тема со шторами. Но пока хочу разобраться в этом примере.
     
  9. nupaT

    nupaT Нуб

    Решил.
    Возможно есть более изящное решение, но не придумал ничего кроме как дописать в строку изменения направление движения двигателя ( -400)
    Было:
    Код (C++):
    if(motor1.distanceToGo()==0)
           motor1.moveTo(-motor1.currentPosition());
    Стало:
    Код (C++):
    if(motor1.distanceToGo()==0)
           motor1.moveTo(-(motor1.currentPosition() - 400));
    Понятно что вместо цифр можно использовать переменную.
     
  10. akl

    akl Гуру

    возможно проблема в том, что -motor1.currentPosition() равняется -400 или типа того

    лучше еще в одном из концов поставить концевой выключатель для калибровки и защиты от уезжания в запретную область
     
    Последнее редактирование: 12 янв 2020
  11. nupaT

    nupaT Нуб

    Да, похоже дело в этом. При первом проходе мотор считает от 0 к 400, а при следующих от 400 до -400 и обратно
    Могу скинуть что выдается в Serial currentPosition и distanceToGo при окончании первого прохода и последующих.
    Спасибо за совет. Пока мне рано до штор рученками своими тянуться =)
    А с другой стороны и шаговик-то не нужен с концевиками.
     
    Последнее редактирование: 12 янв 2020
  12. vvr

    vvr Инженерище

    [QUOTE="nupaT, post: 250157, member: 27871"
    Вообще всеми надоевшая тема со шторами.[/QUOTE]
    а я с удовольствием повозился с этой темой, мне даже понравилось))))
     
  13. nupaT

    nupaT Нуб

    Так повозилСЯ, а не повозился БЫ. У Вас это в прошлом ))
    Мне просто надоело каждый раз отшторивать и поднимать роллшторы.
    Сейчас в проекте хочу сделать просто с физической кнопки и аккумуляторов и поставлю теститься. А в планах с пульта ДУ и телефона. Готовое брать не хочу - не по феншую это. И знания какие-никакие будут.
     
  14. vvr

    vvr Инженерище

    с телефона отказался - понтово, но не удобно.
    окно - пульт на подоконнике с программируемым вечерним закрытием и утренним подъёмом.
    балкон - ик пульт с тем же функционалом (нет места для стационарного пульта))))
     
  15. nupaT

    nupaT Нуб

    Где-то на просторах интернета есть видео или обзор? Движки какие пользовали?
     
  16. vvr

    vvr Инженерище

    такие же как и у вас.
    только переделал их в биполярные.
    подключал через EasyDriver.
     
  17. natan04g

    natan04g Нуб

    Доброго времени суток, у меня возникло проблема: мне нужно, чтобы когда переключался тумблер, мотор крутился в одну сторону, а если тумблер переключить в другое положение, соответственно, в другую сторону. Я пробовал через if, но не получилось - мотор не слушается и очень сильно вибрирует. Тумблер подключил по такой схеме, как на картинке. Что можно с этим сделать?
     

    Вложения:

  18. Tomasina

    Tomasina Сушитель лампочек Модератор

    Без тумблера нормально в обе стороны крутит?
     
  19. vvr

    vvr Инженерище

    правильно подключить
    правильно написать программу
     
  20. natan04g

    natan04g Нуб

    Без тумблер нормально крутит