В этом уроке мы научимся собирать радиоуправляемый корабль на воздушной подушке на базе Arduino. Мы рассмотрим весь процесс его сборки, начиная с проектирования и 3D-печати деталей судна на воздушной подушке, включая пропеллеры, до подключения электронных компонентов и программирования платы Arduino.
Для управления этим судном на воздушной подушке я использовал свой RC-передатчик на базе Arduino, создание которого мы ранее рассматривали на нашем сайте. Я установил правый джойстик для управления серводвигателем для позиционирования рулей направления на задней стороне тягового двигателя, установил один из потенциометров для управления подъемным винтом, который фактически прикреплен к бесщеточному двигателю постоянного тока, а левый джойстик установил для управления движением.
3D модель корабля на воздушной подушке
Для начала я спроектировал судно на воздушной подушке, используя программу 3D-моделирования.
Вы можете найти и скачать эту 3D-модель, а также изучить ее в своем браузере на сервисе Thangs.
Вот ссылка на эту модель на сайте Thangs.
STL-файлы для 3D-печати радиоуправляемого корабля на воздушной подушке на базе Arduino.
Принцип работы судна на воздушной подушке
Основной принцип работы судна на воздушной подушке заключается в том, что судно поднимается за счет воздушной подушки. Центральный пропеллер нагнетает воздух под аппарат, который надувает юбку из мягкого материала.
Когда давление воздуха в юбке становится достаточно высоким, корабль поднимается. Постоянно подаваемый воздух выходит из середины судна, между юбкой и землей, что создает дополнительную подъемную силу, а также уменьшает трение между судном на воздушной подушке и землей.
После подъема с помощью второго гребного винта создается тяга, которая перемещает судно на воздушной подушке вперед.
На задней стороне гребного винта расположен простой набор рулей, которые используются для управления судном на воздушной подушке.
3D-печать компонентов проекта
Тем не менее, закончив дизайн, я начал 3D-печать деталей.
Корпус судна на воздушной подушке — самая большая часть для печати, и я специально спроектировал ее для своего 3D-принтера Creality CR-10 с печатной платформой 30x30 см.
После завершения печати пришло время заняться чисткой напечатанных деталей. Основная часть судна на воздушной подушке или кабина пилота представляла собой самый длинный отпечаток, на печать которого ушло около 18 часов. Из-за изогнутого дизайна и из-за того, что я хотел создать единый отпечаток, для этого отпечатка было использовано много вспомогательного материала.
Однако удалить его было действительно легко, и финальная деталь получилась просто идеальной. Корпус судна на воздушной подушке был напечатан в перевернутом виде, и с него пришлось удалить лишь незначительное количество поддерживающего материала. На самом деле мне пришлось внести некоторые изменения в этот отпечаток и вырезать немного материала из центрального корпуса вентилятора, чтобы держатель юбки мог правильно в него вписаться.
Некоторые круглые участки деталей были немного шероховатыми, поэтому я использовал простую бумагу для их сглаживания.
Пропеллеры не нуждались в чистке и работали вполне хорошо, сразу после 3D-принтера.
Покраска корабля на воздушной подушке
Хорошо, следующий шаг — покраска деталей, напечатанных на 3D-принтере. Раньше я не использовал грунтовку, а сразу наносил акриловую краску в виде аэрозольной краски.
Для первого слоя я использовал шоколадный цвет. Для некоторых более мелких деталей, которые на самом деле являются просто декоративными деталями, я использовал светло-коричневый цвет.
Чтобы судно на воздушной подушке выглядело немного круче, как только первый слой высох, я продолжил добавлять к деталям еще два цвета. Для этой цели я нарисовал на простом листе бумаги несколько случайных узоров и из них сделал полосы и пятна разных цветов. Для этой цели я использовал светло-коричневый и черный цвета.
Сборка корпуса радиоуправляемого корабля на воздушной подушке
Мне очень понравилось, как получились детали, поэтому, как только они высохли, я продолжил их сборку.
Я начал с установки серводвигателя, управляющего рулями направления, на корпус нагнетателя. Я закрепил сервопривод с помощью двух болтов М2 и гаек.
Далее идет бесщеточный двигатель. Конкретная модель, которая у меня есть, — это D2830, диаметр которой составляет 28 мм, длина — 30 мм, и, конечно же, корпус специально разработан для этого двигателя.
При вставке мотора сначала пришлось продеть провода через отверстия. Это немного туговато, но все же можно их пройти. Затем с обратной стороны болтами М3 я закрепил двигатель к корпусу.
Далее я могу объединить корпус тяги с основным корпусом корабля на воздушной подушке. В этой части есть отверстие, через которое могут проходить провода сервопривода и двигателя BLDC.
Используя четыре болта М3, я прочно скрепил их вместе.
Закончив это, я продолжил установку второго бесщеточного двигателя на корпус судна на воздушной подушке. И здесь я снова использовал тот же метод. Сначала я пропустил провода через отверстия, а затем с задней стороны закрепил мотор четырьмя болтами М3.
Принципиальная электрическая схема проекта
Дальше идет электроника. Электронные компоненты будут размещены между корпусом и основной частью судна на воздушной подушке. Но прежде чем мы это сделаем, давайте взглянем на принципиальную схему и посмотрим, как все нужно подключить.
Итак, мозгом этого судна на воздушной подушке является плата Arduino. С помощью Arduino мы можем легко управлять сервоприводом, а также двумя бесщеточными двигателями, используя два электронных регулятора скорости (ESC). Для питания двигателей BLDC я буду использовать литий-полимерную батарею 3S, которая обеспечивает напряжение около 11 В, а для питания Arduino мы можем использовать регулируемое напряжение 5 В, которое ESC обеспечивают через функцию схемы устранения батареи.
Для беспроводной связи мы будем использовать модуль приемопередатчика NRF24L01, который при использовании с усиленной антенной может иметь стабильную дальность действия до 700 метров на открытом пространстве. Радиоуправляемый передатчик, который я буду использовать для управления судном на воздушной подушке, мы рассмотрели в одной из предыдущих статей на нашем сайте. Также есть подробные руководства по модулю NRF24l01 и по использованию бесщеточных двигателей с помощью Arduino. Тем не менее, основной принцип работы заключается в том, что передатчик отправляет данные джойстиков или потенциометров на приемник, который контролирует скорость бесщеточных двигателей и положение сервопривода.
На этой принципиальной схеме есть еще одна маленькая деталь — это монитор батареи. Я добавил простой делитель напряжения из двух резисторов, который подключается напрямую к аккумулятору, а его выход поступает на аналоговый вход Arduino. Делитель напряжения снижает напряжение с 11 В до примерно 4 В, которое затем становится приемлемым для контактов Arduino 5 В. Благодаря этому мы можем контролировать напряжение батареи и настроить загорание светодиода, когда, например, напряжение батареи упадет ниже 11 Вольт.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Модуль nRF24L01 (купить на AliExpress).
- BLDC-двигатель D2830.
- Контроллер ESC 30A.
- Серводвигатель SG90
- Сервомотор SG90 (купить на AliExpress).
- Литий-полимерный аккумулятор.
- XT60 2 гнезда на 1 штекер.
- Разъем XT60.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Окончательная сборка радиоуправляемого корабля на воздушной подушке
Итак, я начал соединять компоненты, как описано. Для подключения двух регуляторов скорости к одной батарее я использовал разветвитель параллельного разъема батареи типа XT60.
Для добавления в проект переключателя питания я использовал еще один разъем XT60, на котором отрезал один провод и припаял туда тумблер. Итак, одна сторона идет к разветвителю Y, а другая — к аккумулятору.
Затем я поместил регуляторы скорости в основной корпус и зажал их между ним и корпусом судна на воздушной подушке. Затем с помощью четырех болтов М3 я скрепил две части вместе. Затем через верхнее отверстие кузова я вставил батарею в зону кабины.
Далее нам нужно подключить компоненты к плате Arduino, и для этой цели я добавил к Arduino два разъема для контактов, которые будут служить контактами GND и 5 В.
Итак, как только я подключил все к Arduino, я пропустил антенну NRF24L01, светодиодный индикатор и выключатель питания через верхнюю крышку кабины.
Тогда мне просто нужно было втиснуть все в кабину. Здесь было немного тесно, потому что я использовал Arduino UNO, и, вероятно, вместо этого мне следовало использовать Arduino Nano.
Однако мне удалось все вместить, еще я прикрепил к крышке небольшую декоративную деталь, а затем просто прикрепил ее к корпусу кабины.
Я продолжил установку рулевого управления. Сначала я подключил небольшое звено к рупору сервопривода с помощью болта М2 и гайки. Затем я вставил первый руль направления на место и закрепил его на корпусе тяги с помощью металлической проволоки диаметром 2 мм, которая проходит через его корпус и позволяет рулю направления вращаться вокруг него. Таким же образом прикрепил второй руль.
У этого руля направления есть дополнительный слот, поэтому мы можем подключить его к ранее вставленной ссылке на сервопривод. Опять же, для их крепления я использовал болт М2 и гайку. И, наконец, я соединил два руля направления друг с другом с помощью другого звена, и на этом система рулевого управления завершена.
Далее я прикреплю эту небольшую декоративную деталь к борту судна на воздушной подушке. С помощью дрели я проделал отверстие, а затем прикрепил деталь к корпусу с помощью одного винта. Я разместил эти детали с обеих сторон и считаю, что они неплохо вписываются в общий вид судна на воздушной подушке.
Хорошо, затем я продолжил изготовление юбки для этого судна на воздушной подушке. Здесь вы можете заметить, что вокруг держателя юбки есть отверстия для крепления ее к корпусу.
Также имеются пазы для гаек, поэтому мы сможем легко прикрепить держатель юбки к корпусу с помощью болтов М3. Закрепив все гайки на месте, я продолжил изготовление юбки, для чего использовал простой пластиковый пакет для мусора.
Поэтому сначала я нанес клей AC на среднюю часть держателя и приклеил его к пластиковому пакету. Затем я сместил периметр держателя примерно на 6 см. Я отметил его в нескольких точках, а затем соединил их вместе.
Используя канцелярский нож, я разрезал полиэтиленовый пакет до нужного размера. Затем я перевернула юбку и добавил к сумке дополнительный держатель там, где мы ранее приклеили ее клеем AC.
Затем внешнюю часть сумки необходимо приклеить к верхней части держателя. Я снова использовал для этой цели клей АС и аккуратно прикрепил к нему пластиковый пакет.
Когда закончите, вот как должна выглядеть юбка.
Затем я проделал в полиэтиленовом пакете отверстия, через которые должны пройти болты. Держатель юбки всего на 1 мм меньше корпуса судна на воздушной подушке, поэтому в сочетании с полиэтиленовым пакетом он идеально вписывается в корпус. Для крепления юбки к корпусу я просто прикрутил болты М3 по всему периметру.
С юбкой нужно сделать еще одну вещь: вырезать центральную часть полиэтиленового пакета.
Таким образом, половина воздуха будет непосредственно надувать юбку, а затем выходить через это отверстие, создавая дополнительный воздушный пузырь посередине.
Наконец, осталось прикрепить пропеллеры к бесщеточным двигателям. Для этой цели я использую цангу, идущую в комплекте с бесщеточным двигателем. Это действительно простой и эффективный способ крепления пропеллера к валу двигателя.
Однако я потерял цангу для другого двигателя, поэтому мне пришлось распечатать другую версию пропеллера, чтобы он мог напрямую подходить к валу двигателя, диаметр которого составляет 3,15 мм. Отпечаток на самом деле получился довольно хорошим, он идеально прилегал к двигателю и прикреплялся к нему даже без использования клея.
И всё, наш радиоуправляемый корабль на воздушной подушке наконец-то готов.
Код Arduino для радиоуправляемого корабля на воздушной подушке
Вот код для этого проекта радиоуправляемого корабля на воздушной подушке на базе Arduino, сделанного своими руками:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
/* Arduino based RC Hovercraft == Receiver Code - ESC and Servo Control = by Dejan, www.HowToMechatronics.com Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> #define led 10 RF24 radio(8, 9); // nRF24L01 (CE, CSN) const byte address[6] = "00001"; unsigned long lastReceiveTime = 0; unsigned long currentTime = 0; Servo esc1; // create servo object to control the ESC Servo esc2; Servo servo1; int esc1Value, esc2Value, servo1Value; // Max size of this struct is 32 bytes - NRF24L01 buffer limit struct Data_Package { byte j1PotX; byte j1PotY; byte j1Button; byte j2PotX; byte j2PotY; byte j2Button; byte pot1; byte pot2; byte tSwitch1; byte tSwitch2; byte button1; byte button2; byte button3; byte button4; }; Data_Package data; //Create a variable with the above structure void setup() { Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.startListening(); // Set the module as receiver resetData(); esc1.attach(7); esc2.attach(6); servo1.attach(5); pinMode(led, OUTPUT); } void loop() { // Check whether we keep receving data, or we have a connection between the two modules currentTime = millis(); if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function } // Check whether there is data to be received if (radio.available()) { radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure lastReceiveTime = millis(); // At this moment we have received the data } // Controlling servos servo1Value = map(data.j2PotX, 0, 255, 0, 50); servo1.write(servo1Value); // Controlling brushless motor with ESC // Lift propeller esc1Value = map(data.pot1, 0, 255, 1000, 2000); // Map the receiving value form 0 to 255 to 0 1000 to 2000, values used for controlling ESCs esc1.writeMicroseconds(esc1Value); // Send the PWM control singal to the ESC // Thrust propeller esc2Value = constrain(data.j1PotY, 130, 255); // Joysticks stays in middle. So we only need values the upper values from 130 to 255 esc2Value = map(esc2Value, 130, 255, 1000, 2000); esc2.writeMicroseconds(esc2Value); // Monitor the battery voltage int sensorValue = analogRead(A0); float voltage = sensorValue * (5.00 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i Serial.println(voltage); // If voltage is below 11V turn on the LED if (voltage < 11) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } void resetData() { // Reset the values when there is no radio connection - Set initial default values data.j1PotX = 127; data.j1PotY = 127; data.j2PotX = 127; data.j2PotY = 127; data.j1Button = 1; data.j2Button = 1; data.pot1 = 1; data.pot2 = 1; data.tSwitch1 = 1; data.tSwitch2 = 1; data.button1 = 1; data.button2 = 1; data.button3 = 1; data.button4 = 1; } |
Описание работы кода
Итак, сначала нам нужно подключить библиотеку RF24 для радиосвязи, а также библиотеку сервоприводов для управления сервоприводами и бесщеточными двигателями. Затем нам нужно определить радио- и сервообъекты, некоторые переменные, необходимые для программы ниже, а также структуру переменных, которые используются для хранения входящих данных от нашего RC-передатчика. Для получения более подробной информации о том, как работает это общение, вы можете прочитать в статье о передатчике (дистанционном пульте управления).
В разделе настройки (setup) нам необходимо инициализировать радиосвязь, а также определить контакты, к которым подключены сервоприводы и регуляторы скорости.
В разделе цикла (loop) мы считываем входящие данные от передатчика и используем эти значения для управления сервоприводами и бесщеточными двигателями. Итак, входящие данные джойстика, которые варьируются от 0 до 255, преобразуются в значения от 0 до 50, и мы используем эти значения для управления положением сервопривода.
Таким же методом мы управляем бесщеточными двигателями с помощью ESC. Входящие данные от 0 до 255 преобразуются в значения от 1000 до 2000 и с помощью функции writeMicroseconds() мы отправляем эти данные в ESC в качестве управляющего сигнала.
Для мониторинга напряжения батареи мы считываем аналоговый входной сигнал, поступающий от делителя напряжения, и с помощью простых математических вычислений преобразуем входные значения в реальное значение напряжения батареи. Если напряжение аккумулятора упадет ниже 11В просто зажигаем светодиодный индикатор.
Вот и все. Надеюсь у вас не возникнет сложностей при сборке данного проекта.