1. Идея
Есть у меня значит телескоп, дешевый и достаточно ущербный. При наведении на обожаемое тело (Небесное естественно) и попытке сфокусироваться вручную, при любом касании и приложении силы жутко начинает вибрировать на штативе, и вибрация эта очень раздражает. И пришла мне в голову идея сделать полностью электрически управляемый телескоп. Хотел я купить шаговые двигатели и винтовые направляющие. Изначально хотел сделать на NRF24, чтобы даже провод не мешал столь "нежной" аппаратуре, но узнал что одна из нрфок в кз и от идеи пришлось отказаться. Затем пришла идея сделать приложение и связь по wi-fi с ESP 8266, но после подключения в ней застрял мой видавший всякое ЮСБ кабель и при попытке его вытащить была допущена фатальная ошибка - я коснулся чего-то на плате своими красными и потными от праведного гнева руками. ESP этого не пережила. Да здравствует ESP!
После всех этих неудач я понял:
1. Сейчас у меня нет инструмента для этого, даже банальной дрели для крепления шаговиков не говоря о сварочном аппарате для приваривания того что необходимо приварить.
2. Покупка трёх шаговиков и направляющих со всем необходимым обвесом обойдется минимум в 30-40 Баксов, что является половиной цены такого нового телескопа, при том что сам телескоп в бородатые времена обошелся мне в 15 вечнозеленых, да ещё и доставку ждать под НГ придется до марта.
После этих размышлений решил действовать. Не так масштабно, ведь это мой первый проект доведенный до конца в принципе. Максимальных колхоз, не щадя ничего на своём пути. Поэтому проект и называется TAPOK, ведь он собран в корпусе роутера TP-LINK и дыры под энкодер и светодиод пришлись прямо на символы -LIN. Так и образовалось культовое название этого ужасного и одновременно прекрасного проекта - TPOK (В режиссерской версии - гордый ТАПОК)
2. Реализация
На этом пункте хочется плакать. Нет, я серьезно. Мне пришлось ездить за двумя метрами медной проволоки для полуторасантиметровой тяги сервопривода, так как вырывать её из электрощитка мне запретили родственники. Корпус, как я уже сказал - обломки древнего роутера. Сердце - Arduino Leonardo (хотел micro, pro micro, nano, esp8266, но все они оказались мертвыми, возможно в том месте где их держал соплеклей им не понравилось, а может быть они даже не проработали и 1 дня, хотя не помню чтоб они вообще работали). Мышца - невероятно мощная дребезжащая синяя сервомашинка на пластиковых шестернях - невероятный зверь.
При разработке проекта, сидя с паяльником и полусгоревшим, оставленным судьбой на вырезку пластика жалом, я решил сделать коробку со световой индикацией и тремя режимами (три устройства ввода которые были у меня), а именно:
1. Красные, знакомые всем, сенсорные кнопки
2. Энкодер на круглой плате
3. Ползунковый потенциометр (далее в моей терминологии слайдер)

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

4. Код
С кодом были сложности, так как первый ардуино проект - ответственнее и сложнее чем первый раз с девушкой, но как и во втором случае всё вышло комом. Я не знаю где, но уверен что этот код можно было написать в 10 раз компактнее и производительней, но как сумел так и написал, главное что работает без перебоев. Использовал библиотеку GyverEncoder - не знаю как здесь к ней относятся, но для меня - это золото ацтеков, невероятно удобно использовать, особенно с дабл кликами и быстрым вращением энкодера
003 | #include "GyverEncoder.h" |
004 | #include <Servo.h> //рекомендуется использовать другие библиотеки servo, так как эта ломает ШИМ на 9 и 10 пине если вы работаете НЕ на Arduino Mega |
006 | Encoder enc1(CLK, DT); |
023 | bool SliderMode = true ; |
024 | bool EncoderMode = false ; |
025 | bool SwitchButtInv = false ; |
028 | ModeCount = ModeCount-1; |
029 | myservo.attach(ServoPin); |
032 | pinMode(plusButton, INPUT); |
033 | pinMode(minusButton, INPUT); |
034 | pinMode(SwitchButt, INPUT_PULLUP); |
035 | pinMode(EncLED, OUTPUT); |
036 | pinMode(ColourRP, OUTPUT); |
037 | pinMode(ColourGP, OUTPUT); |
038 | pinMode(ColourBP, OUTPUT); |
039 | digitalWrite(ColourRP, HIGH); |
040 | digitalWrite(ColourGP, HIGH); |
041 | digitalWrite(ColourBP, HIGH); |
042 | digitalWrite(EncLED, HIGH); |
047 | digitalRead(SwitchButt); |
048 | if (digitalRead(SwitchButt) == SwitchButtInv && Mode < ModeCount) { |
052 | else if (digitalRead(SwitchButt) == SwitchButtInv && Mode == ModeCount) { |
057 | if (Mode == 0 && ModeLED != Mode) { |
058 | digitalWrite(ColourRP, LOW); |
059 | digitalWrite(ColourGP, HIGH); |
060 | digitalWrite(ColourBP, HIGH); |
063 | if (Mode == 1 && ModeLED != Mode) { |
064 | digitalWrite(ColourRP, HIGH); |
065 | digitalWrite(ColourGP, LOW); |
066 | digitalWrite(ColourBP, HIGH); |
069 | if (Mode == 2 && ModeLED != Mode) { |
070 | digitalWrite(ColourRP, HIGH); |
071 | digitalWrite(ColourGP, HIGH); |
072 | digitalWrite(ColourBP, LOW); |
076 | Serial .println(Mode); |
078 | digitalRead(plusButton); |
079 | if (digitalRead(plusButton) == 1) { |
080 | digitalWrite(EncLED, LOW); |
082 | digitalWrite(EncLED, HIGH); |
089 | else if (digitalRead(minusButton) == 1) { |
090 | digitalWrite(EncLED, LOW); |
092 | digitalWrite(EncLED, HIGH); |
103 | if (EncoderMode == 0){ |
105 | if (enc1.isRight() && a < 180) { |
108 | digitalWrite(EncLED, LOW); |
110 | digitalWrite(EncLED, HIGH); |
112 | else if (enc1.isLeft() && a > 0) { |
115 | digitalWrite(EncLED, LOW); |
117 | digitalWrite(EncLED, HIGH); |
122 | else if (EncoderMode == 1){ |
124 | if (enc1.isRight() && a > 0) { |
127 | digitalWrite(EncLED, LOW); |
129 | digitalWrite(EncLED, HIGH); |
132 | if (enc1.isLeft() && a < 180) { |
135 | digitalWrite(EncLED, LOW); |
137 | digitalWrite(EncLED, HIGH); |
145 | if (SliderMode == 1) { |
146 | slideValue = 1023 - analogRead(A5); |
148 | else if (SliderMode == 0) { |
149 | slideValue = analogRead(A5); |
151 | Serial .println(slideValue); |
152 | a=map(slideValue,0,1023,0,180); |
Удивительно, но добавление любого 10мс delay для стабильности в конец или середину void loop приводит к полной дисфункции энкодера. Возможно кто-то знает с чем связано?
5. Итог
Получилось скомкано, возникали фантомные отвалы энкодера, которые решались перебором кода (сами по себе), ну а никто и не говорил что первый раз будет приятно, пришлось серьезно порвать заднее технологическое отверстие что-бы добиться желаемого результата - бесперебойной работы
Шедеврально.
Отправлено в 00.45, то есть ТС писал это под бой курантов, бросив жену и детей у праздничного стола.
Лучше б шампусика выпил:)
По моему часовому поясу это было 23:45, да и молод я ещё для жены, да и с мелкой сестрой не особо попразднуешь) 10 минут посидели и спать
Спустя несколько попыток использования я сломал клей, крепивший качалку к оси фокусировочного механизма, теперь можно настроить фокус вручную, а сервомашинка всё ещё позволяет делать точную подгонку без вибраций, так мне даже больше нравится, так как ручной "черновой" фокус также важен