Код Arduino IDE, который необходимо остановить после заданного количества «оборотов».

У нас есть код Arduino IDE, который приводит в движение пластину на ходовом винте, приводимую в движение шаговым двигателем, вперед и назад.

У нас ходовой винт перемещается на 8 мм в одном направлении, затем на 8 мм в противоположном направлении, что дает общее смещение 16 мм. После этого движения у нас есть счетчик, который затем будет считаться за 1 «оборот». по сути. По достижении указанного количества программа остановится.

В настоящее время программа продолжает работать неопределенное время. Любая помощь/предложения будут оценены по достоинству.

// Подключаем библиотеку AccelStepper:
#include <AccelStepper.h>

// Определить соединения шагового двигателя и тип интерфейса двигателя.
// Тип интерфейса двигателя должен быть установлен на 1 при использовании драйвера:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1

// Создаем новый экземпляр класса AccelStepper:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  // Устанавливаем максимальную скорость и ускорение:
  stepper.setMaxSpeed(40000);
  stepper.setAcceleration(20000);
}

void loop() {
  static int counter = 0; // Инициализируем переменную-счетчик и начинаем с 0

  // Устанавливаем целевую позицию:
  stepper.moveTo(400); // находится в шагах. установка по умолчанию

  // Бежим к целевой позиции с заданной скоростью и ускорением/замедлением:
  stepper.runToPosition();

  delay(0);

  // Возвращаемся к нулю:
  stepper.moveTo(0);
  stepper.runToPosition();

  delay(0); //микросекунды
  counter++; //добавляет 1 к счетчику

  if (counter >= 2) {
    return; //выходим из цикла
  }
}

, 👍2

Обсуждение

СВУ означает «самодельное взрывное устройство»., @jsotola

[Значения СВУ](https://en.wikipedia.org/wiki/СВУ), @Peter Mortensen

Что такое «СВУ»? Вы имеете в виду [IDE](https://en.wikipedia.org/wiki/Integrated_development_environment)? Или *[интеллектуальное электронное устройство](https://en.wikipedia.org/wiki/Intelligent_electronic_device)*? Или [Директива о промышленных выбросах](https://en.wikipedia.org/wiki/Industrial_Emissions_Directive)? Или что-то другое?, @Peter Mortensen


1 ответ


4
if (counter >= 2) {
    return; //выходим из цикла
  }

Инструкция return завершит цикл, но функция цикла вызывается снова и снова. Так что все начнется сначала.

Здесь есть несколько возможностей. Вы можете заменить оператор return на while(1);, который заблокирует выполнение до тех пор, пока плата не будет перезагружена.

Если вам не нужно, чтобы функция цикла когда-либо повторялась, вы можете просто переместить весь свой код в функцию настройки, поскольку она будет выполняться только один раз. Тогда функция цикла может быть просто пустой.

И, наконец, вы можете добавить логическую переменную и поместить код, который хотите запускать только изредка, в оператор if, который проверяет эту переменную. В конце процесса вы устанавливаете для переменной значение false, чтобы остановить запуск другого кода. Это позволит вам позже добавить код, чтобы вернуть его обратно нажатием кнопки или чего-то еще, на случай, если вам понадобится возможность запустить процесс снова.

bool running = true;
void loop(){
  if(running){
      // заниматься вещами
  }
  if (counter >= 2){
    running = false;
  }
}
,

exit(0) и abort() также должны работать. По крайней мере, в AVR они эквивалентны while(1);, хотя и более четко определяют цель., @Edgar Bonet

Я думал, что выход (0) сломан? Почему я так подумал? Было ли это когда-нибудь?, @Delta_G