Страница 1 из 2
Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 01 авг 2017, 20:39
Serg42
Приветствую всех! Задача в общем простая. Вращать шаговый двигатель по(против)часовой стрелке на "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); // начальный запуск
.....Вопрос: как правильно вставить в код строки для этого процесса?
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 выделяются события по переходу состояния датчика, и запускается двигатель на нужное число шагов.
Наверное, придется еще сделать начальные установки, и я бы включил сторожевой таймер.
Попробуйте сначала этот вариант.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 02 авг 2017, 17:57
Serg42
Ругается
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 02 авг 2017, 18:00
Serg42
Сорри! Скачал, Эдуард, Вашу библиотеку Button, ругаться перестала, сейчас опробую на практике
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 02 авг 2017, 18:50
Serg42
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 02 авг 2017, 18:56
Serg42
Эдуард, большое Вам спасибо за помощь!Редкий форум, где реально помогают, а не начинают "умничать"
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 02 авг 2017, 22:56
Эдуард
Здравствуйте! Рад, если помог.
Чтобы программа приобрела законченный вид надо добавить сторожевой таймер.
Кроме того, для того, чтобы при включении питания не было никаких перемещений жалюзи надо сделать следующее.
В setup() вызвать в цикле раз 500 функцию photoSens.scanState() для того, чтобы переменная photoSens.flagPress стала равной реальному состоянию датчика.
Затем сделать prevStatePhoto= photoSens.flagPress;. В этом случае prevStatePhoto будет равна photoSens.flagPress и событий для запуска двигателя не будет.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 12 авг 2017, 09:28
Serg42
Эдуард, приветствую! Подскажи пожалуйста, для ардуино про мини скетч отличается? Естественно номера входов я поменял,но почему то не работает двигло
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 12 авг 2017, 10:27
Эдуард
Скетч должен быть абсолютно такой же. Где-то в распайке ошиблись.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 12 авг 2017, 14:29
Serg42
Дело не в распайке, даже светодиод на минике не загорается при изменении уровня по 2 входу(я в скетче туда прописал фотодатчик)
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 12 авг 2017, 14:31
Serg42
#define PIN_PHOTO 2 // вывод фотодатчика
StepMotor myMotor(3, 5, 6, 9); // создаем объект типа StepMotor, задаем выводы для фаз
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 20 авг 2017, 07:16
Serg42
Эдуард, приветствую! В целом весь "комплекс" работает, но в процессе тестирования вылезают некоторые траблы))) В чём проявляются: При переходе ID103 из состояния 1 в 0 всё более менее работает, но при переходе из 0 в 1 начинается....(((( При увеличении освещенности (а она может увеличиваться по всякому) ID103 ведёт себя, как правило, как попало, переходит из 0 в 1 и обратно по несколько раз, не смотря на то, что в качестве фотоэлемента установлен фоторезистор, у которого линейная характеристика, в отличии от фотодиода, который изначально стоял на этом чуде китайской инженерной мысли)))) Победить регулировочным резистором это дело не удается, регулируется только порог срабатывания. Менял разные фоторезисторы...не спасает. Я когда начинал только возиться с фотодатчиком, пробовал использовать аналоговый его выход, по монитору порта определял максимальное и минимальное значение, прописывал в скетче этот интервал и вся эта приблуда работала гораздо стабильнее. Но потом решил, что 0 и 1 как то "жёстче"...Но оказалось, что не совсем))) Программно можно победить этот казус? Я так понимаю, что: "
Кроме того, для того, чтобы при включении питания не было никаких перемещений жалюзи надо сделать следующее.
В setup() вызвать в цикле раз 500 функцию photoSens.scanState() для того, чтобы переменная photoSens.flagPress стала равной реальному состоянию датчика.
Затем сделать prevStatePhoto= photoSens.flagPress;. В этом случае prevStatePhoto будет равна photoSens.flagPress и событий для запуска двигателя не будет" это примерно то, что мне нужно.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 20 авг 2017, 07:28
Serg42
Или может просто в строке
Button photoSens(PIN_PHOTO, 250); // создание объекта для фотодатчика
увеличить время ожидания стабильности фотодатчика, например 5с?
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 20 авг 2017, 07:56
Serg42
Последнее не помогло
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 20 авг 2017, 08:18
Serg42
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() {
.....
Может я что то не так делаю?
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 20 авг 2017, 10:30
Эдуард
Здравствуйте!
Попробуйте включите фильтрацию датчика по среднему значения. Для этого строку
photoSens.scanState(); // обработка фотодатчика
замените на
photoSens.filterAvarage(); // обработка фотодатчика
Если не поможет, то напишите, я покажу как увеличить время усреднения сигнала датчика.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 03 сен 2017, 17:14
Serg42
Эдуард, приветствую! В общем- не помогло((((( Ни фоторезистор, ни фотодиод в схеме не хотят как надо работать...Но тут вина ИХНИХ
инженеров, не правильно спроектирована схема. В следствии того, что яркость света увеличивается очень медленно, то четкого срабатывания нет. Так, чтобы выставил уровень и по определённой яркости включился (или выключился). А то за время рассвета он гоняет жалюзи в разные стороны, пока "не надоест"
В конечном итоге они конечно остаются открытыми (или закрытыми, в зависимости от времени суток), но трещание шестерни, когда доходит до конечной точки - вымораживает
особенно утром
Трещат они потому, что он не досчитал 567 оборотов и начал вращаться в обратную сторону, механизм уже в крайнем положении, а мозги ещё считают...
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 03 сен 2017, 17:20
Serg42
Вот полный скетч, исправьте пожалуйста, если есть ошибки
Код: Выделить всё
#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
Добавлено: 03 сен 2017, 22:16
Эдуард
Я сейчас в Абхазии. Вернусь домой подумаю.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 11 сен 2017, 20:00
Эдуард
Здравствуйте!
Можно сделать гистерезис по уровню сигнала фотодатчика. Подключить фотодатчик к аналоговому входу. При определенном значении сигнала открывать жалюзи, при другом (меньшем) уровне - закрывать.
Другой вариант - при изменении цифрового сигнала фотодатчка блокировать работу программы на определенное время (несколько десятков минут).
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 13 сен 2017, 16:51
Serg42
Приветствую! И как это будет выглядеть?
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 18 окт 2017, 16:00
Serg42
Эдуард, приветствую! Ничего не могу понять...Переподключил на аналоговый выход, по монитору порта посмотрел значения на выходе 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
Добавлено: 18 окт 2017, 16:22
Эдуард
Здравствуйте!
Подключить датчик к аналоговому входу - я имел в виду измерять напряжение датчика с помощью АЦП. Напряжение датчика сравнивать с двумя порогами: при одном инициировать открывание штор, при другом - закрывание. Получится, что если, например, шторы открылись при определенном пороге напряжения, то для инициации закрытия напряжение должно снизиться до нижнего порога, который учитывает колебания света в переходной период.
Думаю, сначала вам надо сделать аппаратную часть. Подключить фотодиод к АЦП Ардуино через усилитель или фоторезистор с резистором. Попробовать, как работает измеритель с помощью монитора последовательного порта. Можно взять готовую программу из урока 13. Проверить как меняются значения АЦП в переходной период изменения света. Затем, делать выводы, подходит ли такой алгоритм.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 18 окт 2017, 16:27
Serg42
Собственно я так и сделал...При открытом датчике значения на выходе (по монитору порта) - 35-45. При закрытом - от 180 и выше, в пределах 350-370
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 18 окт 2017, 16:37
Serg42
Поставил другой фоторезистор....измеренные значения получились <100 открытый резистор и > 800 закрыт. На уровень освещенности всё реагирует, а вот направление вращения остается неизменным....(((
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 18 окт 2017, 16:43
Эдуард
Программа то старой осталась. Где измерение АЦП, сравнение с порогами?
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 18 окт 2017, 16:51
Serg42
Код: Выделить всё
#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
Добавлено: 18 окт 2017, 17:17
Эдуард
Постараюсь завтра помочь.
Re: Шаговый двигатель, драйвер L298N и ФД ID103
Добавлено: 18 окт 2017, 17:28
Serg42
Спасибо!
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(); // управвление двигателем
}
Программу проверять мне не на чем, поэтому мог ошибиться. Еще мог попутать логику работы открывать или закрывать.