回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【Arduino 动手做】如何使用蓝牙通过 Arduino 微控制器控制无人机 简单

头像 驴友花雕 2025.07.15 12 0

在这个项目中,我将向您展示如何将使用 RC 无线电系统的(商用)RC 无人机转换为由 Arduino 使用蓝牙控制的无人机
为什么我要从 Arduino 控制我的无人机?
我想从 Arduino 控制我的无人机,因为我想迈向无人机的自动化。可以选择构建无人机并使用 Arduino 作为飞行控制器,但那样我就会错过更流行的固件(如 Betaflight)提供的所有高级功能。这让我思考,“为什么不用 Arduino 替换无人机的接收器,这样你仍然可以从 Arduino 控制无人机,而不必牺牲其性能”。这就是想法,所以让我们看看我们是怎么做到的。
用品
以下是该项目所需的所有主要用品清单:
Arduino Uno
HC-05 蓝牙模块
无人机 - 我建造了自己的 FPV 无人机。确保飞控支持 PPM 协议,并且支持 Betaflight。
无人机电池
PCB板
Arduino IDE
Betaflight 配置器
支持蓝牙的手机。
用于数据传输的 Micro-USB
10k 电位计(可选但推荐)
以下是项目所需的所有工具的列表:
A 烙铁
焊锡丝
剥线钳
电线 (公 - 公 和 母 - 公)
万用表(带有连续性测试仪的手表)
电工胶带
精密螺丝刀套装

理论
该项目背后的理论是使用 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 微秒的通道值,这恰好与 Servo Signals 中使用的范围相同。
在最后一个通道之后,有一个 End Of Frame (或 Beginning Of Frame) 暂停。此暂停的长度在 5000 到 20000 微秒之间;接收者似乎对此不是很严格。暂停的长度可以变化,这样你可以将帧设置为固定长度。请记住,暂停时间越长,您经历的延迟就越大,但暂停时间越短,Arduino 和飞行控制器之间的通信就越不稳定。找到最佳平衡点的最佳方法是反复试验。
想法
主要思想是用 Arduino Uno 替换无人机上的接收器。这将使我们能够通过我们想要的任何输入方法(在本例中为蓝牙)来控制无人机,并根据自己的喜好完全自定义无人机。
将 Arduino Uno 连接到无人机后,您将能够着手进行大量项目,而这只是其中之一。该项目突出了当无人机由 Arduino 控制时,无人机的运动是多么精确,以及将不同的输入方法集成到无人机上是多么容易。

第一步是配置无人机,使其使用 PPM 协议进行通信。现在大多数无人机默认配置为使用 S-bus 或 I-bus 协议,因为它比 PPM 更高效、更可靠。但是为了允许 Arduino 和无人机之间进行通信,PPM 协议是最好的选择。
将无人机的飞行控制器连接到计算机。
打开 Betaflight 并找到“配置选项卡”。
向下滚动,直到找到“接收器模式”的设置。
将“接收器模式”更改为“PPM RX input”。
单击屏幕右下角的 “Save and Reboot”(保存并重新启动)。

对于这一步,我们将进行项目所需的所有电气连接,因此请启动您的烙铁并准备好您的焊料以进行一些作。
我们首先需要找出飞控上的哪些引脚是 5V、Ground 和 PPM。要找到它们,您可以使用制造商的引脚图。如果您在互联网上查找特定的飞行控制器并前往官方网站,应该有一个可用的。
我附上了一张 Fritzing Image 和一些额外的图片来帮助建立联系:
您应该采取的第一步是将所有连接连接到 HC-05 蓝牙模块。为此,我使用母头-公头线将其连接到 Arduino Uno 和 PCB 板。将蓝牙模块连接到 Arduino 时,请确保蓝牙模块的 TX 引脚连接到 Arduino 的 RX 引脚,蓝牙模块的 Rx 引脚连接到 Arduino 的 TX 引脚。
接下来,您应该准备好将所有其他组件连接到 PCB。最好使用带有垂直条带的 PCB,因为它会使所有连接更容易、更干净。让我带你了解一下:
首先将 PCB 的 Ground 轨和 5V 轨连接到飞控的 Ground pad 和 5V 焊盘上。要查找要在飞行控制器上使用的焊盘,请参阅其引脚图。焊盘通常位于 PPM 焊盘旁边。
接下来,将蓝牙模块的 5V 和地线连接到各自导轨上的 PCB 板。
最后一步是将 Arduino 板的 5V 和 Ground 引脚连接到 PCB 板。此连接用于为 Arduino 板供电,否则您必须连接 9V 电池,如果可以直接由无人机电池供电,则无需连接。
将 Arduino 板的 pin 3 连接到飞控的 PPM pad。这是将所有命令发送到无人机的信号线。

由于 Arduino Uno 的尺寸,无人机内部没有太多空间,这导致我不得不将 Arduino 板放在无人机的外部。我通常将电池放在顶部,但我决定将其移至无人机的底部,并将 Arduino 板放在无人机的顶部。
我用一些电工胶带将 Arduino Uno 固定在无人机的顶部。我将电线保持得很短,以防止它们在飞行中撞到螺旋桨,并将蓝牙模块放在无人机背面的电池电缆下方。至于 PCB,因为它太小了,而且连接暴露在外,我用了一些电工胶带覆盖它并将其固定到 Arduino 上。

我在 Google Play 商店中寻找一些与 Arduino 相关的蓝牙控制器,但很少有可定制的控制器。最终我选择了这个蓝牙控制器,纯粹是因为它是可定制的,我认为与传统的纵杆控制相比,这将是一种有趣的无人机控制方式。使用此控制器还可以让您更精确地控制无人机。
我附上了一张图片,可以帮助您配置布局,并且我覆盖了每个按钮将发送到 Arduino 的值。设置控制器非常简单,如果您遇到困难,可以按照此“教程”进行作。
注意: 叠加值是您在创建按钮时需要设置的值。在 “On Press Down” 提示符中输入这些值。
要设置每个 Aux 按钮的功能,您必须在 Betaflight 中执行此作。我个人在驾驶无人机时更喜欢使用自动调平,我将其设置为 Aux 3,因为它使飞行更加顺畅,并有助于在起飞和降落过程中保持无人机稳定。
现在是我们一直在等待的部分。
设置好蓝牙控制器后,打开无人机电源并将手机连接到无人机上的蓝牙模块。这是最后一步,布防无人机,准备飞行!

 

01.jpg
02.jpg
03.jpg
04.jpg
05.jpg
06.jpg
07.jpg
08.jpg
09.jpg
09-.jpg
09-1.jpg

项目代码

 

代码
#include "PPMEncoder.h"

//Choose either pin 2 or pin 3 because they are interrupt pins. On other boards you can use any pin that has an interrupt
#define OUTPUT_PIN 3 

// This value will store the input from the Bluetooth Controller
char state = '0';     

// These variables represent the values of each channel, from 1 - 8. You can change how many variables you have depending on the number of channels you have.
int v1 = 50,v2 = 50,v3 = 0,v4 = 50,v5 = 0, v6= 0, v7 = 0, v8 = 0;

//These are the values used to increment or decrement each channel's percent when they are triggered by your input.
int inc1 = 2, inc2 = 2, inc3 = 2, inc4 = 2;

void setup() {
  //Begin serial communication.
  Serial.begin(9600);
  
  //Configure and initiate the encoder. The encoder will send the PPM Signals to the drone.
  ppmEncoder.begin(OUTPUT_PIN);
  
  //Set default values so that the drone start abruptly. 
  //This is how to set values of each channel: ppmEncoder.setChannelPercent(channel, percent). The channels are 0-indexed (so they start at 0) and the percent is from 1-100.
  ppmEncoder.setChannelPercent(0, 50);
  ppmEncoder.setChannelPercent(1, 50);
  ppmEncoder.setChannelPercent(3, 50);
}

void loop() {

  if(Serial.available() > 0){
    state = Serial.read();
     switch(state){
      //This controls the throttle value, +inc3 (+2%).
      case 'U': v3 += inc3; v3 = min(v3, 100); ppmEncoder.setChannelPercent(2, v3); break; 
      
      //This controls the throttle value, -inc3 (-2%).
      case 'D': v3 -= inc3; v3 = max(v3, 0); ppmEncoder.setChannelPercent(2, v3); break; 
      
      //This controls the yaw value, -inc4 (-2%). The rate at which drone will turn left.
      case 'T': (v4 > 50) ? v4 = 50 + inc4: v4 = v4;v4 -= inc4; v4 = max(v4, 0); ppmEncoder.setChannelPercent(3, v4);break; 
      
      //This controls the yaw value, +inc4 (+2%). The rate at which the drone will roll right.
      case 'X': (v4 < 50) ? v4 = 50 - inc4: v4 = v4;v4 += inc4; v4 = min(v4, 100); ppmEncoder.setChannelPercent(3, v4);break; 
      
      //This controls the pitch, +inc2 (+2%) The rate at which the drone will pitch downwards.
      case 'F': (v2 < 50) ? v2 = 50 - inc2: v2 = v2;v2 += inc2; v2 = min(v2, 100); ppmEncoder.setChannelPercent(1, v2);break; 
      
      //This controls the pitch, -inc2 (-2%). The rate at which the drone will pitch upwards.
      case 'B': (v2 > 50) ? v2 = + inc2: v2 = v2;v2 -= inc2; v2 = max(v2, 0); ppmEncoder.setChannelPercent(1, v2);break; 
      
      //This controls the roll, -inc1 (-2%). The rate at which the drone will roll left.
      case 'L': (v1 > 50) ? v1 = 50 + inc1: v1 = v1;v1 -= inc1; v1 = max(v1, 0); ppmEncoder.setChannelPercent(0, v1);break; 
      
      //This controls the roll, +inc1 (+2%). The rate at which the drone will roll right.
      case 'R': (v1 < 50) ? v1 = 50 - inc1: v1 = v1;v1 += inc1; v1 = min(v1, 100); ppmEncoder.setChannelPercent(0, v1);break; 

      //This controls Aux1
      case '1': if(v5 == 100){ 
        v5 = 0;
        ppmEncoder.setChannelPercent(4, v5);
      }
      else{
        v5 = 100;
        v1 = 50, v2 = 50, v3 = 0, v4 = 50;
        ppmEncoder.setChannelPercent(0, v1);
        ppmEncoder.setChannelPercent(1, v2);
        ppmEncoder.setChannelPercent(2, v3);
        ppmEncoder.setChannelPercent(3, v4);
        ppmEncoder.setChannelPercent(4, v5);
      }
      break;

      //This controls Aux2
      case '2': (v6 == 100) ? v6 = 0 : v6 = 100; ppmEncoder.setChannelPercent(5, v6);break;

      //This controls Aux3
      case '3': (v7 == 50) ? v7 = 0 : v7 = 50; ppmEncoder.setChannelPercent(6, v7); break;

      //This controls Aux4
      case '4': (v8 == 100) ? v8 = 0 : v8 = 100; ppmEncoder.setChannelPercent(7, v8); break;
     }
     //Print the input, this is to check that everything is functioning correctly
     //Serial.println(state);
}
}

【Arduino 动手做】使用蓝牙通过 Arduino 来控制无人机
项目链接:https://www.instructables.com/How-to-Control-Any-Drone-From-Your-Arduino-Microco/
项目作者:Iloke Alusala

项目视频:https://www.youtube.com/watch?v=k0k4KmnM2nE
项目代码:https://content.instructables.com/FQ8/UIQE/KR3SUMRC/FQ8UIQEKR3SUMRC.ino
https://content.instructables.com/F92/93LA/KR3SUMRD/F9293LAKR3SUMRD.cpp
https://content.instructables.com/FGR/EJ0E/KR3SUMRE/FGREJ0EKR3SUMRE.h

 

10.jpg
00189.gif

评论

user-avatar
icon 他的勋章
    展开更多