Nema 17 и ардуино
- Войдите на сайт для отправки комментариев
Пнд, 21/12/2020 - 00:06
Здравствуйте! Вопрос наверно банален, но все же. В наличии модуль Arduino, шаговик Nema 17, управляемый драйвером A4988 и датчик - YL-63 (FC-51). Задача воспроизвести алгоритм : при получении сигнала с датчика, двигатель вращается по часовой стрелке 5 секунд. После сигнал с датчика игнорируется 10 секунд.
Во второй части я затупил. Раньше программированием заниматься не приходилось, потому прошу сильно не колотить). Код, написанный благодаря гуглу, прикрепляю, все не имеющие к сути работы элементы вроде потер, но возможно что-то и упустил. Прошу вашей помощи или хотя-бы намека. Заранее благодарен!
unsigned long timing; #define PIN_STEP 3 #define PIN_DIR 2 #define STEP_ROUND 200 void setup() { Serial.begin(9600); pinMode (PIN_STEP, OUTPUT) ; pinMode (PIN_DIR, OUTPUT) ; digitalWrite(PIN_STEP, HIGH); digitalWrite(PIN_DIR, LOW); } void loop() { if (analogRead(A0) < 100) { for (int j = 0; j < STEP_ROUND; j++) digitalWrite (PIN_STEP, HIGH) ; delayMicroseconds (10); digitalWrite (PIN_STEP, LOW) ; delayMicroseconds(10) ;
Намека на что?
В этом коде двигатель даже не вращается, т.к. код не компилируется.
Да, моя ошибка, скопировал не до конца. Скобки забыл. Быстрофикс. Дополню тем, что питание - 12в с лабораторника беру.
Теперь вопросы:
1) почему стоит цикл на кол-во шагов, если в условии требуется работа в течении времени?
2) крутит ли этот скетч двигатель в принципе?
3) знакома ли Вам статья "blink без delay"?
1) Изначально была идея запуска без задержек вообще. Но она была не достаточно удобна.
2)Да, по сигналу с датчика. Скорость регулирую, частотой импульсаов подаваемыми на 3 -пин.
3)Вы про команду "millis"? Если да, то читал (скорее понял принцип, чем нет), пытался через " && " проставить условие в " if ", как очевидный результат происходил шаг двигателя, далее заданное ожидание. Не могу понять логику, как сделать чтобы выполнился цикл в количество шагов двигателя (либо времени, так проще объяснить изначальную задачу).
Судя по исходники варианта два: либо предъявляется опять не тот скетч, что работает в реальности, либо двигатель стартует и функционирует на частоте 50кГц.
Обсуждение фантастических вещей и событий приводит на этом форуме к адским срачам.
Поэтому будьте любезны - скопируйте свой скетч из поста #2 в Arduino IDE, скомпилируйте, прошейте, запустите. Можно без аналогрида даже Затем сделайте из него работоспособный и только после того имеет смысл что-то обсуждать.
Дело точно не в скетче. Возможно я в чем-то не разбираюсь, чем не нарочно вас путаю, но скетч тут явно не причем. Скопировал и залил еще вчера для проверки - все работает и даже с аналоговым сигналом. Может дело в схеме подключения, я брал ее также с инета, прикреплю ниже. А так, могу и видео о работоспособности снять, вечером.
https://3d-diy.ru/upload/medialibrary/be5/Skhema-podklyucheniya-A4988-Arduino.jpg (ссылку профиксил, извиняюсь)
Собственно часть кода брал с этого же сайта.
AbsenceAbsence - а у вас точно именно delayMicroseconds (10); ? - может просто delay() ?
Или цифра в скобках другая. не 10, а скажем 500
Или более вероятно - испытывали вы не этот код. а с "отсутствующими элементами", о которых пишете в первом посте.
Мой вам совет - выкладывайте код целиком, не пытайтесь его "уменьшить" или "сократить". У вас на это сокращение пока знаний маловато, получается ерунда
>>b707
Вообще, я с этой частью эксперементировал. Да было что я ставил делей на high - 1000 а на low - 500. Но в итоге, после переписывания кода на "чистовую", поправив скобки как он тут и представлен - все работало. Но после постов выше у меня снова закрались сомнения, ладно, я как домой приду, сразу попробую перезалить. По результату отпишу. Может и вправду что-то не то залил, например версию с 1000 и 500 милисекунд..
AbsenceAbsence, сделайте форматирование в соответствии с расставленными скобками (команда - Ctrl+T), и посмотрите на результат. Форматирование подскажет реальное разбиение на блоки. Посмотрите внимательно: то, что получилось, то ли это, что Вы хотели?
Всем спасибо за ваши ответы.
Итак, вот видео, на котором наглядно показано что я заливаю конкретно этот скетч и все пашет (https://yadi.sk/i/YdAgauhHoLlaaw). Возможно я где-то взаимоисключающие ошибки сделал, хз, мне опыта точно не хватает самому разобраться. Но тем не менее - оно живое. Вопрос остается актуальным. Все же надеюсь помимо комментариев отправляющих меня переучивать школьный курс физики, будет еще что-нибудь)
ЗЫ: Ctrl+T делал сразу. Если бы я мог самостоятельно увидеть проблему, я бы не задавал тут глупых вопросов. Получилось то , что я хотел ИЗНАЧАЛЬНО, однако мне нужно чуть больше, даже если для этого придется переделывать все, благо тут не так уж и много.
ЗЫ: Ctrl+T делал сразу. Если бы я мог самостоятельно увидеть проблему, я бы не задавал тут глупых вопросов. Получилось то , что я хотел ИЗНАЧАЛЬНО
AbsenceAbsence - признайтесь, ведь вы же не проверяли даже, а отвечаете.
Код. выложенный вами - бредовый, и устроить вас никак не мог.
Вот ваша функция loop() с правильным форматированием:
вы правда этого хотели - в цикле ФОР много раз бессмысленно долбить HIGH в пин, а потом один раз выполнить LOW ?
Не знаю, как он у вас там работает.
Берем первый попавшийся двигатель: https://store.open-electronics.org/STEMOT03%20-%20STEPPER%20MOTOR%20-%20NEMA17
Т.е. стартовать может с 1.4кГц, а работать - на 8кГц. Т.е. нужны паузы в 125мкс между импульсами.
Ширпотреб с Али, я видел, на 11-15кГц гнали, но 50...
Что за модель двигателя и какой микрошаг установлен?
вы правда этого хотели - в цикле ФОР много раз бессмысленно долбить HIGH в пин, а потом один раз выполнить LOW ?
Что самое интересное - на моем двигателе 200 x digitalWrite() + все микросекунды на микрошаге 16 как раз дают движку хоть как-то вертеться с проскальзыванием. for() убираю, всё - поёт.
Как говорится - не благодаря, но вопреки.
Да, теперь я понял о чем вы. Проверял, но смотрел не туда, хотя ctrl+t и вправду у меня таким образом не выстраивала код, странно. Я так понял что для корректного выполнения всего цикла нужно заключить в скобки эту часть?
Тут виной мои слабые познания в синтаксисе и пунктуации среды Arduino. Да при таком исполнении значения импульсов поднимаю до 1000 и 500, тогда работает. Насколько я помню, когда-то так и писал, но потом запутался в цикле for и переделал. Внимания не обратил, так как все работало. Надеюсь понял правильно?
UPD:Теперь понял, что и for в целом - не нужен, это обрывки изначального кода из интернета, принцип работы которого предпологал вращение на определенное кол-во шагов в одну, а после в другую сторону. мде.
Движок - китайская копия Nema 17 (Hanpose 17HS4401). Работает в полный шаг, на драйвере ms пины - не задействованы. Разве что как-то еще он проставился.
Хорошо, допустим что поняли. Теперь следующий этап: крутить через micros().
"blink без delay" берем, миллис на микрос меняем, вклиниваем туда код кручения двигателя, предварительно убрав оттуда последний delayMicroseconds() .
В первом delayMicroseconds() достаточно 5мкс, вся регулировка скорости будет осуществляться алгоритмом сравнения в вышеупомянутом примере.
Интернет пишет, что для 17hs4401:
Вобщем, до 11кгц его можно с акселерацией раскрутить, но не на 50.
В итоге код стал выглядеть так:
Переменную unsigned long оставил для выполнение задержки. Надеюсь теперь все около дела и могу вернуться к вопросу о построении цикла) Спасибо, что подопнули в нужную сторону, если конечно все теперь в порядке.
Хорошо, сейчас попробую!
Вроде работает, я правда позволил себе комментарии оставить, надеюсь мешать не будет и надеюсь с датчиком не поспешил.
analogRead() нужен в другом месте.
Окей, двигатель крутится. Теперь нам нужно иметь возможность его включать/выключать по событию. Берем ещё одну переменную, например stepperEnable. Суём ее в условие к "интервалу" (стр.25) так, чтобы при значении переменной false ничего не работало. См. http://arduino.ru/Reference/Boolean , оператор &&.
А вот саму stepperEnable уже будем вне операции подачи пульса на двигатель устанавливать в зависимости от analogRead(). Если > 100, то true, в противном случае - false.
Это будет избыточно, но в дальнейшем поймёте зачем так делается.
Тут виной мои слабые познания в синтаксисе и пунктуации среды Arduino.
Нет никакого "синтаксиса и пунктуации среды Ардуино", есть синтаксис языков программирования Си/Си++. И по этим языкам есть масса учебной и справочной литературы, а также хорошо развита онлайн-справка в И-нете. Не говоря даже о том, что существует еще и здравый смысл, который очень часто помогает понять, какой "синтаксис" не имеет права на существование.
>>andriano
Я очень рад вашим познаниям и бескомпромиссным "здравым смыслом", честно! Жаль что в остальном данный текст смысла - не несет=)
Хорошо, я думаю тут смогу разобраться, немного подумав, спасибо что помогаете! По результату отпишусь.
>>andriano
Я очень рад вашим познаниям и бескомпромиссным "здравым смыслом", честно! Жаль что в остальном данный текст смысла - не несет=)
"Текст смысла не несет" и "до меня смысл не доходит" - это, как говорят в Одессе, две большие разницы.
andriano
Уважаемый. Не флудите пожалуйста, мне ваши претензии не интересны.
andriano
Уважаемый. Не флудите пожалуйста, мне ваши претензии не интересны.
а вы бы лучше прислушались, Андриано прав
Нет никакого "синтаксиса ардуино", есть язык С/С++, без знания которого программировать ардуино вряд ли выйдет
Господа, я не пониамю ваших нападок. Я уверен, каждый из нас специалист в СВОЕЙ области. Данный персоонаж только и делает что щеголяет "остроумием" не по делу. Поверьте я в курсе существования языков с и с++, более того я примерно понимаю общий принцип работы компилятора, просто это здесь причем? Это раздел "песочница" а не тема "как пропатчить KDE2 под freeBSD" и моя цель попросить у вас, как у специалистов помощи, в быстром РЕШЕНИИ вопроса. Если бы я хотел досканально выучить вышеупомянутые языки, то возможно грубость была бы и уместна. А так извольте, мне агрессивного шизофреника с динозавром на аватаре слушать не в пору. По уму, его стоит в бан на недельку отправить..
b707
К вам у меня притензий нет, ваши комментарии хоть и были строги, но все же по делу.
Ладно, наверно я все-таки должен извиниться. В чужой монастырь со своим уставом лезть - истина, не дело. Прошу прощения у всех в сторону кого был не справедливо груб, в часности andriano! Погорячился, думал "все знаю, просто паяльника дома нет". С таким отношением мне явно ничего хорошего не светит. Буду рад если у вас все же осталось хоть немного желания помочь. Со своей стороны готов пообещать большую внимательность и уравновешенность. Если всё же решите что прощения я - не достоин, можно тему закрывать.
мне показалось, что вы уже все вопросы решили. Если нет - задавайте.
Не надо только так резко реагировать, будьте споскойнее
AbsenceAbsence,все равно не выйдет.
Есть к примеру английский язык и куча пособий как выучит это легко. Но на практике выходит что надо кучу времени потратить что бы просто понять и сказать пару фраз.
Вот так и здесь. Без знания языка Си/Си++ никогда не делайте серьезных проектов. Просто компилятор вас не поймет и нормальный код не выдаст, а значит работать будет криво.
qwone
Да, хорошая аналогия. Теперь думаю доделать свою махарайку (ибо в работе должна помочь) и серьезнее по изучать предмет. Тем более работая в совместной с программированием сфере. Много нового узнал, особенно в плане (не)работы моей логики. Тону в простейших понятиях, описанных на ютубе сейчас, надеюсь хоть на этот проект мозгов по итогу, да с помощью, хватит.
мне показалось, что вы уже все вопросы решили. Если нет - задавайте.
Не надо только так резко реагировать, будьте споскойнее
Не до конца решили. Пока отошел от дела на пару дней, основной работы завал перед НГ. Свою ошибку осознал, теперь точно так и буду)