Шаговый двигатель, драйвер L298N и ФД ID103
Шаговый двигатель, драйвер L298N и ФД ID103
Приветствую всех! Задача в общем простая. Вращать шаговый двигатель по(против)часовой стрелке на "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); // начальный запуск
.....Вопрос: как правильно вставить в код строки для этого процесса?
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); // начальный запуск
.....Вопрос: как правильно вставить в код строки для этого процесса?
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Здравствуйте!
Я так понял, вам надо закрывать и открывать жалюзи в зависимости от уровня освещенности. Если выход фотодатчика перешел в состояние 0, то сделать 576 шагов по часовой стрелке. Если выход стал равным 1, то сделать такое же количество шагов против часовой стрелки.
На мой взгляд, программа должна выглядеть так.
Я программу не проверял, могут быть ошибки. Напишите, я помогу отладить.
Выход фотодатчика обрабатывается моей библиотекой Button (урок 9). Производится подтверждение состояния фотодатчика. Я задал большое значение времени подтверждения 250 мс.
Button photoSens(PIN_PHOTO, 250); // создание объекта для фотодатчика
Дальше в цикле loop выделяются события по переходу состояния датчика, и запускается двигатель на нужное число шагов.
Наверное, придется еще сделать начальные установки, и я бы включил сторожевой таймер.
Попробуйте сначала этот вариант.
Я так понял, вам надо закрывать и открывать жалюзи в зависимости от уровня освещенности. Если выход фотодатчика перешел в состояние 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 выделяются события по переходу состояния датчика, и запускается двигатель на нужное число шагов.
Наверное, придется еще сделать начальные установки, и я бы включил сторожевой таймер.
Попробуйте сначала этот вариант.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Сорри! Скачал, Эдуард, Вашу библиотеку Button, ругаться перестала, сейчас опробую на практике
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Всё пока замечательно, эмулятор фотодатчика (т.е. простая подача 0 и 1) работает. Сейчас подключу приблуду с фоторезистором )))) Что мне ещё понравилось, то что Ардуино просто находится в режиме паузы , ожидая изменения уровня фотодатчика, а не гоняя программу туда-сюда. Думаю, на это время его можно нагрузить другими задачами, целый день простоя и потребления электроэнергии слишком дорогое удовольствие
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Эдуард, большое Вам спасибо за помощь!Редкий форум, где реально помогают, а не начинают "умничать"
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Здравствуйте! Рад, если помог.
Чтобы программа приобрела законченный вид надо добавить сторожевой таймер.
Кроме того, для того, чтобы при включении питания не было никаких перемещений жалюзи надо сделать следующее.
В setup() вызвать в цикле раз 500 функцию photoSens.scanState() для того, чтобы переменная photoSens.flagPress стала равной реальному состоянию датчика.
Затем сделать prevStatePhoto= photoSens.flagPress;. В этом случае prevStatePhoto будет равна photoSens.flagPress и событий для запуска двигателя не будет.
Чтобы программа приобрела законченный вид надо добавить сторожевой таймер.
Кроме того, для того, чтобы при включении питания не было никаких перемещений жалюзи надо сделать следующее.
В setup() вызвать в цикле раз 500 функцию photoSens.scanState() для того, чтобы переменная photoSens.flagPress стала равной реальному состоянию датчика.
Затем сделать prevStatePhoto= photoSens.flagPress;. В этом случае prevStatePhoto будет равна photoSens.flagPress и событий для запуска двигателя не будет.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Эдуард, приветствую! Подскажи пожалуйста, для ардуино про мини скетч отличается? Естественно номера входов я поменял,но почему то не работает двигло
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Скетч должен быть абсолютно такой же. Где-то в распайке ошиблись.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Дело не в распайке, даже светодиод на минике не загорается при изменении уровня по 2 входу(я в скетче туда прописал фотодатчик)
Re: Шаговый двигатель, драйвер L298N и ФД ID103
#define PIN_PHOTO 2 // вывод фотодатчика
StepMotor myMotor(3, 5, 6, 9); // создаем объект типа StepMotor, задаем выводы для фаз
StepMotor myMotor(3, 5, 6, 9); // создаем объект типа StepMotor, задаем выводы для фаз
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Эдуард, приветствую! В целом весь "комплекс" работает, но в процессе тестирования вылезают некоторые траблы))) В чём проявляются: При переходе ID103 из состояния 1 в 0 всё более менее работает, но при переходе из 0 в 1 начинается....(((( При увеличении освещенности (а она может увеличиваться по всякому) ID103 ведёт себя, как правило, как попало, переходит из 0 в 1 и обратно по несколько раз, не смотря на то, что в качестве фотоэлемента установлен фоторезистор, у которого линейная характеристика, в отличии от фотодиода, который изначально стоял на этом чуде китайской инженерной мысли)))) Победить регулировочным резистором это дело не удается, регулируется только порог срабатывания. Менял разные фоторезисторы...не спасает. Я когда начинал только возиться с фотодатчиком, пробовал использовать аналоговый его выход, по монитору порта определял максимальное и минимальное значение, прописывал в скетче этот интервал и вся эта приблуда работала гораздо стабильнее. Но потом решил, что 0 и 1 как то "жёстче"...Но оказалось, что не совсем))) Программно можно победить этот казус? Я так понимаю, что: "Кроме того, для того, чтобы при включении питания не было никаких перемещений жалюзи надо сделать следующее.
В setup() вызвать в цикле раз 500 функцию photoSens.scanState() для того, чтобы переменная photoSens.flagPress стала равной реальному состоянию датчика.
Затем сделать prevStatePhoto= photoSens.flagPress;. В этом случае prevStatePhoto будет равна photoSens.flagPress и событий для запуска двигателя не будет" это примерно то, что мне нужно.
В setup() вызвать в цикле раз 500 функцию photoSens.scanState() для того, чтобы переменная photoSens.flagPress стала равной реальному состоянию датчика.
Затем сделать prevStatePhoto= photoSens.flagPress;. В этом случае prevStatePhoto будет равна photoSens.flagPress и событий для запуска двигателя не будет" это примерно то, что мне нужно.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Или может просто в строке
Button photoSens(PIN_PHOTO, 250); // создание объекта для фотодатчика
увеличить время ожидания стабильности фотодатчика, например 5с?
Button photoSens(PIN_PHOTO, 250); // создание объекта для фотодатчика
увеличить время ожидания стабильности фотодатчика, например 5с?
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Последнее не помогло
Re: Шаговый двигатель, драйвер L298N и ФД ID103
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() {
.....
Может я что то не так делаю?
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() {
.....
Может я что то не так делаю?
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Здравствуйте!
Попробуйте включите фильтрацию датчика по среднему значения. Для этого строку
photoSens.scanState(); // обработка фотодатчика
замените на
photoSens.filterAvarage(); // обработка фотодатчика
Если не поможет, то напишите, я покажу как увеличить время усреднения сигнала датчика.
Попробуйте включите фильтрацию датчика по среднему значения. Для этого строку
photoSens.scanState(); // обработка фотодатчика
замените на
photoSens.filterAvarage(); // обработка фотодатчика
Если не поможет, то напишите, я покажу как увеличить время усреднения сигнала датчика.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Эдуард, приветствую! В общем- не помогло((((( Ни фоторезистор, ни фотодиод в схеме не хотят как надо работать...Но тут вина ИХНИХ инженеров, не правильно спроектирована схема. В следствии того, что яркость света увеличивается очень медленно, то четкого срабатывания нет. Так, чтобы выставил уровень и по определённой яркости включился (или выключился). А то за время рассвета он гоняет жалюзи в разные стороны, пока "не надоест" В конечном итоге они конечно остаются открытыми (или закрытыми, в зависимости от времени суток), но трещание шестерни, когда доходит до конечной точки - вымораживает особенно утром Трещат они потому, что он не досчитал 567 оборотов и начал вращаться в обратную сторону, механизм уже в крайнем положении, а мозги ещё считают...
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Вот полный скетч, исправьте пожалуйста, если есть ошибки
Код: Выделить всё
#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(); // обработка фотодатчика
}
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Я сейчас в Абхазии. Вернусь домой подумаю.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Здравствуйте!
Можно сделать гистерезис по уровню сигнала фотодатчика. Подключить фотодатчик к аналоговому входу. При определенном значении сигнала открывать жалюзи, при другом (меньшем) уровне - закрывать.
Другой вариант - при изменении цифрового сигнала фотодатчка блокировать работу программы на определенное время (несколько десятков минут).
Можно сделать гистерезис по уровню сигнала фотодатчика. Подключить фотодатчик к аналоговому входу. При определенном значении сигнала открывать жалюзи, при другом (меньшем) уровне - закрывать.
Другой вариант - при изменении цифрового сигнала фотодатчка блокировать работу программы на определенное время (несколько десятков минут).
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Приветствую! И как это будет выглядеть?
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Эдуард, приветствую! Ничего не могу понять...Переподключил на аналоговый выход, по монитору порта посмотрел значения на выходе 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(); // обработка фотодатчика
}
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Здравствуйте!
Подключить датчик к аналоговому входу - я имел в виду измерять напряжение датчика с помощью АЦП. Напряжение датчика сравнивать с двумя порогами: при одном инициировать открывание штор, при другом - закрывание. Получится, что если, например, шторы открылись при определенном пороге напряжения, то для инициации закрытия напряжение должно снизиться до нижнего порога, который учитывает колебания света в переходной период.
Думаю, сначала вам надо сделать аппаратную часть. Подключить фотодиод к АЦП Ардуино через усилитель или фоторезистор с резистором. Попробовать, как работает измеритель с помощью монитора последовательного порта. Можно взять готовую программу из урока 13. Проверить как меняются значения АЦП в переходной период изменения света. Затем, делать выводы, подходит ли такой алгоритм.
Подключить датчик к аналоговому входу - я имел в виду измерять напряжение датчика с помощью АЦП. Напряжение датчика сравнивать с двумя порогами: при одном инициировать открывание штор, при другом - закрывание. Получится, что если, например, шторы открылись при определенном пороге напряжения, то для инициации закрытия напряжение должно снизиться до нижнего порога, который учитывает колебания света в переходной период.
Думаю, сначала вам надо сделать аппаратную часть. Подключить фотодиод к АЦП Ардуино через усилитель или фоторезистор с резистором. Попробовать, как работает измеритель с помощью монитора последовательного порта. Можно взять готовую программу из урока 13. Проверить как меняются значения АЦП в переходной период изменения света. Затем, делать выводы, подходит ли такой алгоритм.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Собственно я так и сделал...При открытом датчике значения на выходе (по монитору порта) - 35-45. При закрытом - от 180 и выше, в пределах 350-370
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Поставил другой фоторезистор....измеренные значения получились <100 открытый резистор и > 800 закрыт. На уровень освещенности всё реагирует, а вот направление вращения остается неизменным....(((
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Программа то старой осталась. Где измерение АЦП, сравнение с порогами?
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Код: Выделить всё
#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(); // обработка фотодатчика
}
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Постараюсь завтра помочь.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Здравствуйте!
Попробуйте этот вариант.
Программу проверять мне не на чем, поэтому мог ошибиться. Еще мог попутать логику работы открывать или закрывать.
Попробуйте этот вариант.
Код: Выделить всё
#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(); // управвление двигателем
}
Программу проверять мне не на чем, поэтому мог ошибиться. Еще мог попутать логику работы открывать или закрывать.
Вернуться в «Шаговые двигатели и драйверы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей