Я с детства люблю рыбалку и сколько себя помню, всегда лучшим отдыхом считал поездку на природу с удочками. На озере или реке можно расслабиться и отдохнуть от повседневных проблем, природа помогает быстро восстановить психическое и физическое здоровье. А если кроме отдыха на свежем воздухе, удается поймать несколько хвостатых обитателей водоема, то можно неплохо зарядиться позитивом и хорошим настроением.
Но с рыбалкой не все просто – комфортно порыбачить можно только полгода, а иногда и того меньше, когда погода не подчиняется календарю и выделяет всего несколько месяцев теплой погоды в году. Поэтому рыболовный сезон, до недавнего времени, для меня длился 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. Да, видео вертикальное, сорян :(
Ну и куда же без рыбацких трофеев, которые были пойманы на автоматическую удочку – ниже фото.


(8 оценок, среднее: 4,75 из 5)
Добрый день!
Подскажите номинал резисторов, пожалуйста!
Добрый день!

Резисторы для светодиодов по 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. Хочу добавить детектор поклёвки и шаговый движок для подсекания сматывания лески.
Илья Саныч, Вы можете скетч скинуть, попробуем помочь.
Спасибо большое! Скетчь рабочий, повторил дважды.