Nema 17 42bygh поворот не туда...

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

  1. Dravor

    Dravor Нуб

    Всем доброго времени суток!
    Пытаюсь сконструировать поворотное устройство для радиоантенны, использую: Arduino UNO R3; Шаговик Nema 17 42BYGH; Энкодер (Круглый, синий, на 5 контактов, с кнопкой, ), Акум. 12 вольт как источник питания.
    Столкнулся с проблемой, при попытки увеличить градус с (с меньшего на больший) например с 45 до 90, двигатель всегда делает первый шаг в противоположную сторону (в левую, в сторону уменьшения градуса) а все остальные шаги как и положено в правую, пытаясь дойти до указанной позиции в 90 градусов. Как итог один шаг двигатель не добирает и происходит смещение между планируемой позицией и фактической. Хотя в сторону уменьшения градуса (в левую- когда наоборот мы с 90 идем на 45) всегда все шаги делает правильно. Библиотеку использую GyverStepper.h
    Буду признателен если подскажете в чем может быть причина.
    Ниже привожу код, тапками не закидывайте я совсем новичок в этом деле, только пытаюсь освоить.... ))

    Код (Text):

    #include <microWire.h> // Подключаем библиотеку для работы дисплея
    #include <microLiquidCrystal_I2C.h> // Подключаем библиотеку для работы дисплея
    #include <GyverEncoder.h> // Подключаем библиотеку для работы энкодера
    #include <GyverStepper.h> // Подключаем библиотеку для работы шаговика


    LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
    Encoder enc1(A0, A1, A2, TYPE2);  // Устанавливаем энкодер
    GStepper< STEPPER2WIRE> stepper(200, 7, 6, 5); // Устанавливаем двигатель

    int value = 0; // Устанавливаем переменную для перехода на требуемый градус

    void setup() {
    Serial.begin(115200); // не уверен нужен ли этот показатель в проекте, на пк не вывожу, только на дисплей.
    enc1.setType(TYPE2);  // ставим тип энкодера TYPE2 двухшаговый.
    enc1.setFastTimeout(50);  // таймаут на скорость энкодера
    lcd.init();  
    lcd.backlight(); // Включаем подсветку дисплея
    lcd.setCursor(0, 0); // Ставим курсор в нужную позицию на дисплее
    lcd.print("AZIMUT CEL'-"); // Выводим статичную иформацию "AZIMUT CEL-"
    lcd.setCursor(15, 0); // Ставим курсор в нужную позицию на дисплее
    lcd.print((char)223); // Выводим знак градуса
    lcd.setCursor(0, 1); // Ставим курсор в нужную позицию на дисплее
    lcd.print("AZIMUT FAKT-"); // Выводим статичную информацию "AZIMUT FAKT-"
    lcd.setCursor(15, 1); // Ставим курсор в нужную позицию на дисплее
    lcd.print((char)223); // Выводим знак градуса
    stepper.setRunMode(FOLLOW_POS); // Включаем нужный режим работы для Шагового двигателя
    stepper.setMaxSpeedDeg(400); // Задаем скорость
    stepper.setAccelerationDeg(300); // Задаем ускорение
    }
    void loop() {
    enc1.tick();
    stepper.tick();
    if (enc1.isRight()) value++;  // если был поворот направо, увеличиваем на 1 (ВЫБИРАЕМ НУЖНЫЙ ГРАДУС)
    if (enc1.isLeft()) value--;  // если был поворот налево, уменьшаем на 1 (ВЫБИРАЕМ НУЖНЫЙ ГРАДУС)
    if (enc1.isFastR()) value += 10;  // если был быстрый поворот направо, увеличиваем на 10 (ВЫБИРАЕМ НУЖНЫЙ ГРАДУС)
    if (enc1.isFastL()) value -= 10;  // если был быстрый поворот налево, уменьшаем на 10 (ВЫБИРАЕМ НУЖНЫЙ ГРАДУС)
    value = constrain(value, 0, 359); // задаем ограничения по возможным значениям
    lcd.setCursor(12, 0); // Ставим курсор в нужную позицию на дисплее
    lcd.print(value); // Выводим значение нужного градуса с энкодера на Экран дисплея
    if (value < 100) {lcd.print(' ');} // убираем аномалии с экрана, как правило это нули
    if (enc1.isPress()) { // после нажатия кнопки энкодера  даем команду на переход выбранного градуса
    stepper.setTargetDeg(value); // переход на нужный градус
    lcd.setCursor(12, 1); // Ставим курсор в нужную позицию на дисплее
    lcd.print(stepper.getTargetDeg());  // Считываем ФАКТИЧЕСКОЕ положение двигателя, где он оказался.
    if (value < 100) {lcd.print(' ');} // убираем аномалии с экрана, как правило это нули
    lcd.setCursor(15, 1); // Ставим курсор в нужную позицию на дисплее
    lcd.print((char)223); // Выводим знак градуса
    }
    }
     
     
  2. b707

    b707 Гуру

    возьмите нормальную библиотеку вместо Гайвера, с гайверовской никто разбираться не станет

    В коде явных ошибок не вижу, но видно, что писал новичок...
    Совет - сократите код до минимума, выкиньте пока дисплей и энкодер. Сделайте две кнопки - поворот влево и поворот вправо. И мотор.
    Добейтесь, чтобы с кнопок мотор поворачивался верно.
    Потом поставьте энкодер, проверьте с ним...
    Потом добавляйте дисплей.

    Так вы увидите, в какой момент появляется ошибка. И ее будет проще исправить.
     
    Последнее редактирование: 19 ноя 2020
    Daniil и vvr нравится это.
  3. Dravor

    Dravor Нуб

    Принято, попробую. Под нормальной библиотекой вы вероятно имеете ввиду Accelstepper. Пытался с ней работать но столкнулся с проблемой соотношений шагов двигателя с градусной сеткой. Как соотнести для начала 400 шагов (дробим шаг движка) к 360 градусам, а если к движку будет добавлен редуктор например 1:30 и число шагов станет уже 12000 на 1 оборот... И вот работая над расчетами\формулой, наткнулся на библиотеку Гайвера где данный вопрос решен, указывай в скетче сколько шагов и порядок, дело в шляпе )) Но что то вероятно у меня пошло не так... В общем буду пробовать, спасибо.
     
  4. b707

    b707 Гуру

    хм.. то есть разделить 400 шагов на 360 без библиотеки уже не можем? :)
     
  5. Dravor

    Dravor Нуб

    МогЁм )) Только немного иначе, я 360 делил на 400 что бы понимать сколько градусов выходит на 1 шаг двигателя (но это не столь принципиально). Разделив 360 на 400 получаем 0.9 градусов на 1 шаг двигателя, вроде разница не существенна.... Но чем больше градус мы ставим тем больше недобора будет, например при переходе на 90 градусов мы не доберем 9 шагов двигателя и как следствие по факту окажемся на 81 градусе. Выход - необходимо нивелировать разницу между 1 градусом и 1 шагом, так ка они не равнозначны. И сделать это можно, заставив в определенный момент при перемещении двигатель сделать скажем не 1 шаг а 2, это позволит компенсировать разницу и разлет будет невелик. И вот главный вопрос в который я уперся - как и в каком месте давать команду движку делать не 1 а 2 шага, при условии что перемещаться в градусной сетке (0-359) мы будем хаотично и градусы будем ставить то больше то меньше в зависимости от потребностей. Как понимаю нужна формула, в которой нужно учитывать несколько переменных: прошлый\текущий\новый (на который перейти надо) градус. Хотя возможно я все усложняю и не в ту сторону думаю.... буду рад если поделитесь соображениями.... ))
     
  6. b707

    b707 Гуру

    даже не знаю что и сказать...
    90 градусов - это четверть круга. 400 шагов делим на 4 = получаем 100 шагов. Такая простая мысль вам в голову не приходила? :)

    Мыслите шагами, а не градусами - и никакие заумные формулы не понадобятся
     
  7. Dravor

    Dravor Нуб

    .........90 градусов - это четверть круга. 400 шагов делим на 4 = получаем 100 шагов. - Благодарю за идею! Набросал на бумаге расчеты, так сказать на коленке, соотносится норм и погрешность по факту менее 1 градуса выходит. Буду загонять в Ардуину и пробовать\экспериментировать. Еще раз Спасибо!!
     
  8. Dravor

    Dravor Нуб

    Нда..... дело все таки не в библиотеки и не в коде. Пробовал с Accelstepper, тот же сбой, первый шаг идет не туда. По отключал все лишние оставил только драйвер, шаговик и прстецкий скетч.
    Код (Text):

    #include <AccelStepper.h>


    AccelStepper stepper(1, 7, 6);


    void setup() {
    stepper.setMaxSpeed(100);
    }
    void loop() {
    stepper.moveTo(2);
    stepper.runToPosition();
    }
     
    Полагаю ошибка носит аппаратный характер на участке: Драйвер - Шаговый двигатель. Ошибку в подключение контактов двигателя к драйверу исключаю (перепробовал все варианты включая заведомо не рабочие). Вскрывал корпус драйвера. кроме ошибок в маркировки на корпусе и плате (перепутали местами А+А- и B+B-) других аномалий не увидел. Прозвонил цэшкой контакты самого движка, все норм прозваниваются парно 2 на 2 как и должно. Да и шаги остальные (кроме 1-го) движок делает корректно. По возможности попробую с другим драйвером.
     
  9. vvr

    vvr Инженерище

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

    гайверовская библиотека никакого дела в шляпе не даёт.
    тем более она. как впрочем и большинство его библиотек, или содранная или переписанная с небольшими изменениями.
    некоторые просто название изменил, для самолюбия))))
    нужна точность поворота на нужное число градусов - только редукторы и микрошаги.
     
  10. Dravor

    Dravor Нуб

    И всё-таки драйвер….. провел испытания с драйвером L298N, такой аномалии не возникает, крутит как надо и куда положено (библиотеки менял и на обоих движок корректно отрабатывает). Понятное дело с Nema17 использовать его далеко не самая лучшая идея (ввиду сильного нагрева) но проверить скетч вполне хватает. Разобрав еще раз предыдущий драйвер , оказалось, что это не TB6600 а что то другое – TB67S109AFTG, погуглив нашел информацию что подобные проблемы у этих экземпляров встречаются ввиду их некачественной или не корректной сборки.
     
  11. vvr

    vvr Инженерище

    я на такой тоже напоролся.
    хотя на али пишут что оригинальный драйвер.
    пришлось купить другой, уже на TB6600
     
  12. Рокки1945

    Рокки1945 Гуру

  13. parovoZZ

    parovoZZ Гуру

    Самый лучший драйвер - TMC. Всё управление через SPI, на выходе полевики, защита от КЗ, детекция обрыва обмотки, пропуска шагов, аппаратные микрошаги...
     
  14. Рокки1945

    Рокки1945 Гуру

    да для нормального всё одно плату надо переделать - с таким радиатором смешно