Мигание лазером, в течении времени работы двигателя

В продолжении темы " Не возвращает каретку слайдер в предполагаемое положение try 2 " (Не возвращает каретку слайдер в предполагаемое положение try 2 - #11 от пользователя lednevandrey04).

В программе, лазер мигает в моменты, когда двигатель остановился в указанных координатах. А есть ли возможность мигать лазерным диодом во время работы двигателя? С частотой, скажем каждую десятую долю секунды для состояния ON, и каждые пять десятых для состяния OFF ???

#include <AccelStepper.h>

AccelStepper Stepper1(1, 13, 12); // Использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988)

int LASER = 8; // Пин лазера.

int buttonPin = 11; // Пин концевика.

static bool newZeroPoint = true; // Флаг указывающий, что надо найти сначала нулевую позицию, а потом делать остальное.

void setup() {
  pinMode(buttonPin, INPUT); //
  pinMode(LASER, OUTPUT); // инициализируем Pin8 как выход
  Stepper1.setMaxSpeed(1000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
  // скорость перемещения по слайдеру 20 секунд -- Stepper1.setMaxSpeed(1800);
  Stepper1.setAcceleration(300); //устанавливаем ускорение (шагов/секунду^2)
}

void loop() {
  // Поиск начальной позиции.
  if (newZeroPoint)
  {
      if (digitalRead(buttonPin)) 
      {
          // Если концевик сработал, то выставляем нуливую позицию и завершаем поиск.
          Stepper1.setCurrentPosition(0);
          Stepper1.moveTo(100); 
          Stepper1.runToPosition(); 
          delay(1000);  // Пауза в 1 сек
          newZeroPoint = false;
      } else
      {
        // Двигаемся влево на один шаг, до тех пор пока не сработает концевик.
        if (Stepper1.distanceToGo() == 0) {Stepper1.moveTo(Stepper1.currentPosition() - 1);}
        Stepper1.run();
      }
  }
  else
  {
	digitalWrite(LASER, HIGH);   // Включение лазера на 1 секунду
	delay(1000); // Включение лазера на 1 секунду
	digitalWrite(LASER, LOW); // Выключение лазера
	
    Stepper1.moveTo(30000);  // Позиция №1
    Stepper1.runToPosition();  // Ждем пока двигатель не встанет в заданную позицию
    delay(5000);  // Пауза в 5 сек
	
    digitalWrite(LASER, HIGH);   // Включение лазера на 1 секунду
	delay(1000); // Включение лазера на 1 секунду
	digitalWrite(LASER, LOW); // Выключение лазера
	
	Stepper1.moveTo(-30000);  // Позиция №1
    Stepper1.runToPosition();  // Ждем пока двигатель не встанет в заданную позицию
    delay(5000);  // Пауза в 5 сек
  }
}

Можно.
А хотя тут делеи, наверное всё-таки с таким кодом нельзя.

ЗЫ: тема перемещена в песочницу.

Какой раздел можно посмотреть ???

А можно ли исправить мной написанное,??? :grinning:

Для начала избавиться от delay:

1 лайк

По указанной Вами сылке, про мигание светодиодом, время состояний ON и OFF для светодиода одинаковы. А как изменить длительность отдельного состояния ???

Вместо константы времени использовать переменную, меняя её значение каждый раз, когда “мигает диод”.

Но с дилэями это будет работать через пень-колоду.

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

Чтоб от дилеев избавится, нужно голову переключить и уйти от runToPosition и прочей блокирующий ереси. А это значит - тонну макулатуры перечитать.

1 лайк

Все в руках автора темы!

— Чтоб от дилеев избавится, нужно голову переключить и уйти от runToPosition и прочей блокирующий ереси ----. А куда уйти, куда податься?

Основная мысль такова: приведенный код не может служить основой для реализации указанных хотелок. Код нужно писать с нуля, используя другую идеологию (blink without delay).

1 лайк

Он уже в ищу исполнителя отписался

поставил его в “игнор” до 2023 года :slight_smile:

Он хотел так:

image

1 лайк