基于Arduino的水下机器人

说明:此项目为团队项目,为转载项目,经过了大概两年多的时间项目目前初步达到预期目标(其中也参考了国外的一些水下机器人的项目开发,还没有完成整个项目的自主研发)后续还需要进行改进,由于项目的特殊性,资料仅有部分3D模型文件供大家进行学习,如果大家喜欢此文章,希望大家点点赞,点点关注!!

一、项目说明

大家好,很高兴与大家分享建造第二台遥控水下航行器(ROV)的旅程,我称之为ROV V2,简称ROV2。这个项目建立在我的第一台ROV V1的基础上。

这台ROV2集成了树莓派,使其可以转换为完全自主或半自主的水下机器人(AUV)。这个升级为自动化水下探索打开了无限的可能性。使用无刷电机使这个项目变得更简单,因为它们可以直接使用,无需防水处理。这简化了构建过程并确保了可靠的性能。ROV2采用了矢量推进配置,使其能够朝任何方向移动。这种灵活性是顺利导航复杂水下环境的关键。

ROV2配备了720P广角实时摄像头,提供清晰广阔的水下视觉。它还能够进行深度和方向保持,增强了操作期间的稳定性和控制性。此外,使用锂聚合物电池使ROV2能够潜入水下30-45分钟,为探索提供了充足的时间。

我希望你们发现这个教程对你们的水下项目有帮助和启发。让我们深入了解细节并开始建造吧!
实物图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、项目材料

电子设备:

  • 30A 电子调速器 × 6
  • A2212/13T 1000KV 无刷外转子电机 × 6
  • Arduino MEGA × 1
  • Arduino UNO × 1
  • 3S 3300mAh 锂聚合物电池 × 1
  • MS5540 压力传感器 × 1
  • HSCDTD008A 三轴指南针磁力计模块 × 1
  • 720P FPV 摄像头 × 1
  • RGB LED模块 × 1
  • 电压测量模块 × 1
  • 双向继电器 × 2
  • 18650 电池 × 3
  • 3S 18650 电池管理系统 × 1
  • FLYSKY FS-i6X 带 FS-iA10B 接收器 × 1
  • 切换开关 × 1
  • 60米双绞线

硬件供应:

  • 3mm 白色亚克力板
  • V-Slot 2020 铝型材(2米)
  • M4 六角螺丝
  • M3 螺丝
  • 20mm PVC管(900mm 长)
  • 90mm 端盖 × 4
  • PLA 线材
  • 90mm PVC管(450mm 长)
  • 90mm 螺纹端盖 × 2
  • 60mm 直径透明圆形亚克力片 × 1
  • 六角M3 10mm 公母铜垫片 × 21
  • 配重
  • 环氧树脂胶
  • 硅胶

工具:

  • 3D打印机
  • 电钻
  • 激光切割机

三、结构设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ROV2 使用了一个定制设计的刚性框架,这对于任何水下机器人来说都是至关重要的,以确保其机动性。这种流体动力学结构使其能够在水下表现出色。框架主要由亚克力板和铝型材组成。

3.1 准备材料

  • 3mm 白色亚克力板
  • V型槽 2020 铝型材(350mm 长)
  • M4 六角螺丝
  • 激光切割机
  • 3D 打印机
  • 小块橡胶
  • M3 螺丝

3.2 激光切割亚克力板

  • 对于侧板,使用3mm 白色亚克力板。根据设计激光切割两个面板。下载下面的CAD文件。

3.3 组装框架

  • 使用三个V型槽 2020 铝型材(每个350mm 长)连接两个激光切割的亚克力侧板。
  • 使用M4 六角螺丝将铝型材固定在亚克力板上,以创建一个坚固可靠的结构。

3.4 安装推进器

  • 六个推进器安装在ROV2的侧板上:
  • 两个推进器垂直安装,以控制潜水和上浮,有效管理机器人的深度。
  • 四个推进器以45度角安装,以创建矢量推进配置,使ROV能够朝任何方向移动。
  • 3D打印用于以45度角安装水平推进器的支架。
  • 使用M3 螺丝将支架固定在侧板上,在支架和面板之间放置一小块橡胶以减少振动。
  • 按照描述安装推进器。
  • 每个组件和步骤对于确保ROV2在水下有效可靠地运行至关重要。下载所有组件的CAD文件,并按照详细的组装说明完成你的ROV2结构。

四、推进器和电子调速器。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于ROV2,我使用了3D打印的改进版BlueRobotics T100推进器,这是一个性价比高的选择。这些推进器使用的是$5 A2212/13T 1000KV无刷外转子电机。由于这些电机的内部线圈没有接触,因此可以在水中使用而不会损坏。然而,如果它们在淡水中使用后需要干燥,如果是在咸水中使用,则需要用淡水冲洗然后彻底干燥。这种维护确保了推进器的寿命和性能。每个推进器在12V,10A下大约提供1.26kg的推力。

然而,电子调速器(ESC)需要防水处理,因为它们不是为水下使用而设计的。我3D打印了一个外壳来放置ESC,并用环氧树脂进行了防水处理。每个推进器都需要一个单独的ESC。

目前,我只为垂直推进器使用反向推力。要反转推力方向,你只需交换来自ESC的任意两根线即可。市场上有双向ESC可用,但我使用了普通的ESC和继电器来交换两个连接。

为了以45度角安装水平推进器,我3D打印了一个支架。这个支架可以很容易地使用M3螺丝安装在侧板上。我还在支架和侧板之间放置了一小块橡胶以减少推进器产生的振动。

所有这些组件的CAD文件都可以下载。可以私信我进行获取

4.1 准备3D打印的外壳

根据提供的设计方案3D打印ESC的外壳。确保外壳尺寸适当,能够紧密地容纳ESC。

4.2 安置ESC

将每个ESC放置在其相应的3D打印外壳内。确保ESC在外壳内固定牢靠。

4.3 密封外壳

在ESC将放置的位置内部涂抹一层薄薄的环氧树脂。这层树脂有助于创建一个防水密封。

将ESC放入外壳中,确保它居中且不妨碍外壳的密封面。

4.4 等待固化

按照制造商的说明让环氧树脂完全固化。这通常需要几个小时到一夜的时间。

4.5 测试密封性:

固化后,检查外壳以确保所有边缘都正确密封,没有缝隙或泄漏。

五、电路设计

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在电子方面,它是ROV最关键的部分之一。它处理机器人的所有决策和操作。对于ROV2,我使用Arduino Mega作为机器人的大脑。Arduino Mega可以使用Arduino IDE轻松编程,这简化了开发过程。此外,我还整合了各种执行器和指示器,以增强ROV的功能并使其更加先进。

电子托盘
为了便于电子部件的访问和组装,我3D打印了一个适合放入外壳内部的电子托盘。这个托盘简化了插入和组织电子元件的过程。你可以在下面下载托盘的CAD文件。

组件
以下是ROV2中使用的组件列表及其用途:

  • MS5540压力传感器:读取水压以计算深度并监测温度。
    HSCDTD008A三轴指南针磁力计模块:提供方向数据以协助导航并保持航向。
  • 720P摄像头模块:提供广角实时视频,用于清晰的水下视觉和探索。
  • RGB LED模块:作为指示器,显示各种系统的状态,如电源、连接性和操作模式。
  • TTL到RS485模块:确保远程有线通信。
  • Arduino Mega:作为ROV的大脑,处理所有的决策和控制。
  • 电压测量模块:监测电池电压以确保它们在安全操作范围内。
    双向继电器:交换连接以反转垂直推进器的方向,允许精确控制潜水和上浮。

六、电路外壳设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
电子外壳对于保护和容纳ROV的电子元件至关重要。在这里,我使用了一个直径为90毫米、长450毫米的PVC管来创建一个耐用且防水的外壳。这个设计特点是带有螺纹的端盖,便于对电子设备进行维护和调整。前端盖包括一个清晰的亚克力窗口,用于摄像头,而后端盖配备了多个电线出口和额外的密封以防止水分侵入。这确保了所有电子组件在水下探索期间保持安全和运行。为了更清楚地了解组装过程和设计,请参考上面的图片。

6.1准备外壳

将PVC管切割到所需长度(450毫米)。

6.2 前端盖

在前端盖上切割一个直径为60毫米的孔。
从透明亚克力切割一个直径为70毫米的圆圈,并将其粘贴到前端盖的内侧,为摄像头创建一个窗口。

6.3 后端盖

在后端盖上钻21个直径为3毫米的孔,用于穿线。
插入并固定21个六角M3 10毫米公母铜垫片穿过孔的两侧以防止漏水。
在后端盖的外侧涂抹一层环氧树脂,进一步密封以防止水分侵入。

6.4 最终检查

在测试外壳之前,请确保所有组件都已安全安装和密封。

七、电路控制

在这里插入图片描述
为了控制ROV,我目前使用的是标准的Flysky i6x遥控器。这个遥控器提供10个频道,允许控制多种功能。然而,一个限制是油门杆没有自回中功能。这个功能特别有用,因为它通过在释放时自动将油门返回到中位位置,帮助稳定ROV在所需的深度。

为了解决这个问题,你有两个选择:你可以单独购买一个自回中的摇杆,或者修改现有的油门杆。我选择了后者,通过使用一些3D打印的零件和一个弹簧对其进行了改装。这种改装确保油门杆能够回到中心位置,使得控制ROV更加容易。与空中无人机不同,ROV的推进器可以顺时针(CW)和逆时针(CCW)方向旋转,所以油门的中间位置对应于停止。

接收器是Flysky系统的一部分,它连接到水面上的一个Arduino。这个Arduino读取来自遥控器的信号,并通过系绳将它们传输到ROV。这种设置允许精确且响应迅速地控制ROV的移动和功能。

我还为Flysky遥控器3D打印了一个手机支架。ROV的FPV信号可以通过使用OTG转换器在手机上观看,这样可以轻松地实时查看水下的情况。

#include <Servo.h>


const int channel1Pin = 2; // Receiver channel 1 pin (throttle)
const int channel2Pin = 3; // Receiver channel 2 pin (yaw)
const int channel3Pin = 4; // Receiver channel 3 pin (pitch)
const int channel4Pin = 5; // Receiver channel 4 pin (roll)
const int channel5Pin = 6; // Receiver channel 5 pin (depth hold switch)
const int channel6Pin = 7; // Receiver channel 6 pin (orientation hold)


void setup() {
  Serial.begin(9600); // Initialize serial communication
  pinMode(channel1Pin, INPUT);
  pinMode(channel2Pin, INPUT);
  pinMode(channel3Pin, INPUT);
  pinMode(channel4Pin, INPUT);
  pinMode(channel5Pin, INPUT);
  pinMode(channel6Pin, INPUT);
}


void loop() {
  int channel1Value = pulseIn(channel1Pin, HIGH); // Read PWM value from channel 1
  int channel2Value = pulseIn(channel2Pin, HIGH); // Read PWM value from channel 2
  int channel3Value = pulseIn(channel3Pin, HIGH); // Read PWM value from channel 3
  int channel4Value = pulseIn(channel4Pin, HIGH); // Read PWM value from channel 4
  int channel5Value = pulseIn(channel5Pin, HIGH); // Read PWM value from channel 5 (depth hold switch)
  int channel6Value = pulseIn(channel6Pin, HIGH); // Read PWM value from channel 6 (orientation hold)


  // Send data via serial
  Serial.print(channel1Value);
  Serial.print(",");
  Serial.print(channel2Value);
  Serial.print(",");
  Serial.print(channel3Value);
  Serial.print(",");
  Serial.print(",");
  Serial.print(channel4Value);
  Serial.print(",");
  Serial.print(channel5Value);
  Serial.print(",");
  Serial.println(channel6Value);


  delay(50); // Adjust the delay as needed
}

通道分配:

  • 油门(通道1):D2 引脚
  • 偏航(通道2):D3 引脚
  • 俯仰(通道3):D4 引脚
  • 横滚(通道4):D5 引脚
  • 深度保持开关(通道5):D6 引脚
  • 方向保持(通道6):D7 引脚

这段代码读取来自Flysky接收器通道的PWM信号,并通过串行通信发送这些值。然后,ROV上的微控制器可以接收这些数据来控制ROV。

八、安装线缆

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为您的ROV创建一个可靠的系绳对于保持水面与水下车辆之间的有效通信和电力传输至关重要。在本节中,我将指导您如何使用双绞线制作一条30米长的系绳。

双绞线:

  • 从一根60米的双绞线开始,将其剪成两段相等的30米长度。

电线配置:

  • 使用一对电线用于TX(发送)和RX(接收)通信。
  • 使用另一对电线用于摄像头信号和地线。

固定电线:

  • 为了保持电线的整齐,使用10mm的热缩管。
  • 从热缩管上剪下小段20mm的长度。
  • 将这些小段滑到四根电线上,以便将它们整齐地捆绑在一起。

整洁高效的系绳:

确保热缩管段正确放置,以创建一个组织良好且可靠的30米系绳。

注意 - 扩展通信距离:

所述方法适用于长达40米的通信。对于更长的距离,例如100米或更长,您可以使用TTL到RS-485模块将通信距离扩展到1200米(1.2公里)。然而,对于ROV V2,我没有使用RS-485;系绳配置与V1中的相同。

九、压力传感器

在这里插入图片描述
在这里插入图片描述
对于ROV2项目,确保可靠的深度测量需要使用MS5540C压力传感器。然而,这个传感器本身并不防水,因此我们需要使其防水,以便在水下环境中操作。

为了实现这一点,我为MS5540C传感器设计了一个定制的3D打印外壳。这个外壳完美地贴合传感器,提供了一个紧密的外壳,最大限度地减少了水分进入的风险。设计包括便于放置传感器和安全附件的功能。

打印完外壳后,需要小心地将传感器插入指定的隔间。在这个过程中,重要的是要确保不要触摸传感器的白色圆柱部分,这部分非常敏感,容易损坏。这一部分必须对水开放,因为这对于准确的压力读数至关重要。

为了创建一个防水密封,我们使用硅胶密封剂,慷慨地将其应用于所有开口和接头周围。硅胶不仅将传感器固定在适当的位置,还防止任何水分接触到电子元件。这个过程需要细致入微,以确保完全覆盖,避免可能破坏密封的气泡。

十、电路设计与代码

在这里插入图片描述
构建ROV最具挑战性的部分之一是设计电路和编写代码。上面提供了ROV主板控制器的完整电路图,包括所有组件。如前所述,这个ROV能够执行高级功能,如深度和方向保持。这些功能的代码分别提供,以便于理解。请注意,地面控制器的TXD和RXD必须交叉连接到ROV控制器上。具体来说,地面控制器的RXD应该连接到ROV控制器的TXD,反之亦然,TXD和RXD也应该交叉连接。

这意味着:

  • 地面控制器的TXD(发送数据)应该连接到ROV控制器的RXD(接收数据)。
  • 地面控制器的RXD(接收数据)应该连接到ROV控制器的TXD(发送数据)。

这种交叉连接允许地面控制器发送的信号被ROV接收,同时ROV发送的信号也被地面控制器接收,从而实现双向通信。

#include <Wire.h>
#include <ms5540c.h> // Include your MS5540C library


// Define your pressure sensor and thrusters
ms5540c pressureSensor; 
const int csPin = 12; // Updated pin number for CS
const int upThrusterPin1 = 8;
const int upThrusterPin2 = 9;
const float depthHoldTarget = 5.0; // Target depth in meters


// PID control parameters
const float kp = 0.5; // Proportional gain
const int minThrusterPower = 1000; // Minimum thruster power (PWM value)
const int maxThrusterPower = 2000; // Maximum thruster power (PWM value)


void setup() {
  Serial.begin(9600); // Initialize serial communication
  Wire.begin(); // Initialize I2C communication
  pinMode(csPin, OUTPUT);
  digitalWrite(csPin, HIGH); // Disable sensor initially
  digitalWrite(csPin, LOW);  // Select sensor
  pressureSensor.begin();    // Initialize the sensor
  digitalWrite(csPin, HIGH); // Deselect sensor


  pinMode(upThrusterPin1, OUTPUT); // Set thruster pins as outputs
  pinMode(upThrusterPin2, OUTPUT);
}


void loop() {
  // Read current depth from the pressure sensor
  digitalWrite(csPin, LOW);  // Select sensor
  float currentDepth = getPressureInMeters(); // Get the current depth from the sensor
  digitalWrite(csPin, HIGH); // Deselect sensor
  
  // Calculate error
  float depthError = depthHoldTarget - currentDepth;
  
  // Calculate thruster power based on the error
  int thrusterPower = constrain(depthError * kp, minThrusterPower, maxThrusterPower);


  // Apply control to thrusters based on depth error
  if (depthError > 0) {
    // Need to go up
    analogWrite(upThrusterPin1, thrusterPower);
    analogWrite(upThrusterPin2, thrusterPower);
  } else {
    // Need to go down or maintain depth
    analogWrite(upThrusterPin1, minThrusterPower);
    analogWrite(upThrusterPin2, minThrusterPower);
  }
  
  // Print data for debugging
  Serial.print("Current Depth: ");
  Serial.print(currentDepth);
  Serial.print(" meters, ");
  Serial.print("Thruster Power: ");
  Serial.println(thrusterPower);


  delay(500); // Adjust the delay as needed for stability
}


// Function to get pressure in meters
float getPressureInMeters() {
  float pressure = pressureSensor.getPressure(); // Read pressure from the sensor
  return pressure / 9.81; // Convert pressure to depth in meters (1 Pascal = 1 kg/(m·s²), gravity = 9.81 m/s²)
}

ROV2 代码:

#include <Wire.h>
#include <HMC5883L.h> // Include your HMC5883L library
#include <ms5540c.h> // Include your MS5540C library


// Define compass, pressure sensor, and ESC pins
HMC5883L compass;
ms5540c pressureSensor;
const int csPin = 12; // Updated pin number for CS
const int escFrontLeft = 9;  // ESC pins connected to PWM outputs
const int escFrontRight = 10;
const int escBackLeft = 11;
const int escBackRight = 8;
const int upThrusterPin1 = 23;
const int upThrusterPin2 = 22;
const float targetHeading = 0.0; // Target heading in degrees
const float depthHoldTarget = 5.0; // Target depth in meters


// PID control parameters
const float kpHeading = 1.0; // Proportional gain for heading control
const float kpDepth = 0.5; // Proportional gain for depth control
const int minESCValue = 1000; // Minimum ESC power (PWM value)
const int maxESCValue = 2000; // Maximum ESC power (PWM value)
const int minThrusterPower = 1000; // Minimum thruster power (PWM value)
const int maxThrusterPower = 2000; // Maximum thruster power (PWM value)


void setup() {
  Serial.begin(9600); // Initialize serial communication
  Wire.begin(); // Initialize I2C communication


  // Initialize the compass sensor
  compass = HMC5883L(); // Create an instance of the HMC5883L class
  if (!compass.begin()) {
    Serial.println("HMC5883L not connected.");
    while (1); // Halt if not connected
  }


  // Initialize the pressure sensor
  pinMode(csPin, OUTPUT);
  digitalWrite(csPin, HIGH); // Disable sensor initially
  digitalWrite(csPin, LOW);  // Select sensor
  pressureSensor.begin();    // Initialize the sensor
  digitalWrite(csPin, HIGH); // Deselect sensor


  // Initialize ESC and thruster pins
  pinMode(escFrontLeft, OUTPUT);
  pinMode(escFrontRight, OUTPUT);
  pinMode(escBackLeft, OUTPUT);
  pinMode(escBackRight, OUTPUT);
  pinMode(upThrusterPin1, OUTPUT);
  pinMode(upThrusterPin2, OUTPUT);


  // Ensure all ESCs and thrusters are stopped initially
  analogWrite(escFrontLeft, minESCValue);
  analogWrite(escFrontRight, minESCValue);
  analogWrite(escBackLeft, minESCValue);
  analogWrite(escBackRight, minESCValue);
  analogWrite(upThrusterPin1, minThrusterPower);
  analogWrite(upThrusterPin2, minThrusterPower);
}


void loop() {
  // Read current heading from the compass
  Vector raw = compass.readRaw(); // Replace with the correct method from your library
  float currentHeading = atan2(raw.YAxis, raw.XAxis) * 180 / PI; // Convert to degrees


  // Normalize heading to 0-360 degrees
  if (currentHeading < 0) {
    currentHeading += 360;
  }


  // Calculate heading error
  float headingError = targetHeading - currentHeading;
  
  // PID Controller for heading
  int escPower = constrain(headingError * kpHeading, minESCValue, maxESCValue);


  // Read current depth from the pressure sensor
  digitalWrite(csPin, LOW);  // Select sensor
  float currentDepth = getPressureInMeters(); // Get the current depth from the sensor
  digitalWrite(csPin, HIGH); // Deselect sensor


  // Calculate depth error
  float depthError = depthHoldTarget - currentDepth;
  
  // PID Controller for depth
  int thrusterPower = constrain(depthError * kpDepth, minThrusterPower, maxThrusterPower);


  // Apply control to ESCs based on heading error
  if (headingError > 0) {
    // Turn right
    analogWrite(escFrontLeft, escPower);
    analogWrite(escFrontRight, minESCValue);
    analogWrite(escBackLeft, escPower);
    analogWrite(escBackRight, minESCValue);
  } else {
    // Turn left
    analogWrite(escFrontLeft, minESCValue);
    analogWrite(escFrontRight, escPower);
    analogWrite(escBackLeft, minESCValue);
    analogWrite(escBackRight, escPower);
  }


  // Apply control to thrusters based on depth error
  if (depthError > 0) {
    // Need to go up
    analogWrite(upThrusterPin1, thrusterPower);
    analogWrite(upThrusterPin2, thrusterPower);
  } else {
    // Need to go down or maintain depth
    analogWrite(upThrusterPin1, minThrusterPower);
    analogWrite(upThrusterPin2, minThrusterPower);
  }


  // Print data for debugging
  Serial.print("Current Heading: ");
  Serial.print(currentHeading);
  Serial.print(" degrees, ");
  Serial.print("Current Depth: ");
  Serial.print(currentDepth);
  Serial.print(" meters, ");
  Serial.print("ESC Power: ");
  Serial.print(escPower);
  Serial.print(", Thruster Power: ");
  Serial.println(thrusterPower);


  delay(500); // Adjust the delay as needed for stability
}


// Function to get pressure in meters
float getPressureInMeters() {
  float pressure = pressureSensor.getPressure(); // Read pressure from the sensor
  return pressure / 9.81; // Convert pressure to depth in meters (1 Pascal = 1 kg/(m·s²), gravity = 9.81 m/s²)
}

十一、STOP按键设计

在这里插入图片描述
在这里插入图片描述
正如之前提到的,我计划将这个ROV升级为一个自主水下航行器(AUV)。AUV被设计成能够在没有直接人为控制的情况下独立运行,这就是为什么拥有一个紧急停止机制至关重要。紧急停止开关,也被称为杀开关,在系统遇到任何故障或意外行为时,对于防止潜在的损害或危险情况至关重要。这个功能提供了一个可靠的故障安全选项,可以立即停止所有操作,确保安全并保护设备的完整性。

为了实现这一点,我设计了一个防水开关,允许你在任何时候停止车辆。这个杀开关设计特别考虑到了易于访问和激活,即使是在水下条件下也是如此。开关组件包括一个安装在防水外壳中的切换开关,确保它在潮湿环境中仍然功能正常且可靠。以下是为你的ROV创建和安装杀开关的步骤。

  • 3D打印组件:下壳和上壳。
  • 在下壳的指定位置放置一个切换开关。
  • 在切换开关周围涂抹环氧树脂以实现防水。
  • 用上壳关闭外壳,并使用5mm M3螺丝固定。

十二、电源系统

在这里插入图片描述
在这里插入图片描述
在我的上一个ROV V1项目中,我使用了一个7Ah的铅酸电池,但性能令人失望。尽管有其额定值,但电池并没有提供足够的电力,而且充电时间很长。对于ROV V2,我决定改用锂聚合物(LiPo)电池,以获得更好的效率和性能。最初,我使用了之前六旋翼项目中的一块3300mAh 3S LiPo电池,但在测试中它的续航时间不够长。为了延长操作时间,我又购买了另一块同品牌的电池,并使它们并联使用。为了使它们并联,我将两个女性XT-60连接器和一个男性连接器焊接在一起。这种设置允许ROV在水下运行大约30-45分钟。

根据我在ROV V1项目中的经验,当推进器吸取大电流时,可能会干扰FPV摄像头的实时视频信号,导致图像不清晰。为了防止ROV V2中出现这个问题,我决定为电子设备使用一个单独的电源系统。我使用了三节4000mAh 18650电池串联连接,并配备了电池管理系统(BMS)以防止过充或过放。这种设置确保LiPo电池为电机供电,而18650电池为电子设备供电,为整个系统提供稳定可靠的电源。

十三、ROV2的平衡测试

在这里插入图片描述
平衡和实现中性浮力对于ROV在水下有效执行任务至关重要。中性浮力是指ROV的平均密度与周围液体的密度相匹配,使其既不下沉也不上浮。

计算体积和上推力
影响ROV V2浮力的主要部件是电子外壳,这是一个450毫米长、90毫米直径的PVC管。我们使用圆柱体体积的公式来计算其体积:

  • 体积 = 横截面积 × 高度

  • 根据直径计算出的横截面积,体积大约为0.0028立方米。

  • 接下来,我们使用以下公式计算上推力:

  • 上推力 = 排开的液体体积 × 液体的密度 × 重力加速度

对于密度大约为998.2 kg/m³的淡水,以及9.8 m/s²的重力加速度,上推力为:

  • 0.0028m³ × 998.2kg/m³ × 9.8m/s² = 27.39N

  • 将其转换为千克,我们发现ROV应该额外增加2.74公斤才能在淡水中实现中性浮力。

  • 对于密度更高的盐水,所需的额外重量增加到大约2.91公斤。

实际考虑
由于内部组件等因素,这些理论值在实践中可能不完全准确,这些因素会减少内部空气的有效体积,以及3D打印部件中空气腔体引起的位移。因此,在测试期间必须具备可调节的重量和浮力材料,以微调ROV的平衡。
实施

  • 为了实现适当的平衡,我使用了:

  • 配重:四个450毫米长的金属棒,固定在ROV底部角落。

  • 浮力材料:ROV顶部角落的两个20毫米直径、350毫米长的PVC管,用于提供浮力。

这些特定的重量和浮力材料是针对我的构建选择的,根据ROV的设计和材料,其他构建可能会有所不同。这种设置确保ROV稳定且中性浮力,允许其在水下有效机动。

十四、失败案例

在这里插入图片描述
在这里插入图片描述
在建造ROV V2期间,我遇到的一个重要故障是由于接线错误烧毁了几个电子调速器(ESC)。设计中包括了一个双向继电器系统,用于反转垂直推进器的方向。然而,我犯了一个关键错误,将ESC的输出线连接到了继电器上原本用于电机线的位置上。当只有一个继电器被激活时,这种配置没有问题,因为它只是允许推进器朝一个方向运行。

问题出现在两个继电器同时被激活或停用时。在这种情况下,接线设置导致了短路,因为不应直接连接到一起的ESC输出被错误地短路了。在低PWM值时,这种短路并不明显,因为电流不足以立即造成损坏。然而,当使用更高的PWM值时,电流增加,ESC过热并最终烧毁,导致ROV控制系统出现故障。

看到外壳冒出烟雾是非常令人沮丧的,尤其是在仔细组装了整个系统之后。这一事件严厉地提醒了在施加全功率之前验证每个连接并彻底理解接线的重要性。这样的错误很容易导致电子元件的破坏,从而造成延误。为了防止类似问题,至关重要的是要仔细检查所有的接线和连接。

十五、结束

这不是水下机器人的最终版本;它只是持续旅程中的一个里程碑。我们的目标是将ROV2发展成一个自主水下机器人,整合人工智能和树莓派以增强其能力。

希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。

原创作者:Ranuga
作者:Svan.


注意:本博文为转载项目博文,已征求到原创作者的同意,不得在未经原创作者或本人的同意进行转载或者二次创作,违者必究!!!

免费下载,论文、设计请注明引用! 微小型AUV具有体积小,灵活性高、隐蔽性好等特点,可以工作于其它大型水下机器人无法进入的区域。民用上可以应用于海洋矿产勘探、海底地形探测,沉船打捞,水下考古,海洋生物探测等;军事上可以用来反水雷,作为自航水雷的载体、监察海战时水下敌情等。 首先,本文对所设计的微小型AUV的结构、推进器分布进行介绍,并对其进行受力分析和建立运动方程。结合运动方程设计了被控对象模型未知的AUV自动定深、自动定航控制器;同时研究了传统的PID控制、模糊控制、自适应控制等算法,并最终设计了应用于该微小型AUV的模糊参数自适应PID控制算法。 其次,对该具有多传感器的微小型AUV控制系统进行了研究设计。针对分布式控制系统总体机构及其通信总线进行了设计;分别详细设计了分布式系统的各个子系统;着重研究、设计了理论、算法及软件实现方案;计了基于CAN总线的分布式微小型AUV控制系统,提高了系统的稳定性和模块化程度,在结构上优化了系统的复杂性。最终形成了由软硬件系统组成分布式控制系统。 再其次,根据SINS、DVL和深度计这三个传感器的姿态角、角速度,线速度、加速度,深度等导航信息进行了AUV的航位推算研究与实现;并使用综合水池实验室的X-Y航车系统,反复试验,对航位推算进行了标定,修正了安装误差角和刻度因子。提高了航位推算精度。结合航位推算和AUV制导控制设计了有海流影响的AUV自动巡航控制器。抗海流自动巡航控制器除抗海流功能外可以补偿SINS与艏向安装误差带来的控制性能缺陷。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值