Страница 1 из 3

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

Добавлено: 13 апр 2018, 01:47
АнтонНикиточкин
Здравствуйте друзья. Начать хотелось бы с выражения благодарности автору данного ресурса. Как только будет возможность, обязательно задоначу. Эдуард, спасибо за ваш труд и проработку огромного пласта информации, снимаю шляпу!
Уже почти год я делаю устройство, принцип действия которого очень похож на алгоритм работы дискотечного прибора, именуемого как "поворотная голова". Это мой первый столь масштабный проект, и в данный момент я уперся в препятствие под названием "программирование микроконтроллера". Мне данная наука дается весьма тяжело, так как привык работать руками, а не головой. Очень хочу разобраться и возыметь понимание вопроса самостоятельно, но если кто-то поможет - буду очень рад. Поиск по просторам как отечественных, так и зарубежных сайтов, не принес должного результата - готового решения моей задачи нет.
Теперь подробности.
Необходимо управлять 2 шаговыми моторами по протоколу DMX512 через ардуино, работающего в режиме приема DMX512. Моторы управляются посредством драйверов SPEP/DIR. Вход "Enable" не подключен, так как в момент остановки двигателя требуется удержание вала мотора. Ток удержания не контролируется, задан драйвером мотора. При загрузке, моторы делают поворот до срабатывания щелевой опторапы, которая перекрывается шторкой, закрепленной на валу мотора. Таким образом выставляется "нулевая точка", от которой мотор может поворачиваться на определенное количество шагов. В моем случае их 255, по одному на уровень канала DMX512.
В цикле работы моторы поворачиваются на определенное количество шагов, в зависимости от изменения уровня DMX канала. Грубо говоря - уровень DMX канала "157" равен 157 шагов от отметки 0, при которой сработала оптопара при загрузке. Скорость вращения двигателей ограничена, так как у механизма большая масса и соответственно - инерция. Например, если уровень DMX изменяется от 0 до 100 и обратно в 0 (цифры для примера) слишком быстро, то мотор делает от нуля 10 шагов (тоже цифра отбалды) и возвращается обратно. При перемещениях на большое количетсво шагов старт и стоп плавные, для снижения момента инерции и потери шагов, если конечно это реализуемо.
На профессиональных заводских головах стоит энкодер, если в процессе работы ее насильно повернуть, она вернется обратно на то же количенство шагов, но это реализовать я точно не смогу, да и не думаю что это необходимо.
Что имеем. Два ШД, 1.8 градуса на шаг (стандарт) nema 34. Драйвера DM556 в полношаговом режиме, для наибольшего крутящего момента. Ардуино - китайский клон Arduino Nano. DMX приемник реализован на SN75176 и развязан оптроном 6n137. Схему я выложу чуть позже, так как она сделана их нескольких, я целиком не рисовал. Щелевая оптопара закреплена на корпусе мотора, шторка на валу, фото выложу чуть позже.
Ардуино плата принимает DMX пакеты, вот этот скетч работает, один канал выдает 0/1 на выходе управляясь через DMX.

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

#include <DMXSerial.h>
void setup () {
  DMXSerial.init(DMXReceiver);
  pinMode(2, OUTPUT);
  }
void loop() {
unsigned long lastPacket = DMXSerial.noDataSince();

int n = 1;
int k = 155;

if (DMXSerial.read(n) > k) {
    digitalWrite (2, LOW);
    } else {
    digitalWrite (2, HIGH);
    }
}


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

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

Добавлено: 13 апр 2018, 09:30
Эдуард
Здравствуйте!
А каким образом, средством вы передаете данные по DMX? У вас есть возможность передавать их от компьютера?

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

Добавлено: 13 апр 2018, 10:41
АнтонНикиточкин
Здравствуйте, Эдуард! Данные с компьютера передаются через USB-DMX512 контроллер, работающий под софтом Sunlite Suite, его я хорошо знаю, с передачей данных проблем нет.

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

Добавлено: 13 апр 2018, 11:12
Эдуард
Я так понял вам необходима следящая система с двумя двигателями.
Я бы делал так. Вам необходимы 2 канала DMX?
Надо реализовать прием данных DMX и проверить. Припаяйте 2 светодиода с ограничительными резисторами к ШИМ выводам платы Ардуино. Дальше надо написать простую программу, которая будет отсылать данные с двух каналов DMX на ШИМ светодиодов. И убедиться, что с компьютера меняется яркость светодиодов.
Дальше включить в систему двигатели и заставить их вращаться под управлением от DMX. Пока просто крутить или останавливать.
следующий этап реализовать следящую систему, как в уроке 32, только с синхронизацией по датчику положения.
Если не сможете это сделать, давайте я попробую помочь. Но у меня нет аппаратной части, поэтому проверять программу на каждом этапе будете вы.

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

Добавлено: 13 апр 2018, 18:56
АнтонНикиточкин
В принципе прием dmx прием проверен по скетчу выше, но я последую вашему совету! Как будут результаты, я напишу.

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

Добавлено: 14 апр 2018, 14:28
АнтонНикиточкин
Итак, получен весьма положительнфй результат со светодиодами.
Реулируются все 4 канала, нареканий нет.
Канал 1 DMX512 это общая яркость всех четырех светодиодов
Канал 2 DMX512 яркость светодиода на выходе 3
Канал 3 DMX512 яркость светодиода на выходе 5
Канал 4 DMX512 яркость светодиода на выходе 6
Канал 5 DMX512 яркость светодиода на выходе 9

Cкетч

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

#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
}


Скетч написан не мной, увы. Можно оформить этот скетч как рабочую модель 4-х канального DMX512 диммера, дополнив схему силовыми ключами.
Далее - нужно реализовать вращение моторов с управлением по DMX512, но с этой задачей я пока не могу справиться именно с написанием скетча.

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

Добавлено: 14 апр 2018, 15:29
Эдуард
Попробуйте вот этот скетч.
Я не особенно задумываясь переделал программу из следящей системы (урок 32). Вместо заданного значения с переменного резистора я взял данные с DMX.
По задумке двигатель должен отслеживать положение, заданное в 1 канале DMX. Пока положение не привязано к датчику. В каком положении было включено устройство, то и принимается за нулевое.
Проверьте. Очень надеюсь, что библиотека DMXSerial не использует таймер 1.

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

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

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

unsigned int currentStep;  // текущее положение двигателя
unsigned int setStep;  // заданное положение двигателя

StepDirDriver myMotor(10, 11, 12);  // создаем объект типа StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE

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

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

    // получение заданного положения
    setStep = DMXSerial.read(1) * (NUM_STEPS_MOTOR - 1) / 255 ;
   
    // определение сколько шагов надо сделать
    int stepsToDo;  // сколько шагов надо сделать

    stepsToDo = currentStep - setStep; // ошибка рассогласования

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

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

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

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

Добавлено: 14 апр 2018, 15:34
Эдуард
Кстати. Вы можете пробовать взять программу драйвера с AT командами из урока 35. И под управлением программы следящей системы верхнего уровня запустить ваше устройство в реальном режиме под управлением от компьютера. Можно проверить скорость вращения, мощность, подобрать параметры. Об этой программе написано в уроке 32, а вариант резидентной программы для STEP/DIR драйвера есть в уроке 35.

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

Добавлено: 14 апр 2018, 16:25
АнтонНикиточкин
Программа работает, однако вылез ньюанс такой
Начинаем на 1 канале DMX512 добавлять по 1 шагу от нулевого значения. Двигатель делает по одному шагу на одну добавленную единицу уровня DMX512 корректно, но при переходе уровня с 164 на 165 отъезжает назад шагов эдак на 30 (на глаз) самостоятельно, затем продолжает корректно двигаться с изменением уровня DMX512. Изобразил траекторию на схеме. Прерывистая линия - движение согласно задумке, цельная линия - самостоятельный переход.
Второй баг - мотор не всегда движется в нужную сторону. Крайние положения не меняются, но иногда от крайнего нуля DMX512 до крайнего 255 мотор движется по часовой, а не против. Возникает такая проблема при переключении с 0 до 255 DMX512 без промежуточных шагов.

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

Добавлено: 14 апр 2018, 16:46
Эдуард
Ошибки и должны быть. Но это в принципе то, что надо? Исправлять?

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

Добавлено: 14 апр 2018, 17:04
АнтонНикиточкин
Да! Общая идея именно такая, только с обнулением при заезде шторки в оптопару. Еще вопрос - можно ли в данной программе изменять количество шагов на 1 уровень DMX512? Мотор здоровый, при полношаговом режиме будет сильная вибрация, так как отбор мощности с вала осуществлен редуктором 1/2 всего лишь. Понимаю, что будет потеря момента, но для плавного движения возможно придется делить шаг.
И возможно ли прикрутить плавый старт и стоп, я понимаю что это задача весьма сложная. Масса большая у конструкции, опасаюсь, что будет пропуск шагов на старте и в конце.

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

Добавлено: 14 апр 2018, 17:05
АнтонНикиточкин
И если хватит 1 ардуино для 2 моторов, это будет очень круто, в одном готовом устройстве мотора будет два.

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

Добавлено: 14 апр 2018, 20:13
Эдуард
А у вас нет желания перевести в микрошаговый режим? Можно оставить ту же разрешающую способность 8 разрядов, обусловленную каналом DMX, а сделать, что на один шаг заданного значения будет, например, 4 или 8 шага двигателя? Я вынужден был так сделать в фасовочном оборудовании. Иначе были силные вибрации.
Два двигателя Ардуино потянет без проблем.

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

Добавлено: 14 апр 2018, 20:31
АнтонНикиточкин
Я вот именно так и думал сделать, если есть возможность в скетче установку 1 шаг DMX512 равнялся 4 или 8 шагам ШД

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

Добавлено: 14 апр 2018, 20:44
Эдуард
Да. Просто внутренний алгоритм будет работать с двигателем у которого допустим 1600 шагов, а заданное значение из DMX будет умножаться на 8. Но скорость упадет.
Так определяйтесь сколько шагов у двигателя.

Еще раз как вариант могу предложить:
Загрузить программу драйвер с AT командами из урока 35.
Программой верхнего уровня StepMotor покрутить двигатель. Определиться с максимальной скоростью, микрошагом, мощностью, пуском и т.п.
Можно проверить работу следящей системы программой Tracker из урока 32.
После этого всего вы окончательно выберете параметры: скорость вращения двигателя, микрошаг. И можно будет двигаться дальше.

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

Добавлено: 15 апр 2018, 02:03
АнтонНикиточкин
Благодарю, завтра займусь этим!

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

Добавлено: 16 апр 2018, 15:52
АнтонНикиточкин
При помощи программы был выбран режим 1600 шагов на оборот и делитель скорости 8.
По оптопрерывателям - если шторка не пересекает его, то на выходе низкий уровень (0.14в), если шторка перекрывает щель - высокий уровень (4.5 в)
Режим плавного старта и пуска все же нужен...

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

Добавлено: 17 апр 2018, 22:47
Эдуард
Попробуйте вариант, в котором данное поступает с монитора последовательного порта Arduino IDE. Задавайте значения от 0 до 255.

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

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

#define NUM_STEPS_MOTOR 1600  // число шагов двигателя на оборот

unsigned int currentStep=0;  // текущее положение двигателя
unsigned int setStep=0;  // заданное положение двигателя
byte i=0;
byte x;
char  inChr[10];
boolean newD= false;

StepDirDriver myMotor(10, 11, 12);  // создаем объект типа StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE

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

void loop() {

  if( Serial. available() != 0 ) {
    inChr[i] = Serial.read();
    if( inChr[i] == 0x0a ) {             
       inChr[i-1] = 0;
        x = atoi(inChr);
       // Serial.println(x);
        newD = true;
       i=0;
    }
    else { i++; if( i > 8 ) i=0; }
  }
 
  // проверка остановки двигателя
  if( myMotor.readSteps() == 0) {
    // двигатель остановился

    // получение заданного положения
    setStep = (unsigned int) ((unsigned long)x * (NUM_STEPS_MOTOR - 1) / 255) ;
   
    // определение сколько шагов надо сделать
    int stepsToDo;  // сколько шагов надо сделать

    stepsToDo = currentStep - setStep; // ошибка рассогласования

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

      if((stepsToDo) > 0) stepsToDo -= NUM_STEPS_MOTOR;
      else                stepsToDo += NUM_STEPS_MOTOR;     
    }

    if( newD == true ) {
      newD= false;
      Serial.print("x="); Serial.print(x );
      Serial.print(" Pos="); Serial.print(setStep );
      Serial.print(" Steps= "); Serial.println(stepsToDo );
    }
 
    myMotor.step(stepsToDo);  // запуск двигателя
    currentStep = setStep;  // перегрузка текущего положения   
  }
}

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

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

Добавлено: 17 апр 2018, 23:47
АнтонНикиточкин
Отлично! Теперь работает почти правильно! Единственное - если менять с нулевого значения до 250 например, мотор не делает почти оборот, а двигается до отметки 250 по кратчайшей траектории. Но в принципе это не критично, переключений таких не будет, уровни будут меняться плавно.

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

Добавлено: 17 апр 2018, 23:53
Эдуард
Я исправил для DMX.

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

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

#define NUM_STEPS_MOTOR 1600  // число шагов двигателя на оборот

unsigned int currentStep=0;  // текущее положение двигателя
unsigned int setStep=0;  // заданное положение двигателя

StepDirDriver myMotor(10, 11, 12);  // создаем объект типа StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE

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

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

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

    stepsToDo = currentStep - setStep; // ошибка рассогласования

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

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

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


Я уберу с форума несколько ответов, чтобы меньше дублировался контент. Поисковые системы этого не любят.

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

Добавлено: 18 апр 2018, 00:00
АнтонНикиточкин
Работает корректно!

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

Добавлено: 18 апр 2018, 00:03
Эдуард
Следующий этап - подключение датчика положения. Алгоритм - если от DMX или при включении, не важно, задано значение 0, то надо остановиться по датчику. К какому выводу подключать датчик?
Но это будет уже завтра.

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

Добавлено: 18 апр 2018, 00:20
АнтонНикиточкин
Я думаю будет логично второй мотор подключить к выводам D7, D8, D9, а датчики пусть будут D3 для мотора D10, D11, D12
А для мотора D7, D8, D9 датчик подключим ко входу D2.
Алгоритм работы датчиков такой. При включении DMX не обрабатывается. Если шторка перекрывает датчик, то мотор должен повернуться до края шторки по часовой, если шторка не перекрывает датчик - то мотор крутится до края шторки против часовой. Записываем это как нулевое положение мотора. Далее читаем уровень DMX и мотор движется на соответствующее количество шагов от нуля по часовой стрелке. и далее уже цикл работы.
Как считаете, увеличение и замедление скорости движения привода для старта/стопа возможно будет дописать в данной программе, или лучше это сделать как-то иначе? Внешним каким-то устройством...
Еще нашел недочет, мотор делает на 255 уровней 1 полный оборот, 360 градусов. Я рассчитывал 255 уровней = 255 шагов, в полушаговом режиме драйвера будет 255*1.8/2 = 229.5 градуса. Большее перемещение не получится по механическим ньюансам.

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

Добавлено: 18 апр 2018, 10:55
Эдуард
Здравствуйте!
С плавным пуском непонятно. Когда его делать? При каждом изменении данных DMX? А если один шаг, он будет незаметен.
Соответствие данного DMX и числа шагов двигателя задано в строке:

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

setStep = (unsigned int)((unsigned long)DMXSerial.read(1) * (NUM_STEPS_MOTOR - 1) / 255) ;

Сейчас 0...255 DMX соответствует 0...(NUM_STEPS_MOTOR - 1) микрошагов двигателя. Вы можете задать любое.

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

Добавлено: 18 апр 2018, 11:38
АнтонНикиточкин
С плавным пуском посмотрю нужно ли будет, как соберу механику, возможно я слишком мудрю.

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

Добавлено: 18 апр 2018, 20:40
Эдуард
Попробуйте с синхронизацией.

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

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

#define NUM_STEPS_MOTOR 1600  // число шагов двигателя на оборот

unsigned int currentStep=0;  // текущее положение двигателя
unsigned int setStep=0;  // заданное положение двигателя
byte mode=0;  // режим: 0 - пауза, 1 - синхронизация датчик закрыт, 2 - синхронизация датчик открыт, 3 - слежение

StepDirDriver myMotor(10, 11, 12);  // создаем объект типа StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE
Button sens1 (3, 10);  // создание объекта для датчика 1

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

void loop() {

  if( mode == 0 ) {
    // ожидание фильтрации датчиков
    delay(10);
    if( sens1.flagPress == true ) mode=2;   
    else mode=1;
  }

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

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

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

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

    stepsToDo = currentStep - setStep; // ошибка рассогласования

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

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


  }
  else mode=0;
 
}

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

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

Добавлено: 19 апр 2018, 00:59
АнтонНикиточкин
Работает!!!! Осталось второй движок прикрутить=)
Блин, как круто!

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

Добавлено: 19 апр 2018, 10:54
Эдуард
Здравствуйте! Попробуйте с двумя двигателями.

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

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

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

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

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

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

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;


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

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

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

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

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

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

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

  }
  else mode2=0;
 
}

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

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

Добавлено: 19 апр 2018, 12:01
АнтонНикиточкин
Все работает! Спасибо!
Второй датчик я переставил с D2 на D4, второй вход не срабатывает. Быть может он сконфигурирован ранее неподходящим образом.

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

Добавлено: 19 апр 2018, 23:17
АнтонНикиточкин
Пара фото готового шилда