Позиционирование шаговых двигателей

KADAVR
Offline
Зарегистрирован: 21.10.2016

Всем доброго дня!

нужен скетч под Arduino.

Цель:

Упрапвление моторами позиционирования спутниковой антенны по азимуту (0-360) и вертикали (0-90).

Предполагается в дальнейшем управлять позиционированием через com-port arduino послердством компьютерной программы Oritrin Ссылка.

В данном задании только код для позиционирования антенны "в нули" и установки ее в направлении «ЮГ»

 

Дано:

1.       Arduino Мега 2560

2.       Два шаговых мотора 17PM-K020-01V (даташит пришлю) можно для отладки принять, что моторы - NEMA17

3.       Один датчик холла A3144

4.       Модуль GY-271 (трехосевой цифровой компас на микросхеме HMC5883L)

5.       2 Драйвера шагового двигателя – на LN 298 (по одному на мотор)

 

Необходимо создать скетс со следующей логикой.

При запуске скеча происходит позиционирование антенны «по нулям».

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

Антенну по горизонтали можно крутить без ограничения, там вращающееся кабельное соединение, и кабель закручиваться не будут.

По вертикали нужно установить предел от 0 до 90 градусов.

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

Если кратко то:

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

Далее включаем горизонтальный мотор (в любую сторону, пусть будет по часовой стрелке) и двигаемся до тех пор, пока от магнита не сработает датчик холла. (Тут нужно, чтобы антенна не проскочила его, и если проскочила, то вернуть обратно и точно установить магнит над датчиком холла) (горизонтальный мотор у нас по преженему стоит на 15 градусов). Далее горизонтальный мотор нужно повернуть по часовой стрелке ровно на 180 градусов, после поворота остановить горизонтальный мотор, и запустить вертикальный мотор на снижение (то есть с ранее установленных 15 градусов до 0) вместе с антенной будет и опускаться магнит, отвечающий за вертикаль…. Как датчик сработает, остановить мотор.

Все, шаговые двигатели выставлены «в нули»

Дале так как с программы Oritrin будут идти координаты широты и долготы, то с помощью цифрового компаса GY-271 мне нужно повернуть антенну строго на ЮГ и остановить. (вертикальный мотор пусть остается в ноль градусов).

Пока все.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Когда занимался установкой спутниковых тарелок --- там миллиметры сдвига и сигнал падал.

Можно всё реализовать, но какой механизм поворотов? Точность должна быть такой чтобы не пролетать заданный угол и не возвращаться.

Если такое возможно - пишите на скайп p.masyukov  или вибер +79517956505, обсудим.

Onkel
Offline
Зарегистрирован: 22.02.2016

Готов сделать. Пришлите ваш адрес на мой мыл ydom@mail.ru , а то тут обсуждение зачастую мгновенно превращается в базар

1 Да, могу сделать на этой плате. Если нужно строго скетч для ардуино Ide, могу скетч, но рекомендую все же профессиональное решение на честно С, без ардуиновских тормозов и костылей. Обработка данных с компаса и ПИД - регулирование  - достаточно ресурсоемкое дело.

2 Этот пункт понятен. Логика для 2ф биполярных шаговиков нужна

3 тут есть тонкость . Дело в том, что у 3144 триггер шмидта, и позиционировать на этом сенсоре- непростая задача. Эти сенсоры применяют для энкодеров, как правило. Для позиционирования я применяю другие сенсоры, которые дают пропорциональный сигнал, причем по два сенсора на ость, т.е. регулировака двустадийная, это позволяет достить точности 0.1 ° (может и лучше,но у меня была задача добиться 0,1 °, делал вращающуюся раму для галереи "Москва " (это под хсс), а художники люди такие- они и 0,01° могут засечь....). Впрочем, если позиционирование будет делаться с помощью ШД (а это, как правило, 1,8 ° на шаг, редко 0,9 ° на шаг), можно обойтись и одностадийным регулятором, линейная точность на касательной будет порядка 0,2 мм, но возможно процесс стабилизации будет несколько более длительным. . Вам принципиально датчики 3144 или можно другие, линейные? Линейные датчики у меня есть, если интересно, артикулы сообщу письмом.

 

4 У меня есть похожий модуль, включающий  сенсоры  ADXL34,  HMC5883L и  BMP085 , для отладки достаточно будет.

5 ЭТи драйвера очень старые и на них падает по 2-3 В, они греются  и в них нет встроенного ограничения тока. Я бы рекомендовал заменить на импульсные драйвера, их полно и цены приемлемые, хорошие драйвера почти не греются и работают в режиме ограничения тока, что для ШД важно.

ТЗ понятно, хорошо бы еще уточнить протокол управления, ведь после ресета нужно будет поворачивать.  Пишите ydom@mail.ru или сообщите ваш адрес.

 

KADAVR
Offline
Зарегистрирован: 21.10.2016

Вся механика будет использована родная -  KVH tracphone 252

Вот на ebya точно такую же продают http://www.ebay.com/itm/KVH-TRACPHONE-252-COMPLETE-ANTENNA-ASSEMBLY-REPLACMENT-IN-WORKING-CONDITION-/400782400167?hash=item5d507e1aa7:g:8ccAAOSw7NNULGXY&vxp=mtr

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

 

Araris
Offline
Зарегистрирован: 09.11.2012

Onkel, пожалуйста, вставляйте картинки более гуманных размеров.

Onkel
Offline
Зарегистрирован: 22.02.2016

пример регулятора ПИД с точностью 0,1 мм на радиусе 300 мм

https://www.youtube.com/watch?v=WjBBg8a0SUY&feature=youtu.be

Вращающаяся рама для картины Giuseppe ARCIMBOLDO, для выставки в картинной галерее "Москва" (под хсс)

Сама картина

http://phototour.pro/painting/nature_morte/ARCIMBOLDO_Giuseppe/3/

pcb
Offline
Зарегистрирован: 02.04.2015

Согласно заголовку задача управлять шаговиками.
Тогда несколько непонятно, про точность 0,1мм.
Ибо вся точность = шагу или микрошагу шагового двигателя.

PCBADM На мэйл.ру.

Onkel
Offline
Зарегистрирован: 22.02.2016

pcb пишет:

Согласно заголовку задача управлять шаговиками.
Тогда несколько непонятно, про точность 0,1мм.
Ибо вся точность = шагу или микрошагу шагового двигателя.

это только в случае, когда ось вращения есть ось двигателя. Но случаи разные бывают.

 

KADAVR
Offline
Зарегистрирован: 21.10.2016

Вот видео как антенна должна позиционироваться

https://youtu.be/gkhvvxJzv8A

магнитный датчик там используется с маркировкой A42E

MacSim
Offline
Зарегистрирован: 28.11.2012

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

https://www.youtube.com/watch?v=rDcpxn5ZW2k

http://www.spacesat.ru/202.html

http://www.spektr-tv.ru/positioners.php

 

 

 

MacSim
Offline
Зарегистрирован: 28.11.2012

p.masyukov пишет:

Когда занимался установкой спутниковых тарелок --- там миллиметры сдвига и сигнал падал.

судя по такой фразе давно этим занимались. современные приемники с полуметровой антеной неплохо ловят.

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

 

KADAVR
Offline
Зарегистрирован: 21.10.2016

MacSim

По Вашим ссылкам не то. Там приводы для параболических антенн. у меня другая антенна, да и я хочу сделать следящий привод (не для стационарных спутников)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

да всё давно написано - https://github.com/k3ng/k3ng_rotator_controller
+ pstrotator - http://www.qsl.net/yo3dmu/index_Page346.htm
и обсуждение на рл.сайте http://forum.vhfdx.ru/povorotnye-ustroystva/ao-kotoe-oootk/msg272750/?topicseen#new

можно управлять и через орбитрон, так как в проекте реализованы стандартные команды поворотки yaesu, что надо для орбитрона

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Сделаю за 7000 рублей. Brokly(at)mail.ru

Onkel
Offline
Зарегистрирован: 22.02.2016

brokly пишет:

Сделаю за ..... рублей. Brokly(at)mail.ru

Вы опоздали. Опять опоздали.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну не все же время вам опаздывать !

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

Сделаю за 7000 рублей. Brokly(at)mail.ru

А под какой из протоколов обмена данными сделаете?

GS-232, GS-232A, FodTrack, CI-V, IF-100, TrakBox, EASYCOMM-I?

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Где в задании написано про протокол ?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

Где в задании написано про протокол ?

...Предполагается в дальнейшем управлять позиционированием через com-port arduino послердством компьютерной программы Oritrin Ссылка.

В названии программы ошибка, но ссылка правильная, программа управляет повороткой через драйвер WISPDDE, а уж он поддерживает протоколы обмена, нет, ну если Вы напишите и свой драйвер, это можно только приветствовать!

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

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

Да и не читайте между строк, это вредно для психики.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

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

Да и не читайте между строк, это вредно для психики.

Это не я предлагал работу!
Озвучил выше, что всё уже давно написано  Антоном ( K3NG) и проект абсолютно свободный!
Бери и повторяй.
Для Орбитрона можно использовать WISPDDE тоже давно написан радиолюбителем из Южной Америки.
По спутникам, можно конечно в контроллере организовать обработку TLE, но тут сразу же придётся прикручивать интерфейс ETHERNET, организовывать взаимодействие по ежедневному обновлению оных, решать вопросы с математическим обеспечением расчёта траектории спутника, расчёт собственных координат (а от чего строить траекторию) и т.д.
При цене 7 тысяч совершенно не реальное выполнение  тех.задания )))

И это написано не между строк, а прямо, контроллер должен уметь это делать из программы орбитрон, а иначе всё безсмысленно

 

PS

Необходимо создать скетс со следующей логикой...

...

Дале так как с программы Oritrin будут идти координаты широты и долготы, то с помощью цифрового компаса GY-271 мне нужно повернуть антенну строго на ЮГ и остановить. (вертикальный мотор пусть остается в ноль градусов). Пока все.

PPS c программы орбитрон данные приходят по одному из указанных выше протоколов, однако )))

 

 

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Еще раз. Это ваши домыслы. ТС говорит совсем о другом.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

Еще раз. Это ваши домыслы. ТС говорит совсем о другом.

А что говорит начальник транспортного цеха?  ... что-то пропал, он жеж заказчик

PS видимо завис на компилировании скетча от K3NG  )))

PPS...из тех задания...то с помощью цифрового компаса GY-271 мне нужно повернуть антенну строго на ЮГ ... вот в этом месте Вы глубокомысленно не задумались о, а о какой точке идёт разговор о ''строго на юг"???
в одних точках магнитное склонение положительное, в других отрицательное ХОТЕЛ БЫ Я ПОСМОТРЕТЬ КАК ИМЕННО ВЫ БУДЕТЕ ЭТО РЕАЛИЗОВЫВАТЬ. Строго на юг в этом случае - на ось вращения земли однако )))

 

Onkel
Offline
Зарегистрирован: 22.02.2016

ХОТЕЛ БЫ Я ПОСМОТРЕТЬ КАК ИМЕННО ВЫ БУДЕТЕ ЭТО РЕАЛИЗОВЫВАТЬ. Строго на юг в этом случае - на ось вращения земли однако )))

Величина магнитного склонения задается как параметр, по крайней мере на этом этапе.

 

 

 

 

 

KADAVR
Offline
Зарегистрирован: 21.10.2016

ua6em

Только сейчас прочитал Ваши вопросы.  По данному скетчу я договорился уже с участником Onkel

на ваши вопросы ответы такие:

протокл EASYCOMM-I точнее EASYCOMM-II, но использоваться будет та часть, отвечающая за позиционирование антенны, команды отвечающие за корректировку приенмика по доплеровскому сдвигу не нужны.

из всего набора протоколов выбрал именно этот, так как его поддерживает и программа PstRotator (это чтобы потом в ручном режиме управлять)

Прежде чем написать, я подробно ознакомился с трудами Антона ( K3NG) и прочих коллег, разрабатывающих эту тему... Но их разработки заточены все под распростарненные радио-любительские опорно-поворотные устройства, в том числе и yaesu, но там используются другие двигатели, да и обратная связь (положение антенны), там процессор остлеживает по энкодерам... у меня же тут шаговые двигатели и система позиционирования другая, которую переделывать не имеет смысла. Энкодеры добавить можно - но в этом случае

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

про "строго на юг" - согласен с Вам, фраза расплывчатая :)  не буду расписывать "свою мысль", но тут я имел ввиду, "нулевой отсчет" для протокола EASYCOMM... так как он шлет уже координаты спутника, и антенна должна точно им следовать

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

KADAVR пишет:

ua6em

Только сейчас прочитал Ваши вопросы.  По данному скетчу я договорился уже с участником Onkel

на ваши вопросы ответы такие:

протокл EASYCOMM-I точнее EASYCOMM-II, но использоваться будет та часть, отвечающая за позиционирование антенны, команды отвечающие за корректировку приенмика по доплеровскому сдвигу не нужны.

из всего набора протоколов выбрал именно этот, так как его поддерживает и программа PstRotator (это чтобы потом в ручном режиме управлять)

Прежде чем написать, я подробно ознакомился с трудами Антона ( K3NG) и прочих коллег, разрабатывающих эту тему... Но их разработки заточены все под распростарненные радио-любительские опорно-поворотные устройства, в том числе и yaesu, но там используются другие двигатели, да и обратная связь (положение антенны), там процессор остлеживает по энкодерам... у меня же тут шаговые двигатели и система позиционирования другая, которую переделывать не имеет смысла. Энкодеры добавить можно - но в этом случае

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

про "строго на юг" - согласен с Вам, фраза расплывчатая :)  не буду расписывать "свою мысль", но тут я имел ввиду, "нулевой отсчет" для протокола EASYCOMM... так как он шлет уже координаты спутника, и антенна должна точно им следовать

Начну от обратного:

От строго на юг, если антенна будет эксплуатироваться в одной точке, открываем карту 500 (надеюсь найдёте такую) и смотрим магнитное склонение, его то и занесём в переменные, как написал онкел

По K3NG

Ваш датчик в проекте есть, в проекте есть и шаговые двигатели, там пусто, но это не значит, что не будет работать, открываете закладку проекта rotator_stepper.h и рисуете, что вам надо, не хватает функционально, создаете файлик rotator_stepper.cpp и будет вам счастье

Данные магнитного компаса используются в качестве энкодера

Конфигурирование, а что же вам надо из всего объемного проекта осуществляется всего в трёх файлах:

rotator_features.h, rotator_pins.h и rotator_settings.h

Да, орбитрон работает с pstrotator скормив драйверу MyDDE программу PstRotator, только вот программа PSTROTATOR о существовании ваше самопального контроллера понятия не имеет, то-есть на уровне системных команд может всё же ориентироваться на GS-232 от YAESU?

Половина вашего техзадания - стандартные настройки калибровки контроллера от K3NG

Положительное из всего этого:
будет еще один проект контроллера поворотного устройства на ардуино (если скетч выложите), я только за!!!

KADAVR
Offline
Зарегистрирован: 21.10.2016

ua6em

по PSTROTATOR не скажу, что там она в ком порт выдает, но если он поддерживает протокл EASUCOM, то при выставлении углов азимута и элевации, должна выдавать в ком-порт значения AZxxx.x ELxx.x. Ардуино, их примет и повернет антенну, единственно только в PSTROTATOR есть индикатор "показывающий фактическое положение антенны" - вот тут да... ардуино в ком порт не будет передавать координаты шаговиков....  но пока задача не стоит... мне больше важно управление ORBITRONом

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

Данные магнитного компаса используются в качестве энкодера

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А как вы будете определять реальный азимут и элевацию, расчётом? Это плохая затея, от слова совсем...

Любое устройство без отрицательной обратной связи работать будет нестабильно.
В видео, что вы приводили наглядно показано, что датчики находятся на поворотной платформе...
Не знаю, что у вас будет за антенна и какой лепесток излучения, но люди борятся за точность в доли градусов, сейчас это 0,08 градуса

В коде не надо ничего удалять, просто закомментировать ненужное, раскомментировать нужное, компилятор соберёт всё сам, если владеете английским, есть форум, помогут, можно и на радиолюбительском пообщаться, кстати ваш же исполнитель это может сделать в лёгкую, а сообществу подарить закладку rotator_шаговый_двигатель )))
 

KADAVR
Offline
Зарегистрирован: 21.10.2016

Сам магнитный датчик закреплен "стационарно" а на антеннах стоят два магнита

вот на картинке, пласмасса с двумя болтами - болтами закреплен магнит.

антенна будет использоваться та же (которая на видео). все система позиционирования и механика остается без изменения... поэтому проблем с наведением не должно быть

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Покажите крепление HMC5883L

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Для примера настройки моего контроллера

/* main features */

#define FEATURE_ELEVATION_CONTROL       // uncomment this for AZ/EL rotators
#define FEATURE_YAESU_EMULATION           // uncomment this for Yaesu GS-232 emulation on control port
// #define FEATURE_EASYCOM_EMULATION       // Easycom protocol emulation on control port (undefine FEATURE_YAESU_EMULATION above)

#define FEATURE_MOON_TRACKING
#define FEATURE_SUN_TRACKING

#define FEATURE_CLOCK
// #define FEATURE_GPS

#define FEATURE_RTC_DS1307
// #define FEATURE_RTC_PCF8583
// #define FEATURE_ETHERNET

#define FEATURE_STEPPER_MOTOR    // requires Mega or an AVR with Timer 5 support
// #define FEATURE_AUTOCORRECT

#define FEATURE_TEST_DISPLAY_AT_STARTUP  

#define LANGUAGE_ENGLISH         // all languages customized in rotator_language.h
// #define LANGUAGE_SPANISH
// #define LANGUAGE_CZECH
// #define LANGUAGE_ITALIAN
// #define LANGUAGE_PORTUGUESE_BRASIL
// #define LANGUAGE_GERMAN  
// #define LANGUAGE_FRENCH
// #define LANGUAGE_DUTCH

/* master and remote slave unit functionality */
// #define FEATURE_REMOTE_UNIT_SLAVE // uncomment this to make this unit a remote unit controlled by a host unit                      

// #define FEATURE_MASTER_WITH_SERIAL_SLAVE       // [master]{remote_port}<-------serial-------->{control_port}[slave]
// #define FEATURE_MASTER_WITH_ETHERNET_SLAVE     // [master]<-------------------ethernet--------------------->[slave]


/* position sensors - pick one for azimuth and one for elevation if using an az/el rotator */
#define FEATURE_AZ_POSITION_POTENTIOMETER   //this is used for both a voltage from a rotator control or a homebrew rotator with a potentiometer
// #define FEATURE_AZ_POSITION_ROTARY_ENCODER
// #define FEATURE_AZ_POSITION_ROTARY_ENCODER_USE_PJRC_LIBRARY  // library @ http://www.pjrc.com/teensy/td_libs_Encoder.html  
// #define FEATURE_AZ_POSITION_PULSE_INPUT
// #define FEATURE_AZ_POSITION_HMC5883L            // HMC5883L digital compass support
// #define FEATURE_AZ_POSITION_GET_FROM_REMOTE_UNIT  // requires FEATURE_MASTER_WITH_SERIAL_SLAVE or FEATURE_MASTER_WITH_ETHERNET_SLAVE
// #define FEATURE_AZ_POSITION_ADAFRUIT_LSM303              // Uncomment for azimuth using LSM303 compass and Adafruit library (https://github.com/adafruit/Adafruit_LSM303) (also uncomment object declaration below)
// #define FEATURE_AZ_POSITION_POLOLU_LSM303              // Uncomment for azimuth using LSM303 compass and Polulu library
// #define FEATURE_AZ_POSITION_HH12_AS5045_SSI
// #define FEATURE_AZ_POSITION_INCREMENTAL_ENCODER
// #define FEATURE_AZ_POSITION_A2_ABSOLUTE_ENCODER

 #define FEATURE_EL_POSITION_POTENTIOMETER
// #define FEATURE_EL_POSITION_ROTARY_ENCODER
// #define FEATURE_EL_POSITION_ROTARY_ENCODER_USE_PJRC_LIBRARY  // library @ http://www.pjrc.com/teensy/td_libs_Encoder.html  
// #define FEATURE_EL_POSITION_PULSE_INPUT
// #define FEATURE_EL_POSITION_ADXL345_USING_LOVE_ELECTRON_LIB // Uncomment for elevation ADXL345 accelerometer support using ADXL345 library
// #define FEATURE_EL_POSITION_ADXL345_USING_ADAFRUIT_LIB      // Uncomment for elevation ADXL345 accelerometer support using Adafruit library
// #define FEATURE_EL_POSITION_GET_FROM_REMOTE_UNIT            // requires FEATURE_MASTER_WITH_SERIAL_SLAVE or FEATURE_MASTER_WITH_ETHERNET_SLAVE
// #define FEATURE_EL_POSITION_ADAFRUIT_LSM303                            // Uncomment for elevation using LSM303 accelerometer and Adafruit library (https://github.com/adafruit/Adafruit_LSM303) (also uncomment object declaration below)
// #define FEATURE_EL_POSITION_POLOLU_LSM303              // Uncomment for elevation using LSM303 compass and Polulu library
// #define FEATURE_EL_POSITION_HH12_AS5045_SSI
// #define FEATURE_EL_POSITION_INCREMENTAL_ENCODER
// #define FEATURE_EL_POSITION_MEMSIC_2125
// #define FEATURE_EL_POSITION_A2_ABSOLUTE_ENCODER

// *** Здесь выбираем наш дисплей ***   you must also change the feature setting in rotator_k3ngdisplay.h!!!
// If you are using an Adafruit, Yourduino, RFRobot, YWRobot, or SainSmart display, you must also change the feature setting in rotator_k3ngdisplay.h!!!!
// #define FEATURE_4_BIT_LCD_DISPLAY // Uncomment for classic 4 bit LCD display (most common)
// #define FEATURE_ADAFRUIT_I2C_LCD
// #define FEATURE_ADAFRUIT_BUTTONS  // Uncomment this to use Adafruit I2C LCD buttons for manual AZ/EL instead of normal buttons (also set this feature in rotator_k3ngdisplay.h)
// #define FEATURE_YOURDUINO_I2C_LCD
// #define FEATURE_RFROBOT_I2C_DISPLAY

#define FEATURE_YWROBOT_I2C_DISPLAY   // В этом дисплее в настройках надо было только адрес моего дисплея поправить (на 0x3F)
// #define FEATURE_SAINSMART_I2C_LCD

// #define FEATURE_ANALOG_OUTPUT_PINS

// #define FEATURE_SUN_PUSHBUTTON_AZ_EL_CALIBRATION
// #define FEATURE_MOON_PUSHBUTTON_AZ_EL_CALIBRATION

/* preset rotary encoder features and options */
// #define FEATURE_AZ_PRESET_ENCODER            // Uncomment for Rotary Encoder Azimuth Preset support
// #define FEATURE_EL_PRESET_ENCODER            // Uncomment for Rotary Encoder Elevation Preset support (requires FEATURE_AZ_PRESET_ENCODER above)
#define OPTION_ENCODER_HALF_STEP_MODE
#define OPTION_ENCODER_ENABLE_PULLUPS          // define to enable weak pullups on rotary encoder pins
#define OPTION_INCREMENTAL_ENCODER_PULLUPS  // define to enable weak pullups on 3 phase incremental rotary encoder pins
//#define OPTION_PRESET_ENCODER_RELATIVE_CHANGE   // this makes the encoder(s) change the az or el in a relative fashion rather then store an absolute setting
#define OPTION_PRESET_ENCODER_0_360_DEGREES

/* position sensor options */
#define OPTION_AZ_POSITION_ROTARY_ENCODER_HARD_LIMIT // stop azimuth at lower and upper limit rather than rolling over
#define OPTION_EL_POSITION_ROTARY_ENCODER_HARD_LIMIT // stop elevation at lower and upper limits rather than rolling over
#define OPTION_AZ_POSITION_PULSE_HARD_LIMIT  // stop azimuth at lower and upper limit rather than rolling over
#define OPTION_EL_POSITION_PULSE_HARD_LIMIT  // stop elevation at lower and upper limits rather than rolling over
#define OPTION_POSITION_PULSE_INPUT_PULLUPS  // define to enable weak pullups on position pulse inputs

/* less often used features and options */
#define OPTION_GS_232B_EMULATION          // comment this out to default to Yaesu GS-232A emulation when using FEATURE_YAESU_EMULATION above
// #define FEATURE_ROTATION_INDICATOR_PIN     // activate rotation_indication_pin to indicate rotation
// #define FEATURE_LIMIT_SENSE
// #define FEATURE_TIMED_BUFFER           // Support for Yaesu timed buffer commands
// #define OPTION_SERIAL_HELP_TEXT        // Yaesu help command prints help
// #define FEATURE_PARK
// #define OPTION_AZ_MANUAL_ROTATE_LIMITS    // this option will automatically stop the L and R commands when hitting a CCW or CW limit (settings are AZ_MANUAL_ROTATE_CCW_LIMIT, AZ_MANUAL_ROTATE_CW_LIMIT) 
// #define OPTION_EL_MANUAL_ROTATE_LIMITS    // (settings are EL_MANUAL_ROTATE_DOWN_LIMIT, EL_MANUAL_ROTATE_UP_LIMIT)
#define OPTION_EASYCOM_AZ_QUERY_COMMAND // Adds non-standard Easycom command: AZ with no parm returns current azimuth
#define OPTION_EASYCOM_EL_QUERY_COMMAND // Adds non-standard Easycom command: EL with no parm returns current elevation
// #define OPTION_C_COMMAND_SENDS_AZ_AND_EL  // uncomment this when using Yaesu emulation with Ham Radio Deluxe
// #define OPTION_DELAY_C_CMD_OUTPUT         // uncomment this when using Yaesu emulation with Ham Radio Deluxe
#define FEATURE_ONE_DECIMAL_PLACE_HEADINGS
// #define FEATURE_TWO_DECIMAL_PLACE_HEADINGS  // under development - not working yet!
// #define FEATURE_AZIMUTH_CORRECTION        // correct the azimuth using a calibration table in rotator_settings.h
// #define FEATURE_ELEVATION_CORRECTION      // correct the elevation using a calibration table in rotator_settings.h
// #define FEATURE_ANCILLARY_PIN_CONTROL     // control I/O pins with serial commands \F, \N, \P
// #define FEATURE_JOYSTICK_CONTROL          // analog joystick support
// #define OPTION_JOYSTICK_REVERSE_X_AXIS
// #define OPTION_JOYSTICK_REVERSE_Y_AXIS
#define OPTION_EL_SPEED_FOLLOWS_AZ_SPEED    // changing the azimith speed with Yaesu X commands or an azimuth speed pot will also change elevation speed
// #define OPTION_PULSE_IGNORE_AMBIGUOUS_PULSES // for azimuth and elevation position pulse input feature, ignore pulses that arrive when no rotation is active
// #define OPTION_BUTTON_RELEASE_NO_SLOWDOWN  // disables slowdown when CW or CCW button is released, or stop button is depressed
#define OPTION_SYNC_RTC_TO_GPS // if both realtime clock and GPS are present, synchronize realtime clock to GPS

#define OPTION_DISPLAY_STATUS
#define OPTION_DISPLAY_HEADING
#define OPTION_DISPLAY_HEADING_AZ_ONLY
#define OPTION_DISPLAY_HEADING_EL_ONLY
// #define OPTION_DISPLAY_HHMM_CLOCK  // display HH:MM clock  (set position with #define LCD_HHMM_CLOCK_POSITION) // *** закоментировал ***
// #define OPTION_DISPLAY_HHMMSS_CLOCK  // display HH:MM:SS clock  (set position with #define LCD_HHMMSS_CLOCK_POSITION)
// #define OPTION_DISPLAY_ALT_HHMM_CLOCK_AND_MAIDENHEAD // display alternating HH:MM clock and maidenhead on LCD row 1 (set position with #define LCD_HHMMCLOCK_POSITION)
#define OPTION_DISPLAY_CONSTANT_HHMMSS_CLOCK_AND_MAIDENHEAD // display constant HH:MM:SS clock and maidenhead on LCD row 1 (set position with #define LCD_CONSTANT_HHMMSSCLOCK_MAIDENHEAD_POSITION)
// #define OPTION_DISPLAY_BIG_CLOCK   // display date & time clock (set row with #define LCD_BIG_CLOCK_ROW)
// #define OPTION_CLOCK_ALWAYS_HAVE_HOUR_LEADING_ZERO
#define OPTION_DISPLAY_GPS_INDICATOR  // display GPS indicator on LCD - set position with LCD_GPS_INDICATOR_POSITION and LCD_GPS_INDICATOR_ROW
#define OPTION_DISPLAY_MOON_TRACKING_CONTINUOUSLY
#define OPTION_DISPLAY_DIRECTION_STATUS // N, W, E, S, NW, etc. direction indicator
#define OPTION_DISPLAY_SUN_TRACKING_CONTINUOUSLY
#define OPTION_DISPLAY_MOON_OR_SUN_TRACKING_CONDITIONAL
#define OPTION_DISPLAY_VERSION_ON_STARTUP  //code provided by Paolo, IT9IPQ
// #define OPTION_LCD_HEADING_FIELD_FIXED_DECIMAL_PLACE
// #define OPTION_REVERSE_AZ_HH12_AS5045
// #define OPTION_REVERSE_EL_HH12_AS5045

// #define FEATURE_POWER_SWITCH
// #define OPTION_EXTERNAL_ANALOG_REFERENCE  //Activate external analog voltage reference (needed for RemoteQTH.com unit)
// #define OPTION_SYNC_MASTER_CLOCK_TO_SLAVE        // use when GPS unit is connected to slave unit and you want to synchronize the master unit clock to the slave unit GPS clock
// #define OPTION_SYNC_MASTER_COORDINATES_TO_SLAVE  // use when GPS unit is connected to slave unit and you want to synchronize the master unit coordinates to the slave unit GPS
// #define OPTION_DISABLE_HMC5883L_ERROR_CHECKING
// #define OPTION_HAMLIB_EASYCOM_AZ_EL_COMMAND_HACK
// #define OPTION_HAMLIB_EASYCOM_NO_TERMINATOR_CHARACTER_HACK
// #define OPTION_NO_ELEVATION_CHECK_TARGET_DELAY
// #define OPTION_BLINK_OVERLAP_LED
// #define OPTION_EL_PULSE_DEBOUNCE
// #define OPTION_SCANCON_2RMHF3600_INC_ENCODER  // use with FEATURE_AZ_POSITION_INCREMENTAL_ENCODER and/or FEATURE_EL_POSITION_INCREMENTAL_ENCODER if using the ScanCon 2RMHF3600 incremental encoder
// #define OPTION_RESET_METHOD_JMP_ASM_0
// #define OPTION_SAVE_MEMORY_EXCLUDE_REMOTE_CMDS
// #define OPTION_SEND_STRING_OUT_CONTROL_PORT_WHEN_INITIALIZING  // change OPTION_SEND_STRING_OUT_CONTROL_PORT_WHEN_INITIALIZING_STRING in settings file  

/* ---------------------- debug stuff - don't touch unless you know what you are doing --------------------------- */



#define DEFAULT_DEBUG_STATE 0 // 1 = activate debug mode at startup; this should be set to zero unless you're debugging something at startup

#define DEBUG_DUMP  // normally compile with this activated unless you're really trying to save memory
// #define DEBUG_LOOP
// #define DEBUG_BUTTONS
// #define DEBUG_SERIAL
// #define DEBUG_SERVICE_REQUEST_QUEUE
// #define DEBUG_EEPROM
// #define DEBUG_AZ_SPEED_POT
// #define DEBUG_AZ_PRESET_POT
// #define DEBUG_PRESET_ENCODERS
// #define DEBUG_AZ_MANUAL_ROTATE_LIMITS
// #define DEBUG_EL_MANUAL_ROTATE_LIMITS
// #define DEBUG_BRAKE
// #define DEBUG_OVERLAP
// #define DEBUG_DISPLAY
// #define DEBUG_AZ_CHECK_OPERATION_TIMEOUT
// #define DEBUG_TIMED_BUFFER
// #define DEBUG_EL_CHECK_OPERATION_TIMEOUT
// #define DEBUG_VARIABLE_OUTPUTS
// #define DEBUG_ROTATOR
// #define DEBUG_SUBMIT_REQUEST
// #define DEBUG_SERVICE_ROTATION
// #define DEBUG_POSITION_ROTARY_ENCODER
// #define DEBUG_POSITION_ROTARY_ENCODER_USE_PJRC_LIBRARY  
// #define DEBUG_PROFILE_LOOP_TIME
// #define DEBUG_POSITION_PULSE_INPUT
// #define DEBUG_ACCEL
// #define DEBUG_SVC_REMOTE_COMM_INCOMING_BUFFER
// #define DEBUG_SVC_REMOTE_COMM_INCOMING_BUFFER_BAD_DATA
// #define DEBUG_HEADING_READING_TIME
// #define DEBUG_JOYSTICK
// #define DEBUG_ROTATION_INDICATION_PIN
// #define DEBUG_HH12
// #define DEBUG_PARK
// #define DEBUG_LIMIT_SENSE
// #define DEBUG_AZ_POSITION_INCREMENTAL_ENCODER
// #define DEBUG_EL_POSITION_INCREMENTAL_ENCODER
// #define DEBUG_MOON_TRACKING
// #define DEBUG_SUN_TRACKING
// #define DEBUG_GPS
// #define DEBUG_GPS_SERIAL
// #define DEBUG_OFFSET
// #define DEBUG_RTC
// #define DEBUG_PROCESS_YAESU
// #define DEBUG_ETHERNET
// #define DEBUG_PROCESS_SLAVE
// #define DEBUG_MEMSIC_2125
// #define DEBUG_SYNC_MASTER_CLOCK_TO_SLAVE
// #define DEBUG_SYNC_MASTER_COORDINATES_TO_SLAVE
// #define DEBUG_HMC5883L
// #define DEBUG_POLOLU_LSM303_CALIBRATION
// #define DEBUG_STEPPER
// #define DEBUG_AUTOCORRECT
// #define DEBUG_A2_ENCODER
// #define DEBUG_A2_ENCODER_LOOPBACK_TEST