8byj-48 сделать 3 оборота и обнулиться

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем dmb, 5 июн 2020.

  1. dmb

    dmb Нерд

    Доброе время! Подскажите, пожалуйста - как нужно сделать, чтобы при нажатии на кнопку мотор с драйвером uln2003 сделал определенное количество оборотов (или шагов) - и остановился, при простое не грелся. Вроде как этот скетч должен работать - но нифига, мотор крутиться безпрерывно, не обращая внимания на кнопку...


    #include <CheapStepper.h>

    CheapStepper stepper28BYJ_1(4,5,6,7);

    void setup()
    {
    pinMode(2, INPUT);

    }


    void loop()
    {
    if (digitalRead(2) == 1) {
    stepper28BYJ_1.setRpm(5);
    stepper28BYJ_1.move(true,4096);

    }

    }

    Если не сложно - научите плз...
     
  2. parovoZZ

    parovoZZ Гуру

    если не используется микрошаг, то тупо снять напряжение с обмоток.
     
  3. akl

    akl Гуру

    а кнопка как подключена? подтяжечный резистор есть?
    проще всего подключить кнопку с этого пина на землю, в сетапе прописать
    digitalWrite(2,HIGH);
    тогда включится встоенный подтяжечный резистор, он будет подтягивать к питанию
    а в условии вместо ==1 написать ==0

    еще полезно будет вывести состояние кнопки в монитор ком-порта. для отладки таксказать
     
    Последнее редактирование: 5 июн 2020
  4. dmb

    dmb Нерд

    Да, кнопка работает, спасибо! Вот только не получается сделать несколько оборотов: если ставлю значение намного больше, чем 4096 шагов - то напрочь отказывается работать... Как же сделать, чтобы он мог сделать много оборотов (например 10 или 20) - а потом остановиться? Скетч стал таким:
    #include <CheapStepper.h>

    CheapStepper stepper28BYJ_1(4,5,6,7);

    void setup()
    {
    digitalWrite(2,HIGH);

    }


    void loop()
    {
    if (digitalRead(2) == 0) {
    stepper28BYJ_1.setRpm(5);
    stepper28BYJ_1.move(true,4096);

    }

    }
     
  5. akl

    akl Гуру

    завести переменную, при помощи которой считать обороты.

    что-то типа такого
    Код (C++):
    for(int i=10; i>0; i--){
        stepper28BYJ_1.move(true,4096);
    }
     
    dmb нравится это.
  6. dmb

    dmb Нерд

    А как это вставить в мой код? (простите за тупость - я нуб)
     
  7. akl

    akl Гуру

    тупо вместо
    stepper28BYJ_1.move(true,4096);

    я так понял, что 4096 - это на один оборот шаги?
    думаю проблема в том, что функция .move
    https://github.com/tyhenry/CheapStepper/blob/master/CheapStepper.cpp
    принимает в качестве количества шагов переменную int, а она не может быть более 32767 или около того. поэтому надо просто вызывать эту функцию столько раз сколько надо повторить оборот
     
  8. dmb

    dmb Нерд

    Ура, заработала! Большое спасибо, aki! Еще небольшой вопрос: при остановке двигателя на драйвере продолжают гореть два крайних светодиода - вроде сильного нагрева не наблюдаю, но все же - может можно их потушить после окончания цикла?
     
  9. akl

    akl Гуру

    а что за драйвер? надо найти у библиотеки какую-нибудь команду типа отключения.
    возможно stepper28BYJ_1.off(); подойдет. но я не пользовался этой библиотекой, так что не гарантирую

    кстати, я так понимаю драйвер этот которому надо 4 пина от ардуины?
    для работы с шаговиками рекомендую купить драйвер более полноценный как например drv8825
    то есть такой в котором надо только 2 провода - один направление другой шаги, тогда и библиотека не нужна по сути знай дергай ногой оно будет шагать, там заодно есть всякие фишки типа микрошагов и т.д.
     
  10. dmb

    dmb Нерд

    Спасибо, буду иметь в виду в дальнейшем, а сейчас придется что-то сделать с этим, uln2003. А куда вставить команду stepper28BYJ_1.off(); - что-то, куда не воткну - ругается, не проходит компиляцию...
     
  11. akl

    akl Гуру

    надо втыкать туда где все циклы закончились, то есть куда-то после условия
    if (digitalRead(2) == 0) {
    ....
    }
    stepper28BYJ_1.off();

    а что пишет компилятор?
     
  12. akl

    akl Гуру

    то есть лучше конечно внутри условия, но в конце
    Код (C++):
    if (digitalRead(2) == 0) {
    ....

    stepper28BYJ_1.off();
    }
     
    типа нажали кнопку - моторчик пошел крутиться, когда все открутилось все пины отключились и всё до следующего нажатия кнопки

    вместо этой функции можно написать тупо
    Код (C++):
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
    digitalWrite(7,LOW);
    вроде она так и работает по сути
     
  13. akl

    akl Гуру

    еще советую освоить в этой библиотеке неблокирующие функции, такие как newMove, run и т.д., которые там идут после коммента
    // NON-BLOCKING MOVES
    это позволит делать что-то другое пока моторчик крутится. но это сложнее
     
  14. dmb

    dmb Нерд

    Вот скетч,

    #include <CheapStepper.h>

    CheapStepper stepper28BYJ_1(4,5,6,7);

    void setup()
    {
    digitalWrite(2,HIGH);

    }


    void loop()
    {
    if (digitalRead(2) == 0) {
    stepper28BYJ_1.setRpm(4);
    for(int i=10; i>0; i--){
    stepper28BYJ_1.move(true,4096);
    }
    }
    }



    после void loop() { куда только не ставил - и перед первой закрывающей, и после, и после второй, и после третьей - все одно, пишет

    error: 'class CheapStepper' has no member named 'off'

    exit status 1
    'class CheapStepper' has no member named 'off'
     
  15. akl

    akl Гуру

    странно. как будто этой функции нет в библиотеке. может это какая-то старая версия этой библиотеки?
    не туда вставил кстати - надо вне этого цикла
    тогда попробуй просто вот так

    Код (C++):
    #include <CheapStepper.h>

    CheapStepper stepper28BYJ_1(4,5,6,7);

    void setup()
    {
       digitalWrite(2,HIGH);

    }


    void loop()
    {
       if (digitalRead(2) == 0) {
          stepper28BYJ_1.setRpm(4);
          for(int i=10; i>0; i--){
             stepper28BYJ_1.move(true,4096);
          }
          digitalWrite(4,LOW);
          digitalWrite(5,LOW);
          digitalWrite(6,LOW);
          digitalWrite(7,LOW);
       }
    }
     
    код вставляй кодом, а то модераторы заругают.

    откуда библиотека кстати? может действительно устарелая версия какая
     
    dmb и Airbus нравится это.
  16. Airbus

    Airbus Радиохулиган Модератор

    Неужели сложно?[​IMG]
     
  17. dmb

    dmb Нерд

    О да! ОТработал 10 оборотов - и лампочки на драйвере потухли! Спасибо огромное! Надо самому знания подтягивать...
    Библиотека вроде встроенная в IDE - нажал поиск, начал вводить и нашлась в установленных - хотя, я давно не обновлял ардуину.. И использовал плату Нано совсем дешевую китайскую - может от этого тоже что-т зависит. Еще раз спасибо, тему можно закрывать.
     
  18. dmb

    dmb Нерд

    Сорри, просто не знал - не читал правил, впредь буду осмотрительней!
     
  19. parovoZZ

    parovoZZ Гуру

    А ещё лучше по SPI. Команду закинул и пусть оно шагает. Нечего МК ногодрыгом от серъёзных дел отвлекать.
     
  20. akl

    akl Гуру

    кстати ваще не знал что такие есть. вернее логично что они есть, но не сталкивался совсем в изысканиях на тему самопального ЧПУ и т.п. видимо они не так уж распространены