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

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

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

Сообщение Эдуард » 19 апр 2018, 23:29

Спасибо. Если можно, то напишите для чего используется устройство. Неплохо было бы видео посмотреть. Если какие-то проблемы с коммерческой тайной, то не надо.



АнтонНикиточкин
Сообщения: 32
Зарегистрирован: 13 апр 2018, 01:07

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

Сообщение АнтонНикиточкин » 19 апр 2018, 23:51

Выкладываю трассировку платы в Sprint Layout с комментариями
Компоненты
Arduino nano
SN75176bp Дифференциальный шинный приемопередатчик RS-485
6N137 Оптопара высокоскоростная 10 Мбит/с логическими уровнями на выходе
R1, R2 - 10
R3, R6, R7 - 470
R4 - 4.7k
R5, R8 - 10k
ok1, ok2 - оптопара щелевая TCST2103, минус диода и фототранзистора обьединен.

gnd, dmx3, dmx2 - вход сигнала DMX512
m1 - выход на драйвер ШД1 ( обнуляется по оптопаре ok1)
m2 - выход на драйвер ШД2 (обнуляется по оптопаре ok2)

для выхода с щелевых оптопар задействованы входы ардуино D3, D4

Стоит внимательно отнестись к распайке DMX512 на плате, картинку прилагаю.
Так же не стоит прошивать ардуино на плате, лучше отдельно.
Питание 5vdc должно приходить с 2-х разных источников для корректной работы опторазвязки DMX512 и ардуино.

Файл с трассировкой увы не получается выложить, могу отправить его личным сообщением.
Вложения
3-pin-xlr-wiring-diagram-brainglue-of-3-pin-dmx-wiring-diagram.jpg
плата картинка.JPG

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

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

Сообщение WadimZ » 25 июл 2018, 18:19

Добрый вечер! В первую очередь хочу админу и просто хорошему программисту выразить огромную благодарность за данную разработку. Я искал этот скетч 3 года. И вчера случайно нашел! Просто чудо)
Автору темы - тоже большое спасибо за заданную тему и в результате нашедшее решений.

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

С Уважением,
Вадим

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

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

Сообщение WadimZ » 25 июл 2018, 18:53

У меня есть несколько вопросов - если будет возможность напишите. Благодарю

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

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

Сообщение Эдуард » 25 июл 2018, 21:37

Здравствуйте!
Может на форуме спросите? Можно отдельной темой.

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

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

Сообщение WadimZ » 29 июл 2018, 20:14

Добрый вечер!
расскажу как я пытаюсь реализвовать данную тему.

1. я взял ардуино уно. Нацепил CNC -shield. Удобство в том, что не надо ничего паять . Просто воткнул 2 драйвера DRV8825 шаговиков, подключил 2 концевика.
Результат - при старте ардуины шаговики крутятся против часовой стрелки и пытаются уйти в нулевое положение.
Все идет по плану, но: при нажатии одного из концевиков его двигатель переходит в режим удержания (так и задумано?), второй крутится пока не "встретит" свой концевик. Потом оба отключаются (без удержания. просто выклчаются).
(Уточню - с CNC шилде идет единый сигнал Enable на все драйвера, может надо управлять отдельно сигналами енейбл (если это важно)).

Вроде как все идет по плану и программа верно работает.

2. подключил готовый модуль TTL-RS485 в этой моей сборке. В моем понимании там все просто - выход приемника RO (MAX485) подаю на вход ардуины RX. ну и питание этого 485 модуля...

Но полная тишина.
Не могу понять почему ничего не происходит когда я с программы меняю значание на первом и втором DMX канале...
Линии A и B на входе в 485 менял местами... ничего.


В общем - помогите разобраться пожалуйста.

В Вашем скетче менял только номера пинов на ардуине относительно CNC шилда (DIR1-5 , Step1-2, Enable1 - 8 и DIR2-6 , Step2-3, Enable2 - 8

В общем задумка данного проекта собрать девайс для управления кинетической фигурой через световой пульт.

П.С.С. в автору темы вопрос - у вас все корректно работает?
Поделитесь секретом)

П.С. по готовому результату с удовольствием сделаю админу донейт)

Вадим.

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

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

Сообщение WadimZ » 29 июл 2018, 21:02

Сейчас все переподключил - вроде движки ожили. но как то странно работают.
Во первых - концевики странно себя ведут. Нажимаешь на первый концевик - останавливается первый мотор - второй крутиться пока не нажмешь концевик номер 2. потом все останавливается.
Вроде все правильно, но...
если нажимаешь сначала на второй концевик останавливаются 2 мотора сразу...
Но весь девайс реагирует только на первый DMX канал. и он же управляет сразу обоими движками почему то... Второй канал вообще не на что не влияет.
Но и еще один прикол - когда поднимаешь первый канал - оба двигателя совершают движение синхронно на условный угол (в зависимости от значения DMX), но когда наоборот уменьшаешь значение (убираешь фейдер), то движки крутятся в противоположные стороны.

Не могу понять почему так.

П.С. и еще вопрос - что за значение в Button (1 (понятно - пин), второе значение ???)

СПасибо!

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

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

Сообщение Эдуард » 29 июл 2018, 21:14

Здравствуйте!
Второй аргумент в конструкторе Button время подтверждений или усреднений датчиков в периодах прерывания по таймеру. Можно почитать в уроке 9.
Что касается разобраться. Надо по частям отлаживать. Оставьте один двигатель, отладьте получение данных с DMX. Программа не сложная.

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

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

Сообщение WadimZ » 29 июл 2018, 21:53

А вы не знаете? а автора темы все как надо заработало?
Просто схемы то у нас в принципе идентичные.

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

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

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

Сообщение Эдуард » 29 июл 2018, 22:08

Я так понял, что у него все работает идеально. У меня в уроках такая же система, только данные не по DMX передаются и концевика нет. Все работает без единого сбоя.
Может для начала мою программу из урока попробуете. В уроке 32 описание алгоритма, программы ВУ. В уроке 35 программа адаптирована под STEP/DIR драйвер.

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

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

Сообщение WadimZ » 29 июл 2018, 22:42

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

И так же вам большое спасибо за диалог и помощь в доведении девайса до работоспособности.

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

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

Сообщение WadimZ » 29 июл 2018, 22:44

Я как оказалось был наивен,думая что залью ваш скетч , поменяю пины управления и все будет сразу и хорошо работать))
Думается мне, что вариантов 2 - либо где то в скетче я что уже что то ковырнул (переменную какая нибудь исправил и забыл) или все таки в железе дело

АнтонНикиточкин
Сообщения: 32
Зарегистрирован: 13 апр 2018, 01:07

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

Сообщение АнтонНикиточкин » 03 авг 2018, 14:52

Приветствую друзья! Извините, так как занимаюсь изготовлением моего проекта, очень редко захожу на форум. По конкретной проблеме посоветовать не смогу ничего. В моем случае все заработало так, как и пролагалось. Два движка, два драйвера, плата та что в форуме выложена, питание с двух разных бп для опторазвязки. При включении, моторы движутся до момента перекрытия оптопары шторкой, которая закреплена на оси мотора. Далее, управляются по DMX512 через usb интерфейс, работало на тестах корректно. По циэнци шилду я сказать не могу ничего, так как мне было проще фрезернуть пару плат и взять копеечные детальки.

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

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

Сообщение WadimZ » 07 авг 2018, 18:53

Интересно было бы еще попробывать перевести этот проект на ESP8266. По стоимости сопоставима с стоимостью ардуины. НО:
1) ненадо устанавливать 485 интерфейс
2) ненадо организовывать опторазвязку.
3) управлять можно по протоколу ARTNET.
4) нету физических проводов сигнальных (посути только один WIFI роутер и все девайсы цепляются к нему)

Да и насколько я понимаю - для знающих людей портировать не проблема вообще данную программу.

Но это мысли в слух. И не ислючен вариант создания радиопомех от самих движков. Хотя может этого и не будет.

Но а пока буду отлаживать то, что есть) надеюсь поборю это устройство с вашей помощью.
Всем Мир.

Вадим

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

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

Сообщение WadimZ » 07 авг 2018, 22:52

Сегодня опытным путем выяснил такой нюанс - у меня 8 пин дает команду Enable на один мотор. на второй мотор (драйвер) шел сигнал Enable с 12 пина. РАботало криво(((( Но стоило поменять второй сигнал включения на 13 пин (физически и в программе) - и о чудо - заработало как надо... Просто странно это как то) ....

В общем концевики отрабатывают теперь как надо.

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

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

Сообщение WadimZ » 13 авг 2018, 12:16

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

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

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

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



Добрый день!
Пожалуйста, поподробнее разъясните по настройке соотношения значения DMX и количества шагов.

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

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

Сообщение Эдуард » 13 авг 2018, 13:34

Здравствуйте!
Берется пропорция. 255 - это максимальное значение кода DMX. Строка пересчитывает текущий код DMX, так чтобы спроецировать диапазон кодов DMX (0 ... 255) в диапазон шагов двигателя (0 ... (NUM_STEPS_MOTOR - 1) ).

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

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

Сообщение WadimZ » 11 сен 2018, 21:27

Эдуард писал(а):Здравствуйте!
Берется пропорция. 255 - это максимальное значение кода DMX. Строка пересчитывает текущий код DMX, так чтобы спроецировать диапазон кодов DMX (0 ... 255) в диапазон шагов двигателя (0 ... (NUM_STEPS_MOTOR - 1) ).


Эдуард, Здравствуйте!

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

И по данному материалу - с движками вроде разобрались. Благодарим.

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

Если будет возможность - подправьте пожалуйста данную программу под сервы.
Помоему с ними должно быть проще чем с шаговыми двигателями - им достаточно просто указать угол и не нужно использовать концевики.

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

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

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

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

Сообщение Эдуард » 11 сен 2018, 22:38

Здравствуйте!
Думаю, это несложная задача. Но у меня нет сервоприводов, я с ними никогда не работал.

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

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

Сообщение WadimZ » 12 сен 2018, 00:13

Эдуард писал(а):Здравствуйте!
Думаю, это несложная задача. Но у меня нет сервоприводов, я с ними никогда не работал.



Спасибо за ответ.
Я тоже думаю что задача довольно простая. У меня пока тоже нету сервы на практике попробывать. но скоро будет.

Я в принципе вижу ход решения такой:
Есть библиотека для сервы - Servo.h. Она в ардуино IDE уже идет.
Как я понимаю там явно указывается угол отклонения (положение)

Вот я и не могу совместить - данные, которые принимаются по ДМХ (0-255) к углу поворода сервы (0-180)

Вот в частности пример "KNOB" из ардуино - угол поворота сервы соответствует повороту потенциометра (в масштабе).

#include <Servo.h>

Servo myservo; // create servo object to control a servo

int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin

void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}

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

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

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

Сообщение WadimZ » 25 окт 2018, 20:14

Эдуард писал(а):Здравствуйте!
Думаю, это несложная задача. Но у меня нет сервоприводов, я с ними никогда не работал.



Эдуард, добрый день!
Очень очень нужна ваша помощь! :
по шаговикам разобрался. все заработало (управление по DMX), но сталкнулся с такой проблемой - когда указываешь относительный уровнь, например - Указываешь 10% - мотор поворачивается на 10% по часовой стрелке. Тут все как надо. НО, если указываешь 75% или 90% то мотор идет не по часовой т.е. нарастающий, а идет в нужную позицию (75 или 90%) против часовой. Я так понимаю по кратчайшему пути...(((
Пожалуйста, помогите с этим справиться - исправить.
Срывается такая творческая задумка(((

Буду очень очень благодарен за помощь!!!

Спасибо,
Вадим.

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

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

Сообщение WadimZ » 25 окт 2018, 20:20

У меня задумана подвесная конструкция. и мотор должен ее поднимать на определенную высоту относительно значения DMX. А сейчас происходит немного не то, что нужно.
Выручайте!

Огромное Вам СПАСИБО!

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

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

Сообщение Эдуард » 25 окт 2018, 21:54

Здравствуйте!
Я боюсь ошибиться, но просто надо убрать блоки в режимах СЛЕЖЕНИЕ для обоих двигателей

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

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

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

Эти блоки вычисляют кратчайший путь.

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

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

Сообщение WadimZ » 25 окт 2018, 23:16

Эдуард писал(а):Здравствуйте!
Я боюсь ошибиться, но просто надо убрать блоки в режимах СЛЕЖЕНИЕ для обоих двигателей

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

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

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

Эти блоки вычисляют кратчайший путь.



Эдуард,
прошу прощения - он нужна ваша помощь.

Я удалил конкретно эти строки -
не компилится. выдает ошибку :

exit status 1
'timerInterrupt' was not declared in this scope

Если вам не сложно - помооооооогите тупому)
выложите тут подправленный скетч. Очень нужно. Без вас несправлюсь(((((
Пожалуйста.

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

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

Сообщение WadimZ » 25 окт 2018, 23:35

Не хочу показаться наглым, но мне это действительно - не под силу.
Пожалйуста, скопируйте последний скетч, который отлаженный и удалите ненужные строчки.
Премного вас Благодарю!

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

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

Сообщение Эдуард » 25 окт 2018, 23: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
}

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

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

Сообщение WadimZ » 26 окт 2018, 00:11

Эдуард писал(а):Я удалил тоже самое. У меня ошибки не выдает. Попробуйте.

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

// программа следящего электропривода без обратной связи
 
#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
}




Все получилось
Бесконечно Вам благодарен!!!!
От ДУШИ!

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

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

Сообщение Лев » 16 июн 2019, 13:30

Эдуард, спасибо за скетч, тоже давно искал что то похожее.
Я уже собрал это дело на макетке, все проверил, настроил ,и у меня возник вопрос! А как можно поменять dmx адрес? Как я понял в прошивки он записан на первый (1).
Заранее спасибо!

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

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

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

Здравствуйте!
Адреса двигателей заданы в этих строчках:
#define DMX_CHANEL_MOTO_1 1 // канал DMX для двигателя 1
#define DMX_CHANEL_MOTO_2 2 // канал DMX для двигателя 2


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

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

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