Я с детства люблю рыбалку и сколько себя помню, всегда лучшим отдыхом считал поездку на природу с удочками. На озере или реке можно расслабиться и отдохнуть от повседневных проблем, природа помогает быстро восстановить психическое и физическое здоровье. А если кроме отдыха на свежем воздухе, удается поймать несколько хвостатых обитателей водоема, то можно неплохо зарядиться позитивом и хорошим настроением.
Но с рыбалкой не все просто – комфортно порыбачить можно только полгода, а иногда и того меньше, когда погода не подчиняется календарю и выделяет всего несколько месяцев теплой погоды в году. Поэтому рыболовный сезон, до недавнего времени, для меня длился 4-6 месяцев в год. И я упорно не понимал любителей зимней охоты на рыбу – как можно в мороз и ветер сидеть на льду и дергать туда-сюда удочку, в надежде, что кто-нибудь по ту сторону льда, позарится на вкусного червячка?
А в прошлом году мне подарили зимние снасти я, незаметно для себя, пристрастился и к зимней рыбалке. Хотя и до сих пор не понимаю, как правильно ловить на льду. Многому еще нужно научиться, но уже сейчас мне пришла в голову идея: попробовать немного оптимизировать и автоматизировать зимний рыболовный процесс. Решение, для программиста и электронщика, очевидное – это автоматическая зимняя удочка, которая сама будет дергать мормышкой, пытаясь приманить рыбу.
Идея автоматической зимней удочки
Вся автоматизация зимней удочки сводится к периодическим подергиванием мормышки, которая привязана к концу лески. Для колебаний можно использовать сервопривод, мне под руку попался SG90. Это один из самых дешевых и простых сервоприводов, но в данном случае и его мощности будет достаточно. Для удобства регулирования амплитуды, скорости движения и задержек перед колебаниями можно добавить три потенциометра, с помощью которых можно регулировать эти три показателя. Кроме основного функционала, будет полезно добавить индикацию уровня заряда аккумулятора, поскольку устройство должно быть оснащено автономным источником питания. Также стоит добавить в устройство и модуль, позволяющий заряжать аккумулятор от сети, чтобы не приходилось постоянно вынимать источник питания для зарядки или менять батарейки. Ну и самое главное – мозги автоматической удочки, в данном случае их роль будет выполнять arduino nano. Мне было лень делать плату для пробной версии, и все собрал навесным монтажом, а для этих целей arduino nano подходит весьма удачно, к тому же имеет относительно не большой размер.
С электроникой все примерно понятно, перечень модулей и запчастей есть, основываясь на их размере можно определиться с размерами корпуса. На этапе проектирования коробки можно сразу реализовать и механику – добавить на корпусе качалку, которая будет управляться сервоприводом и приводить в движение удочку. Поскольку у меня есть возможность напечатать все механические детали и корпус на 3D-принтере, долго мучиться над изобретением корпуса и деталек мне не пришлось. Все модели для печати прикладываю к статье, их можно скачать тут: архив с моделями.
Ниже находится изображение того, что получилось в итоге – это картинка 360 градусов и ее можно вращать по оси X, чтобы посмотреть со всех сторон. Изображение вращается с помощью мышки, зажав ЛКМ и перетаскивая влево или вправо.
Схема автоматической удочки на arduino
Ниже приведена макетная схема подключения всех элементов удочки.
Тут все довольно просто – по схеме можно быстро собрать подобное устройство. Единственно, на что хочется обратить внимание, это уровень заряда аккумулятора, про это можете подробней почитать в статье: Уровень заряда аккумулятора 18650 на arduino. Получив уровень заряда, достаточно просто зажечь один из четырех светодиодов, каждый из которых обозначает 25% заряда.
И еще один момент, который тоже нужно упомянуть: для получения уровня заряда аккумулятора нужно переключать уровень опорного напряжения arduino в положение 1.1В. А для корректной работы потенциометров в данной схеме, опорное напряжение должно быть 5в. Таким образом, в скетче приходится постоянно переключать опорное напряжение. И самое интересное, что переключение происходит не сразу, при первом обращении к аналоговому пину, возвращается не корректное значение. Поэтому пришлось немного закастылись в коде – сразу после переключения опорного напряжения происходит задержка в 50 мс и запрос на считывание данных с аналогового пина. Возможно, когда-нибудь получится придумать более адекватное решение. Если есть идеи – пишите в комментарии.
Когда уже нарисовал схему, написал и опубликовал статьи, заметил, что на схеме не хватает модуля для зарядки аккумулятора. В качестве зарядки я использовал TP4056, он предохраняет аккумулятор от полного разряда, а также позволяет заряжать аккумулятор с помощью обычного usb-кабеля. Подключается такой модуль очень просто — одна пара контактов соединяется с аккумулятором, а вторая с нагрузкой.
Скетч для удочки
Ниже приведен код с комментариями для управления автоматической удочкой. Также можете скачать скетч по ссылке: скачать.
#include <Servo.h> // библиотека для работы с сервоприводом Servo myservo; int pin_servo = 9; // пин для управления сервоприводом // пины для потенциометров int rez_1 = A1; int rez_2 = A2; int rez_3 = A3; // пины для светодиодов, которые служат // в качестве индикатора заряда аккумулятора int pin_leds[4] = {2, 3, 4, 5}; // пин для определения уровня заряда аккумулятора int accum = A5; // максимальный заряд аккумулятора float max_v = 4.25; // минимальный заряд аккумулятора float min_v = 3; int pause_time = 300; // время паузы int delay_time = 150; // время колебания int max_degree = 20; // максимальный угол int degree; // рандомный угол int start_degree = 45; // начальный угол int degree_one; // функция для проверки уровня заряда аккумулятора void check_accum(){ // включаем опорное напряжения 1.1В // чтобы правильно определить заряд аккумулятора analogReference(INTERNAL); // кастыль для переключения опорного напряжения Serial.println(analogRead(accum)); delay(50); float Vbat = (analogRead(accum) * 1.1) / 1023; float del = 0.091; // R2/(R1+R2) 0.99кОм / (9.88кОм + 0.99кОм) float Vin = Vbat / del; // уровень заряда в процентах int proc = ((Vin - min_v) / (max_v - min_v)) * 100; Serial.println(Vbat); Serial.println(proc); // гасим все светодиоды int on_leds = 4; for(int i = 0; i < on_leds; i++){ digitalWrite(pin_leds[i], LOW); } // зажигаем нужные светодиоды // в зависимости от уровня заряда if(proc <= 75) on_leds = 3; if(proc <= 50) on_leds = 2; if(proc <= 25) on_leds = 1; for(int i = 0; i < on_leds; i++){ digitalWrite(pin_leds[i], HIGH); } // переключаем обратно опорное напряжение в дефолтное // состояние, чтобы корректно работали потенциометры analogReference(DEFAULT); delay(50); // кастыль для переключения опорного напряжения Serial.println(analogRead(accum)); } void setup() { // инициализация сервопривода myservo.attach(pin_servo); myservo.write(start_degree); delay(1000); // пины потенциометров pinMode(rez_1, INPUT); pinMode(rez_2, INPUT); pinMode(rez_3, INPUT); // пины светодиодов pinMode(pin_leds[0], OUTPUT); pinMode(pin_leds[1], OUTPUT); pinMode(pin_leds[2], OUTPUT); pinMode(pin_leds[3], OUTPUT); // вывод в монитор порта Serial.begin(9600); } void loop() { check_accum(); // проверка заряда аккумулятора // получаем время паузы pause_time = map(analogRead(rez_1), 0, 1023, 50, 1000); // получаем время колебания delay_time = map(analogRead(rez_2), 0, 1023, 50, 1000); // получаем максимальный угол наклона. Амплитуда колебания max_degree = map(analogRead(rez_3) , 0, 1023, 1, 20); // проверка значений в мониторе порта Serial.println(pause_time); Serial.println(delay_time); Serial.println(max_degree); // если нужен рандомный угол наклона //degree = random(max_degree/2, max_degree); // рандомные колебания degree = max_degree; // поднимаем удочку вверх for (degree_one = start_degree; degree_one <= (start_degree + degree); degree_one++) { delay(delay_time / degree); myservo.write(degree_one); } // задержка между колебаниями delay(pause_time); // опускаем удочку вниз for (degree_one = (start_degree + degree); degree_one >= start_degree; degree_one--) { delay(delay_time / degree); myservo.write(degree_one); } // задержка между колебаниями delay(pause_time); }
Послесловие
Посмотреть полевые испытания удочки можно на видео, оно находится чуть ниже. P.S. Да, видео вертикальное, сорян :(
Ну и куда же без рыбацких трофеев, которые были пойманы на автоматическую удочку – ниже фото.
Добрый день!
Подскажите номинал резисторов, пожалуйста!
Добрый день!
Резисторы для светодиодов по 300 Ом. А для делителя напряжения 1 кОм и 10 кОм. Про делитель напряжения и уровень заряда вот тут подробней написано: https://vk-book.ru/uroven-zaryada-akkumulyatora-18650-na-arduino/
потанциометры какого номинала в проекте?
Отличный проект! Повторил все работает. Огромная благодарность вам. А вы можете составить скетч для работы сервы от минимального угла (1°-1,5°) до градусов тридцати с регулировкой амплитуды и частоты от 1 до 10гц , вручную (от потенциометров или энкодеров). Опрашивание аккумулятора необязательно.
Бьюсь с этой темой, но никак не освою, видать не судьба.
Сегодня закончил свою удочку. Вместо батареек — аккумулятор от бесперебойника 12V -> понижающий DC-DC до 7V. Добавил LCD Keypad Shield. При включении ввожу параметры интервала между кивками, максимальный угол (от 0′ до 95′), скорость движения вверх и скорость движения вниз. Потребление при работе серво (TowerPro MG995R) 300 mA, на холостых 30 mA. Хочу добавить детектор поклёвки и шаговый движок для подсекания сматывания лески.
Илья Саныч, Вы можете скетч скинуть, попробуем помочь.
Спасибо большое! Скетчь рабочий, повторил дважды.