本文介绍了由树莓派驱动的水下无人机原型的设计过程、开发和组装操作。
我在探索频道上看了很多关于发明家的节目,有一次我决定自己做一些有趣的事情,这样一次就可以真正令人印象深刻和困难:一些电动机、控制器、处理、相机。买了很多有用(而且不是很有用)的东西后,我开始思考应该开始什么样的项目。最后我得出的结论是,有很多飞行和驾驶无人机,但不是关于水下无人机(哈哈,现在看来,我当时简直大错特错)。
在网上冲浪后,我发现了几个有趣的项目,但其中大多数要么处于开发阶段,要么价格不便宜。
展望未来,我可以说我有一个可以游泳几米深的工作原型,尽管它有着部分优点和缺点。我不能断言我终于有了一个易于控制的东西,或者可以做的不仅仅是平息我的工程师热情的东西。但是这些东西的所有单元都能正常工作,我的错误和经验可以帮助某人创造出真正重要的东西(即使它只对他自己有意义),这一点在我看来是非常重要的。
由于做了大量工作,本文可分为以下几章:
选择组件
电调编程
树莓派服务器配置
使用 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 的编程工具。使用此设备,您可以上传必要的固件。但实际上,这就是问题所在。我不得不等了一个半月。
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 米的深度正常工作)。在这个项目之后,任何智能家居似乎都没有那么复杂了。服务器,中继命令,仅此而已。您需要的主要是有时间和愿望去做。其余的将随之而来。
-
无人机
+关注
关注
229文章
10420浏览量
180149 -
树莓派
+关注
关注
116文章
1706浏览量
105610
发布评论请先 登录
相关推荐
评论