Как сделать RC катер с опцией автопилота — часть 1

Перевел SaorY для mozgochiny.ru

Приветствую, мозгочины! Сегодня расскажу вам, как я своими руками создал Arduino-поделку — радиоуправляемый катер с опцией автопилота.

 

kak-sdelat-rc-kater-s-optsiey-avtopilota3

kak-sdelat-rc-kater-s-optsiey-avtopilota1

kak-sdelat-rc-kater-s-optsiey-avtopilota4

kak-sdelat-rc-kater-s-optsiey-avtopilota5

По сути, это мозгоруководство о создании автопилота на микроконтроллере Arduino, который можно установить в любую модель, тем самым превратив ее в радиоуправляемую поделку, даже не просто поделку, а автономного дрона. На сборку данной мозгоподелки меня вдохновили такие робо-катера как UBC Sailbot и Scout, который кстати, совершил успешный трансатлантический рейс.

Весь процесс создания катера с автопилотом занял у меня более года, и за это время я приобрел много знаний по теории автопилотирования и схемотехники, и думаю, что в один прекрасный день я применю их на настоящем катере моего отца.

Окончательная, завершенная версия катера с автопилотом основывается на решениях трех прототипов, первый из которых самый простой по схеме и коду, остальные более доработанные. Финальный катер представляет собой полнофункциональную радиоуправляемую модель, которая успешно плавает по глади пруда, что я постарался отобразить на фото. Эта версия хотя и окончательная, но может быть доработана и усовершенствована, как с точки зрения кода, лодку нужно научить следовать маршруту, а не просто от точки к точке, так и с точки зрения электроники, можно поставить акселерометр, чтобы он компенсировал наклон от компаса.

 

 

Шаг 1: Видеопрезентация

 

Небольшое видео обозначит направление этого мозгопроекта:

 

 

 

 

Шаг 2: Прототип 1

 

kak-sdelat-rc-kater-s-optsiey-avtopilota6

kak-sdelat-rc-kater-s-optsiey-avtopilota7

kak-sdelat-rc-kater-s-optsiey-avtopilota8

kak-sdelat-rc-kater-s-optsiey-avtopilota9

kak-sdelat-rc-kater-s-optsiey-avtopilota10

kak-sdelat-rc-kater-s-optsiey-avtopilota11

kak-sdelat-rc-kater-s-optsiey-avtopilota12

kak-sdelat-rc-kater-s-optsiey-avtopilota13

kak-sdelat-rc-kater-s-optsiey-avtopilota2

 

Первый катер, то есть прототип 1, был самый простой по исполнению и должен был уметь:

  • считывать GPS-координаты своего положения
  • считывать азимут с компаса
  • управлять сервоприводом руля
  • использовать руль для следования курсу

А так же на нем я тестировал формулы маневрирования для создания действующего автопилота. Основой прототипа 1 был микроконтроллер Arduino Uno, в финальной версии я использовал ATmega328.

 

Считывание GPS-координат

На первом прототипе я установил самый дешевый GPS-модуль который смог достать, это UBlox PCI-5. Для его монтажа нужно было лишь припаять четыре провода к задней стороне платы, подсоединить их к Arduino и прикрепить антенну. Для обработки поступающих данных я использовал библиотеку TinyGPS ++, которая позволила мне получить координаты текущего положения, скорость, направление и много другого! Подробнее о установке этого модуля, который кстати я использовал и в прототипе 2, вот в этом моем мозгоруководстве.

 

Считывание азимута

Чтобы получать данные с компаса я использовал HMC5883L, который легко подключается к микроконтроллеру через I2C. Как именно он устанавливается и как с ним работать хорошо описано здесь и здесь.

 

Управление сервоприводом руля

Контролировать сервопривод руля с помощью Arduino очень легко, но если только вы не используете библиотеку SoftwareSerial, которая нужна для TinyGPS ++, и которая конфликтует с одним таймеров Arduino! Запущенная SoftwareSerial мешает работе любого сервопривода использующего стандартную библиотеку, и решением данного мозгоконфликта является использование библиотеки PWM Servo library.

 

Формулы алгоритма автопилотирования

В прототипе 1 я применил несколько функций, которые позднее станут критичными. Эти функции используют формулу Хаверсина для расчета таких параметров как расстояние между двумя точками, направления от одной точки к следующей и реальный азимут по данным компаса. Более подробно об этих формулах в этой статье.

 

Сборка компонентов

Компоненты первого прототипа я разместил на деревянном каркасе (см. фото), и теперь, зная положение этого каркаса-автопилота и сравнивая с заданным, можно поворачивать руль и сохранять заданный маршрут. Это будет полезно в дальнейшем для навигации по GPS-координатам.

 

 

Шаг 3: Прототип 2

 

kak-sdelat-rc-kater-s-optsiey-avtopilota14

kak-sdelat-rc-kater-s-optsiey-avtopilota15

kak-sdelat-rc-kater-s-optsiey-avtopilota16

kak-sdelat-rc-kater-s-optsiey-avtopilota17

kak-sdelat-rc-kater-s-optsiey-avtopilota18

kak-sdelat-rc-kater-s-optsiey-avtopilota19

kak-sdelat-rc-kater-s-optsiey-avtopilota20

kak-sdelat-rc-kater-s-optsiey-avtopilota21

kak-sdelat-rc-kater-s-optsiey-avtopilota22

kak-sdelat-rc-kater-s-optsiey-avtopilota23

kak-sdelat-rc-kater-s-optsiey-avtopilota24

kak-sdelat-rc-kater-s-optsiey-avtopilota25

 

Довольный результатами первой поделки я решил создать прототип 2 с программными доработками автопилота. Целями для второй самоделки были:

  • плавание по заданным GPS-кооддинатам
  • работа автопилота от аккумулятора
  • тестирование и запись данных автопилота

Конструкция автопилота также претерпела некоторые изменения — была добавлена макетная плата ProtoSheild, на которую я установил сам Arduino и компас. Все компоненты смонтировал на фанерное основание и “упаковал” в пластиковый контейнер.

В этот же контейнер я попытался добавить приемник дистанционного управления, но безуспешно из-за нехватки свободного места.

 

Плавание по заданным GPS-кооддинатам

Код для Arduino я написал таким образом, чтобы он поворачивал руль по направлению к следующей точке заданного маршрута: используя GPS-координаты для вычисления соотношений последующих точек и сравнивая их с компасом, вычисляется поворот руля. Если вычисленное значение правее, на 90 градусов, то руль повернется на 60 градусов. Если вычисленное значение левее, на 270 градусов, то руль повернется на 120 градусов. Если же значение находится между 330 и 30 градусами, то руль будет поворачиваться экспоненциально сохраняя положение прямо.

Все это будет происходить в цикле, примерно так (этот код обобщенный):

while(distanceInMeters(gpslat, gpslong, waypointlat, waypointlong) < 5) {
	int bearing = GetBearing();
	int heading = GetHeading(gpslat, gpslong, waypointlat, waypointlong);	
	bearing = RealBearing(gpslat, gpslong, bearing);
	RudderTurn(RudderAngle(bearing, heading));
}

Пояснение кода таково: если расстояние между катером и следующей точкой более 5 метров, то складывая азимут катера и азимут следующей точки, получается действительный азимут, оба азимута посылаются функции the RudderTurn function, которая вычисляет нужный угол поворота и соответственно поворачивает мозгоруль.

 

Установка аккумулятора

Запитать Arduino от аккумулятора довольно просто. Для этого на микроконтроллере есть контакт Vin, и на него можно подать до 20В постоянного тока. У меня была литиевая батарея на 12.6В, к которой я припаял разъем и подключил ее к контакту Vin на Arduino.

 

 

Шаг 4: Тестирование прототипа 2

 

kak-sdelat-rc-kater-s-optsiey-avtopilota26

kak-sdelat-rc-kater-s-optsiey-avtopilota27

kak-sdelat-rc-kater-s-optsiey-avtopilota28

kak-sdelat-rc-kater-s-optsiey-avtopilota29

 

Для того чтобы проверить прототип в действии я установил два светодиода, первый из которых будет светиться когда зафиксируется GPS-координата, а второй, когда будет достигнута эта точка.

Испытание прототипа

Пробы своего автопилота я проводил на местном поле. К своему ноутбуку я подключил автопилот и запустил последовательный монитор (часть программного обеспечения Arduino), который записывал GPS-координаты все время следования по заданным точкам. Я пользовался рулем который направлял меня к следующей точке, и я поворачивал, словно это был мозгокатер.

На представленных фото обозначен маршрут тестов. Если я оказывался ближе чем 5 метров к нужной точке, то автопилот переключался и начинал навигацию к следующей точке. В процессе этих тестов код поделки претерпел довольно много незначительных изменений.

Для конвертации последовательного текста в путь Google Earth, я импортировал текст в Excel, сохранив файл и далее следуя указаниям Earthpoint, преобразовывал файл в формат KML.

 

 

Шаг 5: Первое судно

 

kak-sdelat-rc-kater-s-optsiey-avtopilota30

kak-sdelat-rc-kater-s-optsiey-avtopilota31

kak-sdelat-rc-kater-s-optsiey-avtopilota32

kak-sdelat-rc-kater-s-optsiey-avtopilota33

kak-sdelat-rc-kater-s-optsiey-avtopilota34

kak-sdelat-rc-kater-s-optsiey-avtopilota35

 

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

Почти все детали судна, включая палубу, вырезаны из пеноматериала. Для тяги мотор сначала я взял щеточный, но потом заменил его двигателем без щеток с пропеллером 5х3. Этот 9-ти граммовый сервомотор я смонтировал на задней панели, а для проводов идущих к нему в контейнере высверлил отверстие. Но в конце концов, эта самоделка не отправилась в плавание… Дело в том, что система ESC, которую я планировал использовать сгорела во время инцидента другого мозгопроекта, да еще GPS модуль наотрез отказался работать на поверхности пруда.

 

 

Шаг 6: Модифицированный катер

 

kak-sdelat-rc-kater-s-optsiey-avtopilota36

kak-sdelat-rc-kater-s-optsiey-avtopilota37

kak-sdelat-rc-kater-s-optsiey-avtopilota38

kak-sdelat-rc-kater-s-optsiey-avtopilota39

 

А теперь снова вернемся к чертежам катера! На известном онлайн-ресурсе я купил новый катер. В комплект к нему входили никель-металл-гидридный (Ni-MH) аккумулятор на 7.4В, зарядное устройство, передатчик и плата приемника. С передатчиком возникли небольшие проблемы — нужно было найти 12 батареек АА, и я остался разочарованным не работающим катером. Но, для проекта это не критично и я продолжил.

Я выпаял два Н-канальных MOSFET-транзистора из цепи приемника, они пригодятся позднее. После этого обрезал все провода и загерметизировал горячим клеем все щели и трещинки, которые нашел в корпусе катера.

Два двигателя катера имели сложную систему охлаждения — очень шумный пропеллер, который нагнетал воздух на двигатели, еще на моторах стояли шунтирующие конденсаторы, и оба этих момента работали в мою пользу. А вот для маленького переключателя на верхней стороне мозгокатера я не нашел более достойного применения.

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

 

 

Шаг 7: Прототип 3

 

kak-sdelat-rc-kater-s-optsiey-avtopilota40

kak-sdelat-rc-kater-s-optsiey-avtopilota41

kak-sdelat-rc-kater-s-optsiey-avtopilota42

kak-sdelat-rc-kater-s-optsiey-avtopilota43

kak-sdelat-rc-kater-s-optsiey-avtopilota44

kak-sdelat-rc-kater-s-optsiey-avtopilota45

kak-sdelat-rc-kater-s-optsiey-avtopilota46

kak-sdelat-rc-kater-s-optsiey-avtopilota47

kak-sdelat-rc-kater-s-optsiey-avtopilota48

kak-sdelat-rc-kater-s-optsiey-avtopilota49

 

Одним из недостатков двух предыдущих прототипов была медленная скорость обновления, то есть скорости реакции. Руль недостаточно быстро реагировал на изменение маршрута и этот момент был включен в список целей и задач нового прототипа:

  • увеличение скорости реакции автопилота
  • добавление контроллеров моторов
  • программирование совместной работы двигателей
  • установка приемника

Увеличение скорости реакции

Единственный минус библиотеки TinyGPS ++ это медленность. Проблема в том, что Arduino Uno не может выполнять две вещи одновременно (в принципе может, на деле — нет). Простым решением может стать еще один микроконтроллер Arduino, который с помощью библиотеки TinyGPS ++ будет обрабатывать данные GPS, а затем отправлять параметры на первый микроконтроллер автопилота. Но у меня не было еще одного Arduino.

Arduino Uno это, по существу, чип ATmega328 и еще несколько дополнительных компонентов. Зная это можно создать свой собственный Arduino на макетной плате. И для этого есть хорошее мозгоруководство.

К собранному самостоятельно Arduino, так же как и “старый” модуль, я подключил новый GPS-модуль Ublox NEO-6M. Для программинга самодельного Arduino использовал библиотеку Bill Porter’s Easy Transfer library, а “связал” оба микроконтроллера одиночным проводом, то есть односторонним последовательным соединением. Этот самодельный Arduino повысил скорость реакции автопилота с 4 Гц до 50 Гц!

 

Добавление контроллеров двигателей

Мне очень понравилась плата ProtoSheild для Arduino Uno, которую я использовал, но оказалось, что она не имеет достаточного пространства для крепления двух контроллеров двигателей. Поэтому я убрал эту мини-плату, и поставил другую, больших размеров.

Электроцепь контроллеров двигателей проста: МОП-транзистор (MOSFET), с помощью ШИМ, контролирует среднее напряжение, идущее к двигателю. Резистор 1кОм ограничивает силу тока чтобы не перегорел Arduino, а резистор 10кОм удерживает MOSFET закрытым, когда отсутствует входящий сигнал.

 

Программирование взаимодействия моторов

У данного катера отсутствует штурвал, то есть руль, и вместо него для управления используется два мотора. Их то я и решил задействовать, а не устанавливать сервомотор для управления. Контроллеры моторов я уже собрал, осталось только запрограммировать Arduino для управления этими контроллерами.

Программирование я начал с написания макета программы в начал с Visual Studio. По мере написания я отладил код, и в конце концов добился взаимодействия двигателей. Оставалось только переделать код с VS на Arduino, но это не трудно, так как языки C # и C ++ очень близки.

 

Установка приемника радиоуправления

На прототип я смонтировал приемник ДУ для ручного управления самоделкой. Это тоже довольно просто сделать, нужно лишь считывать входящие значения функцией pulseIn и “научить” реагировать автопилот на эти значения.

 

Испытание прототипа

Прототип автопилота я установил внутри катера, подключил двигатели к контроллерам и запрограммировал маршрут плавания по местном пруду. После прохождения трех точек, поделка перестала работать и “сгасла”. Оказалось, что высокое напряжение от аккумулятора (12 В) “спалило” регуляторы напряжения 5 В.

Продолжение следует…

(A-z Source)

ПОДЕЛИТЕСЬ С ДРУЗЬЯМИ!


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

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

* Copy This Password *

* Type Or Paste Password Here *