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

    Продолжение, начало тут.

    Определение исходных требований к устройству. Выбор «железа»


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

    Общие требования


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

    Функционал


    Основные функции устройства:
    • вращение против часовой стрелки с заданной скоростью(тактовая кнопка, пока нажато — вращаем)
    • вращение по часовой стрелке с заданной скоростью (тактовая кнопка, пока нажато — вращаем)
    • регулировка скорости вращения (потенциометр)
    • команда «освободить двигатель» – снять напряжение с двигателя (для экономии ресурса АКБ и для охлаждения двигателя, при необходимости)
    • Кроме того, полезно вставить функцию автоматического снятия напряжения с двигателя если фокусером не пользуются продолжительное время (скажем, более 10 минут) – тут возможны варианты;
    • Хорошо бы иметь на пульте ДУ простую индикацию величины скрорости вращения, например яркостью светодиода.


    Исходя из способа применения, необходимо иметь как минимум два варианта управления фокусировочным устройством:
    • с пульта управления при работе непосредственно у телескопа (в т.ч. при визуальных наблюдениях или при грубой фокусровке по изображению на дисплее цифровой камеры) — то есть меня вполне устроит кнопочный пульт на коротком кабеле ;
    • с помощью собственного ПО с ноутбука под OS Windows, значит блок управления фокусером должен подключаться к ПК, например по USB;
    • опционально, в будущем — с ПК с помощью ASCOM-драйвера.


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



    Двигатель и драйвер


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

    Подключение двигателя - биполярное
    Биполярное. Это объясняется тем, что именно биполярное подключение дает максимальный крутящий момент на низких оборотах. В случае, если используется двигатель с 6-ю отводами, необходимо использовать крайние, средние заизолировать. При этом необходимо учитывать, что сопротивление обмоток при этом возрастает в 2 раза, соответственно ток падает в два раза, соответственно падает крутящий момент.


    Крайне важный параметр, по которому нужно выбирать двигатель – необходимый крутящий момент двигателя. В моем случае, максимальный крутящий момент, который мне удалось зафиксировать составил ~2 кг/см при комнатной температуре.
    Желая иметь некоторый запас, я задался минимальным крутящим моментом в 3 кг/см.

    Как измерить крутящий момент без измерительного оборудования в домашних условиях.
    Сделать это достаточно просто. Для этого необходимо к валу фокусировочного устройства прикрепить рычаг (можно использовать само фокусировочное колесо, зацепившись за его край) и используя динамометр измерить силу, при которой происходит «срыв» положения вала. Для этого плавно увеличивая усилие тянем динамометр строго перпендикулярно оси рычага (естественно в плоскости рычага, перпендикулярно оси вала фокусера) и ловим момент начала вращения.

    Схема 2


    Не забываем привести показания динамометра к требуемым единицам и умножить на плечо рычага (обычно крутящий момент указывается в Н*м или в кг*см). Что делать, если нет динамометра? Взять безмен, кухонные весы или сделать самостоятельно с помощью пружины и линейки, например, так:


    В последнем случае необходима калибровка, которую можно сделать используя бутыль с водой (1л=1кг). Точность конечно не высокая, но для нашей задачи вполне достаточная.

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

    UPD! Еще один очень важный момент — обычно производители указывают номинальный крутящий момент. То есть момент, при номинальном напряжении, номинальном токе и полном шаге! Ниже станет ясно, что для достижения необходимой точности нужно пользоваться режимом микрошага, при котором крутящий момент существенно падает! Поэтому выбирать двигатель по величине крутящего момента обязательно нужно с запасом.



    Следующий важный параметр – точность позиционирования. Так как я уже решил, что буду использовать шаговый двигатель, то вопрос ставится так: какой шаг должен быть у двигателя и нужно ли мне использоваться драйвер с поддержкой микрошага? Большинство доступных двигателей имеет шаг 1.8° на оборот (или 200 шагов), но так же доступны модели с шагом 0.9° (400 шагов на оборот), 7.5° и другие. Данный параметр так же индивидуален. В моем случае зона фокусировки получилась порядка 15°.

    Измерение угла фокусировки
    Для оценки точности позиционирования необходимо определить на какой угол мы поворачиваем вал фокусировочного устройства при фокусировке. Для этого на ручку фокусера я нанес метку – нуль-пункт. Далее, используя маску Бахтинова сфокусировался по звезде. Померил угол a1 — положение метки относительно отвеса транспортиром. После чего расфокусировал изображение (в любую сторону) так, чтобы отсутствие фокуса было хорошо заметно (средний луч существенно сместился в сторону от центра симметрии дифракционной картины). Измерил угол a2 – второе положение метки относительно отвеса. Разность значений (a1-a2) по модулю умноженная на 2 – и есть зона фокусировки.

    Схема 3


    При этом точная фокусировка (минимальный угол, при котором становится заметным смещение среднего луча от центра) – менее 2° (выбранная методика не позволяет делать замеры точнее, но это и не нужно). Таким образом, при использовании двигателя с шагом в 1.8° вся зона фокусировки будет проходиться примерно за 10 шагов, а точная фокусировка будет фактически невозможна. Шаг 0.9° так же скорее всего будет недостаточным для хорошей фокусировки.
    Измерив угол, в котором производится фокусировка с разными окулярами, я получил разные значения, но одного порядка – 10-20°. Так что влияние окуляра в данном случае, вероятно, не принципиально.


    В итоге я пришел к выводу, что можно использовать шаговый двигатель с шагом 1.8° или 0.9°, но в любом случае нужен драйвер шагового двигателя с поддержкой микрошага. По этой причине мне пришлось отказаться от использования популярных драйверов, распространяемых в виде Arduino Shield – все они не поддерживают микрошаг. Выбор пал на легко доступный и дешевый Polulu A4988, который правда пришлось разместить на отдельной плате.
    Позже, в следующем проекте, я использовал DRV8825 того же производителя и он мне понравился значительно больше.

    "
    Для управления A4988 нужно минимум 6 сигналов — ENABLE, STEP, DIR и три сигнала выбора микрошага MS1, MS2, MS3. Учитывая три таковые кнопки на пульте ДУ (влево, вправо и «освободить») и светодиод скорости получается, что придется задействовать 10 цифровых выходов микроконтроллера.

    Пропуск шага и низкая точность в микрошаговом режиме - мифи и реальность
    Часто можно услышать, что ШД в режиме микрошага обязательно пропускает шаги, неточно позиционируется, крутящий момент катастрофически падает и т.п., и что мол вообще не надо их использовать. Потратив некоторое время на этот вопрос у меня сложилось впечатление, что это распространенное заблуждение. Подтверждением этому служат как мои собственные эксперименты, так и разнообразные источники в сети. Не являюсь специалистом в данной области, постараюсь обобщить собранную информацию (теоретическую и экспериментальную), предоставив читателю самому делать окончательный вывод. Итак, наиболее распространенные претензии ка ШД и микрошагу:
    1. В режиме микрошага очень сильно падает крутящий момент. Да, действительно, популярные теоретические модели ШД дают существенное падение крутящего момента при переходе к микрошагу. Причем чем мельче шаг, тем больше потеря. В то же время, в ряде источников (например тут и тут). Я тоже не заметил, чтобы в моих экспериментах крутящий момент падал даже в 3 раза, хотя работаю в режиме 1/16 и 1/32 микрошага.
    2. В режиме микрошага ШД обязательно пропускает шаги.
      Давайте разберёмся, по каким причинам может произойти пропуск шага. Основные причины, указываемые производителями:
      • Недостаточное питание ШД. На драйвере А4988 есть регулятор (ограничитель) силы тока, покрутите его и сразу увидете как недостаточный ток (а по сути потеря крутящего момента) сказывается на микрошаге. Уменьшая силу тока постепенно можно вместо 16 микрошагов получить сначала 8, а потом стабильные 4. Это объясняется тем, что крутящий момент в разных фазах полного шага тоже разный;
      • Слишком большой крутящий момент нагрузки. То есть крутящий момент, приложенный к двигателю, заведомо больше выдаваемого данным двигателем в определенных фазах — в этот момент имеем пропуски;
      • Слишком высокая скорость вращения. ШД не успевает шагать. Для данной задачи не актуально;
      • Слишком быстрое торможение/ускорение. В данной задаче не актуально;
      • Неисправный двигатель. И такое тоже бывает.




    Кратко и очень ёмко про ШД изложено тут, тут и очень хорошо тут

    Чаще всего проблема пропуска шагов, это не проблема ШД, а проблема либо недостаточного питания, либо проблема «перегруза». Первая проблема решается довольно легко выбором правильно блока питания и выставлением правильного положения на ограничителе А4988. Вторая требует аккуратного рассмотрения всех вариантов нагрузки фокусера. Так же необходимо решать проблему увеличения необходимого для проворота крутящего момента из-за роста силы трения (на валу ШД и на фокусере) при низких температурах. Решать ее можно по-разному. Можно взять более мощный двигатель, а можно использовать морозостойкую смазку.

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


    Питание


    Arduino Uno питается достаточно широким диапазоном напряжения (рекомендованный диапазон 7-12В) и небольшим током, поэтому при выборе источника питания фактически приходится отталкивать от двигателя. Драйвер А4988 поддерживает напряжения от 8 до 35В. Шаговые двигатели представлены в широком ассортименте, с разными номинальными параметрами (под разное напряжение и ток). Источник питания хочется использовать один и для блока управления, и для самого двигателя. Отсюда получаем ограничение: напряжение питания должно быть в интервале 8-12В. Окончательный выбор можно делать после того, как будет сделан выбор двигателя исходя из требуемой мощности.
    Кроме того, стоит учесть место использования телескопа. В моем случае это лоджия (~220В), крыша дома (АКБ), на выезде (автомобиль, 12В или ~220В через инвертер, но иногда машину приходится оставлять и тогда снова АКБ). Возможно кому-то стоит сразу подбирать АКБ вместо БП.

    Механика


    Я выбрал соосное размещение двигателя: с помощью соединительной муфты двигатель фиксируется прямо на валу фокусировочного устройства. Вторая точка опоры – произвольное жесткое крепление двигателя к корпусу фокусера. Просто и надежно, хотя и требует большего крутящего момента. Такая схема позволит максимально упростить крепление (одна точка), облегчит процедуру снятия и установки двигателя при необходимости, и, самое главное, позволит избежать «юстировки» механической части – крепления и подгонки шестеренок, шкивов и т.п.

    Схема 1


    Вес и габариты


    Так как двигатель размещается на фокусировочном устройстве на телескопе, вес важен. Слишком большой вес усложнит балансировку, повысит нагрузку на монтировку и треногу, габариты — добавят парусности. Поэтому чем меньше двигатель — тем лучше. Данный критерий достаточно индивидуален, я задался максимальной массой двигателя в 300 г.

    Подбор ключевых комплектующих (платформа, ШД, БП, корпус и т.д.)



    Выбор двигателя


    Итак, мы уже определили, что нам нужен шаговый двигатель с определенными
    характеристиками.
    • Шаг 1.8° или 0.9°;
    • Крутящий момент от 3 кг/см;
    • Номинальное напряжение 12В;
    • Ток обмотки — чем меньше, тем лучше, разумное ограничение — не больше 1А;
    • Подключение биполярное (соответственно 4 отвода, если выберете униполярный двигатель с 6-ю отводами, не забудьте удвоить сопротивление обмоток и пересчитать ток);
    • Вес – не более 0.3 кг;
    • Габариты. Имейте ввиду, что слишком большой двигатель в некоторых положения монтировки может задевать другое оборудование. Этот параметр имеет смысл так же минимизировать.

    Далее запускаем браузер и ищем подходящий двигатель на просторах Интернета. Средняя стоимость в Китае – 10-20USD, средняя стоимость в РФ – 1000-1500р. Стараемся выбирать двигатель, с возможно меньшем номинальным током. Теоретически, можно использовать двигатели с током до 2А, но большой ток приведет к сильному нагреву двигателя (его придется отключать каждый раз после фокусировки) и быстрому расходу АКБ. Кроме того, драйвер А4988 имеет встроенный ограничитель силы тока, что хорошо, так как к нему можно подключить двигатель рассчитанный на существенно большие токи. Плохо то, что такой двигатель не будет набирать нужный крутящий момент.


    Механика


    Для выбора соединительной муфты нам нужно знать посадочные диаметры. Для этого мы должны измерить диаметр вала фокусера и посмотреть диаметр вала двигателя. В моем случае получилось 8 мм и 5 мм соответственно. Так же потребуется знать крутящий момент.


    Крепление двигателя к фокусеру – задача сугубо индивидуальная. Я решил ее следующим образом: К двигателю прикрутил алюминиевый уголок (специально вырезанный), а в корпусе фокусера прорезал щель, куда этот уголок вошел. Этого уже достаточно, чтобы исключить проворот, но не достаточно, чтобы исключить люфт. Для исключения люфта я взял трансформаторное кольцо, приклеил к внутренней стороне полоску медицинского ждут и закрепил на фокусере. В алюминиевом уголке просверлил еще одно отверстие по месту и стянул хомут болтом. Люфт ушел, хотя конечно вся конструкция в целом не жесткая: у меня получилась одна точка опоры на фокусере + крепление на вал через гибкую муфту. Соответственно на муфте есть небольшая подвижность. На практике, данная подвижность не мешает, но может «съесть» часть крутящего момента на деформацию муфты.
    Данный вопрос является творческим и очень индивидуальным.
    image

    Платформа для блока управления



    На самом дела, тут конечно вариантов масса, я выбрал Arduino Uno.

    Почему я остановил свой выбора на Arduino Uno или Ода современной модульной электронике
    • Доступно;
    • Не дорого;
    • Бесплатная среда разработки;
    • Программирование на С++;
    • Популярная платформа, поддержка любителей по всему миру;
    • Поддержка RS232 – при подключении отладочной платы микроконтроллера (USB) к ПК в системе появляется появляется COM-порт. Поддержка работы с RS232 со стороны программы, выполняемой микроконтроллером так же имеется, причем с точки зрения программирования все ОЧЕНЬ просто.

    Ну и самое главное, Arduino Uno имеет достаточно кол-во входов и выходов и полностью готов к использованию — не требуется никакой допонительной разводки, бери и программируй.

    Причем вариантов реализации масса, как Arduino-совсместимых, так реализованных на другой архитекктуре, со своими средами разработки и своими сообществами. На Arduino Uno конечно же свет клином не сошелся. Мы живем в удивительное время, когда пользуясь школьными знаниями на базе модульной электроники можно решать самые разные задачи, механизируя и автоматизируя различные процессы — телескопы, аквариумы, оранжереи, укачивание ребенка в люлке или управление высокоточными процессами. Непонятная и нелепая концепция «умного дома» ограниченная регулировками климата, освещения и т.п. наконец обретает какой-то практический смысл, дает какое-то действительно новое качество, которого очень сложно или вообще нельзя было добиться «вручную». Причем на уровне, доступном очень многим. И это просто пкрекрасно!


    Выбор блока питания


    Очень популярное напряжение – 12В и именно на нем я и остановился. Оно подходит для Arduino; на рынке доступно много шаговых двигателей, рассчитанных на это напряжение; есть масса блоков питания, АКБ, можно подключаться напрямую от прикуривателя автомобиля.
    Для своего устройства я остановился на блоке питания 12В и 25 ватт.

    Чуть больше деталей..
    Выбор блока питания осуществляется по двум основным параметрам – напряжение и мощность. В моем случае U=12В. Мощность можно оценить зная максимальный ток как I*U. Исходя из 2А на двигателе и напряжении 12В получаем 24 ватт.
    С АКБ аналогично, но вместо мощности имеет смысл смотреть емкость и рабочий ток. Ток – до 2А, емкость исходя из 2-3 часов работы – скажем 4-5 А*часа. На практике на фокусировку суммарно в течении ночи уходит вряд ли больше часа, так что емкости 2 А*часа тоже должно быть достаточно.
    Следуя условию общего питания для Arduino и двигателя, я объединил шины GND и VIN платы микроконтроллера Arduino c шинами GND и VMOT драйвера А4988 соответственно (см. схему). При этом на корпус выведен второй разъем питания, аналогичный разъему питания Arduino. Это сделано для того, чтобы в случае замены двигателя на более мощный с другим питанием (например, 24В) можно было без особых проблем разделить шины VIN и VMOT и подать на двигатель нужное напряжение.


    Конструктив


    Так как изначально при разработке устройства я ставил условие использования стандартных компонент, то все комплектующие из спецификации, приведенной ниже, доступны в магазинах, а подавляющее большинство можно заказать в Интернете.
    Радости новичка, или о чем не пишут в даташитах...
    Хочу только напомнить одну пословицу – «7 раз отмерь, один – закажи» :) После сборки у меня осталась кучка запасных деталей, а вот некоторые пришлось заказывать по второму разу :)
    Отдельно хочу сказать пару слов о размещении разъемов в корпусе и кнопок на макетной плате. При размещении разъемов учитываете, что корпус будет закрываться и размещайте разъемы так, чтобы при они не мешали при сборке. При размещении кнопок учитывайте, что на кнопку после сборки одевается колпачок, и этот колпачок может быть шире, чем сама кнопка. Поэтому если кнопки поставить на плате слишком близко друг к другу – колпачки придется подпиливать :) Так же стоит обратить внимание не высоту кнопок – они должны достаточно выходить из корпуса, что бы на них можно было одеть колпачок (высоту кнопок стоит учесть при заказе корпуса пульта ДУ).


    Блок управления двигателем


    Итак, мозг нашего устройства – это блок управления двигателем. Дабы не загромождать и не утяжелять фокусер, плату микроконтроллера Arduino Uno и драйвер А4988 я вынес в отдельный стандраный промышленный корпус. Соответственно, на корпус выведены следующие разъемы:
    • Питание (штатный разъем Arduino и отдельный разъем для независимого питания двигателя при необходимости)
    • Разъем силового кабеля двигателя
    • Разъем USB платы микроконтроллера для подключения к ПК и удаленного управления
    • Разъем пульта ДУ





    Как показал опыт, я выбрал не самый удачный, хотя и весьма качественный корпус. Можно брать аналогичный, но на пару сантиметров ниже, и на 1-2 сантиметра шире.
    Блок управления я располагаю под телескопом либо на полке на треноге. Соответственно, длина кабеля БУ – двигатель должна быть около 1м. Кабель 4-х жильный, с сечением достаточным для тока до 2А. Можно сплести самостоятельно.

    Пульт дистанционного управления


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


    На этом на сегодня все. Полная спецификая на выбронные компоненты доступна тут.

    Принципиальная схема приведена тут и в первой части.
    В следующей части доберемся до кода микроконтроллера и кода панели управления под Windows.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 16

      0
      количество проводов от пульта можно было бы сократить до двух, если воспользоваться voltage ladder (кнопки перемежаются резисторами разных номиналов, аналоговым входом контроллера вы определяете, какой по счёту кнопкой замкнуло цепи).

      Светодиод в пульте не ослепляет? Может быть, стоило взять вместо него вибромоторчик как в сотовом телефоне?
        0
        Ну, наверное все такие до 5? Кнопки + светодиод + потенциометр + 5V + GND?
        В общем можно конечно, но я не инженер, сам не догадался, а подсказали уже когда схему вчистую отрисовывал :)
        Еще позже узнал про I2C, тогда было бы всего 4 провода. Сейчас активно применяю в другом проекте. Но тогда пришлось бы в пульт ставить что-то подобное. Телефонный кабель и разъемы RJ11.

        Про сведиод — с нашим светлым небом и паразитной засветкой — не особо, хотя я уже подумывал его ограничить. Не обязательно выводить светодид на полную мощность. По большому счету, он нужен только для того, чтобы беря пульт в руки понять на какой я скорости, дабы не крутануть случайно фокусер при точном доведении. По этой же причине не представляю как мне поможет вибромоторчик — узнать скорость желательно не трогая ни кнопки, ни ручку потенциометра.
        0
        На базе тех же компонентов сделал себе пуль для монтировки, вместо сгоревшего: фото, теперь вот задумался об электрофокусере.
          0
          Что скажешь, круто :) А якак раз недавно закончил механизировать EQ3-2, сейчас занимаюсь «чисткой» и «доведением». Правда больше самой монтировки :( это был следующий проект после фокусера, после НГ про него напишу.
          +2
          Я сейчас сталкиваюсь ежедневно с arduino, и наконец-то могу выразить, чем же она плоха. Как модуль — отличная штука с завышенной ценой. Но вот коммунити — это ужас. Ужасные схемы, ужасные алгоритмы. Причем, люди учатся по урокам таких же новичков как и они сами и еще больше вырождаются. А полноценный С/С++ еще и позволяет без труда стрелять в ногу.
          Для попробовать свои силы — штука отличная, а если бы в моем детстве была подобная плата — я был бы самым счастливым ребенком. Но никто же в серьез не думает, что можно, например, жить в доме построенном из конструктора Lego.
          Это предисловие, которое объяснит мысль: если вам понравилось, и хочется продолжать — попробуйте сделать что-нибудь, на той же arduino uno, но без использования библиотек arduino. Сначала AVR покажется кучей непонятных регистров, но очень быстро придет понимание самого контроллера, и вот тогда можно будет делать потрясающие вещи. Даже готов лично объяснить непонятные моменты, если возникнет необходимость.
            +1
            Спасибо большое за развернутый комментрий!
            У меня просто пока эйфория от того, как все легко и просто получается :) Я лет 20 жил в виртуальном компьтерном мире (лет 10 работал прикладным программистом) и представить себе не мог, что смогу программировать на привычном С++ предметы реального мира :)
            Да, я согласен с тем, что качество многих примеров, решений и библиотек оставляет желать лучшего и уж точно не может быть использовано в промышленном масштабе — сам натыкался на перепосты типа «библиотеку можно взять вот эту, но примеры там не рабочие» :) То есть не то чтобы не оптимальные, а вообще не рабочие! :)
            С другой стороны, это же хобби :) Сообщество «не профессионалов».
            Хотя, к слову о доме из лего, вот вопрос безопасности собственного дома меня очень беспокоит. Следующий проект — оранжерея для жены. Она будет работать 7х24. Там кроме пары десятков датчиков, еще и управление светом, а это 6 ЭПРА и нехилое тепловыделение. В общем, немного стремно. Буду с кем-нибудь консультироваться.

            По поводу прямого программирования AVR — мне когда-то приходилось программировать на асме под 386/486, так что не думаю что меня AVR испугает. За совет и предложение спасибо — буду иметь ввиду! :) Пока у меня есть только одна проблема, которая поддталкивает к этому шагу. В дгуром проекте мне критически важно конролировать время выполнения опреция, Loop не должен быть дольше 130 микросекунд. И все бы хорошо, если бы не Serial — любая посылка — это 200-300 микросекунд. Причем, не важно какая выставлена скорость порта, сколько байт я пересылаю — 260-280 микромсекунд, если ничего не путаю. Подскажите куда двигаться?

            PS Честно говоря, я тоже не очень то страдал перфекционизмом, когда работал над этим проектом, и код там еще чистить и чистить :)
              0
              Подскажу конечно, двигаться на прерывания. Если знаете asm — то, должно быть знаете, что это за штука. Но поясню на всякий случай. При общении с любым блоком периферии (будь то ADC, UART и еще много какой) могут генерироваться прерывания, это когда процессор бросает текущую задачу и отправляется выполнять код связанный с произошедшим событием. В AVR с этим все очень неплохо. Например, что касается Serial или модуля UART — он полностью аппаратный, и пока передатчик выплевывает биты в компьютер — вы можете заниматься своими делами. Сама отправка очередного байта в UART- занимает единицы тактов, ну может пару десятков, если требуется как-то хитро достать из памяти. На скорости в 16МГц — это 1-2 микросекунды, обычно меньше. Но тут опять же мешает реализация библиотеки Serial на arduino.
              Обычно алгоритм такой — вместо serial.write() данные записываются в некий буфер, и отдается команда начать передачу, после этого управление возвращается обратно в код и вы продолжаете заниматься полезной работой, как только передатчику UART требуется новый байт — он генерирует соответствующее прерывание и обработчик этого прерывания отправляет ему следующий байт и тут же выходит. Для основного цикла программы это происходит прозрачно. Тоже самое происходит и с приемом данных: как только получен новый байт данных — генерируется прерывание и его обработчик решает, что с этим байтом делать.

              P.S. на самом деле не обязательно писать на ассемблере. Это очень полезно, в рамках обучения, но довольно сложно. Тем более, если имеется огромный опыт C++, глупо не было бы не воспользоваться. Arduino IDE использует тот же самый и самый распространенный компилятор gcc-avr, просто библиотека libarduino (или как она правильно называется) делает некий HAL. Но лишняя абстракция на кристалле в котором нет ни памяти, ни ресурсов вызывает больше проблем, чем пользы.
              Кстати, для Eclipse есть вполне рабочий плагин для AVR. И все плюшки, например автодополнение. А еще некоторое чипы, например atmega16 позволяют проводить отладку на кристале, с breakpoint, просмотром/изменением регистров, памяти. И это еще далеко не все печеньки, которыми заманивают на правильную сторону.
                0
                Ага, очень интересно! То есть в общих словах, от Serial полностью не отказываемся, но вместо метода Serial.write() инициируем отправку напрямую через UART, отдавая данные через обработчик прерывания, так?

                О, еще вопрос вспомнил! :)
                Мне нужно очень точно измерять время в микросекундах. Пишут, что встроенные методы типа micros() не точные, особенно если МК сильно загружен (как раз мой случай, подозреваю). Попробовал RTC на DS3231 и DS1307. Все бы хорошо, но библиотеки, что мне удалось найти выдют время с точностью до секунды, а мне нужны микросекунды. Как раз сооружаю стенд, чтобы понять на сколько часы ардуино не точные по сравнению с RTC. И видится мне пока только один «штатный» путь — засинхрить ардуионвские часы с RTC и надеяться, что micros() от этого станет работать точнее (правда как проверить — не придумал). Куда посоветуете двигатья?
                  0
                  Да именно так, причем все это скорее всего можно сделать из Arduino IDE.

                  По второму вопросу:
                  Если требуется считать события длительностью в единицы микросекунд — тогда надо точнее всю задачу, если просто получить время с точностью до микросекунды между двумя какими-то событиями (например между импульсами с DS1307) — заводим таймер, прерывания от него приходят через строго определенное время, плюс есть непосредсредственный доступ к регистру счетчика таймера.
                  Т.е. по стартовому событию, запускаем таймер, и начинаем считать прерывания от него и ждем стоп. Как только приходит стоп, сохраняем значение счетчика таймера (в нем будут недосчитанные тики), и добавляем к нему количество посчитанных прерываний ну и перемножаем на соответсвующие коэффициенты. Таким образом можно получить точность в 1 такт или (примерно) 62.5 наносекунды на 16МГц, если заморочиться. Примерно, потому что частота кварца тоже плавает и без калибровки результаты будут в попугаях.
                    0
                    По работе с СОМ-портом — грубыми мазками все понятно, буду разбираться с UART`ом. Большое спасибо!

                    По поводу точного отсчета времени тоже вроде все понял. Мне нужно достаточно точно контролировать скорость вращения ШД на низкой скорости. Там, где это действительно важно — скорость достаточно низкая, я делаю примерно 50 шагов в секунду. В приципе, мне даже микросекундная точность не нужна, достаточно миллисекундной. Но RTC дает только целые секунды (в тех библиотеках, что я нашел), поэтому «влоб» перейти с micros() на RTC не получается. В общем, идея понятна — привязываюсь к RTC, а между импульсами с него считаю время описанным вами методом по прерывания. Тут конечно вопросы еще будут :) Спасибо, буду разбираться!
                      0
                      RTC не обязательно, заведите таймер на прерываение каждые 1мс и считайте. Вообще, первое, что следует освоить (после моргания светодиодом) — это таймеры.
                        0
                        Ну, RTC уже есть и есть «штатный» метод синхронизации, так что пусть будут :) А по таймерам понял, с этого и начну.
                        Спасибо еще раз!
            0
            спасибо за подробное изложение.все никак не закончу свой драйвер на stm32 для тал125, а самодельный фокусер считал слишком сложным в механике, ибо я даже редуктору шестерни еле нашел
              0
              Пожалуйста, рад поделиться опытом. :)
              Уже осенью сделал фокусер для МАК127, получилось даже изящнее. Крепление двигателя так же прямо на вал, соосное.

              Честно говоря, механическая часть меня больше всего беспокоила (особенно на новеньком МАК127), но как оказалось все достаточно просто.
                0
                Тут главное просто начать что-то делать. Я начал с того, что умер родной пульт к MT-3S, ну и как лобитель планетарки хотел добавить нужные скорости. О гидировании даже не мечтал.

                А потом начал думать о ПЗС или КМОП матрице с охлаждением ну и понеслось…
              0
              Если цена вопроса не критична, то
              можно просто через RS232 или USB с писюка рулить шаговиком.
              Например типа вот такой коробочки:
              onitex.ru/solutions/stepmotor/kontroller-shagovogo-dvigatelya/osm-17u
              Со всем перечисленным функционалом.

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

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