制作 Arduino 动力 RC 气垫船:全 3D 打印设计与编程指南
概述
本教程将学习如何制作一款基于 Arduino 的 RC 气垫船。我将展示从设计和 3D 打印气垫船零件(包括螺旋桨)到连接电子元件和编程 Arduino 的全过程。
您可以观看以下视频或阅读下面的文字教程。
控制气垫船使用我之前视频制作的 DIY Arduino RC 发射器。我将右摇杆设为控制后部推进电机舵机(控制方向舵),将一个电位器设为控制升力螺旋桨(实际连接在无刷直流电机上),将左摇杆设为控制推进。让我们看看制作这款 RC 气垫船需要什么。

气垫船 3D 模型
首先,我使用 3D 建模软件设计了气垫船。

您可以在 Thangs 上找到并下载此 3D 模型,也可在浏览器中探索。

在 Thangs 下载组装 3D 模型。
STL 文件用于 3D 打印:
气垫船工作原理
气垫船的基本工作原理是船体由气垫托起。中央螺旋桨向船底吹气,充气由软材料制成的裙边。

当裙边内气压足够高时,船体被托起。持续供给的空气从船体中部、裙边与地面之间逸出,产生额外升力并减少气垫船与地面的摩擦。
一旦悬浮,使用第二个螺旋桨产生推力使气垫船前进。

推进螺旋桨后部有一组简单的方向舵,用于转向气垫船。
3D 打印
不管怎样,设计完成后开始 3D 打印零件。

气垫船船体是最大的打印件,我专门设计适配我的 Creality CR-10 3D 打印机(打印床 30x30cm)。

这是该 3D 打印机链接,如果您想了解。
打印完成后需清理。气垫船主体或驾驶舱是耗时最长的打印,约 18 小时。由于曲面设计且为单次打印,使用了大量支撑材料。

不过支撑很容易移除,最终件非常完美。船体倒置打印,仅需移除少量支撑。实际上我对此打印做了些调整,切割掉中央鼓风机外壳部分材料以便裙边支架能正确安装。

我已更新 3D 模型,您不会遇到此问题。
某些零件圆弧区域稍粗糙,用砂纸打磨光滑。

螺旋桨无需清理,直接从 3D 打印机出来就工作良好。

气垫船喷漆
好的,下一步给 3D 打印零件喷漆。我没用底漆,直接喷涂丙烯酸喷漆。

第一层用巧克力棕色。一些较小的装饰件用浅棕色。
为让气垫船更酷,第一层干后继续加两种颜色。在普通纸上做随机图案,用作模板喷涂条纹和斑点。使用浅棕色和黑色。

组装 Arduino RC 气垫船
我非常喜欢零件效果,干燥后继续组装。

首先将控制方向舵的舵机安装到推进鼓风机外壳上。用两个 M2 螺栓螺母固定舵机。

接下来是无刷电机。我用的特定型号是 D2830,直径 28mm 长 30mm,外壳专门设计适配此电机。

插入电机时先将线穿过开口。有点紧但仍可穿过。背面用 M3 螺栓将电机固定到外壳。

接下来将推进外壳与气垫船主体合并。此部件有开口供舵机和无刷电机线穿过。

用四个 M3 螺栓将其牢固连接。

完成后,继续将第二个无刷电机安装到气垫船船体。同样方法:先穿线,背面用四个 M3 螺栓固定电机。
电路图
接下来是电子部分。电子元件将放置在船体和主体之间。但先看电路图了解连接方式。
气垫船的大脑是 Arduino 开发板。通过 Arduino 可轻松控制舵机和两个无刷电机(使用两个电子调速器 ESC)。为无刷电机供电用 3S 锂聚合物电池(约 11V),Arduino 可用 ESC 通过 BEC 功能提供的稳压 5V 供电。

无线通信用 NRF24L01 收发模块,若配合增强天线可在开阔地稳定达 700 米。控制气垫船的 RC 发射器是我之前教程自制的,可查看详情。也有 NRF24L01 模块和 Arduino 使用无刷电机的详细教程。基本原理是发射器发送摇杆或电位器数据到接收器,控制无刷电机转速和舵机位置。
电路图还有一个小细节:电池监测。我添加了一个由两个电阻组成的简单分压器,直接连接电池,输出接 Arduino 模拟输入。分压器将 11V 降至约 4V,适合 5V Arduino 引脚。这样可监测电池电压,当电压低于 11V 时点亮指示 LED。
所需元件
- NRF24L01 收发器模块
- NRF24L01 + PA + LNA 增强版
- 无刷电机
- ESC 30A
- 锂聚合物电池
- XT60 2 母转 1 公并联连接器
- XT60 连接器
- 舵机
- Arduino 开发板
按说明开始连接元件。为将两个 ESC 连接到单个电池,我使用并联电池连接器分线器,类型 XT60。

为添加电源开关,我用另一个 XT60 连接器,剪断一根线焊接拨动开关。一侧接 Y 分线器,另一侧接电池。
接下来将 ESC 放入主体,夹在主体和船体之间。用四个 M3 螺栓拧紧两部分。从车身顶部开口将电池插入驾驶舱区域。

接下来将元件连接到 Arduino,为此我在 Arduino 上添加两个排针作为 GND 和 5V 引脚。

连接所有元件到 Arduino 后,将 NRF24L01 天线、指示 LED 和电源开关穿过驾驶舱顶盖。

然后将所有东西塞进驾驶舱。有点紧,因为我用 Arduino UNO,可能应该用 Arduino Nano。

但我设法塞进所有东西,也安装了一个小装饰件到盖子,然后卡扣固定到驾驶舱主体。
继续安装转向系统。先用 M2 螺栓螺母将小连杆连接到舵机舵盘。然后插入第一个方向舵并用 2mm 金属线穿过其本体固定到推进外壳,使舵可绕其旋转。同样方式安装第二个方向舵。

这个方向舵有额外槽可连接之前插入的连杆。再次用 M2 螺栓螺母固定。最后用另一根连杆连接两个方向舵,转向系统完成。

接下来在气垫船侧面安装小装饰件。钻孔后用单螺丝固定到船体。两侧各放一个,我认为它们很适合气垫船整体外观。

好的,接下来制作气垫船的裙边。裙边支架周围有孔用于固定到船体。

也有螺母槽,这样可用 M3 螺栓轻松将裙边支架固定到船体。固定所有螺母后,开始制作裙边,我用普通垃圾袋塑料袋。

先在支架中间区域涂 AC 胶,粘到塑料袋。然后将支架周边偏移约 6cm。在几点标记并连成线。

用美工刀将塑料袋裁剪至合适尺寸。翻转裙边,在之前用 AC 胶粘贴的地方加额外支架。

袋子外侧需粘到支架顶部。再次用 AC 胶小心固定塑料袋。

完成后,裙边应如下图所示。

在塑料袋螺栓位置打孔。裙边支架比船体小 1mm,配合塑料袋完美嵌入船体。用 M3 螺栓拧紧整个周边固定裙边。

裙边还需做一件事:剪掉塑料袋中央区域。

这样一半空气直接充气裙边,然后通过此开口逸出,在中间形成额外气泡。
最后剩下将螺旋桨安装到无刷电机。为此使用随无刷电机附带的夹头。这是将螺旋桨固定到电机轴的简单有效方法。

但我弄丢了另一个电机的夹头,所以不得不打印另一个版本的螺旋桨直接适配电机轴(3.15mm)。打印效果很好,无需胶水即可完美适配固定。

就这样,我们的遥控气垫船终于完成了。

不过,视频剩下的部分是看 Arduino 代码和程序工作原理。
Arduino RC 气垫船代码
这是 DIY Arduino RC 气垫船项目的代码:
/* 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 库进行无线电通信,以及 Servo 库控制舵机和无刷电机。然后定义无线电和舵机对象、程序所需变量以及用于存储来自 DIY RC 发射器传入数据的变量结构。更多通信工作细节建议查看我的相关教程。
在 setup 部分初始化无线电通信,定义舵机和 ESC 连接引脚。
在 loop 部分读取发射器传入数据并用这些值控制舵机和无刷电机。摇杆传入数据 0-255 映射为 0-50 值控制舵机位置。
同理控制无刷电机使用 ESC。传入数据 0-255 映射为 1000-2000 值,用 writeMicroseconds() 函数发送控制信号到 ESC。
监测电池电压:读取分压器来的模拟输入,简单数学转换为真实电池电压。若电池电压低于 11V 点亮指示 LED。
就是这样。如果需要更多细节,可查看其他建议教程以完全理解工作原理。
希望您喜欢这个教程并学到新知识。欢迎在下方评论区提问,查看我的 Arduino 项目合集。
制造工艺
- 自制LUMAZOID:基于Arduino的音乐可视化灯光控制器
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- Pixie:基于 Arduino Pro Mini 的 NeoPixel 智能腕表 - 极简 DIY LED 时钟
- DIY VR 滑板:用 Arduino、Google Cardboard 与蓝牙打造虚拟滑雪体验
- Arduino Nano 驱动 128x64 OLED 实时运行康威生命游戏 (元胞自动机)
- DIY Arduino 电子波疗设备 - 基于拉德尼克疗法的 EMR 治疗仪
- 基于 Arduino 与 Google Sheets 的实时 RFID 考勤系统
- DIY二自由度竞速模拟器:Arduino Nano驱动SG90微型舵机
- 基于 Arduino UNO 构建可靠的智能能源监测仪——分步指南
- Arduino 智能安防系统:超声波测距 + 舵机扫描 + 声光报警
- 使用 Arduino 制作便携式 RFID 门锁——分步指南
- DIY三轴CNC立式加工中心:打造精密铣床