本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于Arduino微控制器的无人机

发布时间:2021-09-22
分享到:

基于Arduino微控制器的无人机

发布时间:2021-09-22
分享到:

各位好!在这个 项目中,我将向您展示我如何将使用 RC 无线电系统的(商业)RC 无人机转换为由您的 Arduino 使用蓝牙控制的无人机,为什么我要从 Arduino 控制我的无人机?我想从 Arduino 控制我的无人机,因为我想在无人机的自动化方面迈出一步。可以选择建造无人机并使用 Arduino 作为飞行控制器,但随后我会错过更流行的固件(如 Betaflight)提供的所有高级功能。这让我想到,“为什么不用 Arduino 替换无人机的接收器,这样您仍然可以通过 Arduino 控制无人机,而不必牺牲其性能”。这就是想法,所以让我们看看我们是如何做到的。

零件清单:

  • Arduino
  • HC-05 蓝牙模块
  • 无人机
  • 无人机电池
  • PCB板
  • Arduino IDE
  • Betaflight 配置器
  • 支持蓝牙的手机。
  • 用于数据传输的 Micro-USB
  • 10k 电位器(可选但推荐)

工具列表:

  • 一个烙铁
  • 焊锡丝
  • 剥线钳
  • 电线
  • 万用表
  • 电工胶带
  • 精密螺丝刀套装

第 1 步:理论和理念

理论
该项目背后的理论是使用 Arduino 生成的 PPM 信号来控制无人机。飞行控制器通常从接收器接收 PPM 信号,接收器从发射器接收数据。如果我们可以生成与接收器使用来自发射器的数据发送给飞行控制器相同的 PPM 信号,我们就可以将我们自己的数据编码到来自 Arduino 的 PPM 信号上,并从 Arduino 控制无人机。这意味着不再需要传统的发射器和接收器来驾驶无人机,我们可以使用任何输入方法来控制无人机。

那么什么是 PPM 信号?

大多数发射器和接收器使用 PPM 信号(或脉冲位置调制)将信息从发射器传输到接收器。

PPM 是一种单线信号,可对许多脉宽调制 (PWM) 信号进行编码。它通常用于业余飞机和无人机的无线电控制,其中无线电传输 PPM 信号,该信号被解码为许多 PWM 信号以控制 RC 伺服电机。

发送的信号是一系列固定长度的脉冲,以微秒为单位。在电子产品中,这些脉冲是电压变化的电信号(在 +2.5V 和 +5V 之间似乎是正常的)。这些脉冲之间是长度不同的暂停(也以微秒为单位)。在电子产品中,这些脉冲介于 0V 和 +0.5V 之间。

此类信号的数据被编码为脉冲长​​度加上后续暂停的长度。或者换句话说:两个脉冲开始(或结束,无关紧要,因为脉冲是固定长度)之间的时间。这也是脉冲高低无所谓的原因;您只需选择信号的上升沿或下降沿并测量两个上升沿或下降沿之间的时间。

通道在信号中按时间顺序相互跟随;即通道 1 先到,通道 N 最后。脉冲之间的时间用于生成伺服信号(在我们的例子中,该信号不会控制伺服系统,而是控制无人机上的电机)。脉冲的长度通常约为 500 微秒(但正如您在我们的示例中所见,长度可能并不总是 500 微秒),停顿在 500 到 1500 微秒之间。当您将它们加在一起时,您会得到 1000 到 2000 微秒的通道值,这恰好与伺服信号中使用的范围相同。

在最后一个频道之后有一个帧结束(或帧开始)暂停。这个暂停的长度在 5000 到 20000 微秒之间;接收者似乎对此并不十分严格。暂停的长度可能会有所不同,这样您就可以将帧设置为固定长度。请记住,停顿时间越长,您将遇到的延迟越多,但停顿时间越短,Arduino 和飞行控制器之间的通信就越不稳定。找到最佳点的最佳方法是反复试验。

想法
主要想法是用 Arduino Uno 替换无人机上的接收器。这将使我们能够通过任何我们想要的输入方法来控制无人机,在这种情况下是蓝牙,并根据我们的喜好完全定制无人机。

将 Arduino Uno 连接到无人机后,您将能够开展大量项目,而这只是其中之一。该项目强调了无人机在由 Arduino 控制时的运动是多么精确,以及将不同的输入方法集成到无人机上是多么容易。

让我们深入了解这个项目。

第 2 步:配置无人机

第一步是配置无人机,使其使用 PPM 协议进行通信。现在大多数无人机默认配置为使用 S-bus 或 I-bus 协议,因为它比 PPM 更有效和可靠。但是为了让 Arduino 和无人机之间能够通信,PPM 协议是最好的选择。

将无人机的飞行控制器连接到计算机。
打开 Betaflight 并找到“配置选项卡”。
向下滚动,直到找到“接收器模式”的设置。
将“接收器模式”更改为“PPM RX 输入”。
单击屏幕右下角的“保存并重新启动”。
现在您的无人机已经配置完毕,让我们进入下一步。希望到目前为止您还没有遇到任何挑战!

第 3 步:电子和焊接

在这一步中,我们将进行项目所需的所有电气连接,因此点燃烙铁并准备好焊料以进行某些操作。吨

我们首先需要找到飞行控制器上哪些引脚是 5V、Ground 和 PPM。要找到它们,您可以使用制造商的引脚图。如果您在互联网上查找您的特定飞行控制器并前往官方网站,则应该有一个可用。

我附上了一张 Fritzing 图片和一些额外的图片来帮助连接:

您应该采取的第一步是与您的 HC-05 蓝牙模块建立所有连接。为此,我使用阴阳线将其连接到 Arduino Uno 和 PCB 板。蓝牙模块连接Arduino时,请确保蓝牙模块的TX引脚连接到Arduino的RX引脚,蓝牙模块的Rx引脚连接到Arduino的TX引脚。
接下来,您应该准备好将所有其他组件连接到 PCB。最好使用带有垂直条带的 PCB,因为它会使所有连接更容易、更清洁。让我带你了解一下:
首先将PCB的Ground rail和5V rail连接到飞控的Ground pad和5V pad。要找到飞行控制器上使用的焊盘,请参阅其引脚图。垫通常位于 PPM 垫旁边。
接下来将蓝牙模块的 5V 和地线连接到各自导轨上的 PCB 板。
最后一步是将 5V 和接地引脚从 Arduino 板连接到 PCB 板。此连接用于为 Arduino 板供电,否则您必须连接一个 9V 电池,如果它可以直接从无人机电池供电,则这是不必要的。
将 Arduino 板上的引脚 3 连接到飞行控制器上的 PPM 垫。这是将所有命令发送到无人机的信号线。
我们完成了所有连接,现在使用万用表上的连续性测试仪测试是否没有错误焊接。完成后,进入下一步。

第 4 步:代码

这是固件的主要代码。下载文件并确保将所有 3 个文件保存在同一目录中,在我的计算机上,我使用了文件路径:“C:\Users\Administrator\Documents\Arduino\Projects\Drone_Controller”。

正确保存所有内容后,在 Arduino IDE 中打开“Drone_Controller.ino”。如果“PPMEncoder.cpp”或“PPMEncoder.h”尚未添加到文件中,请单击“草图”-->“添加文件...”并添加必要的文件。

暂时不要上传,可能需要进行一些更改才能让无人机顺利飞行。

我已经在代码中做了笔记,但这里是需要注意的主要事项:

当您打开“PPMEncoder.h”时,您将看到可能需要更改的唯一变量是:
PPM_DEFAULT_CHANNELS - 这是您希望在无人机上拥有的频道数。
PPM_PULSE_LENGTH_uS - 这是脉冲的长度,您可能需要使用变量找到正确的值。最常见的值为 0.5 或 0.3
PPM_FRAME_LENGTH_uS - 这是分离暂停的长度。值越大,读数越稳定,延迟越高,但值越低,读数越不稳定,延迟越低。尝试使用此值,直到找到最佳位置。以下是我的开源代码,仅供大家参考。

Drone_Controller.ino

PPMEncoder.cpp

PPMEncoder.h

第 5 步:调整无人机

现在您可以上传代码并打开 Betaflight

打开 Betaflight 后,转到“接收器”选项卡,您可以在此处监控信号的稳定性以及频道读数是否不正确并需要调整。

这里有一个提示,可以快速找到“最佳位置”值:

在无数个不眠之夜试图从很宽的范围内找到合适的值之后,我决定如果我使用电位计并“滚动”范围直到找到“最佳位置”值,效率会更高。

这特别有用,尤其是当我正在寻找合适的脉冲长度时,因为我的飞行控制器不适用于传统的 0.5ms 或 0.3ms,我的飞行控制器实际上只适用于 0.01ms - 0.05ms 范围内的值!所以这个方法在寻找脉冲长度时肯定有帮助。

我在寻找 err 值时重复了上面的步骤。当您将代码上传到 Arduino 板并开始向飞行控制器发送 PPM 信号时,您可以在 Betaflight 中监控这些值,您可能会注意到读数有很多波动,这会使无人机无法飞行。为了解决这个问题,我在代码中添加了 err 变量。当您增加此值时,它会向下修剪 Betaflight 中的所有读数,而当您增加此值时,它会向上修剪 Betaflight 中的所有读数。一旦您调整了所有值,使通道 1、2 和 4 的读数为 1500,而通道 3 的读数为 1000,您就可以开始飞行了。

如果您想使用电位计来帮助获得正确的值,我附上了一个 Tinkercad 图像来帮助连接。连接电位器时使用的代码行已在代码中注释掉,但具体行如下:

const int potPin = A3;

void setup() {
  pinMode(potPin, INPUT);
}

void loop() {
  int potValue = analogRead(potPin);
  int val = map(val, 0, 1023, 0, 500);
  #define PPM_PULSE_LENGTH_uS = val; //Change which variable you want to test 

如果您没有调整这些值以使它们适应您的飞行控制器,您可能会注意到的第一件事是您可能根本无法在 Betaflight 中获取任何读数!这可能是因为您没有正确的“PPM_PULSE_LENGTH_uS”值。

您可能会注意到的第二件事是这些值非常不稳定且不稳定。这是由于值“PPM_FRAME_LENGTH_uS”太低。增加该值直到值稳定。

处理完上述两个问题后,最后一个要调整的变量是“err”。如果您注意到每个通道的值不在正确的默认位置并且它们没有波动,则需要相应地调整“err”变量。正如我上面提到的,当你增加这个值时,它会向下修剪 Betaflight 中的所有读数,当你增加这个值时,它会向上修剪 Betaflight 中的所有读数。我附上的第一个 Betaflight 屏幕截图显示了在我使用代码中的 err 变量修剪它们之前,通道读数是多么不稳定。第二个屏幕截图显示了我修剪后的通道值。它有很大的不同!

一旦您收到稳定的值,您就可以进入下一步。

第 6 步:组装

由于 Arduino Uno 的尺寸,无人机内部没有太多空间,这导致我不得不将 Arduino 板放在无人机外部。我通常将电池放在顶部,但我决定将它移到无人机的底部,并将 Arduino 板放在无人机的顶部。

我用一些电工胶带将 Arduino Uno 固定在无人机的顶部。我将电线保持得很短,以防止它们在飞行途中撞到螺旋桨,并将蓝牙模块放在无人机背面的电池电缆下方。至于 PCB,因为它太小而且连接是裸露的,所以我用了一些电工胶带把它盖住并固定在 Arduino 上。

这是我在每张图片中遵循的顺序:

  • 图 1:所有连接都已建立,一切都已暴露。
  • 图 2:我已经将无人机的相机重新连接到框架上并将其连接到飞行控制器。我还将 VTX 放回了飞行控制器的顶部。
  • 图 3:我已将框架的顶部重新连接到无人机上。
  • 图 4:我将无人机翻转过来并安装了螺钉以将框架的底部连接到框架的顶部。
  • 图 5:我将无人机翻转过来并使用电工胶带将 Arduino 板连接到无人机顶部
  • 图 6:我在 PCB 上放置了电工胶带并将其固定在 Arduino 板上。
  • 图 7:在此图中,您可以看到我放置蓝牙模块的位置。我把它放在框架和电池线之间。
  • 图 8:该图显示了完整的无人机,所有东西都已连接,但没有打开螺旋桨。
  • 图 9:这是完整的无人机,一切就绪,准备飞行!

第 7 步:控制器

如果没有控制器,我们就无法驾驶无人机,所以让我们解决这个问题。

我在 Google Play 商店四处寻找一些与 Arduino 相关的蓝牙控制器,但很少有可定制的控制器。最终我选择了这个蓝牙控制器,纯粹是因为它是可定制的,我认为与传统的操纵杆控制相比,这将是一种有趣的控制无人机的方式。使用此控制器还可以让您更精确地控制无人机。

我附上了一张可以帮助您配置布局的图像,并且我已经覆盖了每个按钮将发送到 Arduino 的值。设置控制器非常简单,如果您遇到困难,可以按照此“教程”进行操作。

注意:叠加值是您在创建按钮时需要设置的值。在“On Press Down”提示中输入这些值。

要设置每个 Aux 按钮的功能,您必须在 Betaflight 中进行。我个人在驾驶无人机时的偏好是使用自动调平,我将其设置为 Aux 3,因为它使飞行更加平稳,并且有助于在起飞和着陆过程中保持无人机的稳定。

现在是我们一直在等待的部分。
设置好蓝牙控制器后,打开无人机并将手机连接到无人机上的蓝牙模块。这是最后一步,武装无人机并准备飞行!

第 9 步:改进、安全和总体思路

改进:
就 Arduino 向无人机发送信号的方式而言,我发现它非常稳定和可靠,但我知道可以更有效地编写代码以减少每次传输的延迟。
我认为我肯定会将传输方式从蓝牙更改为延迟更低的媒体,因为在您按下控制器上的按钮和无人机响应之间存在明显的延迟。这更多是一个安全问题,因为在您需要即时响应的时候,您可能只需要几分之一秒的时间。我也会改变传输方法,因为虽然蓝牙是最容易配置的,但它的范围非常有限,如果你想远距离飞行,这可能会导致问题。
我目前正在开发一个系统,您可以使用该系统将其添加到无人机中,以便安全地测量电池电压并将其发送回控制器。目前最好使用计时器并在着陆时测量电池的电压。这是为了避免电池电压下降到危险的低电压,从而导致电池损坏。
获得更小的微控制器(例如 Arduino Nano)也很理想,它可能适合无人机框架的内部。
安全
在项目结束时,主要关注的是无人机和使用它的人的安全。它可能看起来像一个“玩具”,但有很多事情可能会出错。

飞行无人机时可以采取的一些安全措施是:

在障碍物少、人少的环境中飞行。
将无人机与任何物体(包括您自己)保持一定距离,以便在无人机出现故障时有足够的时间做出响应。
安全存放电池,您可以遵循无人机电池制造商的指导方针,以便安全使用和存放无人机电池。
不要将无人机飞离控制器太远,因为控制器的信号丢失会对无人机周围或路径中的任何事物构成风险
最重要的安全规则是运用常识,不要以任何冒险的方式飞行。
结论:
在项目结束时,我对 Arduino 能够将 PPM 信号发送到无人机的能力感到非常满意。我绝对可以看到自己用 Arduino 和无人机做更多与自动化相关的项目。至于飞行,我觉得非常稳定和令人满意。由于无人机的强大功能以及来自 Arduino 的读数的准确性,我觉得这是一个完美的组合。

以上就是项目的全部内容了,希望您能够喜欢!

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论