Телескопы покупают здесь


A A A A Автор Тема: Универсальная система управления телескопом на Arduino  (Прочитано 163452 раз)

AndyNigmatec и 1 Гость просматривают эту тему.

Оффлайн IovchАвтор темы

  • *****
  • Сообщений: 1 294
  • Благодарностей: 124
    • Сообщения от Iovch
На форуме уже имеется несколько тем, посвященных системам управления монтировками, собранных на базе компонентов ардуино, в частности:

Простая система управления монтировкой на Arduino
Управление монтировкой на ШД Arduino + grbl
GOTO на Arduino практическая реализация "Импортозамещение"

   В результате изучения этих, и многих других источников, у меня сложилось четкое представление, как простейшим образом, на базе компонентов Ардуино можно решить некоторые вопросы, связанные с управлением телескопом.
   В настоящий момент собран действующий образец управляющего блока на базе Ардуино нано и драйверов А4988 для монтировки на шаговых двигателях с выходом для подключения электрофокусера, с индикацией координат наведения и прочей информации на двухстрочном LCD, с возможностью выполнения команд GOTO задаваемых с ПК, с возможностью подключения проводного устройства управления. Реализовано прямое подключение к плагину «управление телескопом» программы Stellarium. Разработано программное обеспечение для управления экваториальной и альт-азимутальной монтировками, масса тестовых программ. Собранная система управляет монтировкой из комплекта Деагостини «Собери свой телескоп» (аналог Astro-3, на фото), но система подойдет для управления любой монтировкой на шаговых двигателях. Пришло время собрать окончательный вариант изделия уже с беспроводным управлением. В процессе переборки системы, попытаюсь систематизировать и показать в этой теме, от простого к сложному, как простейшим образом, на Ардуино можно реализовать тот или иной функционал. Думаю, материал будет полезным.

Для удобства ориентирования в теме привожу здесь ссылки на основные моменты и программы:

Астротрекер или привод оси прямого восхождения, описание электронной части:
Универсальная система управления телескопом на Arduino
Астротрекер или привод оси прямого восхождения, скетч GOTO1 + драйвер ch341ser.zip:
Универсальная система управления телескопом на Arduino
Привод оси склонений и элемент управления (джойстик), ускорение перемещений, описание:
Универсальная система управления телескопом на Arduino
Привод оси склонений и элемент управления (джойстик), ускорение перемещений, скетч GOTO2:
Универсальная система управления телескопом на Arduino
Система управления экваториальной монтировкой с функциями GOTO, описание и скетч GOTO3:
Универсальная система управления телескопом на Arduino
Прикручиваем управление фокусером к джойстику
Универсальная система управления телескопом на Arduino
Подключаем LCD, описание электронной части:
Универсальная система управления телескопом на Arduino
Подключаем LCD, скетч GOTO4 + драйвер LCD 1602:
Универсальная система управления телескопом на Arduino
Скетч GOTO4 с автоопределением и автоюстировкой джойстика:
Универсальная система управления телескопом на Arduino
Пульт ИК часть 1 (Slave), описание электронной части:
Универсальная система управления телескопом на Arduino
Пульт ИК часть 1 (Slave), скетч GOTO5SLAVE, программа настройки и драйвер пульта ИК:
Универсальная система управления телескопом на Arduino
Пульт ИК часть 2 (Master), описание электронной части и скетч GOTO5MASTER:
Универсальная система управления телескопом на Arduino
Шаговый электрофокусер, описание электронной части:
Универсальная система управления телескопом на Arduino
Шаговый электрофокусер, скетч GOTO6MASTER.zip:
Универсальная система управления телескопом на Arduino
Версии GOTO6MASTER и GOTO6SLAVE для штатного ИК пульта ардуино:
Универсальная система управления телескопом на Arduino
Энергонезависимые часы реального времени:
Универсальная система управления телескопом на Arduino
Скетч для управления альт-азимутальной монтировкой GOTO7MASTER:
Универсальная система управления телескопом на Arduino


Ссылка на яндекс-диск со всеми материалами и стабильными версиями: https://yadi.sk/d/f1jTO1AohCtbz
« Последнее редактирование: 15 Авг 2019 [15:40:58] от Deimos »

Ньютон SW150/750, Рефрактор триплет 100/365_H/M, CG4_GoTo_H/M, Datyson T7C, Levenhuk T510NG, Canon 450Da, БП2 10х50 Berkut

Оффлайн IovchАвтор темы

  • *****
  • Сообщений: 1 294
  • Благодарностей: 124
    • Сообщения от Iovch
Ну тут уже не знаю, ждем автора кода :)
Посмотрите в мониторе порта работу вот этого скетча и почувствуйте разницу  ;D !

(кликните для показа/скрытия)
Ньютон SW150/750, Рефрактор триплет 100/365_H/M, CG4_GoTo_H/M, Datyson T7C, Levenhuk T510NG, Canon 450Da, БП2 10х50 Berkut

Оффлайн asdf

  • *****
  • Сообщений: 2 045
  • Благодарностей: 54
    • Сообщения от asdf
Ну тут уже не знаю, ждем автора кода :)
Посмотрите в мониторе порта работу вот этого скетча и почувствуйте разницу  ;D !

(кликните для показа/скрытия)

Все. Дошло.  :)
« Последнее редактирование: 30 Сен 2017 [05:43:24] от asdf »

Оффлайн Дядя Вова

  • *****
  • Сообщений: 8 084
  • Благодарностей: 95
    • Сообщения от Дядя Вова
Извините, многое пропустил. А прерывания по таймеру в sabj не используются?
(Vixen ED80+Canon300Da, 9x50+QHY5)+EQ6upg
Meade ETX-90PE

Оффлайн IovchАвтор темы

  • *****
  • Сообщений: 1 294
  • Благодарностей: 124
    • Сообщения от Iovch
Извините, многое пропустил. А прерывания по таймеру в sabj не используются?
Нет, прерывания по таймеру нигде в проекте не использовал.
Ньютон SW150/750, Рефрактор триплет 100/365_H/M, CG4_GoTo_H/M, Datyson T7C, Levenhuk T510NG, Canon 450Da, БП2 10х50 Berkut

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Как раз хотел выложить код для проверки, все весьма примитивно и завязано на функцию millis().

(кликните для показа/скрытия)

Загрузить скетч, запустить монитор порта, смотреть и сравнивать с эталонным секундомером. Можно с компьютерными часами, которые надо синхронизировать с временем интернета перед снятием контрольных показаний (скриншоты например, или монитор порта запускать, когда секундная стрелка вблизи ноля часов). Лучше на ночь оставить и утром посмотреть расхождение показаний. Продвинутые программеры легко сделают кнопку старт/стоп  :)
Собственно, всё логично... У Вас цикл выполняется более чем за 1 секунду на итерацию.

Грамотнее писать как-то так:
(кликните для показа/скрытия)
« Последнее редактирование: 01 Окт 2017 [10:59:35] от Deimos »
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Приведение типа? Это какой язык? Стандартное ардуино - преобразование типа как функция.

Язык вроде бы си-подобный, можно и (double)x, и double(x).
Там полноценный С++ (правда выпилены исключения и STL), просто библиотеки написаны так, что может сложиться впечатление, что это язык такой.

Кстати, теперь замечания.
На целевой платформе (8-битный AVR) sizeof(int) = 2, sizeof(long) = 4, sizeof(float) = 4, sizeof(double) = 4, то есть double и float - синонимы.
Это нормально и стандарт требует лишь, чтобы удовлетворялись условия:
sizeof(char) = 1
sizeof(short int) <= sizeof(int) <= sizeof(long int) <= sizeof(long long int)
sizeof(float) <= sizeof(double) <= sizeof(long double)

Для ардуины это цепочки 2<=2<=4<=4 и 4<=4<=4 - всё в порядке.

Далее, мантисса во float/double имеет размер 23 бита, то есть 23 значащих двоичных знака, что при сложении и вычитании может привести к не очевидным, но совершенно ожидаемым последствиям, например:
A + B == A, если после денормализации для сложения второго аргумента он оказывается нулевым. Можете проверить:
Serial.println((double)(1ULL << 25) + 1 == (1ULL << 25)); - будет вычислено в true.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
можно и (double)x, и double(x).
Это разные записи и значат немножко разные вещи: в первом случае величина x преобразуется в тип double, во втором - контруируется новый экземпляр типа double со значением x. Для примитивных типов это одно и то же, но может иметь разный смысл для пользовательских типов.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
О привидении здесь могу вот что добавить:
Между записями millis() / 86400000.0 и millis() / 86400000 есть разница. В первом случае используется double operator/(double, double) с неявным преобразованием первого аргумента long в double (компилятор при этом ругнётся о преобразовании с возможной потерей точности), а во втором - long operator/(long, long), то есть целочисленное деление с отбрасыванием остатка.
Вторая запись к слову неверная, надо сделать так: 86400000L.
Поскольку правый аргумент явно указан в виде вещественного литерала, то преобразование в double будет выполнено неявно и явно его можно не указывать. Но лучше указать, чтобы случайно не ошибиться, и правый аргумент в принципе тоже можно упросить, убрав дробную часть. В общем-то тут исключительно дело вкуса.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн IovchАвтор темы

  • *****
  • Сообщений: 1 294
  • Благодарностей: 124
    • Сообщения от Iovch
Спасибо, Deimos! Некоторые вещи подробно пояснил, мне бы не хватило терпения, да и не профессионал я в программировании. С Си отдельная история у меня. Язык сложен и коварен.  Кто делает первые шаги в прогаммировании, не стесняйтесь и в этих темах: Arduino для начинающих: вопросы и ответы  Платформа Arduino: полезные советы и решения запросить/получить подробности.
Ньютон SW150/750, Рефрактор триплет 100/365_H/M, CG4_GoTo_H/M, Datyson T7C, Levenhuk T510NG, Canon 450Da, БП2 10х50 Berkut

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Если не возражаете, позволю себе немножко пофилософствовать :)

Языки что Си, что С++, разрабатывались как языки для программистов, и в них изначально предполагается, что человек, работающий с ними, понимает, как оно устроено уровнем ниже. Си вообще в конце 60-х позиционировался как высокоуровневый ассемблер. То есть человек, который пишет на ассемблере, должен знать платформу. С другой стороны, языки (и требования к реализации компиляторов) стандартизованы и не дают особых вольностей разработчикам компилятора и неопределённости (это отдельный разговор, но не начинаю его) для разработчиков. С++ действительно сложный, пожалуй, даже самый сложный из используемых в промышленном масштабе языков. Но в нём нет абсолютно ничего непредсказуемого (оставим в стороне обсуждения в комитете стандартизации нововведений в язык), поэтому он и распространился настолько.
Но как бы там ни было, языки программирования - это инструменты, а не самоцель. Знать устройство инструмента полезно, но не строго непроходимо, по большому счёту.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн IovchАвтор темы

  • *****
  • Сообщений: 1 294
  • Благодарностей: 124
    • Сообщения от Iovch
Гидирование и управление монтировкой с ПК

Полагаю, многих интересует «ардуиногидирование». Очень много пришлось повозиться с этим вопросом. Свой драйвер под АСКОМ писать не хотелось (не владею в достаточной степени C++/C# для ПК), а подобрать и состыковать какой-либо готовый, не получалось, но в итоге…
…Это страшное слово АСКОМ… кто его впервые слышит, не пугайтесь, просто установите с официального сайта http://www.ascom-standards.org/ свежую версию ASCOM platform 6.3. Также и там же надо скачать и установить Telescope/Mount driver Celestron Unified (6.0.6338, June 2017).
Используем контроллер монтировки собранный по приведенной здесь Универсальная система управления телескопом на Arduino схеме. Картинку продублировал, чтобы сразу видна была. Схему можно сильно упростить (до схемы GOTO2 этой темы): оставить только 2 драйвера осей X Y, переключатель направлений Y+/Y-, motor ON/OFF и светодиод на корпус. Переключатель режимов, разъем фотоаппарата и фокусера – не нужны здесь, используется режим “Alarm”, т.е. постоянно включенное экваториальное ведение, направление вращения двигателя Х задаем в конфигурационном файле скетча. Загружаем нижеприведенный скетч NSMOUNT.zip, предварительно поставив свои значения в конфигурационном файле, убеждаемся, что при включении идет ведение в нужном направлении.
Запускаем ASCOM POTH Scope-Dome Hub. В настройках указываем Celestron Telescope Driver и номер СОМ-порта к которому подключена ардуина (см. Celestron driver.png), нажимаем «Connect scope». В результате подключения должны появиться три небольших окошка (Три окна.png). Окно POTH с предупреждением, что время монтировки не совпадает со временем ПК закрываем. Используем окно «Hand control» собственно только оно нам и нужно. Все элементы данного окошка должны работать, монтировка должна управляться при нажатии кнопок N T W S, скорости должны меняться от выбора 0,5 sideral - 64*sidereal и 0,5 deg/sec – 4 deg/sec. Соответствие скоростей не гарантируется скетчем, в приведенной версии гарантируется только ее ступенчатое увеличение при выборе от 0,5 sideral до 4 deg/sec, это необходимо и достаточно для обеспечения гидирования. Отключение монтировки делаем кнопкой «Disconnect scope».
Если все получилось на этом этапе – считайте, что гидирование и дистанционное управление телескопом с ПК у вас сделано.
Далее устанавливаем программу PHD Guiding 2, подключаем гидирующую камеру и указываем Celestron Telescope Driver и настраиваем гидирование. Но это уже отдельная и вероятно многократно «перемолотая» тема на данном форуме.
Ньютон SW150/750, Рефрактор триплет 100/365_H/M, CG4_GoTo_H/M, Datyson T7C, Levenhuk T510NG, Canon 450Da, БП2 10х50 Berkut

Оффлайн IovchАвтор темы

  • *****
  • Сообщений: 1 294
  • Благодарностей: 124
    • Сообщения от Iovch
P.S. В приведенном скетче много лишнего, т.к. он делается под полнофункциональный контроллер монтировки. В данном случае гарантирую только трекинг в экваториальном режиме и гидирование. Можно попробовать подключиться к напрямую Стеллариуму или SkySafary через блютус по СОМ порту, до переределки под гидирование все работало, но не проверял. Времени в обрез на все эти дела, т.к. «купила баба порося(д)»  :)!
Ньютон SW150/750, Рефрактор триплет 100/365_H/M, CG4_GoTo_H/M, Datyson T7C, Levenhuk T510NG, Canon 450Da, БП2 10х50 Berkut

Оффлайн ASheff

  • *****
  • Сообщений: 10 499
  • Благодарностей: 247
  • Артем
    • Сообщения от ASheff
Такой вопрос есть, драйвер A4988.
Что считается полным шагом мотора, единичное изменение сигнала на пине STEP драйвера, или двойное изменение уровня сигнала?

К примеру,
digitalWrite(PIN_STEP, 1);
digitalWrite(PIN_STEP, 0);
digitalWrite(PIN_STEP, 1);
digitalWrite(PIN_STEP, 0);
двигатель с шагом 1.8°, если выполнить 200 подобных строчек, тот двигатель повернется ровно на полоборота, вместо ожидаемого полного. Что я не так понимаю? Пины MS1-3 не подключены, работа в полном шаге.
- Meade Maxvision 80/480 APO
- SW HEQ5Pro belt-mod
- Canon EOS 550Da, ASI 178MC, Datyson T7M
- MC Helios 44M-6, MC Юпитер-37А,Canon 70-200/4

Оффлайн аспирант

  • *****
  • Сообщений: 1 830
  • Благодарностей: 60
    • Сообщения от аспирант
Что считается полным шагом мотора, единичное изменение сигнала на пине STEP драйвера, или двойное изменение уровня сигнала?
Импульсом считается переход в 1, а затем возврат в 0. Т.е. нужно выполнить 400 строчек, либо по другому 200 групп 1-0... вроде по логике так.

Оффлайн ASheff

  • *****
  • Сообщений: 10 499
  • Благодарностей: 247
  • Артем
    • Сообщения от ASheff
Импульсом считается переход в 1, а затем возврат в 0. Т.е. нужно выполнить 400 строчек, либо по другому 200 групп 1-0... вроде по логике так.

Так вал двигателя перемещается, если был переход в 1, потом опять перемещается при переходе в 0. Получается можно таким образом использовать полушаг без подачи высокого уровня на MS1?
- Meade Maxvision 80/480 APO
- SW HEQ5Pro belt-mod
- Canon EOS 550Da, ASI 178MC, Datyson T7M
- MC Helios 44M-6, MC Юпитер-37А,Canon 70-200/4

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
А он в таком темпе точно успевает отрабатывать управление?
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн ASheff

  • *****
  • Сообщений: 10 499
  • Благодарностей: 247
  • Артем
    • Сообщения от ASheff
А он в таком темпе точно успевает отрабатывать управление?

Не, задержки есть конечно между сменами уровней, это просто пример.
- Meade Maxvision 80/480 APO
- SW HEQ5Pro belt-mod
- Canon EOS 550Da, ASI 178MC, Datyson T7M
- MC Helios 44M-6, MC Юпитер-37А,Canon 70-200/4

Оффлайн аспирант

  • *****
  • Сообщений: 1 830
  • Благодарностей: 60
    • Сообщения от аспирант
Так вал двигателя перемещается, если был переход в 1, потом опять перемещается при переходе в 0. Получается можно таким образом использовать полушаг без подачи высокого уровня на MS1?   
Не знаю, я сторонник традиционного подхода https://www.pololu.com/file/download/a4988_DMOS_microstepping_driver_with_translator.pdf?file_id=0J450  с 6 страницы...

Оффлайн ASheff

  • *****
  • Сообщений: 10 499
  • Благодарностей: 247
  • Артем
    • Сообщения от ASheff
Не знаю, я сторонник традиционного подхода https://www.pololu.com/file/download/a4988_DMOS_microstepping_driver_with_translator.pdf?file_id=0J450  с 6 страницы...

Спасибо за ссылочку, но все ж странная логика шага с двумя движениями. Ладно, будем экспериментировать :)
- Meade Maxvision 80/480 APO
- SW HEQ5Pro belt-mod
- Canon EOS 550Da, ASI 178MC, Datyson T7M
- MC Helios 44M-6, MC Юпитер-37А,Canon 70-200/4

Оффлайн аспирант

  • *****
  • Сообщений: 1 830
  • Благодарностей: 60
    • Сообщения от аспирант
Спасибо за ссылочку, но все ж странная логика шага с двумя движениями.
В принципе, вполне логично для полношагового режима - переход 0-1 контроллер выставляет одинаковый ток (может максимальный, может половина от максимального) на обеих фазах... переход 1-0 - максимальный ток на второй фазе. Следующий переход опять одинаковый ток, следующий переход - максимальный ток только на первой фазе... и т.д. Поэтому лучше пользоваться документированными функциями, когда на соседних фазах гарантирован одинаковый половинный ток. Это мои предположения... может всё не совсем так.