Делаем автономного водного дрона или как я мечтал помочь Байкалу, но я не газпром. Часть 1

Привет Хабр!
Я живу рядом с Байкалом, и много раз бывал на нем. Это красивое озеро с чистым воздухом. Несколько лет назад озеро начало загрязняться. И вот я подумал почему бы не сделать дрона с солнечными батареями, поставить на нее двигатель, нейронный компьютер с YolloV3(нейросеть которая обеспечивает зрение компьютеру) со стереокамерой, добавить GPS и научить его чистить Байкал в автономном режиме.image
Погуглив, я узнал что есть две основные причины: грязные, плохо очищенные канализационные стоки города Улан-Удэ и отдыхающие, которые пользуются моющими средствами, которые в свою очередь создают на берегу Байкала высокую концентрацию нитратов и фосфатов. После еще одно поиска в гугле выяснилось, что для спасения Байкала, его всего лишь нужно очищать. Я подумал что с таким не хитрым делом я справлюсь. Так я начал свой путь дроностроителя)

Первый кому я рассказал про свою идею это был мой начальник. Это было весной 2018. Идея ему понравилась и поэтому за несколько дней он начертил 3д чертеж дрона. Это единственное фото которое сохранилось. На фото дрон со снятой солнечной батареей и нижним буйком.
image
Далее мы нашли спонсора, но он получив чертежи сразу отвалился. Далее и начальник тоже остыл к проекту, когда я предложил собрать его за свои деньги.
Наступил январь 2019 и все таки решил сделать его. Дядя согласился мне помочь. Первое что я купил — это обычные пластиковые трубы (почему они такие дорогие!!!) вместе с муфтами, отворотами, хомутами и крышками. Далее мы взяли старую алюминиевую гардину, просверлили в ней отверстия под каждую муфту и прикрутили к ней лист фанеры. Трубы взял по метру диаметром 110 мм. Мы не знали какие подойдут для нашего корабля, поэтому взяли эти, ну, а в будущем уже подогнать необходимую грузоподъемность.
image

Далее мы сварили металлическую станину для двигателя из обычных старых железяк, которые валялись в огороде. Сломанный двигатель от охлаждения мотора волги-3110 дал мне дядя. После вскрытия оказалось что там был пробит искрогасящий кондер. После его замены двигатель заработал. И наш плот превратился в кораблик.
image

Вот уже пришла весна и я узнал про конкурс «IT-старт». Я подумал почему и мне не пойти с моим проектом. Но там мне сначала москвичи сказали, что дрон который чистит Байкал не нужен, нужно какое то коммерческое назначение, ну, а потом и местные не оценили моей инициативы. К последнему дню «IT-старта» мы уже успели сделать корпус для электроники и руль. За ночь перед конкурсом я успел доделать простенькое управление кораблем yf esp8266 не имеющее обратной связи. Это видео я показал на конкурсе

Так он выглядел внутри
image

Аккумулятор от бесперебойника подарил знакомый весовщик. Двигатель руля где-то нашел дядя. Фильтр и насос (насос погружного типа, поэтому находится под кораблем в «носу») пришлось окупать за свои деньги. Рэле автомобильное на 40 Ампер.
После конкурса энтузиазм убавился. И летом я занимался не белее 2 часов в неделю. Управление собранное на esp8266 имело один недостаток: работало все через get запрос в функции похожей на прерывание и если в этот момент отправлялась еще одна команда, то проц сбоил и перезагружался, что было видно по данным отправленным по ком порту. Да и сам проц постоянно отваливался. Порывшись в ардуиновских исходниках и не найдя там регистров (оказывается, как я потом уже узнал, что китайцы сразу написали управляющие функции для всех моделей esp8266) я решил идти по самому простому пути, а именно купить радио брелок и написать все управление на atmegа88pa. Обратная связь положения руля была сделана на двух пружинках, притянутых резистором на 560 Ом к 5 В. Когда алюминиевая планка, приделанная к направляющей двигателя была в правом положение, касалась ближней пружинки, то на пин1 мк приходила земля, когда к дальней то на пин2.
image

Исходный код прошивки атмеги
/*
 * korabl.cpp
 *
 * Created: 24.07.2019 21:59:04
 * Author : Антон
 */ 

#include 
#include "util/delay.h"
# define F_CPU 8000000UL
int p=0;
int polozhenue = 0;

void init_port(void)
{
DDRD|=(1<<2)|(1<<3);
///DDRB|=1<<1;
}
void po_4asovoi_on(void)
{
PORTD|=(1<<2)|(1<<3);
}
void po_4asovoi_off(void)
{
PORTD&=0b11110011;
}
void init_polozhenie(void)
{
	po_4asovoi_on();
	while(PIND&0x10);
	po_4asovoi_off();
	p = 0;
	polozhenue = 0;
}

int main(void)
{
init_port();
p=0;
    /* Replace with your application code */
    while (1) 
    {
	 if(PIND&0x10)

	 {

		 if ((p==1)||(p==2))///if(GPIOB->IDR&(1<<9))
		 {

			 po_4asovoi_on();

			 _delay_ms(200);
			 // HAL_TIM_Base_Stop_IT(&htim3);
			 po_4asovoi_off();
			 p=0;
		 }
		 while(PIND&0x10)
		 {
			 PORTD|=(1<<1);
			 _delay_ms(100);
		 }

	 }
	 PORTB&=0xfc;
	 if(PIND&0x20)
	 {
		 if ((p==2)||(p==0))///if(GPIOB->IDR&(1<<8))
		 {

			 po_4asovoi_on();




			 while(PIND&0x80)
			 {
		
			 }

			 //HAL_TIM_Base_Stop_IT(&htim3);
			 po_4asovoi_off();
			 p=1;
		 }
	 }

	 if(PIND&0x40) 
	 {
		 if ((p==1)||(p==0))///if(GPIOB->IDR&(1<<7))
		 {


			 po_4asovoi_on();

			 while(PINB&0x02)
			 {
				
			 }

			 /// HAL_TIM_Base_Stop_IT(&htim3);
			 po_4asovoi_off();
			 p=2;
		 }
	 }
    }
}



Я еще решил собрать драйвер движка управления рулем на 4-х транзисторах (на фото это светлый кусок фонеры), но после его сборки и опробования оказалось что движку без разница какая на него полярность приходит, и я отказался от этой затеи.
И вот уже конец сентября. После отпуска мы поехали его запускать. С первой попытки он начал тонуть. Зад корабля оказался тяжелый, а герметик дырявый и в него попала вода. Умер модуль радиосвязи. На следующий день купили новый и нарастили трубы. Кораблик перестал тонуть, но в боевых условиях радиомодуль брал только на пол метра. Пришлось делать третью попытку. Я нагуглил исходники для esp8266 и программу для смартфона (спасибо доброму человеку) и с третьей попытки он заработал

Аккумулятора хватило только на несколько минут, поэтому к берегу так и не получилось притянуть.
Ну вот и все. Окончательный исходный код для ESP8266 и переделанный для атмеги лежит тут.

© Habrahabr.ru