Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Рабочие проекты Ардуино
Лев
Сообщения: 6
Зарегистрирован: 05 июн 2019, 19:06

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение Лев » 16 июн 2019, 22:28

В этих строчках заданы каналы двигателей.
Адрес и канал в dmx - две разные вещи.


Лев
Сообщения: 6
Зарегистрирован: 05 июн 2019, 19:06

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение Лев » 16 июн 2019, 22:35

Вот скетч димера который был выложен на первой странице этой темы. Здесь вроде сразу приписывается адрес.
Может я не прав, поправьте меня.

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

#include <DMXSerial.h>

int adr = 1;       // start adress 1...505
int mult = 0;      // all channels light

void setup () {
  DMXSerial.init(DMXReceiver);
}

void loop() {
//  unsigned long lastPacket = DMXSerial.noDataSince();
  mult = DMXSerial.read(adr);                         // read from DMX512
  analogWrite(3,(DMXSerial.read(adr+1)*mult/255));    // channel 1
  analogWrite(5,(DMXSerial.read(adr+2)*mult/255));    // channel 2
  analogWrite(6,(DMXSerial.read(adr+3)*mult/255));    // channel 3
  analogWrite(9,(DMXSerial.read(adr+4)*mult/255));    // channel 4
}

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

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение Эдуард » 16 июн 2019, 22:43

Возможно я что-то забыл, но протокол DMX512 передает данные последовательно 512 логическим приемникам, называемыми каналами. Можно назвать их адресами, но это будут последовательные адреса от 1 до 512. Данные проект использует 2 канала: 1 и 2.


WadimZ
Сообщения: 24
Зарегистрирован: 25 июл 2018, 18:15

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение WadimZ » 23 сен 2019, 16:03

Эдуард!
Добрый день!
Решил вот продолжить начатый ранее проект. Очень нужнаюсь в Вашей помощи.
ПОЖАЛУЙСТА!, помогите дописать код. понимаю, что там всего надо дописать 3 строчки, но своих знаний не хватает. Вся надежда на вас.

Подскажите - как добавить новые функции?

1. Установка "Количество шагов двигателя на оборот" пропорционально значения второго канала ДМХ? т.е. при значении 2ого канала ДМХ (условно 10) значение количества шагов на оборот будет (условно 1000 шагов)?

2. Установка скорости движения двигателя относительно значения 3его канала ДМХ?

3. При установке 4ого канала ДМХ меньше 127 - двигатель будет без удержания, при значении 4ого канала ДМХ больше 128 - двигатель будет на удержании.

Заранее огромное СПАСИБО за помощь!
С удовольствием оформлю платную подписку на сайт т.к. постоянно читаю ваши статьи и новости.

Помогите пожалуйста!!!!

Код программы:


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

// программа следящего электропривода без обратной связи
 
#include <TimerOne.h>
#include <StepDirDriver.h>
#include <DMXSerial.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 200  // число шагов двигателя на оборот
#define DMX_CHANEL_MOTO_1 1   // канал DMX для двигателя 1

unsigned int currentStep1=0;  // текущее положение двигателя
unsigned int setStep1=0;  // заданное положение двигателя
int stepsToDo1;  // сколько шагов надо сделать
byte mode1=0;  // режим: 0 - пауза, 1 - синхронизация датчик закрыт, 2 - синхронизация датчик открыт, 3 - слежение
byte timer=0; // таймер


StepDirDriver myMotor1(5, 2, 8);  // создаем объект типа StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE
Button sens1 (9, 10);  // создание объекта для датчика 1


void setup() {
  DMXSerial.init(DMXReceiver);
  Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250);  // обработчик прерываний
  myMotor1.setMode(0, false);  // шаговый режим, без фиксации при остановке
  myMotor1.setDivider(8);     // делитель частоты 8
 
}

void loop() {

//--------------------------------- двигатель 1 ---------------------------
  if( mode1 == 0 ) {
    // ожидание фильтрации датчиков
    if( timer > 40 ) {
      if( sens1.flagPress == true ) mode1=2;   
      else mode1=1;     
    }   
  }

  else if( mode1 == 1 ) {
    // синхронизация датчик закрыт
    myMotor1.step(-10); // по часовой
    if( sens1.flagPress == true ) {
      myMotor1.step(0);
      mode1=3;
    }
  }

  else if( mode1 == 2 ) {
    // синхронизация датчик открыт
    myMotor1.step(10); // против часовой
    if( sens1.flagPress == false ) {
      myMotor1.step(0);
      mode1=3;
    }
  }
 
  else if( mode1 == 3 ) {
    // слежение

  // ------------------------------------ СЛЕЖЕНИЕ
   
  // проверка остановки двигателя
  if( myMotor1.readSteps() == 0) {
    // двигатель остановился

    // получение заданного положения
    setStep1 = (unsigned int)((unsigned long)DMXSerial.read(DMX_CHANEL_MOTO_1) * (NUM_STEPS_MOTOR - 1) / 255) ;
   
    // определение сколько шагов надо сделать
    stepsToDo1 = currentStep1 - setStep1; // ошибка рассогласования

//    if( abs(stepsToDo1) >= (NUM_STEPS_MOTOR / 2) ) {

//      if((stepsToDo1) > 0) stepsToDo1 -= NUM_STEPS_MOTOR;
//      else                stepsToDo1 += NUM_STEPS_MOTOR;     
//    }
 
    myMotor1.step(stepsToDo1);  // запуск двигателя
    currentStep1 = setStep1;  // перегрузка текущего положения   
  }

  }
  else mode1=0;

}

//-------------------------------------- обработчик прерывания 250 мкс
void  timerInterrupt() {
  timer++;
  myMotor1.control(); // управвление двигателем
  sens1.filterAvarage();  // вызов метода фильтрации по среднему для датчика 1
 
}



Заранее премного Вам благодарен!

С уважением, Вадим!

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

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение Эдуард » 23 сен 2019, 16:30

Здравствуйте!
От чего-то надо начинать. Скетч, который вы привели работает? Вы его проверили? Будем к нему добавлять функции?

WadimZ
Сообщения: 24
Зарегистрирован: 25 июл 2018, 18:15

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение WadimZ » 23 сен 2019, 16:55

ОГРОМНЕЙШЕЕ ВАМ СПАСИБО, что откликнулись!
Да, этот скетч работает отлично. В принципе это тот же который вы составили в начале этой темы, за исключением - я убрал второй двигатель.
будем с одиним работать, что бы не путаться и не усложнять.

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

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение Эдуард » 23 сен 2019, 18:02

Самый простой вариант это добавить в основной цикл блок, который будет переустанавливать режим двигателя.

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

  // установка режимов двигателя 
  numStepsMotor= DMXSerial.read(2); // число шагов двигателя на оборот
  myMotor1.setDivider(DMXSerial.read(3)); // делитель частоты
  if( DMXSerial.read(4) < 127 ) myMotor1.setMode(0, false); // без фиксации при остановке
  else myMotor1.setMode(0, true); // фиксация при остановке


Скетч полностью будет выглядеть так

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

// программа следящего электропривода без обратной связи

#include <TimerOne.h>
#include <StepDirDriver.h>
#include <DMXSerial.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 200 // число шагов двигателя на оборот
#define DMX_CHANEL_MOTO_1 1 // канал DMX для двигателя 1

unsigned int currentStep1=0; // текущее положение двигателя
unsigned int setStep1=0; // заданное положение двигателя
int stepsToDo1; // сколько шагов надо сделать
byte mode1=0; // режим: 0 - пауза, 1 - синхронизация датчик закрыт, 2 - синхронизация датчик открыт, 3 - слежение
byte timer=0; // таймер


StepDirDriver myMotor1(5, 2, 8); // создаем объект типа StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE
Button sens1 (9, 10); // создание объекта для датчика 1

unsigned int numStepsMotor= NUM_STEPS_MOTOR; // число шагов двигателя на оборот

void setup() {
DMXSerial.init(DMXReceiver);
Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
Timer1.attachInterrupt(timerInterrupt, 250); // обработчик прерываний
myMotor1.setMode(0, false); // шаговый режим, без фиксации при остановке
myMotor1.setDivider(8); // делитель частоты 8

}

void loop() {

//--------------------------------- двигатель 1 ---------------------------
if( mode1 == 0 ) {
// ожидание фильтрации датчиков
if( timer > 40 ) {
if( sens1.flagPress == true ) mode1=2;
else mode1=1;
}
}

else if( mode1 == 1 ) {
// синхронизация датчик закрыт
myMotor1.step(-10); // по часовой
if( sens1.flagPress == true ) {
myMotor1.step(0);
mode1=3;
}
}

else if( mode1 == 2 ) {
// синхронизация датчик открыт
myMotor1.step(10); // против часовой
if( sens1.flagPress == false ) {
myMotor1.step(0);
mode1=3;
}
}

else if( mode1 == 3 ) {
// слежение

// ------------------------------------ СЛЕЖЕНИЕ

// проверка остановки двигателя
if( myMotor1.readSteps() == 0) {
// двигатель остановился

// получение заданного положения
setStep1 = (unsigned int)((unsigned long)DMXSerial.read(DMX_CHANEL_MOTO_1) * (numStepsMotor - 1) / 255) ;

// определение сколько шагов надо сделать
stepsToDo1 = currentStep1 - setStep1; // ошибка рассогласования

// if( abs(stepsToDo1) >= (numStepsMotor / 2) ) {

// if((stepsToDo1) > 0) stepsToDo1 -= numStepsMotor;
// else stepsToDo1 += numStepsMotor;
// }

myMotor1.step(stepsToDo1); // запуск двигателя
currentStep1 = setStep1; // перегрузка текущего положения
}

}
else mode1=0;

  // установка режимов двигателя 
  numStepsMotor= DMXSerial.read(2); // число шагов двигателя на оборот
  myMotor1.setDivider(DMXSerial.read(3)); // делитель частоты
  if( DMXSerial.read(4) < 127 ) myMotor1.setMode(0, false); // без фиксации при остановке
  else myMotor1.setMode(0, true); // фиксация при остановке

}

//-------------------------------------- обработчик прерывания 250 мкс
void timerInterrupt() {
timer++;
myMotor1.control(); // управвление двигателем
sens1.filterAvarage(); // вызов метода фильтрации по среднему для датчика 1

}


Попробуйте. Можно сделать так, что переустановка режима будет происходить не постоянно, а только при изменении параметров.

WadimZ
Сообщения: 24
Зарегистрирован: 25 июл 2018, 18:15

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение WadimZ » 23 сен 2019, 23:22

Добрый вечер.
В общем докладываю - Работает так - 1 канал как и должен - на расстояние. , 2 канал (число шагов на поворот - работает некорректно , при какаом либо положительном значении на этом канале - пытаюсь задать движение первым каналом, но мотор колбасит и дергается и ничего не происходит. Может быть это связано с тем, что переменная numStepsMotor к чему то привязана? (чисто мои догадки)
3 канал (скорость) - работает хорошо. поставил делитель - стало то что нужно - от быстрого к медленному. кстати, хотел узнать - можно сделать инверсию? а то когда дмх значение 0 - максимальная скорость, а когда на 255 - самая медленная. как то привычнее наоборот)
4 канал - фиксация/без работает отлично. то что надо.

Благодарю за помощь!

П.С. и что это значит? не понятно, но очень интересно - "Можно сделать так, что переустановка режима будет происходить не постоянно, а только при изменении параметров".

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

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение Эдуард » 23 сен 2019, 23:38

А если убрать строчку
numStepsMotor= DMXSerial.read(2); // число шагов двигателя на оборот
работает нормально?

Чтобы сделать инверсию скорости надо строчку
myMotor1.setDivider(DMXSerial.read(3)); // делитель частоты
заменить на
myMotor1.setDivider(255 - DMXSerial.read(3)); // делитель частоты

Если последние 2 параметра отрабатываются правильно, то последний вопрос неактуален. Я имел в виду, что например, функция setDivider вызывается только если произошло изменение значения 3 канала.

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

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение Эдуард » 23 сен 2019, 23:42

И я еще забыл. Вы хотели число шагов двигателя использовать с пропорциональным коэффициентом. Вот для коэффициента 10
numStepsMotor= DMXSerial.read(2) * 10; // число шагов двигателя на оборот

WadimZ
Сообщения: 24
Зарегистрирован: 25 июл 2018, 18:15

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение WadimZ » 24 сен 2019, 00:48

уже ДМХ консоль отключил, завтра буду продолжать эксперименты. Но сейчас уже увидел один момент, при загрузке программы в ардуино мотор начинает крутиться (выходить на домашнюю позицию) с минимальной скоростью.видимо т.к. ДМХ канал в нуле. Но в принципе это не самое страшное.можно от случая пользоваться и так и так. Остальное уже не могу проверить. завтра буду продолжать.
Большое спасибо за помощь.

WadimZ
Сообщения: 24
Зарегистрирован: 25 июл 2018, 18:15

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение WadimZ » 02 окт 2019, 14:20

Эдуард, Доброго вам дня и доброго здравия!
Помогите пожалуйста с кодом если не сложно. нужно реализовать на ДМХ канале №5 при значении канала от 5 до 127 бесконечное вращение в одну сторону, а при значении 130 до 255 бесконечное вращение в другую сторону.

Заранее ОГРОМНОЕ Вам СПАСИБО!
С уважением, Вадим

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

Re: Прибор"поворотная голова". Управление 2 ШД по протоколу DMX512 с обнулением по щелевой оптопаре.

Сообщение Эдуард » 02 окт 2019, 19:59

Здравствуйте!
Я правильно понял, что эту функцию надо добавить к предыдущей программе? Попробуйте.

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

// программа следящего электропривода без обратной связи

#include <TimerOne.h>
#include <StepDirDriver.h>
#include <DMXSerial.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 200 // число шагов двигателя на оборот
#define DMX_CHANEL_MOTO_1 1 // канал DMX для двигателя 1

unsigned int currentStep1=0; // текущее положение двигателя
unsigned int setStep1=0; // заданное положение двигателя
int stepsToDo1; // сколько шагов надо сделать
byte mode1=0; // режим: 0 - пауза, 1 - синхронизация датчик закрыт, 2 - синхронизация датчик открыт, 3 - слежение
byte timer=0; // таймер
byte dt=0;


StepDirDriver myMotor1(5, 2, 8); // создаем объект типа StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE
Button sens1 (9, 10); // создание объекта для датчика 1

unsigned int numStepsMotor= NUM_STEPS_MOTOR; // число шагов двигателя на оборот

void setup() {
DMXSerial.init(DMXReceiver);
Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
Timer1.attachInterrupt(timerInterrupt, 250); // обработчик прерываний
myMotor1.setMode(0, false); // шаговый режим, без фиксации при остановке
myMotor1.setDivider(8); // делитель частоты 8

}

void loop() {

  dt= DMXSerial.read(5);
  if( dt >= 5 && dt <= 127) myMotor1.step(-10); // по часовой
  else if( dt >= 130 && dt <= 255) myMotor1.step(10); // против часовой
  else {


//--------------------------------- двигатель 1 ---------------------------
if( mode1 == 0 ) {
// ожидание фильтрации датчиков
if( timer > 40 ) {
if( sens1.flagPress == true ) mode1=2;
else mode1=1;
}
}

else if( mode1 == 1 ) {
// синхронизация датчик закрыт
myMotor1.step(-10); // по часовой
if( sens1.flagPress == true ) {
myMotor1.step(0);
mode1=3;
}
}

else if( mode1 == 2 ) {
// синхронизация датчик открыт
myMotor1.step(10); // против часовой
if( sens1.flagPress == false ) {
myMotor1.step(0);
mode1=3;
}
}

else if( mode1 == 3 ) {
// слежение

// ------------------------------------ СЛЕЖЕНИЕ

// проверка остановки двигателя
if( myMotor1.readSteps() == 0) {
// двигатель остановился

// получение заданного положения
setStep1 = (unsigned int)((unsigned long)DMXSerial.read(DMX_CHANEL_MOTO_1) * (numStepsMotor - 1) / 255) ;

// определение сколько шагов надо сделать
stepsToDo1 = currentStep1 - setStep1; // ошибка рассогласования

// if( abs(stepsToDo1) >= (numStepsMotor / 2) ) {

// if((stepsToDo1) > 0) stepsToDo1 -= numStepsMotor;
// else stepsToDo1 += numStepsMotor;
// }

myMotor1.step(stepsToDo1); // запуск двигателя
currentStep1 = setStep1; // перегрузка текущего положения
}

}
else mode1=0;

  }

  // установка режимов двигателя
  numStepsMotor= DMXSerial.read(2); // число шагов двигателя на оборот
  myMotor1.setDivider(DMXSerial.read(3)); // делитель частоты
  if( DMXSerial.read(4) < 127 ) myMotor1.setMode(0, false); // без фиксации при остановке
  else myMotor1.setMode(0, true); // фиксация при остановке

}

//-------------------------------------- обработчик прерывания 250 мкс
void timerInterrupt() {
timer++;
myMotor1.control(); // управвление двигателем
sens1.filterAvarage(); // вызов метода фильтрации по среднему для датчика 1

}


Вернуться в «Проекты Ардуино»

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

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