Обо мне
    Резюме
    Портфолио
    Услуги
    Контакты
    Астро
    Схемотехника
    Мультикоптеры
    Автономный дом
Язык:

Проект: Синхронизация купола с телескопом

2011-02-11 14:36:25

незаконченный материал

Статус: Готов контроллер и датчик на 7 бит. Готова программа на компе, нужно чуток дописать программу на МК и затолкать линейку датчиков в корпус и отладить.

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

Структура проекта глобально:

  • по длине окружности рельсы, по которой ездит купол ставится шкала абсолютного энкодера на основе рефлексивного двоичного кода Грея (модификация обычного двоичного кода, 0000 - это 0, 0001 - это 1, 0010 - это 2 и т.п., где 0 - это чёрный квадрат, а 1 - белый);
  • в любом одном месте купола ставится датчик, состоящий из линейки набора однотипных элементов. Каждый элемент - это оптопара с открытым типом оптического канала отражательного типа, ещё называемая опторазмыкателем или оптопрерывателем, или оптопереключателем. Суть такого несложного и дешёвого (~1$) девайсика в светодиоде и фототранзисторе в одном корпусе. Как следует из названия, эта оптопара работает на отражение. Если разместить белую бумагу в ~5..8 мм перед ней, транзистор откроется и при помощи простой схемы мы получим на контроллере один логический уровень. Если же напротив пары будет чёрный фрагмент бумаги (той самой шкалы);
  • с этого датчика, точнее с линейки из 10 датчиков (так как хочу сделать десятиразрядный энкодер, то есть со значениями 0 ... 1023) данные поступают непосредственно на atmega16;
  • программа на компе раз в секунду через ASCOM получает азимут монтировки и через COM-порт с этой самой атмеги получает данные о положении купола, переводит всё в градусы и при несоответствии значений больше чем на заданное число градусов даёт команду контроллеру купола о переходе в текущий азимут монти;
  • контроллер, получив команду о переходе в другую позицию анализирует текущие координаты купола, внося поправку на сдвиг положения датчика купола относительно севера, относительно 0°, принимает решение о включении мотора купола по часовой или против часовой стрелки. Постоянно опрашивая энкодер купола и принимает решение об отключении моторов.

Схема и её суть:

Схема недорисована. Не хватает опто-датчиков и исполнителей (пары реле и светодиодов).

Суть схемы проста.

  • Левая её часть взята из datasheet к микрухе MAX232 согласования уровней COM-порта и TTL-логики микропроцессора atmega.
  • Верх схемы, стабилизатор напряжения для питания схемы на L7805. Выдаёт 5В с большим запасом до 1.5А. В основном, схема потребляет энергию, светя ИК-светодиодами открытых оптопар. Каждый светодиод расчётно светит на 30мА, их десять, вот и 300мА. Поэтому стоит L7805 поставить на простенький радиатор. В принципе, так как устройство непосредственно связано с компом, то кроме 12В от него можно получить и 5В, которыми питать устройство от БП компа.
  • В центре проц с внешним кварцем и разъёмом для программирования, тут всё просто.
  • Верх-справа, часть исполнителей. Их, в рамках проекта два - две релюхи, подключенные через набор из 7 транзисторов дарлингтона ULN2003 в DIP16. Но, кроме купола, ещё попутно управляются створки, освещение и, может ещё какие-то нагрузки, так что релюх семь. Нарисовано одно реле, остальные аналогично.
  • Справа-снизу часть оптодатчиков. Нарисован один, остальные аналогично.

Программная часть на МК:

Программная часть на ПК:

Практическая реализация:

Готовое изделие:

 

Этап развития №1

На самом деле идея возникла сразу же после... а нет, сразу же до (!) того, как я сделал первый проект на МК atmega, одну моргающую лампочку. Как только я узнал, что в атмеге уже встроен 10бит АЦП, я захотел повесить на оси монтировки переменные резюки и получать данные от такого примитивного энкодера, передавать их компу. Потом мысль пошла дальше и захотелось вместо резюков на оси монтировки поставить координатные круги на основе двоичного кода (точней сказать, как теперь я понимаю, на основе кода Грея, замечательного тем, что при переходе от числа к числу меняется только один бит... Не суть), поставить считыватели из линейки фотодатчиков.

 

Этап развития №2

Вчерась экспериментировал с АЦП, в рамках проекта энкодера купола.
Пока не собрал оптический энкодер, просто на ADC0 повесил переменный резюк и попросил контроллер на вопрос "дай данные" выдавать два байта текущего положения "энкодера". Всё отлично работает через max232 на физический ком-порт компа. Лень было паять мелконогого ft232rl, пока так пойдёт.

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

Общение проги с МК сводится к четырём командам:

  1. 0xAA (b10101010): "дай координаты купола". В ответ приходит два байта с АЦП, в перспективе с 10 каналов оптического энкодера;
  2. 0x55 (b01010101): "подвинь купол на координаты". Далее идут два байта координат, где я хочу увидеть купол. Выбрал этот вариант, а не две команды "налево" и "направо", чтобы во-первых, мозги МК не атрофировались, во-вторых, я смогу не общаясь с ПК хоть десять раз в секунду получать данные с энкодера о текущем положении купола и принимать решение на МК о необходимости включения мотора в том или ином направлении. Конечно же, надо будет предусмотреть небольшой гестерезис, чтобы мотор не гонять туда-сюда, пытаясь достичь нереальной (и ненужной в этом случае) точности позицирования;
  3. 0xCC (b11001100): включи нагрузку. Дальше идёт байт, напрямую записываемый на порт C проца, на котором висит ULN2803 и релюшки. Полезно, к примеру, включить свет или коммутировать иную нагрузку, как сделано у меня в обсерватории через модули реле PureLogic;
  4. 0x33 (b00110011): дай данные с датчиков. Мысль на будущее, получать какие-то данные обсерватории (охранка, концевики створок купола, ...). В ответ присылает байт с .. пусть будет порта B, к примеру, не важно.

Подумал чуток... четвёртую команду уберу, просто будет в первой команде три (или больше) байт приходить. Меньше общения по UART, меньше кода и на 0.00000001% выше надёжность .

 

Плата процессора (atmega16 в DIP40), сопряжение уровней с COM-портом (max232 в DIP16), питание от 12В через L7805 (не хватает пары кондёров, не было тогда в наличии, но и так работает, нагрузка маленькая). А так же "эмулятор энкодера" на основе переменного резистора на 45кОм (что было под рукой), подключенного к АЦП проца.

   

Скрины первой версии программы управления

Этап развития №3

Всё продолжаю проект энкодера купола. Начинаю не любить отечественные детальки. Купил неделю назад на митьке оптрон с открытым оптическим каналом отражательного типа, звать АОТ137А1. Как не пытался, так и не смог запустить его по нескольким схемам из инета. Во-первых, мне отсыпали часть маркированных, часть нет, не беда, если те же жуки. Во-вторых, цоколёвка не совпадает с данными производителя, Ульяновского завода "Оптрон". Да, он даёт, судя по тестеру, разницу в 0.1В, вроде бы меняет сопротивление, но как не подключал с часок меняя ноги, так и не добился не то, что стабильной работы, а работы вообще.

Хочу купить иномарочный аналогичный оптрон в количестве пары штук для тестов, но точно работающий с известной цоколёвкой и имеющейся схемой подключения к атмеге. Остальная часть проекта готова и отлажена на переменном резисторе в качестве эмулятора энкодера.
Звать его ITR8307, схема отсюда: http://shemopay.do.am/publ/12-1-0-130

  

АОТ137А1 маркированные и нет. Тестером подобрал полярность, поставил один на плату для экспериментов.

---------------

Касательно энкодера. Мысль, естественно, идёт дальше. Попробуй её останови, мысль эту , когда прёт.

Я, считай что доделал макет, его программно-смехотехническую часть. Сегодня планирую делать механику на пробном отрезке, напечатаном на А4. Хотел посоветоваться о размерах полосы энкодера и разнесении датчиков.

Датчик энкодера получается примерно такой:
http://shop.roboforum.ru/product/or-linesens-ktirx10-datchik-linii/ (это
только датчик, без процессора). Плюс плата процессора, питания и COM-порта.

Важный момент: лента всегда на одинаковом расстоянии от датчика, плюс-минус несколько миллиметров. Чтобы достигнуть подобной точности на довольно длинной ленте я мыслю датчики расположить или сверху, или сбоку и организовать прижим простыми средствами, пружинки такие из упругих усиков. Если датчик сверху, его банально можно нагрузить любым весом.
Ещё важный момент: позицирование линейки датчиков в измерении по длине линейки, оно же по ширине ленты энкодера. Аналогично предыдущему решению, думаю сделать направляющие из тех же пружинок "а-ля скрепка", установленных по двум (или одному с прижимом) краям платы датчиков. Они будут упираться в
края ленты, не допуская поперечного сдвига. Поэтому лента должна быть не только бумажной, но на твёрдом основании, лучше пластиковом, думаю. От точности изготовления основания будет зависеть величина паразитного хода линейки считывателей поперёк напечатанной
ленты энкодера. Мне кажется, проще не стремиться вывести эту величину в ноль, а заранее предположить её равной, допустим, +-5мм. Плюс небольшой запас, плюс ширина датчика, итого на каждую полосу энкодера 15мм. Полос 10 сигнальных и одна синхронизирующая, то есть 11 * 15 = 165 мм - это ширина пластикового основания и ленты энкодера.

Ставить ленту напечатанной стороной наверх, мне кажется, не очень гуд с точки зрения эксплуатации, больше сбор пыли и грязи. К тому же вместо полоски пластика, которую гнём по окружности и крепим саморезами в случае вертикального крепления ленты, для горизонтального крепления нужна будет более дорогая фигура "большого бублика", от точности изготовления которой зависит точность энкодера.

Вот набросал отрезок датчика и ленты.

Поэтому встают вопросы...
- уверен, не будет большой проблемой купить на строй-рынке листовой пластик и там же попросить порезать его на полоски, шириной 165мм. Особой точности не требуется, но лучше один край пусть будет максимально прямой. В итоге должны получиться те самые N метров длины окружности купола;
- возможно, стоит напрячь каких-нибудь рекламщиков, чтобы они распечатали мой файл энкодера на ленте 14м, нежели склеивать листы А4. Это и повысит точность, и резко понизит геморой. Цена, уверен, будет копеечной, не больше 500р за всё. Если не кидаться к первому попавшемуся исполнителю. Нужно уточнить, на какой бумаге они могут напечатать, так как отражение может разнится.
- верно ли мыслю в целом?

Отрезок линии энкодера и датчик на 6 бит (на 10 такой же, только длиней. Направляющие и прижим датчика.

Комментарии по рисунку.
Рис слева: вид в разрезе. Платка слева, на ней прилеплены открытые оптопары (или пары светодиод / фототранзистор, не суть). Лента изображена правым вертикальным прямоугольником. Движение ленты "от себя" и "к себе".
Рис справа: вид с боку. К примеру, из середины купола, от телескопа. Видна платка датчиков, обозначены (хоть и не видны в реале, закрыты платой) оптодатчики. Лента скользит налево-направо.
-------------

Сначала думал о двоичном коде и не понимал подвох, потом понял, что не зря в промышленных энкодерах используют код Грея, вот о чём речь, взято отсюда: http://kipia.ru/catalog/detail/_enkoderyi_ustroystvo_i_printsip_rabotyi_5367/

Двоичный код является многошаговым кодом. Это означает, что при переходе с одного положения (значения) в другое могут изменяться несколько бит одновременно. Например, число 3 в двоичном коде = 011. Число же 4 в двоичном коде = 100. Соответственно, при переходе от 3 к 4 меняют свое состояние на противоположное все 3 бита одновременно. Считывание такого кода с кодового диска привело бы к тому, что из-за неизбежных отклонений (толеранцев) при производстве кодового диска изменение информации от каждой из дорожек в отдельности никогда не произойдет одновременно. Это, в свою очередь, привело бы к тому, что при переходе от одного числа к другому кратковременно будет выдана неверная информация. Так при вышеупомянутом переходе от числа 3 к числу 4 очень вероятна кратковременная выдача числа 7, когда, например, старший бит во время перехода поменял свое значение немного раньше чем остальные. Таким образом, использование обычного двоичного кода может привести к большим погрешностям, так как две соседние кодовые комбинации могут отличаться друг от друга не в одном, а в нескольких разрядах. Чтобы избежать этого применяется так называемый одношаговый код, например, так называемый Грей-код.

Для экспериментов нарисовал всё же двоичный код, он легко читаемый. Потом переделаю на Грея. Вот в двоичном коде, пока что, нарисовал шесть бит 15х15мм элементов. Числа от 45 до 63.

Этап развития №4

Спаяли вот с 1.4 годовасиком-Юриком 6-бит энкодер, проверили.
Принтер у меня старый уж, так что напечатанные им чёрные квадраты не столь чёрные, не работают. А вот на изоленте чёрной работает (перестаёт отражать, даёт 1).

И как-то не пойму пока почему нестабильно работает железный UART у атмеги16. Разбираюсь. Проц нормально работает, а передача данных (основной цикл программы) глючит, вплоть до полной остановки передачи. При этом приём и обработка команды по UART работает нормально. Надо бы проверить цепь TX. Как добьюсь качественной работы на напечатанном отрезке, доделаю 10 бит, запихну в корпус.

А вообще, всё с бОльшим энтузиазмом смотрю на CCD-линейку соневскую. К примеру, от сканера. Есть совсем мелкие, по 128бит, есть крупные. Работать с атмеги очень просто, есть примеры.

            

Контроллер сильно глючил при питании от 12В через преобразователь ("кренку") L7805 без охлаждения и обвязки (кондёров). Собственно, я воткнул L7805 просто эксперимента ради, в этом проекте она не нужна вовсе. Сначала, пока не подключил оптроны, потребление было низким и всё работало нормально, а потом по 30мА на светодиод, по 20мА на транзистор и... в общем, L7805 при максимальном (с радиатором 1.5А) начал греться, заметил я это случайно. Убрал его, запитал 5В от компа, стало работать без сбоев, проверял в течение нескольких часов.

Этап развития №5 (будущее)

Мыслю купить любой линейный CCD-сенсор, к примеру этот современный соневский ILX551A . Это матрица 2048 х 1 пиксель по 14х14 микрон каждый. Процесс считывания элементарный, сброс, такты и читай из АЦП данные. Небольшой объективчик и ... вуаля, можем читать достаточно узкую ленту. Правда, придётся чуток повозиться с обработкой, за то сбоев, кмк, будет меньше. Впрочем, это решение я планирую опробовать при создании 1" энкодера.

Телефон: +7 (928) 425-32-10
e-mail: