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


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

0 Пользователей и 1 Гость просматривают эту тему.

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

  • *****
  • Сообщений: 1 306
  • Благодарностей: 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

Оффлайн portal

  • ****
  • Сообщений: 391
  • Благодарностей: 28
  • Мне нравится этот форум!
    • Сообщения от portal
вот опять 3 часа торчал на улице а толку ноль. Перекинул провода по оси DEC - проверяю стеллариум. Узнал координаты фомальгаута , навелся , создал в каталоге- привязал. Думаю наведусь на Сатурн, он недалеко : монти поднялась по оси DEC тормознула на широте сатурна , поехала на запад в 5 градусах от сатурна стала дергатся - я понимаю это коррекция так работает , но пока я залипал в стелариум монти САМА сдвинулась на запад и юг на широту фомальгаута. а визир остался на сатурне. ???
По скорости ведения- я навелся на юпитер , в 23 ночи он строго на западе. Стал выставлять vdmss , 74200000 и у меня на минутной выдержке нет треков ....навелся в зенит уже на 30 секундах треки , навелся на юг - тоже на 30 секундах треки .это из за неправильной выставленой полярки?
самодел рефрактор  90\800 ,130\700, Canon 550D, microsoft HDcam с UW\IR фильтром , arduino EQ 1  с гидированием и go to

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
А вы посмотрите в какую сторону треки - я так еще до ардуинки ловил косяки в ведении своего франкенштейна когда он еще на обычном моторчике был.

Т.е. я делал снимок (минута или несколько мин), первые 15-20 сек было отключено ведение, затем включал - и уже на фотке видел что и куда ведет)))

вот пример - Универсальная система управления телескопом на Arduino

там кстати далее посты - я аналогично не мог заставить нормально наводиться из стеллариума, оказалось скорости с которыми наводится монти влияют.
« Последнее редактирование: 29 Сен 2023 [09:58:19] от AndyNigmatec »
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
поехала на запад в 5 градусах от сатурна стала дергатся - я понимаю это коррекция так работае
- вот именно так у меня работало (вернее не работало) наведение из стеллариума вначале, излечилось уменьшением скорости наведения:

Цитата
С этим тоже прояснилось - непрерывность достигается уменьшением параметров imStepsXPS и imStepsYPS ... правда при этом соответственно уменьшается макс.скорость перемещения с пульта, что для меня в силу особенностей конструкции нехорошо.
Универсальная система управления телескопом на Arduino

Странно что у вас раздельно позиционирование работает, изначально скетч наводился одновременно по обеим осям, что мне не понравилось и я его немного модифицировал чтоб наводилось сначала по RA потом по DEC.
« Последнее редактирование: 29 Сен 2023 [10:20:17] от AndyNigmatec »
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
Такой вопрос возник - а как мне почистить скетч от азимутальной части?

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

Может и глупость сказал, но практика показала: отключаю гид.импульсы в phd2 - RA ведет боль-менее ровно (без резких скачков), включаю - получаю осциллограмму ... всякими настройками в phd2 удалось RMS довести до 1-1,4" ... но хотелось бы менее 1".
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн FlexLM

  • ****
  • Сообщений: 252
  • Благодарностей: 42
  • Олег
    • Сообщения от FlexLM
    • AMount - cистема управления телескопом
Для начала попробуйте закомментировать (так всю строку //какой-то код или так несколько строк /* какой-то код */ ), введя в поиск разные комбинации:
(iTMode==0)||(iTMode==1)
(iTMode==1&&iSMode!=0)
iTMode==1
Shutting() // это в цикле loop()
if(Debug)//это касается отладки
« Последнее редактирование: 05 Окт 2023 [19:32:04] от FlexLM »
SW Dob8 + AMount

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
Спасибо, попробую.

Случайно не знаете за что отвечают переменные:
iTMode
iSMode
?
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн FlexLM

  • ****
  • Сообщений: 252
  • Благодарностей: 42
  • Олег
    • Сообщения от FlexLM
    • AMount - cистема управления телескопом
См. Amount.ino:
iTMode   // Тип монтировки, 1=Альт-азимутальная
iSMode  // Скорость ведения
SW Dob8 + AMount

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
А могу я дополнительно в скетче убрать (закоментить) структуру

XYxy AzAlt {0.0, 0.0, 0.0, 0.0, 0}; //Текущие и целевые AzAlt

и соответственно закоментить функции:

AzAltFromRaDe()
RaDeFromAzAlt()

и убрать реакцию на "z" и "Z"

   /*         
   case 'z': {if(iTMode==2||iTMode==3) AzAltFromRaDe(1);
              Serial.print(HexToStr(RaToUL(AzAlt.AtX,ulMaxValue),STROUT,8)); Serial.print(","); //Сохраненный из NexStar протокола
              Serial.print(HexToStr(RaToUL(AzAlt.AtY,ulMaxValue),STROUT,8)); Serial.print('#'); //запрос текущих азимутальных координат
              break;}
             
   case 'Z': {GetSubStr ();
              if((strlen(STR1)==8)&&(strlen(STR2)==8))
               {
                Serial.print('#');
                if (iTMode==0||iTMode==1||iTMode==2||iTMode==3) //В любом режиме
                 {
                  AzAlt.ToX=ULToRa(StrToHEX(STR1),ulMaxValue);
                  AzAlt.ToY=ULToRa(StrToHEX(STR2),ulMaxValue);
                  if (!bAlignment) {AzAlt.AtX=AzAlt.ToX; AzAlt.AtY=AzAlt.ToY; RaDeFromAzAlt(3); bAlignment=true;}
                  else RaDeFromAzAlt(2);
                  ulLoopTimer= millis();
                  ulMilisec =millis();
                 }
                }
                break;}     
    */

без потери функциональности в экваториальном режиме?


в таком варианте у меня получается:
Цитата
Скетч использует 21728 байт (70%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 587 байт (28%) динамической памяти, оставляя 1461 байт для локальных переменных. Максимум: 2048 байт.
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн FlexLM

  • ****
  • Сообщений: 252
  • Благодарностей: 42
  • Олег
    • Сообщения от FlexLM
    • AMount - cистема управления телескопом
Команды z, Z можно смело убрать, они для AltAz. Для Eq монтировки используются команды работы с координатами e и r.
Со структурой XYxy AzAlt сложнее, она там вплетена в код для Eq-режима. Если какая-то функция есть, но не используется в коде, то компилятор её просто проигнорирует. Ещё там имеются функции работы со временем, но используется ли что-то для Eq-режима я не помню.
То, что вы пишете об объёме скетча, вполне нормально. Я больше склоняюсь к ограниченности быстродействия ардуино. Esp32 заметно шустрее. У вас скорость обмена данными 9600 или 115200?
SW Dob8 + AMount

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
У вас скорость обмена данными 9600 или 115200?
- 9600 и по шнурку, 115200 как-то не очень устойчиво работала
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн FlexLM

  • ****
  • Сообщений: 252
  • Благодарностей: 42
  • Олег
    • Сообщения от FlexLM
    • AMount - cистема управления телескопом
У меня как-то было, что частый опрос аналоговых входов (на них висит реальный кнопочный пульт РП) "подвешивал" даже esp32. Попробуйте в loop() закоментировать ulCtrlStat=AskControl(), чтобы это оценить. И если понадобится, то подумать над ограничением частоты опроса. Например, при гидировании его программно отключать. Но в этом случае РП не будет работать, придётся использовать ВП.
« Последнее редактирование: 06 Окт 2023 [15:49:52] от FlexLM »
SW Dob8 + AMount

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
У меня как-то было, что частый опрос аналоговых входов (на них висит реальный кнопочный пульт РП) "подвешивал" даже esp32. Попробуйте в loop() закоментировать ulCtrlStat=AskControl(), чтобы это оценить. И если понадобится, то подумать над ограничением частоты опроса. Например, при гидировании его программно отключать. Но в этом случае РП не будет работать, придётся использовать ВП.

Спасибо, попробую.

по предыдущему: установка скорости обмена 115200 - разве не сильнее нагрузит проц?
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн FlexLM

  • ****
  • Сообщений: 252
  • Благодарностей: 42
  • Олег
    • Сообщения от FlexLM
    • AMount - cистема управления телескопом
Если на 9600 работает стабильнее, то оставляйте её.
SW Dob8 + AMount

Оффлайн FlexLM

  • ****
  • Сообщений: 252
  • Благодарностей: 42
  • Олег
    • Сообщения от FlexLM
    • AMount - cистема управления телескопом
По просьбе ЛА для ВП добавлена возможность изменять цвет текста и подсветку кнопок (см. "Настройки->Цвет текста"). Установленный цвет "запоминается".
SW Dob8 + AMount

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
Всем доброго!

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

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

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
Проблема думаю где-то в этой ф-ии - unsigned long AskControl() ... но я не программер ((((

конкретно в этом куске кода:

if(iCtrlEnable>3) //KEYCONTROL
     {
      if(iCtrlEnable>7) //Defined Z key
      {
      if((iA3<250)){iLastCtrlKey=5; strcat(strcat(strcpy(CSTR,"F"),itoa(iZRate,LCTRL,10)),"-");} // F-
      if((iA3>=250)&&(iA3<=650)&&(iLastCtrlKey>4)&&(iLastCtrlKey<7)) {InitSTR(CSTR,SubSTRMaxLen);} // Stop F
      if((iA3>650)){iLastCtrlKey=6; strcat(strcat(strcpy(CSTR,"F"),itoa(iZRate,LCTRL,10)),"+");} // F+
      }
      if((iA4<250)||(iA4>650)) //S+/-
      {
       digitalWrite(13, HIGH); //Отображает нажатие клавиши S
       if(iLastCtrlKey>4) LCTRL[0]='f'; else
       if(iLastCtrlKey<3) LCTRL[0]='x'; else LCTRL[0]='y';
       LCTRL[1]='\0';
      if(iA4<250) // S-
      {
       if(iLastCtrlKey<5) if(iXYRate>1) iXYRate--; else if(iSMode!=0) {iSModeOLD=iSMode; iSMode=SetSMode(0);} //Mount
       if(iLastCtrlKey>4) if(iZRate >1) iZRate--; //Focuser
      }
      if(iA4>650) // S+
      {
       if( iLastCtrlKey<5) //Mount
        {
         if(iXYRate<9) iXYRate++;
         if((iSMode==0)&&(iSModeOLD>0)) {iSMode=SetSMode(iSModeOLD); ulLoopTimer=millis(); ulMilisec=millis();} // Tracking ON
        }
       if( iLastCtrlKey>4) if(iZRate <9) iZRate++; //Focuser
      }
      if(LCTRL[0]=='f') itoa(iZRate,LCTRL+1,10); else itoa(iXYRate,LCTRL+1,10);
      strcat(LCTRL,"#");
      Serial.print(LCTRL);
      LCTRL[0]='\0';
      digitalWrite(13, LOW);
      ulCtrlTimer=millis();
     } //S+/-
    } //KEYCONTROL

зачем мы в порт передаем что-то?
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн FlexLM

  • ****
  • Сообщений: 252
  • Благодарностей: 42
  • Олег
    • Сообщения от FlexLM
    • AMount - cистема управления телескопом
В порт передаём информацию о последней нажатой кнопке (ось или фокусер), чтобы синхронизировать изменение скорости между ВП и РП. Например, изменяем скорость через РП, а ВП это изменение показывает.

Попробуйте в loop() закоментировать ulCtrlStat=AskControl();
Чтобы понять программный это глюк или аппаратный (например, просадка напряжения). При нажатии кнопок РП (он не будет работать) phd2 вылетает?
Далее, если проблема осталась, убирайте комментарий из loop и пробуйте закоментировать в AskControl()
if(LCTRL[0]=='f') itoa(iZRate,LCTRL+1,10); else itoa(iXYRate,LCTRL+1,10);
      strcat(LCTRL,"#");
      Serial.print(LCTRL);
      LCTRL[0]='\0';
« Последнее редактирование: 12 Окт 2023 [17:29:51] от FlexLM »
SW Dob8 + AMount

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
направление понял, проверю, спасибо.
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
провел вчера тест: закоментил ulCtrlStat=AskControl(); - вылетов PHD2 при любых нажатиях на РП нет - все четко, ну ессно пульт при этом не работает.
раскоментил - вылетает при нажатиях S+/S- (в phd подключены монти и камера ессно)

тогда закоментил в AMOUNT.h в процедуре unsigned long AskControl() строчку:
Serial.print(LCTRL);

и все норм - пульт работает, вылетов никаких нет, правда ВП при этом я не догадался потестить - ну так когда в phd монти подключена то ВП и не подцепится - порт то занят.

Получается PHD2 сводит с ума передаваемая в порт инфа в процедуре AskControl(), и судя по коду процедуры передается она только при нажатиях S+/S-

UPD. Собственно теперь это для меня не проблема - для себя я пофиксил, ежели мне понадобится ВП - то заставлю скетч читать еще параметр (например "w" - он вроде не занят) и в зависимости от него включать/отключать команду Serial.print(LCTRL);  - решение тупое, зато мне по силам)).
Так что исправлять глобально это - на усмотрение авторов, необходимости нет, ну и для информации если еще кто столкнется.
« Последнее редактирование: 13 Окт 2023 [10:36:38] от AndyNigmatec »
Да здравствует то благодаря чему мы несмотря ни что!

Оффлайн AndyNigmatec

  • ***
  • Сообщений: 219
  • Благодарностей: 32
    • Сообщения от AndyNigmatec
Параллельно еще решал задачу на тему разгрузить немного ардуинку, по совету FlexLM закоментил все блоки с  if(Debug) хотя вряд ли это сколько-нить значительно напрягало проц, убрал все связанное с фотиком и решил сделать пореже (не в каждом цикле) опрос аналоговых входов AskControl()

вот с последним вышло не совсем ... частоту вызова уменьшил тупо счетчиком:

if(iAskCounter>=iAskControlStep)
 {
  iAskCounter=0;
  ulCtrlStat=AskControl();  // Запрос и обработка состояния элементов управления
 }
 iAskCounter++;

но столкнулся с непонятным для меня поведением системы - если вызов AskControl() я делал реже чем раз в пять-шесть циклов, то по оси Dec все работало норм, а вот по Ra почему то шаговик крутил только условно "вперед" независимо от нажатия кнопок вправо или влево, нормально Ra отзывалась на пульт только при iAskControlStep не более 5-6 (я игрался с параметрами, смотрел чего как).
Также заметил, что выставляя более 100 пульт начинал "подтормаживать" на команды ... странно, вроде частота цикла loop() 1,136МГц, по идее и при опросе раз в 1000 циклов не должно было быть заметного на глаз подтормаживания отклика, в результате остановился на 5, посмотрим далее как себя железка вести будет ))

Да здравствует то благодаря чему мы несмотря ни что!