首页 > 其他 >特殊应用电路 > 基于树莓派实现的水下无人机设计方案

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

来源:互联网发布者:toothache 关键词: 无人机 树莓派 更新时间: 2024/03/01

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

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

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

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

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

选择组件

电调编程

树莓派服务器配置

使用 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 米的深度正常工作)。在这个项目之后,任何智能家居似乎都没有那么复杂了。服务器,中继命令,仅此而已。您需要的主要是有时间和愿望去做。其余的将随之而来。

提问/讨论

这里还没有内容,您有什么问题吗?

我要提问/讨论

电子电路资源推荐

推荐帖子 最新更新时间:2024-11-13 08:54

AUTOSAR MCAL的原理与实践
本书主要介绍AUTOSAR MCAL的基本原理与实践,简述AUTOSAR这一汽车软件架构的相关标准。本书期望能给相关应用设计的初学入门者提供一些参考,以利于后续深入技术的研究,帮助读者全面、深入地了解AUTOSAR MCAL的架构和工作原理,以及熟悉并掌握基于AUTOSAR M
 arui1999下载中心专版
免费分享资深硬件工程师视频讲解---ADC模数转换器件设计选型指南
ADC器件的选型,原理和类型都有讲解,很详细,适合新手们看看。 免费分享资深硬件工程师视频讲解---ADC模数转换器件设计选型指南 学习一下 不错,学习了。 学习一下 你好 学习一下 学习一下 好资料 学习 学习 学习 学习一下 感谢感
 CCBSKY模拟与混合信号
请教怎样把Libxml 编译成可以在WINCE下使用的DLL
最近因为工作需要,下了Libxml 的源码,想编译成WINCE下使用的动态库, 苦于不知道怎么下手,希望做过的人说一下大概步骤.先谢谢了! 请教怎样把Libxml 编译成可以在WINCE下使用的DLL 如果是轻量级的应用,建议用tinyxml 简单易用 tinyxml 很好用,也
 clio4177WindowsCE
WinCE5和CE6能同时装在一个主机上么
条件有限,只能在一台机子上装CE5和CE6的开发环境。 并且由于种种原因,已经装好了CE6,此时再装CE5会不会有什么问题? 如果真的会有问题的话,怎么做可以避免掉这些问题呢? WinCE5和CE6能同时装在一个主机上么 很简单,两个方法: 1、不管,直接两个都装,试试看; 2、
 xw0326WindowsCE
求助:求AT32F425的脚位信息
官网有说可以p2p替换,但是datasheet里没找到脚位信息,现在想替换stm32f103cbt6。哪位好汉有这个资料方便分享一下? 求助:求AT32F425的脚位信息 上官网给你下载的,更多资料,可以看下面的官网链接。 https://www.arterytek.c
 Ansersion国产芯片交流
功率放大器应用,在压电振动驱动的旋转软体机器人制作中的应用
实验名称:基于振动驱动的旋转及攀爬软体机器人的研究 研究方向:利用振动驱动原理,设计了能够实现快速旋转运动和攀爬运动的两种软体驱动结构。 实验内容: 旋转软体机器人具有可实现大变形、柔性接触、人体友好等特性,在移动机器人、生物医学器件等领域具有重要的应用价值。本文主要设计
 aigtek01开关电源学习小组

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

EEWORLD 电路图 站点相关: 下载中心 Datasheet 参考设计

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved