基于树莓派实现的水下无人机设计方案

描述

本文介绍了由树莓派驱动的水下无人机原型的设计过程、开发和组装操作。

我在探索频道上看了很多关于发明家的节目,有一次我决定自己做一些有趣的事情,这样一次就可以真正令人印象深刻和困难:一些电动机、控制器、处理、相机。买了很多有用(而且不是很有用)的东西后,我开始思考应该开始什么样的项目。最后我得出的结论是,有很多飞行和驾驶无人机,但不是关于水下无人机(哈哈,现在看来,我当时简直大错特错)。

无人机

在网上冲浪后,我发现了几个有趣的项目,但其中大多数要么处于开发阶段,要么价格不便宜。

展望未来,我可以说我有一个可以游泳几米深的工作原型,尽管它有着部分优点和缺点。我不能断言我终于有了一个易于控制的东西,或者可以做的不仅仅是平息我的工程师热情的东西。但是这些东西的所有单元都能正常工作,我的错误和经验可以帮助某人创造出真正重要的东西(即使它只对他自己有意义),这一点在我看来是非常重要的。

由于做了大量工作,本文可分为以下几章:

选择组件

电调编程

树莓派服务器配置

使用 Raspberry Pi 处理电动机

陀螺仪

树莓派手电筒控制

客户端-服务器通信协议

安卓应用

视频流

屏幕和操纵杆控制

施工组装和测试

结论

选择组件

您将在下面找到用于创建设备的不同内容的列表。

母板

无人机

在众多控制器中,我选择了Raspberry Pi 3B 。我不会为这个项目推荐类似 Arduino 的板,因为它不会管理如此复杂的任务,因为需要控制至少 4 个电机、二极管、陀螺仪、从相机发送视频流并同时接收并处理来自控制设备的命令。Raspberry Pi 3B 带有用于 RJ-45 连接器的内置 Wi-Fi 和以太网,这无疑会帮助您完成所有这些操作。

联结渠道

无人机

在水下传输数据总是很困难。水是一个很好的盾牌,因此,您可以忘记任何无线数据传输。所以没有其他选择。

在水下传输数据的能力。

水下数据传输的速度。

通用性(它非常适合 Raspberry Pi 3B 和发射器)。

基地发射器

无人机

NEXX迷你路由器 有 3 个主要的传输选项:

尝试将 Wi-Fi 天线从水中连接到陆地(在这种情况下,应该使用实心线而不是双绞线),但存在很多争议点。

在两个 Raspberry Pi 3B 之间创建一个客户端-服务器桥连接(这将是合适的,但更昂贵且更麻烦)。

使用双绞线将迷你路由器与 Raspberry 连接。这个选项被作为基础,因为它是最可靠、最快速和最便宜的。经验证明,这是一个相当不错的选择。

电动马达

无人机

N2830/2212 1000KV

在测试了 3 种不同的电机后,我选择了这个模型。你可能会问为什么?因为它足够强大,它有第二个轴,所以你可以同时使用 2 个螺旋桨。一般来说,所有电机在水中正常运行,直到藻类或沙子进入电机内部。如果您选择高速且功率较小的电机,您会发现这些类型的电机并不是最适合水的。更便宜的电机也没有达到预期。

控制板 (ESC)

无人机

非洲式电调 (30A)

这也很简单。它可以编程为正向/反向切换,30安培的功率对于被测电机来说应该足够了。

Afro ESC USB 编程工具

无人机

ESC 的编程工具。使用此设备,您可以上传必要的固件。但实际上,这就是问题所在。我不得不等了一个半月。

LED脉冲驱动器

无人机

7-30В 3А或类似

这非常适合我们的目的 - 它拥有两个上述 LED,它还连接到 Raspberry 并允许您调整 LED 的亮度。

陀螺仪

MPU-6050

一个三轴陀螺仪/加速度计,将位置数据发送到树莓。有一些数据,但不是很有用☺。

相机

无人机

RPi 相机 F

您可以使用任何其他本机 Raspberry Pi 相机。主要条件是它应该通过FFC连接,而不是USB。视频流一直是一个大问题(延迟、编码),或者更确切地说,这不是问题,只是需要很多时间才能开始。

操纵杆

无人机

iPega PG-9055 - 额外的控制助手,如果你的手湿了,相信我,他们会湿的,你可以使用这个设备控制无人机。

电池

Turnigy 2200mAh 3S 30C

再次进行了很多测试。18650 电池不适合,因为控制器具有 25A 的放电率,这对于峰值负载条件下的整个系统来说是不够的(是的,几块电池在使用后就死了)。可以尝试使用 6 节电池并获得 50A,但难度更大。这样的直流电不能使用电线传输(不要忘记大约 100 m 的距离)。所以我买了 Li-Po,它优雅地完成了任务,完美地融入了外壳。

驱动螺旋桨(主要问题之一)

电缆接头

还有外壳、连接器、电线和其他东西。

电调编程

不幸的是,全新的 Afro ESC 只能向一个方向旋转,因此您需要更新固件。

无人机

现在正确连接电线很重要,否则其中一个设备可能会发生故障。

在这里,您将找到一些有关如何正确连接电线的简短说明:

一对红色和黑色粗线,末端有一个公连接器。是通用电源。在这种情况下,提供的电源将是 12V 和所需的安培数。

红色——输入端口“+”。

黑色 – 输入端口“-”。

一根粗红黑黄的电线负责电机电源。我们现在不会连接它们,但稍后我们会将这些电线连接到具有相似颜色的电动机的电线上。

细线负责控制威廉希尔官方网站 板。

控制信号通过黄线传输。

红线输出5v(我没用过)。它们有几种不同的类型,您可以在此处了解更多信息。

黑线应连接到端口“-”。

因此,让我们将细线连接到链接器:将黑线(减号)和黄线(信号)连接在一起。请勿触摸或将红线连接在一起。下一步——为威廉希尔官方网站 板提供电源(黑色和红色厚输入)。我使用了这个静态电源单元,但任何其他具有类似特性的电源都可以(12V,2+A)。

打开固件更新工具并选择:

无人机

端口:选择连接的 USB 端口。幸运的是,只有很少的选择。

波特率:9600。

控制器:基于 atmega 8 的无刷 ESC(8kB 闪存)。

选择下载的固件文件。单击“运行”按钮并祈祷:)

很快固件就会成功上传到电调,一切准备就绪。

使用 Raspberry Pi 处理电动机

一件重要的事情是,如果您正在构建一个严肃的项目,而不仅仅是为了好玩,您不必使用 Raspberry PI 进行实时工作,例如电机处理。PWM 生成不会如您所愿,因此请使用单独的板,例如 Arduino 进行控制。但是对于我的项目来说,使用 Raspberry 就足够了。感谢Fabio Balzano在本文下方的评论中对此进行了解释。

所以,让我们开始我们工作中最有趣的部分——我们应该为 Raspberry Pi 控件编写代码。找到项目文件夹~ /drone并在那里安装 PiGpio 库:

无人机

现在我将为您提供一些有关 ESC 控制的简短信息。我们应该将某个频率传输到细黄线(控制)(参见“ESC 编程”部分)。afro_nfet_besc30_r1固件的范围是1100-1900 ,其中值 1500 是平静状态,1100 最大反向,1900 最大正向。创建文件engines.js并将JS代码添加到其中:

//Calm state constant
const SERVO_ZERO = 1500;
//Connect 'pigpio' library
const Gpio = require('pigpio').Gpio;
// Define 4 motors using Raspberry pins (this process will be described below)
const servo1 = new Gpio(22, {mode: Gpio.OUTPUT});
const servo2 = new Gpio(10, {mode: Gpio.OUTPUT});
const servo3 = new Gpio(9, {mode: Gpio.OUTPUT});
const servo4 = new Gpio(27, {mode: Gpio.OUTPUT});
//Set each board into the state of "calm"
servo1.servoWrite(SERVO_ZERO);
servo2.servoWrite(SERVO_ZERO);
servo3.servoWrite(SERVO_ZERO);
servo4.servoWrite(SERVO_ZERO);
//After that you should enter the value into ESC
module.exports.engines = {
leftEsc: (value) => {
  servo1.servoWrite(value);
},
rightEsc: (value) => {
  servo2.servoWrite(value);
},
topLeftEsc: (value) => {
  servo3.servoWrite(value);
},
topRightEsc: (value) => {
  servo4.servoWrite(value);
}
}

为了使用此代码,您应该在app.js中编写:

无人机

实际上这部分代码servo1.servoWrite()负责控制。1100 - 电机反向转动,1900 - 最大正向转动。

在这里您可以找到 Raspberry pin 方案:

无人机

简而言之,你应该使用橙色的 GPIO。一对由 GPIO 10 和 GPIO 22 组成,第二对是 GPIO 9 和 GPIO 27(使用 27、22 和 10 -9 会更合乎逻辑,但我在焊接时没有考虑到,所以我不得不更改它)。如果考虑序数(它们是灰色的),那么这些是 13、15 和 19、21 联系人。您应该将 ESC 的黄线连接到它们中的每一个,负号应连接到一个 GND,例如 39 触点。现在让我们连接其他的东西。

将Afro ESC的电源线(红色和黑色)连接到单独的电源单元(12v),将电机连接到黄-红-黑粗线,现在您可以尝试它是如何工作的。

陀螺仪

连接示例:

无人机

VCC到引脚 1 (3.3V PWR)

GND到任何负号

SCL到引脚 5 (GPIO 3)

SDA到引脚 3 (GPIO 2)

正确连接一切并不难,如果谈论软件——它会更简单——所有信息都可以在互联网上轻松找到。在这里你应该使用i2c-bus и i2c-mpu6050库。将它们安装到项目中:

无人机

创建文件gyroscope.js并添加:

const i2c = require('i2c-bus');
const MPU6050 = require('i2c-mpu6050');
const address = 0x68;
const i2c1 = i2c.openSync(1);
const sensor = new MPU6050(i2c1, address);
var reading = false;
var sensorData = {};
module.exports.gyroscope = {
getData : () => {
  return JSON.stringify(sensorData);
},
readRotation : () => {
  sensor.readRotation(function (err, rot) {
    if (err) {
      console.log(e);
      return;
    }
    console.log(rot);
  });
},
readSensor : () => {
  if (!reading) {
    reading = true;
  }
  sensor.read(function (err, data) {
    reading = false;
    if (err) {
      console.log(err);
    } else {
      sensorData = data;
    }
  });
 }
}

以一定的频率运行 readSensor 方法,并从 getData 获取上次调查的数据。会有很多位置分量(x,y,z,a)。我没有足够的时间来定义这些组件的含义,因为我有更重要的任务——处理。我知道调查它会更好,但结果的相关性对于当时的这个项目来说并不是很重要。

树莓派手电筒控制

所以,让我们继续增加我们无人机的功能,现在我将向您介绍 LED。我有两个XHP-50 LED 和 LED 脉冲驱动器(见上表)。它们很容易过热,因此我建议您将它们与散热器一起使用。你可以在同一个网上商店找到它们,最主要的是不要忘记尺寸。因此,将 LED 连接到散热器上,使用电线将一个 LED 的负极焊接到另一个 LED 的正极(它们已标记)并焊接 - 和 + 线:

无人机

控制器和焊接:

无人机

电源 - 12V 正负,您可以使用与电机相同的输入。LED 连接器应连接到先前焊接的连接器,L- 到负,L+ 到正。在这种情况下,我们不需要模拟触点(A),所以不要连接它。

现在我们对数字输入(D)和接地输入(G)感兴趣。现在您应该将数字输入 (D) 与 GPIO11 连接,将接地输入 (G) 与 GND 连接(您可以在 Raspberry 上选择任何您想要的)。

现在让我们回到 Raspberry Pi,创建一个文件light.js并添加以下内容:

//Again the same library
const Gpio = require('pigpio').Gpio;
//Create Gpio for your pin
const light = new Gpio(11, {mode: Gpio.OUTPUT});
// You can set the value starting from 0 to 255 (I have found this info in the LED driver instructions)
const LIGHT_MIN = 0;
const LIGHT_MAX = 255;
//It will be needed for calculations
const LIGHT_DIAPASONE = LIGHT_MAX - LIGHT_MIN;
// Turn off the LED (the system starts with the LEDs turned on to maximum)
light.pwmWrite(LIGHT_MIN);
//Export work methods
module.exports.light = {
on: () => {
  //Transmit the value 255 to the driver
light.pwmWrite(LIGHT_MAX);
},
off: () => {
// Transmit the value 0 to the driver
  light.pwmWrite(LIGHT_MIN);
},
//Here will be the percent value from 0 to 100
set: (val) => {
  if(val < 0 || val > 100) return;
//Calculate the value based on the percentage
  val = Math.round(LIGHT_MIN + LIGHT_DIAPASONE / 100 * val);
  console.log("Light:"+val);
//Transmit the value to the driver
  light.pwmWrite(val);
}
}

我们可以使用app.js或引擎运行它:

无人机

客户端-服务器通信协议

正如您从树莓派的初始配置中了解的那样,通信将使用套接字连接进行。您还需要一些在服务器和客户端中硬编码的命令集。当我自己做所有事情时,我决定使用我自己的格式,因为存在的选项与重量/可读性标准不太匹配。因此,让我们在考虑控制模型的情况下进行构建,在这种情况下,它将是 Android 智能手机。

无人机

在这里你可以找到模型本身(应用程序将在下面描述)。

画面分为两部分。左边部分代表水平轴(前后),右边部分代表垂直轴。如果您将手指放在某个区域,这将被视为参考点并由一对电机控制,但它也是一个“平静”点。

如果您的手指垂直向上滑动,两个电机的正向旋转速度将随着功率从 0 到最大值(取决于接触点到当前点的距离)缓慢增加。

如果您向下滑动手指,两个电机将以一定速度反向旋转,该速度取决于与接触点的距离。

如果您向右滑动手指,左侧电机将向前旋转,而右侧电机将反向旋转。所以,实际上,我们需要知道偏离接触点的角度(其中top=90,bottom=90,right=0,left=180)和速比——手指到接触点的距离(从 0 到 100)。对象命令应如下所示:

无人机

С - (command),任何命令都应该以这个字母开头;

: - 键值分隔符;

; - 键值对的分隔符;

L——表示触摸是在屏幕左侧进行的;

R - 表示触摸是在屏幕的右侧进行的;

LIGHT——代表光 :)

A ——ANGLE,偏差角;

V——价值,某物的价值。

因此,第一个命令听起来像:“一对水平电机,方向 - 45 度(左电机处于最大速度(但最大值为 35%,基于 V),右电机停止),旋转速度为 35%最大限度”。

第二条命令:“垂直电机对,方向 - 0 度(左电机最大转速,右电机反向最大转速),最大转速”。

第三个命令:“以 50% 的亮度打开灯”。

当您通过套接字在键值块中为每个值更改发送单独的命令时,这就是它的工作原理。然后神奇地变成控制板上的命令。解释这些数据的转换会很无聊。所以大家可以试着自己研究一下,掌握控制器。

安卓应用

最后,我们已经到了尝试创建控制器的时刻。一般来说,通信的意思是:“点击屏幕上的东西——将值传输到服务器”。我会写一些关于应用程序的内容。没有什么不寻常或特别具有挑战性的,所以我不会发布所有代码。如果您愿意,您可以访问存储库并找到所需的信息。我还想指出,我没有使用任何新奇的模式,如 MVVM、MVP、VIPER 等,因为我需要在最短的时间内工作的应用程序。UI 尽可能简单。

首先,您应该创建一个带有状态显示视图的活动。布局如下:

视频显示层(播放器封装在一个片段中)。

JoystickView层是一个自定义视图,其中dispatchTouchEvent方法被覆盖,它处理手指在屏幕上的按下和移动。它将 UI 线从按下点绘制到当前状态。多点触控支持是强制性的,因为控制是用两根手指执行的。

一个带有 Raspberry Pi 当前温度的 TextView 的层(如果出现问题并且它开始过热,您可以在它关闭/燃烧之前停止使用它)。幸运的是,我的 Raspberry 没有发生这种情况。

陀螺仪显示的数据层。在标签值对中设置的 TextView。它显示来自陀螺仪的“原始数据”。计划处理这些数据,但我没有足够的时间来做它并发明一个很酷的显示它。

一个 SeekBar 层 - LED 控件,一个简单的元素,它在拖动时将值从 0 更改为 100。

施工组装和测试

现在我们已经到了下一步——我们需要找到一些东西,我们可以放置上面提到的所有东西(哈哈)。在设计和组装阶段,我的朋友 Sergey 给了我很多帮助。实际上,他找到了一个外壳,做了一个铁平台,我们可以将电机安装在不同的位置,然后将它们放在一起:

无人机

我先说 6 个电机的原型会更有效率,但对我来说,即使有 4 个电机也很难支持原型,这就是为什么决定用 4 个电机测试原型的原因。

首先,我们决定测试外壳的结构,这就是为什么我们没有将所有电子设备都放入外壳中,而是简单地将电机连接到平台上,两对双绞线从电调发送信号到每个他们(ESC在测试期间一直留在内陆)。

无人机

结论

所有这一切的主要结果是,我获得了构建此类单元和系统的丰富经验。在开发过程中使用了大量不同的设备,其管理比看起来要容易得多。四电机原型并没有预期的那么好——控制这样的设备非常困难。最好使用四个垂直电机和至少两个水平电机。同时,它应该用陀螺仪稳定,因为对于人类来说,它很难完美地控制它,需要帮助(飞行无人机也是如此)。

此外,所有在售的电机都会被沙子和其他东西堵塞,所有单元都可能因腐蚀而损坏(这是合乎逻辑的),不适合此类项目。我没有找到水下马达(可以表明它是防水的,但它只能在 1-2 米的深度正常工作)。在这个项目之后,任何智能家居似乎都没有那么复杂了。服务器,中继命令,仅此而已。您需要的主要是有时间和愿望去做。其余的将随之而来。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分