26 (изменено: Aza256, 20-04-2019 03:08:25)

Re: Шаговый двигатель в виде поворотного механизма

Здравствуйте! Проекты на ардуино ни когда не писал, но всегда было желание научиться. Подскажите пожалуйста как сделать, что бы в данном проекте, после того как шаговик найдет нулевую позицию, он ждал появления сигнала от кнопки "стоп", после этого передвигался к первой позиции и останавливался, затем снова ждал сигнала от кнопки, после её нажатия  переходил к следующей позиции и так двигался до последней позиции затем опять возвращался в нулевую позицию.

Будет ли работать вот так ?


#include <AccelStepper.h>

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

static int buttonPin = 11; // Пин концевика.
static int button2Pin = 10; // Пин кнопки "Стоп".

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

void setup()
{
  pinMode(buttonPin, INPUT); //
  Stepper1.setMaxSpeed(200); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
  Stepper1.setAcceleration(13000); //устанавливаем ускорение (шагов/секунду^2)
}

void loop()
{
  // Поиск начальной позиции.
  if (newZeroPoint)
  {
      if (digitalRead(buttonPin)) 
      {
          // Если концевик сработал, то выставляем нуливую позицию и завершаем поиск.
          Stepper1.setCurrentPosition(0);
          newZeroPoint = false;
      } else
      {
        // Двигаемся влево на один шаг, до тех пор пока не сработает концевик.
        if (Stepper1.distanceToGo() == 0) {Stepper1.moveTo(Stepper1.currentPosition() - 1);}
        Stepper1.run();
      }
  }
  
  else
   
    // Обработка кнопки "Стоп".
    if (digitalRead(button2Pin))
    
    {
    button2Pin = true  ; // Ждем нажатия кнопки  "Стоп".
    }
    else
    
  {
    Stepper1.moveTo(400);  // Позиция №1
    Stepper1.runToPosition();  // Ждем пока двигатель не встанет в заданную позицию
    }
     {
    // Обработка кнопки "Стоп".
    if (digitalRead(button2Pin))
    {
    button2Pin = true  ; // Ждем нажатия кнопки  "Стоп".
    } 
    else
    Stepper1.moveTo(800);  // Позиция №2

27

Re: Шаговый двигатель в виде поворотного механизма

Скетч неполный - это всего лишь пример?

Думаю в таком варианте работать не будет. Т.к. необходимо устранить дребезг кнопки и начинать выполнять перемещение к другой позиции например при отпускании кнопки.

28 (изменено: Aza256, 21-04-2019 03:08:46)

Re: Шаговый двигатель в виде поворотного механизма

Да скетч не полный. Просто взял скетч автора данной темы и попытался немного переделать, автор при нажатии кнопки останавливал движение, а мне нужно, что бы следующий шаг начинался только тогда когда будет кратковременно нажата кнопка.
1. Вход подтяну к замле резистором и параллельно кнопке поставлю конденсатор 100 нан, тем самым избавлюсь от дребезга.
2. Получается нужно ждать когда на входе кнопки появится высокий уровень, а затем ждать момента когда он  перейдет на низкий ? (что бы увидеть, что кнопка кратковременно нажата)

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


#include <AccelStepper.h>

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

static int buttonPin = 11; // Пин концевика.
static int button2Pin = 10; // Пин кнопки "Стоп".

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

void setup()
{
  pinMode(buttonPin, INPUT);
  pinMode(button2Pin, INPUT);//
  Stepper1.setMaxSpeed(200); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
  Stepper1.setAcceleration(13000); //устанавливаем ускорение (шагов/секунду^2)
}

void loop()
{
  // Поиск начальной позиции.
  if (newZeroPoint)
  {
      if (digitalRead(buttonPin)) 
      {
          // Если концевик сработал, то выставляем нуливую позицию и завершаем поиск.
          Stepper1.setCurrentPosition(0);
          newZeroPoint = true;
      } else
      {
        // Двигаемся влево на один шаг, до тех пор пока не сработает концевик.
        if (Stepper1.distanceToGo() == 0) {Stepper1.moveTo(Stepper1.currentPosition() - 1);}
        Stepper1.run();
      }
  }
  
  else
   
    // Обработка кнопки "Стоп".
    
    if (digitalRead(button2Pin))
    {
        
    button2Pin = true  ; // Ждем нажатия кнопки  "Стоп".
        
     } 
    
    
    else
    
  {
    Stepper1.moveTo(400);  // Позиция №1
    Stepper1.runToPosition();  // Ждем пока двигатель не встанет в заданную позицию
    }
     
    // Обработка кнопки "Стоп".
    if (digitalRead(button2Pin))
    {
    button2Pin = true  ; // Ждем нажатия кнопки  "Стоп".
    } 
    else
    {
    Stepper1.moveTo(800);  // Позиция №2
    Stepper1.runToPosition();  // Ждем пока двигатель не встанет в заданную позицию
    }
  }

29

Re: Шаговый двигатель в виде поворотного механизма

Aza256 пишет:

1. Вход подтяну к замле резистором и параллельно кнопке поставлю конденсатор 100 нан, тем самым избавлюсь от дребезга.

Хорошее решение.

Aza256 пишет:

2. Получается нужно ждать когда на входе кнопки появится высокий уровень, а затем ждать момента когда он  перейдет на низкий ? (что бы увидеть, что кнопка кратковременно нажата)

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

 
  //Инструкции подавления дребезга контактов кнопки
  currentButtonState = digitalRead(buttonPin);
  if(currentButtonState != previousButtonState)
  {
    delay(5);
    currentButtonState = digitalRead(buttonPin);
    if(currentButtonState != previousButtonState && currentButtonState)
    {
      // Действие 
    }
  }
  previousButtonState = currentButtonState;

30

Re: Шаговый двигатель в виде поворотного механизма

genaonyx пишет:

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

Код Ваш же, но с моими комментариями (может, где-то некорректно).

 
  currentButtonState = digitalRead(buttonPin);  // считываем состояние кнопки и заносим в currentButtonState (текущее сост.)
  if(currentButtonState != previousButtonState)  // если текущее состояние кнопки не равно предыдущему (значит, сост. изменилось)...
  {
    delay(5);                                    // ждем 5 мсек
    currentButtonState = digitalRead(buttonPin);  // снова считываем состояние кнопки и заносим в currentButtonState (текущее сост.)
    if(currentButtonState != previousButtonState && currentButtonState)  // если текущее сост. кнопки не равно предыдущему и текущему...
    {
      // Действие 
    }
  }
  previousButtonState = currentButtonState;  // заносим текущее сост. кнопки в previousButtonState (предыдущ.сост.)

6-ая строка: // если текущее сост. кнопки не равно предыдущему И текущему...
На последнем я потерял ход логики. Мы текущее сост. кнопки сравниваем  с предыдущим (логично!) И текущим (зачем???). Какой смысл сравнивать одну и ту же переменную саму с собой?

31

Re: Шаговый двигатель в виде поворотного механизма

Lavad пишет:

6-ая строка: // если текущее сост. кнопки не равно предыдущему И текущему...
На последнем я потерял ход логики. Мы текущее сост. кнопки сравниваем  с предыдущим (логично!) И текущим (зачем???). Какой смысл сравнивать одну и ту же переменную саму с собой?

if(currentButtonState != previousButtonState && currentButtonState)

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