Всем доброго времени суток! Пытаюсь сконструировать поворотное устройство для радиоантенны, использую: 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); // Выводим знак градуса } }
возьмите нормальную библиотеку вместо Гайвера, с гайверовской никто разбираться не станет В коде явных ошибок не вижу, но видно, что писал новичок... Совет - сократите код до минимума, выкиньте пока дисплей и энкодер. Сделайте две кнопки - поворот влево и поворот вправо. И мотор. Добейтесь, чтобы с кнопок мотор поворачивался верно. Потом поставьте энкодер, проверьте с ним... Потом добавляйте дисплей. Так вы увидите, в какой момент появляется ошибка. И ее будет проще исправить.
Принято, попробую. Под нормальной библиотекой вы вероятно имеете ввиду Accelstepper. Пытался с ней работать но столкнулся с проблемой соотношений шагов двигателя с градусной сеткой. Как соотнести для начала 400 шагов (дробим шаг движка) к 360 градусам, а если к движку будет добавлен редуктор например 1:30 и число шагов станет уже 12000 на 1 оборот... И вот работая над расчетами\формулой, наткнулся на библиотеку Гайвера где данный вопрос решен, указывай в скетче сколько шагов и порядок, дело в шляпе )) Но что то вероятно у меня пошло не так... В общем буду пробовать, спасибо.
МогЁм )) Только немного иначе, я 360 делил на 400 что бы понимать сколько градусов выходит на 1 шаг двигателя (но это не столь принципиально). Разделив 360 на 400 получаем 0.9 градусов на 1 шаг двигателя, вроде разница не существенна.... Но чем больше градус мы ставим тем больше недобора будет, например при переходе на 90 градусов мы не доберем 9 шагов двигателя и как следствие по факту окажемся на 81 градусе. Выход - необходимо нивелировать разницу между 1 градусом и 1 шагом, так ка они не равнозначны. И сделать это можно, заставив в определенный момент при перемещении двигатель сделать скажем не 1 шаг а 2, это позволит компенсировать разницу и разлет будет невелик. И вот главный вопрос в который я уперся - как и в каком месте давать команду движку делать не 1 а 2 шага, при условии что перемещаться в градусной сетке (0-359) мы будем хаотично и градусы будем ставить то больше то меньше в зависимости от потребностей. Как понимаю нужна формула, в которой нужно учитывать несколько переменных: прошлый\текущий\новый (на который перейти надо) градус. Хотя возможно я все усложняю и не в ту сторону думаю.... буду рад если поделитесь соображениями.... ))
даже не знаю что и сказать... 90 градусов - это четверть круга. 400 шагов делим на 4 = получаем 100 шагов. Такая простая мысль вам в голову не приходила? Мыслите шагами, а не градусами - и никакие заумные формулы не понадобятся
.........90 градусов - это четверть круга. 400 шагов делим на 4 = получаем 100 шагов. - Благодарю за идею! Набросал на бумаге расчеты, так сказать на коленке, соотносится норм и погрешность по факту менее 1 градуса выходит. Буду загонять в Ардуину и пробовать\экспериментировать. Еще раз Спасибо!!
Нда..... дело все таки не в библиотеки и не в коде. Пробовал с 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-го) движок делает корректно. По возможности попробую с другим драйвером.
вы не разобрались с библиотекой и ерунду написали. поиграйтесь с примерами аксельстепер. и увидите, что работает она прекрасно. только скорости большие на ней не получить. гайверовская библиотека никакого дела в шляпе не даёт. тем более она. как впрочем и большинство его библиотек, или содранная или переписанная с небольшими изменениями. некоторые просто название изменил, для самолюбия)))) нужна точность поворота на нужное число градусов - только редукторы и микрошаги.
И всё-таки драйвер….. провел испытания с драйвером L298N, такой аномалии не возникает, крутит как надо и куда положено (библиотеки менял и на обоих движок корректно отрабатывает). Понятное дело с Nema17 использовать его далеко не самая лучшая идея (ввиду сильного нагрева) но проверить скетч вполне хватает. Разобрав еще раз предыдущий драйвер , оказалось, что это не TB6600 а что то другое – TB67S109AFTG, погуглив нашел информацию что подобные проблемы у этих экземпляров встречаются ввиду их некачественной или не корректной сборки.
я на такой тоже напоролся. хотя на али пишут что оригинальный драйвер. пришлось купить другой, уже на TB6600
Самый лучший драйвер - TMC. Всё управление через SPI, на выходе полевики, защита от КЗ, детекция обрыва обмотки, пропуска шагов, аппаратные микрошаги...