Шаговый двигатель, драйвер L298N и ФД ID103

Вопросы об управлении шаговыми двигателями
Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 01 авг 2017, 20:39

Приветствую всех! Задача в общем простая. Вращать шаговый двигатель по(против)часовой стрелке на "n" количество шагов в зависимости от состояния выхода ID103 ("0" или "1")

StepMotor myMotor(10, 11, 12, 13); // создаем объект типа StepMotor, задаем выводы для фаз
const int pinPhoto = 9; // Назначаем вывод 9 фотодатчику ID103
//const int ENA = 8; // Input ENA,ENB драйвера L298N подключены к выводу 8 Ардуино

unsigned int timeCounter; // счетчик времени
byte md; // режим: 0 — вращение против ч.с., 1 — пауза, 2 — вращение по ч.с., 3 — пауза

void setup() {
pinMode(pinPhoto, INPUT); // Объявляем назначение PIN-ам

MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 1 мс
MsTimer2::start(); // разрешаем прерывание по таймеру
myMotor.setMode(2, false); // между шаговый режим, без фиксации при остановке
myMotor.setDivider(21); // делитель частоты 21 (при прерывании 1 мс период коммутации фаз 21 мс)
md= 0; // начальный режим
myMotor.step(576); // начальный запуск
.....Вопрос: как правильно вставить в код строки для этого процесса?


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 01 авг 2017, 22:26

Здравствуйте!
Я так понял, вам надо закрывать и открывать жалюзи в зависимости от уровня освещенности. Если выход фотодатчика перешел в состояние 0, то сделать 576 шагов по часовой стрелке. Если выход стал равным 1, то сделать такое же количество шагов против часовой стрелки.

    Надо выделить два события: переход выхода фотодатчика из 1 в 0 и переход из 0 в 1.

    Желательно обеспечить цифровую фильтрацию сигнала фотодатчика, чтобы не было ложных срабатываний.

    По этим событиям вызвать функцию запуска вращения двигателя с нужным количеством шагов myMotor.step(-576) и myMotor.step(576.)

На мой взгляд, программа должна выглядеть так.

Код: Выделить всё

#include <MsTimer2.h>
#include <StepMotor.h>
#include <Button.h>

#define PIN_PHOTO 9  // вывод фотодатчика

StepMotor myMotor(10, 11, 12, 13);  // создаем объект типа StepMotor, задаем выводы для фаз
Button photoSens(PIN_PHOTO, 250);  // создание объекта для фотодатчика

boolean prevStatePhoto= false;  // предыдущее состояние фотодатчика

void setup() { 
  MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 1 мс
  MsTimer2::start();               // разрешаем прерывание по таймеру
  myMotor.setMode(2, false);  // полушаговый режим, без фиксации при остановке
  myMotor.setDivider(21);     // делитель частоты 21 (при прерывании 1 мс период коммутации фаз 21 мс)
}

void loop() {

  if( photoSens.flagPress != prevStatePhoto) {
    // состояние фотодатчика изменилось
    prevStatePhoto= photoSens.flagPress;

    if( photoSens.flagPress == false ) {
      // переход из 1 в 0
      myMotor.step(-576); // 576 шагов по часовой стрелке
    }
    else {
      // переход из 0 в 1
      myMotor.step(576);  // 576 шагов против часовой стрелки     
    }   
  }     
}

//-------------------------------------- обработчик прерывания 1 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  photoSens.scanState();  // обработка фотодатчика
}


Я программу не проверял, могут быть ошибки. Напишите, я помогу отладить.

Выход фотодатчика обрабатывается моей библиотекой Button (урок 9). Производится подтверждение состояния фотодатчика. Я задал большое значение времени подтверждения 250 мс.
Button photoSens(PIN_PHOTO, 250); // создание объекта для фотодатчика

Дальше в цикле loop выделяются события по переходу состояния датчика, и запускается двигатель на нужное число шагов.

Наверное, придется еще сделать начальные установки, и я бы включил сторожевой таймер.
Попробуйте сначала этот вариант.

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 02 авг 2017, 17:57

Ругается :D
Изображение

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 02 авг 2017, 18:00

Сорри! Скачал, Эдуард, Вашу библиотеку Button, ругаться перестала, сейчас опробую на практике

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 02 авг 2017, 18:50

Всё пока замечательно, эмулятор фотодатчика (т.е. простая подача 0 и 1) работает. Сейчас подключу приблуду с фоторезистором )))) Что мне ещё понравилось, то что Ардуино просто находится в режиме паузы :), ожидая изменения уровня фотодатчика, а не гоняя программу туда-сюда. Думаю, на это время его можно нагрузить другими задачами, целый день простоя и потребления электроэнергии :D :D :D слишком дорогое удовольствие :D :D

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 02 авг 2017, 18:56

Эдуард, большое Вам спасибо за помощь!Редкий форум, где реально помогают, а не начинают "умничать"

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 02 авг 2017, 22:56

Здравствуйте! Рад, если помог.

Чтобы программа приобрела законченный вид надо добавить сторожевой таймер.

Кроме того, для того, чтобы при включении питания не было никаких перемещений жалюзи надо сделать следующее.
В setup() вызвать в цикле раз 500 функцию photoSens.scanState() для того, чтобы переменная photoSens.flagPress стала равной реальному состоянию датчика.
Затем сделать prevStatePhoto= photoSens.flagPress;. В этом случае prevStatePhoto будет равна photoSens.flagPress и событий для запуска двигателя не будет.

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 12 авг 2017, 09:28

Эдуард, приветствую! Подскажи пожалуйста, для ардуино про мини скетч отличается? Естественно номера входов я поменял,но почему то не работает двигло

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 12 авг 2017, 10:27

Скетч должен быть абсолютно такой же. Где-то в распайке ошиблись.

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 12 авг 2017, 14:29

Дело не в распайке, даже светодиод на минике не загорается при изменении уровня по 2 входу(я в скетче туда прописал фотодатчик)

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 12 авг 2017, 14:31

#define PIN_PHOTO 2 // вывод фотодатчика

StepMotor myMotor(3, 5, 6, 9); // создаем объект типа StepMotor, задаем выводы для фаз

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 20 авг 2017, 07:16

Эдуард, приветствую! В целом весь "комплекс" работает, но в процессе тестирования вылезают некоторые траблы))) В чём проявляются: При переходе ID103 из состояния 1 в 0 всё более менее работает, но при переходе из 0 в 1 начинается....(((( При увеличении освещенности (а она может увеличиваться по всякому) ID103 ведёт себя, как правило, как попало, переходит из 0 в 1 и обратно по несколько раз, не смотря на то, что в качестве фотоэлемента установлен фоторезистор, у которого линейная характеристика, в отличии от фотодиода, который изначально стоял на этом чуде китайской инженерной мысли)))) Победить регулировочным резистором это дело не удается, регулируется только порог срабатывания. Менял разные фоторезисторы...не спасает. Я когда начинал только возиться с фотодатчиком, пробовал использовать аналоговый его выход, по монитору порта определял максимальное и минимальное значение, прописывал в скетче этот интервал и вся эта приблуда работала гораздо стабильнее. Но потом решил, что 0 и 1 как то "жёстче"...Но оказалось, что не совсем))) Программно можно победить этот казус? Я так понимаю, что: "Кроме того, для того, чтобы при включении питания не было никаких перемещений жалюзи надо сделать следующее.
В setup() вызвать в цикле раз 500 функцию photoSens.scanState() для того, чтобы переменная photoSens.flagPress стала равной реальному состоянию датчика.
Затем сделать prevStatePhoto= photoSens.flagPress;. В этом случае prevStatePhoto будет равна photoSens.flagPress и событий для запуска двигателя не будет
" это примерно то, что мне нужно. ;)

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 20 авг 2017, 07:28

Или может просто в строке
Button photoSens(PIN_PHOTO, 250); // создание объекта для фотодатчика
увеличить время ожидания стабильности фотодатчика, например 5с?

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 20 авг 2017, 07:56

Последнее не помогло :D

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 20 авг 2017, 08:18

void setup() {
MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 1 мс
MsTimer2::start(); // разрешаем прерывание по таймеру
myMotor.setMode(2, false); // полушаговый режим, без фиксации при остановке
myMotor.setDivider(21); // делитель частоты 21 (при прерывании 1 мс период коммутации фаз 21 мс)
do {
delay(500);
prevStatePhoto= photoSens.flagPress;
}while (prevStatePhoto= photoSens.flagPress);
}

void loop() {
.....
Может я что то не так делаю?

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 20 авг 2017, 10:30

Здравствуйте!
Попробуйте включите фильтрацию датчика по среднему значения. Для этого строку
photoSens.scanState(); // обработка фотодатчика
замените на
photoSens.filterAvarage(); // обработка фотодатчика

Если не поможет, то напишите, я покажу как увеличить время усреднения сигнала датчика.

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 03 сен 2017, 17:14

Эдуард, приветствую! В общем- не помогло((((( Ни фоторезистор, ни фотодиод в схеме не хотят как надо работать...Но тут вина ИХНИХ :D инженеров, не правильно спроектирована схема. В следствии того, что яркость света увеличивается очень медленно, то четкого срабатывания нет. Так, чтобы выставил уровень и по определённой яркости включился (или выключился). А то за время рассвета он гоняет жалюзи в разные стороны, пока "не надоест" :lol: В конечном итоге они конечно остаются открытыми (или закрытыми, в зависимости от времени суток), но трещание шестерни, когда доходит до конечной точки - вымораживает :oops: особенно утром :lol: Трещат они потому, что он не досчитал 567 оборотов и начал вращаться в обратную сторону, механизм уже в крайнем положении, а мозги ещё считают...

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 03 сен 2017, 17:20

Вот полный скетч, исправьте пожалуйста, если есть ошибки ;) :)

Код: Выделить всё

#include <MsTimer2.h>
#include <StepMotor.h>
#include <Button.h>

#define PIN_PHOTO 9  // вывод фотодатчика

StepMotor myMotor(10, 11, 12, 13);  // создаем объект типа StepMotor, задаем выводы для фаз
Button PhotoSens(PIN_PHOTO, 250);  // создание объекта для фотодатчика

boolean prevStatePhoto= false;  // предыдущее состояние фотодатчика

void setup() {
  MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 1 мс
  MsTimer2::start();               // разрешаем прерывание по таймеру
  myMotor.setMode(2, false);  // полушаговый режим, без фиксации при остановке
  myMotor.setDivider(21);     // делитель частоты 21 (при прерывании 1 мс период коммутации фаз 21 мс)
  do {
     delay(10000);
     prevStatePhoto = PhotoSens.flagPress;
  }while (prevStatePhoto = PhotoSens.flagPress);
}

void loop() {

  if( PhotoSens.flagPress != prevStatePhoto) {
    // состояние фотодатчика изменилось
    prevStatePhoto= PhotoSens.flagPress;

    if( PhotoSens.flagPress == false ) {
      // переход из 1 в 0
      myMotor.step(-576); // 576 шагов по часовой стрелке
    }
    else {
      // переход из 0 в 1
      myMotor.step(576);  // 576 шагов против часовой стрелки     
    }   
  }     
}

//-------------------------------------- обработчик прерывания 1 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  PhotoSens.filterAvarage();  // обработка фотодатчика
}

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 03 сен 2017, 22:16

Я сейчас в Абхазии. Вернусь домой подумаю.

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 11 сен 2017, 20:00

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

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 13 сен 2017, 16:51

Приветствую! И как это будет выглядеть?

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 18 окт 2017, 16:00

Эдуард, приветствую! Ничего не могу понять...Переподключил на аналоговый выход, по монитору порта посмотрел значения на выходе ID103, сделал соответствующие изменения в скетче, а двигатель вращается только в одну сторону (по часовой) при разных значениях на А0

Код: Выделить всё

#include <MsTimer2.h>
#include <StepMotor.h>
#include <Button.h>

#define PIN_PHOTO A0  // вывод фотодатчика

StepMotor myMotor(10, 11, 12, 13);  // создаем объект типа StepMotor, задаем выводы для фаз
Button photoSens(PIN_PHOTO, 250);  // создание объекта для фотодатчика

int prevStatePhoto = false;  // предыдущее состояние фотодатчика

void setup() {
   
  MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 1 мс
  MsTimer2::start();               // разрешаем прерывание по таймеру
  myMotor.setMode(0, false);  // полушаговый режим, без фиксации при остановке
  myMotor.setDivider(21);     // делитель частоты 21 (при прерывании 1 мс период коммутации фаз 21 мс)
 
  }

void loop(){

  if( photoSens.flagPress != prevStatePhoto) {
    // состояние фотодатчика изменилось
    prevStatePhoto= photoSens.flagPress;

    if( photoSens.flagPress <= 50 ) {
      // переход из 1 в 0
      myMotor.step(576); // 576 шагов по часовой стрелке
    }
    else if (photoSens.flagPress >= 180) {
      // переход из 0 в 1
      myMotor.step(-576);  // 576 шагов против часовой стрелки     
    }   
  }
}
//-------------------------------------- обработчик прерывания 1 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  photoSens.scanState();  // обработка фотодатчика
}


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 18 окт 2017, 16:22

Здравствуйте!
Подключить датчик к аналоговому входу - я имел в виду измерять напряжение датчика с помощью АЦП. Напряжение датчика сравнивать с двумя порогами: при одном инициировать открывание штор, при другом - закрывание. Получится, что если, например, шторы открылись при определенном пороге напряжения, то для инициации закрытия напряжение должно снизиться до нижнего порога, который учитывает колебания света в переходной период.
Думаю, сначала вам надо сделать аппаратную часть. Подключить фотодиод к АЦП Ардуино через усилитель или фоторезистор с резистором. Попробовать, как работает измеритель с помощью монитора последовательного порта. Можно взять готовую программу из урока 13. Проверить как меняются значения АЦП в переходной период изменения света. Затем, делать выводы, подходит ли такой алгоритм.

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 18 окт 2017, 16:27

Собственно я так и сделал...При открытом датчике значения на выходе (по монитору порта) - 35-45. При закрытом - от 180 и выше, в пределах 350-370

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 18 окт 2017, 16:37

Поставил другой фоторезистор....измеренные значения получились <100 открытый резистор и > 800 закрыт. На уровень освещенности всё реагирует, а вот направление вращения остается неизменным....(((

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 18 окт 2017, 16:43

Программа то старой осталась. Где измерение АЦП, сравнение с порогами?

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 18 окт 2017, 16:51

Код: Выделить всё

#include <MsTimer2.h>
#include <StepMotor.h>
#include <Button.h>

int analogPIN_PHOTO = A0;  // вывод фотодатчика

StepMotor myMotor(10, 11, 12, 13);  // создаем объект типа StepMotor, задаем выводы для фаз
Button photoSens(analogPIN_PHOTO, 250);  // создание объекта для фотодатчика

int prevStatePhoto = false;  // предыдущее состояние фотодатчика
int val = 0;

void setup() {
   
  MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 1 мс
  MsTimer2::start();               // разрешаем прерывание по таймеру
  myMotor.setMode(0, false);  // полушаговый режим, без фиксации при остановке
  myMotor.setDivider(21);     // делитель частоты 21 (при прерывании 1 мс период коммутации фаз 21 мс)
 
  }

void loop(){
  val = analogRead(analogPIN_PHOTO);
  if( photoSens.flagPress != prevStatePhoto) {
    // состояние фотодатчика изменилось
    prevStatePhoto= photoSens.flagPress;

    if( photoSens.flagPress <= 100 ) {
      // переход из 1 в 0
      myMotor.step(576); // 576 шагов по часовой стрелке
    }
    else if (photoSens.flagPress >= 800) {
      // переход из 0 в 1
      myMotor.step(-576);  // 576 шагов против часовой стрелки     
    }   
  }
}
//-------------------------------------- обработчик прерывания 1 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  photoSens.scanState();  // обработка фотодатчика
}


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 18 окт 2017, 17:17

Постараюсь завтра помочь.

Serg42
Сообщения: 29
Зарегистрирован: 01 авг 2017, 18:46

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Serg42 » 18 окт 2017, 17:28

Спасибо! :)

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Шаговый двигатель, драйвер L298N и ФД ID103

Сообщение Эдуард » 19 окт 2017, 00:08

Здравствуйте!
Попробуйте этот вариант.

Код: Выделить всё

#include <MsTimer2.h>
#include <StepMotor.h>

#define DARK_LEVEL 800  // уровень датчика в темном состоянии
#define BRIGHT_LEVEL 100  // уровень датчика в светлом состоянии

StepMotor myMotor(10, 11, 12, 13);  // создаем объект типа StepMotor, задаем выводы для фаз

byte mode=0;  // режим, 0 - открыты, 1 - закрыты
unsigned int sensLevel; // уровень датчика

void setup() { 
  MsTimer2::set(1, timerInterrupt); // задаем период прерывания по таймеру 1 мс
  MsTimer2::start();               // разрешаем прерывание по таймеру
  Serial.begin(9600); // временно для проверки
  myMotor.setMode(2, false);  // полушаговый режим, без фиксации при остановке
  myMotor.setDivider(21);     // делитель частоты 21 (при прерывании 1 мс период коммутации фаз 21 мс)
}

void loop() {

  // измерение и усреднение АЦП
  sensLevel=0;
  for(byte i=0; i<32; i++) {
    sensLevel += analogRead(A0);
    delay(1);
  }
  sensLevel /= 32;
  Serial.println(sensLevel);  // временно для проверки

  if(mode == 0) {
    // жалюзи закрыты
    if( sensLevel > DARK_LEVEL ){
      // переход на жалюзи открыты
      myMotor.step(-576); // 576 шагов по часовой стрелке
      mode=1;
    }
  }
  else {
    // жалюзи открыты
    if( sensLevel < BRIGHT_LEVEL ){
      // переход на жалюзи закрыты
      myMotor.step(576); // 576 шагов против часовой стрелки
      mode=0;
    }
   
  }
}

//-------------------------------------- обработчик прерывания 1 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
}

Программу проверять мне не на чем, поэтому мог ошибиться. Еще мог попутать логику работы открывать или закрывать.


Вернуться в «Шаговые двигатели и драйверы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей