Автоматическая зимняя удочка на arduino

Автоматическая зимняя удочка на arduino

Я с детства люблю рыбалку и сколько себя помню, всегда лучшим отдыхом считал поездку на природу с удочками. На озере или реке можно расслабиться и отдохнуть от повседневных проблем, природа помогает быстро восстановить психическое и физическое здоровье. А если кроме отдыха на свежем воздухе, удается поймать несколько хвостатых обитателей водоема, то можно неплохо зарядиться позитивом и хорошим настроением.
Но с рыбалкой не все просто – комфортно порыбачить можно только полгода, а иногда и того меньше, когда погода не подчиняется календарю и выделяет всего несколько месяцев теплой погоды в году. Поэтому рыболовный сезон, до недавнего времени, для меня длился 4-6 месяцев в год. И я упорно не понимал любителей зимней охоты на рыбу – как можно в мороз и ветер сидеть на льду и дергать туда-сюда удочку, в надежде, что кто-нибудь по ту сторону льда, позарится на вкусного червячка?
А в прошлом году мне подарили зимние снасти я, незаметно для себя, пристрастился и к зимней рыбалке. Хотя и до сих пор не понимаю, как правильно ловить на льду. Многому еще нужно научиться, но уже сейчас мне пришла в голову идея: попробовать немного оптимизировать и автоматизировать зимний рыболовный процесс. Решение, для программиста и электронщика, очевидное – это автоматическая зимняя удочка, которая сама будет дергать мормышкой, пытаясь приманить рыбу.

Идея автоматической зимней удочки

Вся автоматизация зимней удочки сводится к периодическим подергиванием мормышки, которая привязана к концу лески. Для колебаний можно использовать сервопривод, мне под руку попался SG90. Это один из самых дешевых и простых сервоприводов, но в данном случае и его мощности будет достаточно. Для удобства регулирования амплитуды, скорости движения и задержек перед колебаниями можно добавить три потенциометра, с помощью которых можно регулировать эти три показателя. Кроме основного функционала, будет полезно добавить индикацию уровня заряда аккумулятора, поскольку устройство должно быть оснащено автономным источником питания. Также стоит добавить в устройство и модуль, позволяющий заряжать аккумулятор от сети, чтобы не приходилось постоянно вынимать источник питания для зарядки или менять батарейки. Ну и самое главное – мозги автоматической удочки, в данном случае их роль будет выполнять arduino nano. Мне было лень делать плату для пробной версии, и все собрал навесным монтажом, а для этих целей arduino nano подходит весьма удачно, к тому же имеет относительно не большой размер.
С электроникой все примерно понятно, перечень модулей и запчастей есть, основываясь на их размере можно определиться с размерами корпуса. На этапе проектирования коробки можно сразу реализовать и механику – добавить на корпусе качалку, которая будет управляться сервоприводом и приводить в движение удочку. Поскольку у меня есть возможность напечатать все механические детали и корпус на 3D-принтере, долго мучиться над изобретением корпуса и деталек мне не пришлось. Все модели для печати прикладываю к статье, их можно скачать тут: архив с моделями.
Ниже находится изображение того, что получилось в итоге – это картинка 360 градусов и ее можно вращать по оси X, чтобы посмотреть со всех сторон. Изображение вращается с помощью мышки, зажав ЛКМ и перетаскивая влево или вправо.

Схема автоматической удочки на arduino

Ниже приведена макетная схема подключения всех элементов удочки.

Схема автоматической удочки на 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. Да, видео вертикальное, сорян :(

Ну и куда же без рыбацких трофеев, которые были пойманы на автоматическую удочку – ниже фото.

Автоматическая удочка на arduino: трофеи


Рассказать друзьям:


Оценить:
(4 оценок, среднее: 5,00 из 5)

Автоматическая зимняя удочка на arduino: 2 комментария

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code