Nema 17 и ардуино

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Здравствуйте! Вопрос наверно банален, но все же. В наличии модуль 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) ;
sadman41
Offline
Зарегистрирован: 19.10.2016

Намека на что? 

В этом коде двигатель даже не вращается, т.к. код не компилируется.

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Да, моя ошибка, скопировал не до конца. Скобки забыл. Быстрофикс. Дополню тем, что питание - 12в с лабораторника беру.

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) ;

  }

}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Теперь вопросы:
1) почему стоит цикл на кол-во шагов, если в условии требуется работа в течении времени?
2) крутит ли этот скетч двигатель в принципе?
3) знакома ли Вам статья "blink без delay"?

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

1) Изначально была идея запуска без задержек вообще. Но она была не достаточно удобна.

2)Да, по сигналу с датчика. Скорость регулирую, частотой импульсаов подаваемыми на 3 -пин. 

3)Вы про команду "millis"? Если да, то читал (скорее понял принцип, чем нет), пытался через " && " проставить условие в " if ", как очевидный результат происходил шаг двигателя, далее заданное ожидание. Не могу понять логику, как сделать чтобы выполнился цикл в количество шагов двигателя (либо времени, так проще объяснить изначальную задачу).

sadman41
Offline
Зарегистрирован: 19.10.2016

Судя по исходники варианта два: либо предъявляется опять не тот скетч, что работает в реальности, либо двигатель стартует и функционирует на частоте 50кГц.

Обсуждение фантастических вещей и событий приводит на этом форуме к адским срачам.

Поэтому будьте любезны - скопируйте свой скетч из поста #2 в Arduino IDE, скомпилируйте, прошейте, запустите. Можно без аналогрида даже Затем сделайте из него работоспособный и только после того имеет смысл что-то обсуждать.

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Дело точно не в скетче. Возможно я в чем-то не разбираюсь, чем не нарочно вас путаю, но скетч тут явно не причем. Скопировал и залил еще вчера для проверки - все работает и даже с аналоговым сигналом. Может дело в схеме подключения, я брал ее также с инета, прикреплю ниже. А так, могу и видео о работоспособности снять, вечером.

https://3d-diy.ru/upload/medialibrary/be5/Skhema-podklyucheniya-A4988-Arduino.jpg (ссылку профиксил, извиняюсь)

Собственно часть кода брал с этого же сайта.

b707
Offline
Зарегистрирован: 26.05.2017

AbsenceAbsence - а у вас точно именно delayMicroseconds (10); ? - может просто delay() ?

Или цифра в скобках другая. не 10, а скажем 500

Или более вероятно - испытывали вы не этот код. а с "отсутствующими элементами", о которых пишете в первом посте.

Мой вам совет - выкладывайте код целиком, не пытайтесь его "уменьшить" или "сократить". У вас на это сокращение пока знаний маловато, получается ерунда

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

>>b707

Вообще, я с этой частью эксперементировал. Да было что я ставил делей на high - 1000 а на low - 500. Но в итоге, после переписывания кода на "чистовую", поправив скобки как он тут и представлен - все работало. Но после постов выше у меня снова закрались сомнения, ладно, я как домой приду, сразу попробую перезалить. По результату отпишу. Может и вправду что-то не то залил, например версию с 1000 и 500 милисекунд..

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AbsenceAbsence, сделайте форматирование в соответствии с расставленными скобками (команда - Ctrl+T), и посмотрите на результат. Форматирование подскажет реальное разбиение на блоки. Посмотрите внимательно: то, что получилось, то ли это, что Вы хотели?

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Всем спасибо за ваши ответы.

Итак, вот видео, на котором наглядно показано что я заливаю конкретно этот скетч и все пашет (https://yadi.sk/i/YdAgauhHoLlaaw). Возможно я где-то взаимоисключающие ошибки сделал, хз, мне опыта точно не хватает самому разобраться. Но тем не менее - оно живое. Вопрос остается актуальным. Все же надеюсь помимо комментариев отправляющих меня переучивать школьный курс физики, будет еще что-нибудь) 

ЗЫ: Ctrl+T делал сразу. Если бы я мог самостоятельно увидеть проблему, я бы не задавал тут глупых вопросов. Получилось то , что я хотел ИЗНАЧАЛЬНО, однако мне нужно чуть больше, даже если для этого придется переделывать все, благо тут не так уж и много.

b707
Offline
Зарегистрирован: 26.05.2017

AbsenceAbsence пишет:

ЗЫ: Ctrl+T делал сразу. Если бы я мог самостоятельно увидеть проблему, я бы не задавал тут глупых вопросов. Получилось то , что я хотел ИЗНАЧАЛЬНО

AbsenceAbsence - признайтесь, ведь вы же не проверяли даже, а отвечаете.

Код. выложенный вами - бредовый, и устроить вас никак не мог.

Вот ваша функция loop() с правильным форматированием:

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) ;

  }

}

вы правда этого хотели - в цикле ФОР много раз бессмысленно долбить HIGH в пин, а потом один раз выполнить LOW ?

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Не знаю, как он у вас там работает. 

Берем первый попавшийся двигатель: https://store.open-electronics.org/STEMOT03%20-%20STEPPER%20MOTOR%20-%20NEMA17

  • Max. No-load starting frequency: 1400 pps
  • Max. No-load operating frequency: 8000 pps

Т.е. стартовать может с 1.4кГц, а работать - на 8кГц. Т.е. нужны паузы в 125мкс между импульсами.

Ширпотреб с Али, я видел, на 11-15кГц гнали, но 50...

Что за модель двигателя и какой микрошаг установлен?  

 

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

вы правда этого хотели - в цикле ФОР много раз бессмысленно долбить HIGH в пин, а потом один раз выполнить LOW ?

Что самое интересное - на моем двигателе 200 x digitalWrite() + все микросекунды на микрошаге 16 как раз дают движку хоть как-то вертеться с проскальзыванием. for() убираю, всё - поёт.

Как говорится - не благодаря, но вопреки.

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Да, теперь я понял о чем вы. Проверял, но смотрел не туда, хотя ctrl+t и вправду у меня таким образом не выстраивала код, странно. Я так понял что для корректного выполнения всего цикла нужно заключить в скобки эту часть? 

 { 

    digitalWrite (PIN_STEP, HIGH) ;
    delayMicroseconds (10);
    digitalWrite (PIN_STEP, LOW) ;
    delayMicroseconds(10) ;
}


Тут виной мои слабые познания в синтаксисе и пунктуации среды Arduino. Да при таком исполнении значения импульсов поднимаю до 1000 и 500, тогда работает. Насколько я помню, когда-то так и писал, но потом запутался в цикле for и переделал. Внимания не обратил, так как все работало. Надеюсь понял правильно?

UPD:Теперь понял, что и for в целом - не нужен, это обрывки изначального кода из интернета, принцип работы которого предпологал вращение на определенное кол-во шагов в одну, а после в другую сторону. мде.

 

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Движок - китайская копия Nema 17 (Hanpose 17HS4401). Работает в полный шаг, на драйвере ms пины - не задействованы. Разве что как-то еще он проставился.

sadman41
Offline
Зарегистрирован: 19.10.2016

Хорошо, допустим что поняли. Теперь следующий этап: крутить через micros().

"blink без delay" берем, миллис на микрос меняем, вклиниваем туда код кручения двигателя, предварительно убрав оттуда последний delayMicroseconds() .

В первом delayMicroseconds() достаточно 5мкс, вся регулировка скорости будет осуществляться алгоритмом сравнения в вышеупомянутом примере. 

Интернет пишет, что для 17hs4401:

  • Maximum no-load starting frequency : ≥ 1400 PPS
  • Maximum no-load operating frequency : ≥ 4000 PPS

Вобщем, до 11кгц его можно с акселерацией раскрутить, но не на 50.

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

В итоге код стал выглядеть так: 

unsigned long timing;

#define PIN_STEP 3
#define PIN_DIR 2


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)

  {
    digitalWrite (PIN_STEP, HIGH) ;
    delayMicroseconds (1000);
    digitalWrite (PIN_STEP, LOW) ;
    delayMicroseconds(500) ;
   
  }

}

Переменную unsigned long оставил для выполнение задержки. Надеюсь теперь все около дела и могу вернуться к вопросу о построении цикла) Спасибо, что подопнули в нужную сторону, если конечно все теперь в порядке.

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Хорошо, сейчас попробую!

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Вроде работает, я правда позволил себе комментарии оставить, надеюсь мешать не будет и надеюсь с датчиком не поспешил. 

const int PIN_STEP = 3;                   // Пин шага
const int PIN_DIR = 2;                    // Пин направления

long previousMicros = 0;                  // Храним время последнего переключения 

long interval = 1000;                    // Управление скоростью двигателя (интервал импульсов)

void setup() {

  Serial.begin(9600);                    // Соединение с портом

  pinMode (PIN_STEP, OUTPUT) ;           //Пин (3) - выход
  pinMode  (PIN_DIR, OUTPUT) ;           //Пин (2) - выход

  digitalWrite(PIN_STEP, HIGH);          //Изначальное напряжение на пинах
  digitalWrite(PIN_DIR, LOW);
}

void loop()
{

  unsigned long currentMicros = micros();

  //проверяем не прошел ли нужный интервал, если прошел то
  if (currentMicros - previousMicros > interval) {
    // сохраняем время последнего переключения
    previousMicros = currentMicros;

    if (analogRead(A0) < 100)             //Условия срабатывания при поступлении сигнала с датчика уровнем < 100

    {
      digitalWrite (PIN_STEP, HIGH) ;     // Выполнение цикла
      delayMicroseconds (5);
      digitalWrite (PIN_STEP, LOW) ;

    }


  }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

analogRead() нужен в другом месте.

Окей, двигатель крутится. Теперь нам нужно иметь возможность его включать/выключать по событию. Берем ещё одну переменную, например stepperEnable. Суём ее в условие к "интервалу" (стр.25) так, чтобы при значении переменной false ничего не работало. См.  http://arduino.ru/Reference/Boolean , оператор &&.

А вот саму stepperEnable уже будем вне операции подачи пульса на двигатель устанавливать в зависимости от analogRead(). Если > 100, то true, в противном случае - false.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AbsenceAbsence пишет:

Тут виной мои слабые познания в синтаксисе и пунктуации среды Arduino.

Нет никакого "синтаксиса и пунктуации среды Ардуино", есть синтаксис языков программирования Си/Си++. И по этим языкам есть масса учебной и справочной литературы, а также хорошо развита онлайн-справка в И-нете. Не говоря даже о том, что существует еще и здравый смысл, который очень часто помогает понять, какой "синтаксис" не имеет права на существование.

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

>>andriano

Я очень рад вашим познаниям и бескомпромиссным "здравым смыслом", честно! Жаль что в остальном данный текст смысла - не несет=)

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Хорошо, я думаю тут смогу разобраться, немного подумав, спасибо что помогаете! По результату отпишусь.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AbsenceAbsence пишет:

>>andriano

Я очень рад вашим познаниям и бескомпромиссным "здравым смыслом", честно! Жаль что в остальном данный текст смысла - не несет=)

"Текст смысла не несет" и "до меня смысл не доходит" - это, как говорят в Одессе, две большие разницы.

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

andriano

Уважаемый. Не флудите пожалуйста, мне ваши претензии не интересны.

b707
Offline
Зарегистрирован: 26.05.2017

AbsenceAbsence пишет:

andriano

Уважаемый. Не флудите пожалуйста, мне ваши претензии не интересны.

а вы бы лучше прислушались, Андриано прав

Нет никакого "синтаксиса ардуино", есть язык С/С++, без  знания которого программировать ардуино вряд ли выйдет

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Господа, я не пониамю ваших нападок. Я уверен, каждый из нас специалист в СВОЕЙ области. Данный персоонаж только и делает что щеголяет "остроумием" не по делу. Поверьте я в курсе существования языков с и с++, более того я примерно понимаю общий принцип работы компилятора, просто это здесь причем? Это раздел "песочница" а не  тема "как пропатчить KDE2 под freeBSD" и моя цель попросить у вас, как у специалистов помощи, в быстром РЕШЕНИИ вопроса. Если бы я хотел досканально выучить вышеупомянутые языки, то возможно грубость была бы и уместна. А так извольте, мне агрессивного шизофреника с динозавром на аватаре слушать не в пору. По уму, его стоит в бан на недельку отправить..

b707

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

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

Ладно, наверно я все-таки должен извиниться. В чужой монастырь со своим уставом лезть - истина, не дело. Прошу прощения у всех в сторону кого был не справедливо груб, в часности andriano! Погорячился, думал "все знаю, просто паяльника дома нет". С таким отношением мне явно ничего хорошего не светит. Буду рад если у вас все же осталось хоть немного желания помочь. Со своей стороны готов пообещать большую внимательность и уравновешенность. Если всё же решите что прощения я - не достоин, можно тему закрывать.

b707
Offline
Зарегистрирован: 26.05.2017

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

Не надо только так резко реагировать, будьте споскойнее

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

AbsenceAbsence,все равно не выйдет.

Есть к примеру английский язык и куча пособий как выучит это легко. Но на практике выходит что надо кучу времени потратить что бы просто понять и сказать пару фраз.

AbsenceAbsence пишет:
Задача воспроизвести алгоритм : при получении сигнала с датчика, двигатель вращается по часовой стрелке 5 секунд. После сигнал с датчика игнорируется 10 секунд.
Напоминает задание написать текст :как я провел лето в деревне на английском. И да можно написать что-то.  Но 1- это явно будет видно что писал не носитель языка 2- а если будет написан текст носителем языка, то новичек это никогда не поймет.

Вот так и здесь. Без знания языка Си/Си++ никогда не делайте серьезных проектов. Просто компилятор вас не поймет и нормальный код не выдаст, а значит работать будет криво. 

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

qwone

Да, хорошая аналогия. Теперь думаю доделать свою махарайку (ибо в работе должна помочь) и серьезнее по изучать предмет. Тем более работая в совместной с программированием сфере. Много нового узнал, особенно в плане (не)работы моей логики. Тону в простейших понятиях, описанных на ютубе сейчас, надеюсь хоть на этот проект мозгов по итогу, да с помощью, хватит.

AbsenceAbsence
Offline
Зарегистрирован: 09.10.2020

b707 пишет:

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

Не надо только так резко реагировать, будьте споскойнее

Не до конца решили. Пока отошел от дела на пару дней, основной работы завал перед НГ. Свою ошибку осознал, теперь точно так и буду)