Игорь Уватенков (R9JD)
При строительстве антенн, мы всегда сталкиваемся с проблемой: как распорядится суммой при покупке составных частей антенны, мачты, прочих устройств. Денег как всегда не хватает… Мы расставляем приоритеты, но кое-что, можем изготовить самостоятельно. Сегодня речь пойдет об одном из вариантов устройства контроля за азимутальным поворотом антенны.
С давних пор радиолюбители используют герконы для этих целей, но здесь возникает проблема в многожильном кабеле. От каждого геркона нужна отдельная жилка, которая скоммутирует светодиод или лампочку-индикатор. По этой причине многие собирают датчики поворота на герконах с меньшим количеством, чем хотелось. Для того чтобы сократить количество жил, нужно закодировать значение и передать на индикатор. Индикатор сам по себе не сможет отобразить значение азимута, здесь на помощь придет дешифратор. Каков он будет, это выбор радиолюбителя.
Сначала изготовим датчик. Герконов можно установить такое количество, какую точность поворота вы намереваетесь видеть. Безусловно это будут дискретные значения. Я выбрал вариант расположения через 5 градусов, этого больше чем достаточно для КВ антенн. Поскольку на травесе установлены еще и УКВ антенны, то хотелось бы азимут измерять поточнее. Мне понадобилось 72 геркона и 214 диодов. Логика работы шифратора: На клемму «1» подается положительное питание, геркон замыкает цепь и через диоды на выходном разъеме получаем двоичный код замкнутого геркона (направления).
Шифратор выполнен по принципу двоичного кодирования. Распаиваем диоды на выходную шину данных в соответствии с нужной комбинацией. Обращаю внимание на то, что в шифраторе использована небольшая хитрость, каждая следующая позиция геркона кодируется по порядковому номеру геркона, а не значением азимута в градусах, поэтому шина данных составляет всего 7 проводников, вместо 9.
Судите сами, для кодировки значения 355 градусов понадобится 9 разрядов: 101100011, а для кодирования этой же позиции по номеру геркона (71) — 7 разрядов: 1000111. В данном случае удобно использовать кабель экранированная «Витая пара» для внешней прокладки, 7 проводников данные, одна для подачи напряжения на герконы, экран — общий провод. Такие кабели продаются в компьютерных магазинах и с приобретением нет проблем!
Собираем датчик. Для того, чтобы на датчике установить вращающееся коромысло с магнитом, нужно какой то безлюфтовый крепкий узел. В качестве такого, я взял электродвигатель от старого жесткого диска компьютера. Он идеально подошел по габаритам, легко вращается, люфта нет, на верхней части вала имеется прижимной фланец, под ним пара колец — распорки, которые удерживали магнитные диски. Они пригодились для закрепления коромысла с магнитом и регулировки его высоты над герконами. Само коромысло сделал из текстолита, в центре отверстие для крепежа на двигатель, на конце прорезь для магнита. Магнит дисковый, 2х6 мм, залил герметиком (вместо клея).
Датчик выполнен на плате из двухстороннего фольгированного текстолита, размерами 200х200 мм, с одной стороны герконы, с другой (чтобы не мешались) распаяны диоды. В центре закрепил вышеописанный двигатель. Скачать плату в формате Layout.
Герконы можно использовать любые, но лучше компактные, а диоды использовал М1-М5 в корпусе SMA по 2 рубля за штуку. Они легко монтируются при поверхностном монтаже. Компактные, легко подобраться к выводам жалом паяльника, такие кирпичики размером 2.5 х 4 мм, аккуратно «сидят» на плате.
Дешифраторы.
Дешифратор 7х72, выполнен на микросхемах 1шт-155ИД6 (74LS42), 5шт-155ИД3 (74LS154) и 155ЛН1 (74LS04). Вобще можно использовать любые микросхемы-дешифраторы, главное каскадировать их таким образом, чтобы в итоге получился двоично-десятичный 7х72 дешифратор. Схема дешифратора приведена на следующем рисунке. На входе дешифратора стоят токоограничительные подстроечные резисторы, уровень входного напряжения для работы микросхем должна быть логическая единица, устанавливается именно ими. Например, если вы подали в линию (до мачты) 12 вольт на герконы, то можете легко отрегулировать на приемной стороне уровень логической единицы, вне зависимости сколько падает в линии. В данной схеме в качестве буферных элементов используются инверторы, это упрощает сборку, и на выходы инверторов можно непострественно включать светодиоды.
Плата дешифратора 130х190 мм, двусторонний стеклотекстолит с металлизацией отверстий (см. рисунок ниже). На входе предусмотрены площадки для TVS-диодов (быстродействующих защитных диодов, одно или двунравленных). Защита от EFT нужна, чтобы исключить возможные импульсные помехи и статику. Микросхемы в корпусах DIP14, DIP16 и DIP24. Разъемы для подключения светодиодов используются IDC40M (шлейфы от компьютера, для подключения жестких дисков). Обратите внимание, 20-й контакт на шлейфе - "глухой", поэтому при установке на плату ответного разъема, в нем нужно извлечь данный контакт. Тип подстроечных резисторов - PV36W (3296W-1-502, СП5-2ВБ) номиналом 10К, конденсаторы 0.033-0.047 мк. Скачать плату в формате LAYOUT.
Еще одна схема: На входе которой стоят оптопары для гальванической развязки. А вместо инвертеров, для защиты выходов микросхем стоят транзисторные ключи. Каскады DD4 — DD8 идентичны, на схеме для упрощения не показаны. Транзисторные ключи нужны для увеличения нагрузочной способности, в случае, если вы решите использовать более яркие светодиоды с большим током, чем обычно. Светодиоды распаяны на фольгированном текстолите по кругу, который в свою очередь размечен с указанием направления. Приведеные схемы идентичны, можно выполнять разводку печатной платы в зависимости от предпочтений, количества компонентов и их компактного размещения.
Блок отображения собран на плате из двухстороннего фольгированного стеклотексталита. На лицевой части располагаются светодиоды и надписи со шкалой. Если вы будете заказывать платы в компании, которая их производит, то нанесение шелкографии будет обеспечено. Если вы изготавливаете платы дома, тогда рекомендую самоклеющуюся пленку для лазерных или струйных принтеров. Очень удобно и красиво, нарисовал как нужно, распечатал в масштабе и наклеил на лицевую часть. С обратной стороны располагаются разъемы для подключения к плате дешифратора.
Я развел в Layout две разных платы, выбирайте на вкус: с SMD диодами (размер 110 х 85 мм) и обычными 3мм (размер 145 х 115 мм).
Тем, кто привык возиться со старыми запасами микросхем, предыдущие варианты дешифраторов могут быть весьма бюджетным вариантом и к сожалению габаритным!
Даешь микроконтроллер!
Мы сегодня живем в эпоху микроконтроллеров, грешно не использовать их преимущество, тем более, что огромные возможности для реализации имеются. Для начинающих настоятельно рекомендую проект Arduino — это электронный конструктор и удобная платформа быстрой разработки электронных устройств. Она пользуется огромной популярностью во всем мире. Благодаря открытой архитектуре и программному коду. Программы (скетчи) пишутся довольно легко в специальной программной среде, даже новичку не составит труда написать программу управления антенным коммутатором или какой-либо другой «балалайкой». Платформа легко программируется через USB-порт без использования программаторов. В интернете очень много сайтов посвященных Arduino, там же есть примеры для повторения.
Итак, датчик с герконами оставляем как есть, а вот функции преобразования двоичного кода в удобочитаемые символы применим аппаратную платформу Arduino. Этот вариант намного компактнее и эстетичнее в исполнении. Для этого нам понадобится контроллер Ардуино (в принципе любые, какие будут доступны, работать будут исправно все), самые маленькие платы: Arduino Nano, Mini, Micro. На платах достаточное количество цифровых входов/выходов и аналоговых входов, чтобы соорудить несложное устройство радиолюбителя. Стоят эти мелкие контроллеры на российском рынке 300-500 руб., в зависимости от продавца, у китайцев 100-250 руб., от них получал посылки в течении полутора-двух недель, косяков не было, платы все рабочие, дешево и сердито!
Для своего проекта выбрал китайский аналог — Leonardo Pro Micro ATmega32U4. Возможности: частота: 16МГц, 4 канала АЦП (10 бит), 10 портов ввода-вывода общего назначения (из них 5 с ШИМ), Размеры: 18х33 мм.
Главное достоинство данной платы — это наличие встроенного в микроконтроллер USB порта, который может выступать не только как интерфейс связи Ардуино с ПК, но и как обычное USB-устройство ввода (клавиатура, мышь и даже джойстик). При этом данное устройство определяется и устанавливается ОС без дополнительных драйверов. Драйвер необходим только непосредственно для программирования самой платы.
В качестве дисплея — семисегментный 4х значный индикатор с драйвером управления на плате ТМ1637, что упрощает написания кода при программировании и сокращает количество контактов управления подключаемых к контроллеру. Библиотеку управления индикатором с таким чипом можно найти в интернете.
Подключаем.
Схема подключения (см. ниже). Обратите внимание на контакты подключения: RAW — внешнее питание для платы. Когда плата запитана от порта USB, на данном выводе будет напряжение около 4,8В (5В на USB минус падение на диоде Шоттки). Внешний источник питания следует подключать через этот вывод, допустимое напряжение — до 12В. VCC — напряжение, подаваемое на микроконтроллер (выход после регулятора напряжения на плате). Если плата запитана от внешнего источника, этот вывод можно использовлать для питания других устройств стабилизированным напряжением. RST — вывод сброса микроконтроллера, подтянут к +5В резистором на 10кОм. Для сброса микроконтроллера его следует соединить с GND. GND — общий. А0-А6 - шина данных от датчика. Дисплей подключается 4-мя проводниками, два из них питание, CLK (тактовые импульсы) и DIO (данные) по аналогии с интерфейсом I2C.
При подключении датчика к портам платы Ардуино, необходимо «подтянуть» выводы каждого из них к земле через резисторы номиналом 1К…10K. Это нужно, чтобы на выводах при переключениях не оставался остаточный потенциал и не было ложного срабатывания при выборке состояний шины данных. Также необходимо предусмотреть защиту линии от датчика до устройства от статики, атмосферных разрядов и мощных наводок, обязательно экранируйте линию, экранный провод должен быть соединен с общим проводом устройства (на рисунке ниже эти компоненты не показаны). Запитывать герконы необходимо от внешнего источника.
Алгоритм программирования такой: сначала мы определяем последовательно (от А0 до А6) на цифровых входах состояние, логический ноль или единица, «собираем» значение двоичного кода в переменную (позиция геркона), затем интерпретируем двоичный код в значение для отображения на дисплее. Пишем скетч и загружаем в микроконтроллер.
При написании скетча, библиотеки ТМ1637.h, скаченные из разных источников, работали некорректно с моим экземпляром индикатора. При выводе значений на дисплей, отображалась какая то абракадабра. Я использовал библиотеку TM1637Display.h (лежит здесь). Скачать можно с ресурса GitHub. Скетч несложный, я вставил комментарии, его можно оптимизировать под свои нужды, это уже самостоятельно, если захотите:
#include <Arduino.h> #include <TM1637Display.h> // включаем библиотеку в наш проект
#define CLK 3 //определим константы как номера пинов на которые будут #define DIO 2 //соединены с одноименными пинами на модуле int pr; //показ перехлеста uint8_t data[] = {0x54}; TM1637Display displayLed (CLK, DIO); //создаем экземпляр объекта типа «TM1637»
union Datchiki { // Объявляем битовую структуру struct { unsigned b0: 1; unsigned b1: 1; unsigned b2: 1; unsigned b3: 1; unsigned b4: 1; unsigned b5: 1; unsigned b6: 1; unsigned b7: 1; } bits ; uint8_t value; }; Datchiki D; // Переменная для хранения состояния шины данных
void setup () { pinMode (A6,INPUT); // Назначаем порты на вход pinMode (A7,INPUT); pinMode (A8,INPUT); pinMode (A0,INPUT); pinMode (A1,INPUT); pinMode (A2,INPUT); pinMode (A3,INPUT); pr = 1; displayLed.setBrightness (0x0f); //яркость дисплея } uint8_t binaz () //Считываем в битовую структуру состояние шины данных { D.value = 0; if (digitalRead (A8) == HIGH) {D.bits.b6=1;} else {D.bits.b6=0;}; if (digitalRead (A7) == HIGH) {D.bits.b5=1;} else {D.bits.b5=0;}; if (digitalRead (A6) == HIGH) {D.bits.b4=1;} else {D.bits.b4=0;}; if (digitalRead (A3) == HIGH) {D.bits.b3=1;} else {D.bits.b3=0;}; if (digitalRead (A2) == HIGH) {D.bits.b2=1;} else {D.bits.b2=0;}; if (digitalRead (A1) == HIGH) {D.bits.b1=1;} else {D.bits.b1=0;}; if (digitalRead (A0) == HIGH) {D.bits.b0=1;} else {D.bits.b0=0;}; D.bits.b7=0; return D.value; }
void loop () { binaz ();
switch (D.value) { //Сконвертим позицию геркона в градусы case 0: deg = 0; break; case 1: deg = 5; break; case 2: deg = 10; break; case 3: deg = 15; break; case 4: deg = 20; break; case 5: deg = 25; break; case 6: deg = 30; break; case 7: deg = 35; break; case 8: deg = 40; break; case 9: deg = 45; break; case 10: deg = 50; break; case 11: deg = 55; break; case 12: deg = 60; break; case 13: deg = 65; break; case 14: deg = 70; break; case 15: deg = 75; break; case 16: deg = 80; break; case 17: deg = 85; break; case 18: deg = 90; break; case 19: deg = 95; break; case 20: deg = 100; break; case 21: deg = 105; break; case 22: deg = 110; break; case 23: deg = 115; break; case 24: deg = 120; break; case 25: deg = 125; break; case 26: deg = 130; break; case 27: deg = 135; break; case 28: deg = 140; break; case 29: deg = 145; break; case 30: deg = 150; break; case 31: deg = 155; break; case 32: deg = 160; break; case 33: deg = 165; break; case 34: deg = 170; break; case 35: deg = 175; break; case 36: deg = 180; break; case 37: deg = 185; break; case 38: deg = 190; break; case 39: deg = 195; break; case 40: deg = 200; break; case 41: deg = 205; break; case 42: deg = 210; break; case 43: deg = 215; break; case 44: deg = 220; break; case 45: deg = 225; break; case 46: deg = 230; break; case 47: deg = 235; break; case 48: deg = 240; break; case 49: deg = 245; break; case 50: deg = 250; break; case 51: deg = 255; break; case 52: deg = 260; break; case 53: deg = 265; break; case 54: deg = 270; break; case 55: deg = 275; break; case 56: deg = 280; break; case 57: deg = 285; break; case 58: deg = 290; break; case 59: deg = 295; break; case 60: deg = 300; break; case 61: deg = 305; break; case 62: deg = 310; break; case 63: deg = 315; break; case 64: deg = 320; break; case 65: deg = 325; break; case 66: deg = 330; break; case 67: deg = 335; break; case 68: deg = 340; break; case 69: deg = 345; break; case 70: deg = 350; break; case 71: deg = 355; break; case 72: deg = 360; break; }
displayLed.showNumberDec (deg, false, 4, 0); //выводим на индикатор азимут в градусах if (D.value >= 71 || D.value ≤ 1) { //перехлест if (pr == 1) { displayLed.setSegments (data,1, 0); pr = 0; } else {pr = 1;} } delay (300); //Период опроса датчика (в милисекундах) }
}
|
Программа обрабатывает сигналы с датчика, преобразовывает в читабельное значение азимута в градусах. Отображается это значение на 4х разрядном семисегментный индикаторе. При положении близком к «перехлесту» (выход за пределы одного оборота) на дисплее в первой знаковой позиции будет отображена малая буква «п». В скетче условие задано положением на север: 355 и 5 градусов (71 и 1 герконы). При другом положении направления, необходимо сделать исправления кода в программе обработки и написать новое корректное условие «перехлеста».
Если на дисплее отображается «0» — это означает, что ни один геркон не замкнут, либо магнит находится между герконами, либо обрыв кабеля. В конструкции постарайтесь сделать так, чтобы чувствительность герконов была адекватной и момент перехода был не заметен, но нужно иметь ввиду «не переборщить», если сработают два рядом стоящих геркона, азимут будет считан неверно!
Наблюдаем на дисплее значение азимута в градусах:
Примечание: Есть четырёхразрядный индикатор (Trema-модуль), он значительно больше по размерам и использует другую библиотеку iarduino_4LED dispLED. Под нее я исправил скетч, он вместе с библиотекой лежит здесь.
Для любителей стрелочных приборов.
Позволю себе предложить еще один вариант построения индикатора. Это будет стрелочный индикатор, а в качестве устанавливающего узла — обыкновенный шаговый двигатель под управлением все того же Ардуино-контроллера. Шаговый двигатель я взял униполярный с редуктором (редукция 1:64), модель 28BYJ-48-5V вместе с драйвером двигателя.
Драйвер двигателя представляет из себя микросхему ULN2003A — это набор составных транзисторных ключей Дарлингтона и обвязку с разъемами на одной плате. Индикация каналов на светодиодах очень удобна для наблюдения подключения обмоток двигателя. Топология микросхемы и схема драйвера приведены на рисунках ниже.
Исключаем дисплей и подключаем шаговый двигатель к плате микроконтроллера (цифровые выходы 10,16,14,15). Питание для двигателя нужно брать от внешнего источника, т.к. порт микропроцессора не выдержит длительной нагрузки обмоток двигателя.
Еще нам понадобится конечный выключатель для установки вала шагового двигателя в начальное положение при включении устройства. В качестве такового можно использовать геркон, датчик холла или оптические датчики. Мне показалось достаточно выгодным использовать оптопару или щелевой датчик. Можно взять от старой компьютерной мышки. В ней применяются энкодеры на каждой оси — инфракрасный светодиод и сдвоенный фототранзистор с общим коллектором. У разного покаления мышек, могут стоять разные компоненты, перед тем, как выпаивать детали, замерьте напряжения на выводах и при применении, обеспечте такие же уровни напряжения. В моем экземпляре были такие: на диоде = 1.12V, на транзисторе в закрытом состоянии = 5V, в открытом = 3.7V. Повторюсь, это уровни измерял на плате мышки! Для нашего случая на фототранзисторе будут другие, а на диоде нужно выдержать именно этот уровень, чтобы нечаянно его не сжечь.
После некоторых эксперементов, я остановился на выборе KTIR0611S, заказывал здесь. Правда из пяти штук, один оказался неисправный! Так что руководствуйтесь народной поговоркой: «Запас кармана не дерёт!» Можно купить готовые модули с компаратором и без, например, посмотрите эту ссылку. Почти в два раза дешевле, чем на нашем рынке.
Пробовал несколько вариантов от старых мышек и от «концевика» принтера Epson (пока шла посылка с заказом), все они меня не удовлетворили уровнями, разброс между открытым состоянием и закрытым маловат, приходится подбирать для каждого экземпляра сопротивления…
При испытании датчика KTIR0611S, положение выровнялось, фототранзистор вел себя великолепно, напряжение на диоде (по паспорту) типовое = 1.2v, максимальное = 1.4v, установка резистора 100 ом в цепь питания диода от стандартного источника 5v, составило 1.27v-1.3v. Срабатывание происходит четко и в момент, когда непрозрачный предмет проходит через щель. Уровни напряжения при указанных на схеме номиналах резисторов такие: в закрытом состоянии ф/транзистора = 4.91v, при открытом = 0.01v, о лучших TTL-уровнях и мечтать не приходится! Схему подключения датчика к микроконтроллеру см.выше. Данные датчика и внешний вид приведены ниже. На корпусе имеется барельеф, так что не запутаетесь при подключении, где выводы диода, а где транзистора.
Постарайтесь выполнить оптический узел контроля аккуратно, от него зависит точность установки позиции вала шагового двигателя. Шторку можно выполнить из любого непрозрачного материала, и прочно закрепить на валу двигателя. Самым простой вариант — это металлическая пластина шириной 5-6 мм, окрашеная в черный цвет. Пластина должна быть жесткой и не болтаться на валу, для того чтобы правильно позиционировалась в щели датчика, ведь там расстояние всего 5 мм!
Итак, соберем все в кучку. Плата (скачать отсюда), на которую будут устанавливаться:
- Микроконтроллер Ардуино в слот из гнездовых разъемов.
- Драйвер шагового двигателя с помощью сквозных болтов крепит в том числе плату к основанию из листовой стали или дюралевой пластины (своего рода получается слоеный пирог), на которой закреплен шаговый двигатель. На валу двигателя — шторка, которая будет перекрывать щель оптического датчика. Плата разведена таким образом, что можно вместо драйвера использовать компоненты, их номиналы указанныы на плате, по сути это тот же драйвер. Микросхема ULN2003 выпускается на 7 (DIP16) и 8 (DIP18) каналов, при использовании 7-ми канальной микросхемы, нужно замкнуть джампера J1 и J2.
- Оптический щелевой датчик припаян с обратной стороны платы.
Теперь о программной части. Для написания скетча использовалась библиотека для управления шаговым двигателем CustomStepper.
#include <CustomStepper.h> // включаем библиотеку в наш проект
CustomStepper stepper (15,14,16,10, (byte[]){8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001}, 4075.7728395, 12, CCW);
boolean rotateend = false; //Разрешение на вращение при установки вала двигателя в начальную позицию boolean setdegsolution = false; //Разрешение на установку новых значений азимута int DegPosition = 0; int OldDegPosition =0; int OldPosition = 0; int NewPosition = 0; int deg; //Значение угла поворота в градусах long interval = 2000; //задержка 2 сек. (чтобы вал не болтался при значениях между герконами, установите эксперементально) long previousMillis = 0; unsigned long currentMillis = 0;
union Datchiki { struct { unsigned b0: 1; unsigned b1: 1; unsigned b2: 1; unsigned b3: 1; unsigned b4: 1; unsigned b5: 1; unsigned b6: 1; unsigned b7: 1; } bits ; uint8_t value; }; Datchiki D;
void setup () { pinMode (A0,INPUT); // Назначаем порты шины данных на вход pinMode (A1,INPUT); pinMode (A2,INPUT); pinMode (A3,INPUT); pinMode (A6,INPUT); pinMode (A7,INPUT); pinMode (A8,INPUT); pinMode (9, INPUT); //сигнал от оптодатчика pinMode (15,OUTPUT); //Пины шагового двигателя pinMode (14,OUTPUT); pinMode (16,OUTPUT); pinMode (10,OUTPUT); D.value = 0; stepper.setRPM (12); // количество оборотов stepper.setSPR (4075.7728395); // количество шагов на оборот с учетом редукции setdegsolution = false; IniStepper (); //установка вала в начальное положение «0» — отсчет }
void IniStepper () { if (stepper.isDone () && rotateend == false) { //Крутим, пока не упремся в оптический датчик остановки stepper.rotate ();} } int binaz (uint8_t val) //Считываем состояние шины данных { D.value = val; if (digitalRead (A8) == HIGH) {D.bits.b6=1;} else {D.bits.b6=0;}; if (digitalRead (A7) == HIGH) {D.bits.b5=1;} else {D.bits.b5=0;}; if (digitalRead (A6) == HIGH) {D.bits.b4=1;} else {D.bits.b4=0;}; if (digitalRead (A3) == HIGH) {D.bits.b3=1;} else {D.bits.b3=0;}; if (digitalRead (A2) == HIGH) {D.bits.b2=1;} else {D.bits.b2=0;}; if (digitalRead (A1) == HIGH) {D.bits.b1=1;} else {D.bits.b1=0;}; if (digitalRead (A0) == HIGH) {D.bits.b0=1;} else {D.bits.b0=0;}; D.bits.b7=0; switch (D.value) { case 0: deg = 0; break; case 1: deg = 5; break; case 2: deg = 10; break; case 3: deg = 15; break; case 4: deg = 20; break; case 5: deg = 25; break; case 6: deg = 30; break; case 7: deg = 35; break; case 8: deg = 40; break; case 9: deg = 45; break; case 10: deg = 50; break; case 11: deg = 55; break; case 12: deg = 60; break; case 13: deg = 65; break; case 14: deg = 70; break; case 15: deg = 75; break; case 16: deg = 80; break; case 17: deg = 85; break; case 18: deg = 90; break; case 19: deg = 95; break; case 20: deg = 100; break; case 21: deg = 105; break; case 22: deg = 110; break; case 23: deg = 115; break; case 24: deg = 120; break; case 25: deg = 125; break; case 26: deg = 130; break; case 27: deg = 135; break; case 28: deg = 140; break; case 29: deg = 145; break; case 30: deg = 150; break; case 31: deg = 155; break; case 32: deg = 160; break; case 33: deg = 165; break; case 34: deg = 170; break; case 35: deg = 175; break; case 36: deg = 180; break; case 37: deg = 185; break; case 38: deg = 190; break; case 39: deg = 195; break; case 40: deg = 200; break; case 41: deg = 205; break; case 42: deg = 210; break; case 43: deg = 215; break; case 44: deg = 220; break; case 45: deg = 225; break; case 46: deg = 230; break; case 47: deg = 235; break; case 48: deg = 240; break; case 49: deg = 245; break; case 50: deg = 250; break; case 51: deg = 255; break; case 52: deg = 260; break; case 53: deg = 265; break; case 54: deg = 270; break; case 55: deg = 275; break; case 56: deg = 280; break; case 57: deg = 285; break; case 58: deg = 290; break; case 59: deg = 295; break; case 60: deg = 300; break; case 61: deg = 305; break; case 62: deg = 310; break; case 63: deg = 315; break; case 64: deg = 320; break; case 65: deg = 325; break; case 66: deg = 330; break; case 67: deg = 335; break; case 68: deg = 340; break; case 69: deg = 345; break; case 70: deg = 350; break; case 71: deg = 355; break; case 72: deg = 360; break; } return deg; }
void SetRealPosition () //Расчитаем угол в градусах для поворота вала на новую позицию повороте { NewPosition = deg; DegPosition=OldPosition — NewPosition; OldPosition = NewPosition; }
void loop () { binaz (D.value); if (digitalRead (9)==LOW && rotateend == false){ //Если сработал оптодатчик — останавливаем мотор stepper.setDirection (STOP); rotateend = true; setdegsolution = true; DegPosition = 0; OldPosition = 0; NewPosition = 0; } currentMillis = millis (); if (currentMillis — previousMillis > interval) { previousMillis = currentMillis; if (stepper.isDone () && setdegsolution == true && deg > 0){ SetRealPosition (); if (DegPosition <0){ //поворот против часовой stepper.setDirection (CW); } if (DegPosition >0){ //поворот по часовой stepper.setDirection (CCW); } setdegsolution == false; stepper.rotateDegrees (abs (DegPosition)); //Крутим по назначению setdegsolution == true; } } stepper.run (); }
|
Ну вот, рассказал Вам несколько вариантов построения индикатора азимутального поворота на базе герконового датчика. Что именно Вы захотите использовать — ваш выбор. Удачи всем в эксперементах! Если заметили ошибку или родилась идея, пишите на мой адрес rw9jd@mail.ru.
|