Разработка Электрофокусера на базе отладочной платы Arduino Uno, часть 1

Постановка задачи


Имеется любительский телескоп с простым механическим фокусировочным устройством. Фокусировка осуществляется методом вращения колеса фокусера. Процедура фокусировки (особенно для целей астрофотографии) получается весьма мучительной (даже с использованием маски Павла Бахтинова и спец. ПО оценки точности фокусировки типа DSLRFocus или BackyardEOS), так как:

  • Очень сложно приложить рукой нужное усилие и повернуть колесо на действительно маленький угол при точной фокусировке;
  • Каждое касание фокусировочного устройства вызывает колебания телескопа, что приводит к потере времени на ожидание, пока колебания утихнут и можно будет оценить результат последней итерации (и чем хуже монтировка, тем этот интервал дольше, автор имел удовольствие работать с монтировкой, где период полного затухания был ~20 секундам);
  • Описанные выше особенности процесса фокусировки практически исключают фокусировку в динамике: вращение колеса с одновременным оцениванием результата. Как следствие, фокусировка – процесс итерационный, требующий большого терпения и определенного навыка, граничащего с искусством.

Исходя из вышесказанного, ставим следующую задачу в общем виде: необходимо подсоединить к фокусировочному устройству телескопа электропривод, который будет управляться

  • с помощью выносного пульта управления;
  • «удаленно» с ПК;

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

Disclaimer


Я не являюсь инженером ни по образованию, ни по роду занятости. И уж тем более не являюсь конструктором, механиком или монтажником. В данном случае это хобби, выросшее на около профессиональном интересе и любопытстве. Не претендую на то, что данное решение оптимально – вполне возможно профессионал сходу заметит какие-то вещи, которые можно было бы сделать проще. Тем не менее, я гарантирую, что:

  • данное решение работает;
  • его может повторить любой, кто умеет пользоваться паяльником, отверткой, шуруповертом, надфилем, тестером и при этом является опытным пользователем ПК;

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

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

  1. http://sourceforge.net/projects/sglfocuser/
  2. https://github.com/ejholmes/Arduino-Focuser
  3. https://github.com/sirJolo/ascom-jolo-focuser

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


Что получилось


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

  • Шаговый двигатель Fulling Motor FL42STH47-0806M, 12В, 0.8А на фазу,

  • Блок управления фокусером на базе отладочной платы микроконтроллера Arduino Uno и драйвера шагового двигателя Polulu A4988 в промышленном корпусе, питание – 12В, 25 ватт

  • Пульт управления фокусером, для работы рядом с телескопом без использования ПК, имеет
    1. две копки вращения фокусера (желтые, вращение непрерывное с заданной скоростью пока нажата кнопка);
    2. кнопку снятия напряжение с двигателя (синяя, на случай перегрева и с целью снижения энергопотребления);
    3. рукоятку регулировки скорости вращения;


  • Программа управления фокусером с ПК (блок управления подключается к ПК по USB, собранная версия Focuser Control Panel (под Windows) доступна тут


Принципиальная схема блока управления и ПДУ:



Прошивка микроконтроллера выложена на GitHub, равно как и исходный код панели управления.

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

Идеи на будущее



ASCOM-драйвер


Для автоматизации процесса тонкой фокусировки хорошо бы использовать уже готовые решения вроде Backyard EOS. Для этого нужен ASCOM драйвер, которым я планирую заняться несколько позже.

Микрофокусировка


При использовании фокусера Крейфорда с ручкой микрофокусировки решение может существенно отличаться, хотя для начала необходимо точно установить, стоит ли овчинка выделки? При использовании микрошага можно осуществлять поворот оси фоксера на угол порядка 3-4’.

Сменные фильтры


Следующее желание, возникающее после механизации фокусера – механизация колеса окуляров и фильтров. Данная задача имеет куда как более сложную механику и выходит за рамки данного проекта. Однако существуют проекты, решающие данную задачу. Например: ivastro.e3w.ru/FWF/index.htm

Беспроводной пульт


Существуют различные решения, которые позволяют избавиться от проводов. Или по крайней мере из минимизировать. Есть готовые решение вида ИК-пульт + блок управления ШД. Я от них отказался, так как в моем случае они имеют ряд недостатков. Например:
  • ИК пульт требует прямой видимости, что не всегда удобно;
  • WiFi и Bluetooth модули для Ардуино достаточно дороги;
  • Для ДУ можно было бы использовать контроллер I2C, сократив кол-во проводов до 4-х и использовать тонкую витую пару, но плата с I2C контроллером и периферией обойдется примерно в $10.
  • Возможность запоминать положение — очень полезно при смене окуляров, с готовыми решениями эту функцию реализовать можетбыть затруднительно


Почему сделанно именно так? Как сделать мне?


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

UPD: Продолжение следует.
UPD2: проблема с дергающимся при запуске двигателем решилась банально — по возможности не использовать 13-ый пин Arduino. Схема исправлена, код прошивки на github`е обновлен.
Поделиться публикацией
Комментарии 35
    +1
    Попробуйте подтянуть enable до плюса питания, возможно дергается из-за того, что в момент включения все ноги МК находятся в Hi-z состоянии и ловят любую наводку. Еще у вас sleep и reset висит в воздухе.
      0
      Не помогло :(
      –1
      Sleep и Reset заведены друг на друга, как и предлагается делать разработчиком (по инструкции).

      По поводу поднять enable до плюса питания поясните пожалуйста? Двигатель «дергается» в случае, если питание на логику и на мотор подается одновременно. Если сначала поднять питание на логику, а через пару секунд на двигатель — все хорошо. Но это значит, что надо ставить реле, а этого делать не хотелось. Или есть другие варианты?

        +1
        поднять до плюса, это значит подтянуть резистором. Чтобы там был надежный уровень когда выход контроллера «болтается в воздухе».
          0
          А, идею понял, спасибо!
          0
          Ну как минимум в даташите Sleep подтянут резистором к земле. В вашем случае, если вы не планируете управлять Reset и Sleep с МК, нужно подтянут их резисторами порядка 10кОм к питанию. Дело в то, что это логические входы и если верить даташиту, там нет внутренних резисторов подтяжки. Значит любая наводка будет приводить к сбросу и/или засыпанию микросхемы.
            0
            Ага, идею понял. Попробую воплотить. Я ориентиорвался вот на эту диаграмму:
              0
              Ну это диаграмма так, на поиграться. Для всех логических входов уровень должен быть задан по умолчанию. Лучше читать даташит, смотреть типовые схемы включения там. Только будте внимательны, там тоже могут накосячить. Если бы вы делали по дашатиту (т.е. притянули sleep к земле и подключили к МК), у вас бы тоже ничего не дергалось.

              Подтянуть sleep к плюсу и управлять им с МК — тоже выход. Ничего дергаться не будет.
                0
                Не, не помогает :( Подтянул и Sleep, и Reset и Enable к плюсу через 10 кОм — результат нулевой. Попробовал к земле — то же самое. И по отдельности и вместе подтягивал, при старте двгатель ровно три раза делает шаг вперед — шаг назад.
                В даташите, кстати, Sleep и так притянут к плюсу, только через 100 кОм. А Enable к земле.
                Может что-то есть в даташите от самого A4988, но сходу никаких конкретных рекомендаций по этому поводу не нашел.
                Может глупость спрошу, но моежт быть Step имеет смысл подтянуть?
                  0
                  Надо проверить код инициализации контроллера. Может он у вас кратковремеено дергает ногой, когда вы порты настраиваете. В атмельках легко на это попасться.

                  Sleep на приложенной схеме притянут к плюсу потому что там он так управляется с МК. Пока МК явно не опустит его вниз, драйвер будет спать. То же самое с Enable, пока контроллер его явно не поднимет — драйвер будет игнорировать управляющие сигналы.

                  Если же у вас Sleep не управляется с МК, то его надо подтянуть к земле, тогда драйвер никогда не будет засыпать. Если оставить его подтянутым з плюсу — то он всегда будет спать, и вы никак не сможет им управлять.

                  Step не имеет смысла подтягивать, если вы используете Enable и он у вас правильно работает. Пока вы не переведете Enable в активный режим, драйвер будет игнорировать сигналы на Step.

                  Поэтому, посмотрите всё-таки как вы инициализируете порты в МК. Возможно, вы записываете в регистр настройки в нексколько этапов, поэтому сначала пин переводится в output, а потом уже выставляется нужное значение. Или сначала вы настраиваете один пин, не обратив внимание что при записи байта в регистр, вы также перенастраиваете соседние пины.
                    0
                    По поводу инициализацйии — очень может быть, проверю. Скорее всего именно в этом дело, так как я сначала назанаю режимы всех пинов через pinMode(), а потом уже задаю уровни :(( Переделаю через обращение к порту.

                    По поводу управляющих сигналов — на сколько я могу судить по даташиту на А4988, все как раз наоборот (см. стр. 7 и 10). Для работы Sleep и Reset должны быть подняты, а Enable опущен. Видимо поэтому в даташите от Polulu и редлагается замыкать Sleep на Reset (который единственный болтается в воздухе). А Enable заведен на землю.
                    Так?
                      0
                      Да, я просто не обратил внимания, что эти все три управляющих линии инверсные.

                      Так что, да, для нормальной работы N_Sleep и N_Reset должны быть высокие, а N_Enable — низким. Соотвественно, если эти линии не управляются чем-то (например, МК), то они должны быть подтянуты к активным уровням. Если есть внешнее управление, то лучше что бы при запуске они были выключены, соотвествнно нужно их подтягивать к противоположным уровням.
                        0
                        Ага, хорошо. То есть, Sleep и Reset завожу через 10 кОм на землю и после инициализации поднимаю с МК, а Enable наоборот, завожу через 10 кОм на плюс и опускаю после инициализации, так?
                          0
                          Ну да, получается что так. Правда, использовать все три линии — это оверкилл, наверное.
                          Вполне допустимо оставить только Enable, например. Остальные просто оставить подтянутыми к плюсу.

                          Хотя, если есть лишние ноги на МК — то почему бы не порулить всеми тремя линиями. Только не забудьте, что после поднимания N_Sleep надо полождать милисекунду, пока зарядятся charge pump.

                          Enable наверное стоит опускать в самом конце инициализации, когда вы уже готовы управлять двигателем.
                            0
                            Все, разобрался… Больше не дергается. Ну что, двойка нам всем!!!
                            Столько времени потратили, а ответ оказался абсолютно скучным и не интересным :( Поражаюсь, почему я раньше то этого не заметил!
                            Не надо по возможности использовать 13-ый пин на Arduino Uno. На нем висит светодиод, которым ардуинка три раза моргает в процессе загрузки. И похоже происходит это все еще до того как код прошивки вообще получает управление. Step и Dir висят в воздухе, не инициализированы, там конечно шумы и наводки и в это время Ардуинка сама три раза дергает 13-ый пин. Вот и и получается дерганье. Даже если подтянуть Enable к плюсу. В процессе прошивки наблюдается тоже самое. Правильно рассужда?

                            В общем завел Enable на 3-й пин — все прекрасно! Тишина и покой.
                            Вероятно идея заземлить Step тоже сработала бы. Но сейчас уже лень все назад перепаивать.
                            С грустью в душе пошел собирать девайс и исправлять схему.
                              0
                              Да, назадача. Ну значит, минус в карму Arduino. Зачем тратить время на мигание при загрузке, надо сразу отдавать управление скетчу.
                                0
                                В таком случае подтяжка никак не поможет, управление светодиодом пересилит любую разумную подтяжку. Светодиодом arduino дергает еще на этапе загрузчика, и только после загрузчика начинает выполнятся код написаный вами.
                                Разумный выход один — перевесить на другой порт.

            0
            Есть WiFi-модуль es8266 недорогой.
              0
              Ага, вижу, спасибо. В другом проекте пригодиться :)
              0
              Одно хочу заметить: микрошаги работают неточно. Всегда. Это надо учитывать.
                0
                В данном случае абсолютная точность позиционирования — совершенно не важна. Фокусировка — всегда процесс итерационный. Мало того, при разной температуре фокус будет разный. Удобно запоминать примерную позицию в шагах, это экономит время. Грубо говоря, мы имеем дело с системой с обратной связью, где эта самая связь осуществляется человеком. Пропустили микрошаг — ну шагнем еще раз.

                В другом моем проекте, по механизации монтировки — точность позиционирования важна, но как показала практика — не она бутылочное горлышко, хотя там я использую моторы с редукторами, что дает около 33000 шагов на оборот в режиме 1/32 микрошага и обеспечивает достаточную точность. Но об этом позже, в другой статье.
                +1
                А, разве там мотор нужен настолько мощный? Я вот видел в тепловентиляторе 5-вольтовый шаговый двигатель с редуктором. и он гораздо меньше размерами и потреблением.
                  0
                  У данного фокусера крутящий момент около 2 кг/см при комнатной температуре. Второй фокусер, который я мехнизировал крутиться на много легче — 0.5 кг/см. Там и моторчик пошел поменьше.
                  0
                  Для беспроводного пульта можно использовать копеечные NRF24L01, доступно, довольно просто. Дальности вполне хватает для таких целей. Посмотрите, полезная штука.
                    0
                    Посмотрел, спасибо. Цен особенно радует, из серии 3 штучи на десяточку :) Закажу.
                    0
                    а фотки то с телескопа будут?
                      +1
                      Погоди-погоди, я еще только запрягаю :)

                      Ну вот например:
                      <img src="" alt=«image»/>
                        0
                        Ок, ждем продолжения )
                          0
                          Это кроп, или ресайз? ))
                            0
                            И то и дргуое. И ISO 800. И честно говоря — это превьюха. Труба не успела остыть, фокус на серии поплыл :(( А на вторую уже времени не хватило — стремительно рассветало.
                        –1
                        Это называется стрельбой из пушки по воробьям!
                        Ладно бы, фокусер при помощи простой ПЗСки вычислял полуширины звезд и автоматом настраивался! А так — ардуйня безболезненно заменяется на генератор на 555-м чипе. И все довольны. Функционал совершенно такой же, а прошивать МК не нужно. И дешевле! И меньше паять!

                        P.S. чтобы двигатель не дергался при инициализации, EN драйвера надо явно подтягивать! А пока он болтается в воздухе, возможно все, что угодно!
                          +2
                          1. Почему именно Ардуино — будет во второй части. Если можно, дайте ссылку на ваш вошлебный генератор.
                          2. Как показано на схеме от производителя, Enable заведен на землю. А Sleep на 5V. Болтается только RESET.
                          3. Полуширины звезд в городской застройке — вещь бесполезная. А в САО, КрАО, Хабле, Гайе и т.д. моеми потугами вряд ли заинтеруются :) Тогда уж вычислять угол между лучами маски Бахтинова. В любом случае для этого надо научиться управлять зеркалкой, обрабатывать снимки, идентифицировать зведы и уже потом вычислять полуширины. Ну то есть практически переписать BackyardEOS. То есть это вопрос не к решению, а к постановке задачи, а она была иной. Да и зачем это делать? Напишу ASCOM-драйвер, буду пользоваться готовыми решениями. Хотя честно признаться, энтузиазм малось поостыл. Фокусировка уже стала простым и быстрым дело, куда как более приятным, чем привязке к полярной оси.
                            0
                            3. Тьфу, не уголы между лучами конечно, а отклонение центрального луча. Не проснулся :)
                          0
                          Классная тема!

                          Про монтировку расскажите?
                            0
                            Спасибо! :)
                            Планирую, скорее всего сразу после нового года. Сейчас занимаюсь чисткой и оптимизацией. Задача оказалось на порядок (если не на два) сложнее и интереснее.

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

                          Самое читаемое