Шаговый двигатель и мигающий светодиод

Я подключил светодиодную палочку к шаговому двигателю. Можно ли мигать светодиодом, не останавливая вращение двигателя?

Я использую SparkFun RedBoard Plus, Qwiic LED Stick — APA102C, шаговый двигатель Adafruit — размер NEMA-17 — 200 шагов/об и Adafruit Motor Shield V2

Спасибо

Сценарий:

#include <Adafruit_MotorShield.h>
#include <Wire.h>
#include "Qwiic_LED_Stick.h"

LED LEDStick;
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

void setup() {
  Wire.begin();
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Stepper test!");

  if (!AFMS.begin()) {
    // если (!AFMS.begin(1000)) {
    Serial.println("Could not find Motor Shield. Check wiring.");
    while (1);
  }
  Serial.println("Motor Shield found.");
  myMotor->setSpeed(25);  // 25 об/мин

  if (LEDStick.begin() == false) {
    Serial.println("Qwiic LED Stick failed to begin. Please check wiring and try again!");
    while (1);
  }
  Serial.println("Qwiic LED Stick ready!");
}

void loop() {
  Serial.println("Single coil steps");
  myMotor->step(200, FORWARD, SINGLE);

  LEDStick.setLEDColor(10, 10, 10);
  delay(1000);
  LEDStick.LEDOff();
  delay(1000);
}

, 👍0

Обсуждение

Вы видели этот урок? https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay, @VE7JRO

delay(1000); останавливает все на одну секунду, @jsotola

попробуйте использовать onestep вместо step, @jsotola


1 ответ


2

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

В этом случае мы можем попытаться реализовать:

  1. Индикатор на & двигатель активен.
  2. Светодиод не горит & двигатель активен.
  3. Индикатор на & мотор не работает.
  4. Светодиод не горит & мотор не работает.

Выбранная вами библиотека Adafruit_StepperMotor может блокировать. Этот текст из справочной библиотеки шагов Arduino допускает, что аналогичная функция блокируется:

Эта функция блокируется; то есть он будет ждать, пока двигатель закончит движение, чтобы передать управление следующей строке вашего скетча.

Если это так, и вызов step() блокирует действие светодиода дольше, чем допустимо, рассмотрите возможность вызова step() с меньшим количеством шагов, чтобы задержка блокировки была допустимой. Например, требуется 100 шагов, рассмотрите возможность вызова шага 10 раз, каждый раз продвигая двигатель на 10 шагов.

Вернемся к машине состояний. Чтобы отслеживать вышеуказанные 4 состояния, вам нужно 2 флага. Светодиодный флаг и моторный флаг. Управляйте светодиодным флагом, используя mills(), а не delay().

мельницы():

Возвращает количество миллисекунд, прошедших с момента запуска текущей программы на плате Arduino. Это число переполнится (обнулится) приблизительно через 50 дней.

Рассмотрите возможность написания кода конечного автомата для немедленного включения светодиода и сохранения текущего значения, возвращаемого функцией mills(). Каждый последующий раз через конечный автомат проверяйте, возвращает ли mills() значение на 1000 больше, чем сохраненное значение (учитывайте, что mills() в конечном итоге переполнится и начнется с нуля). Когда он переключит светодиод, сохраните возвращаемое значение newmills() и начните проверку каждый последующий раз с помощью конечного автомата.

Поскольку мы запускаем конечный автомат снова и снова с такой скоростью, с которой может справиться процессор, мы также можем протестировать установленный извне флаг для запуска мотора. Нам нужно определить, является ли вызов step() блокирующим. Если это так, нам нужно определить максимальное количество шагов/задержек, допустимых для функции светодиода. Если мы обнаружим, что это, скажем, 10 шагов, нам нужно разработать код, чтобы разделить желаемое количество шагов на отдельные вызовы по 10 или меньше шагов. Если этот подход желателен, управляйте флагом мотора конечного автомата, активируя его, когда число шагов составляет > 0. Вычитание 10 из количества шагов на каждой итерации конечного автомата. И установка флага двигателя конечного автомата для деактивации, когда шаги = 0.

,