30分钟内使用手机控制四轴飞行器(ESP8266 + A7105 + Blynk App for iOS/Android)

本文介绍了如何在30分钟内使用手机、ESP8266模块、A7105无线收发器和Blynk App实现四轴飞行器的远程控制。教程涵盖了从设置Blynk应用到硬件连接、项目配置、编写上传代码,最后成功控制飞行器的全过程。所需技能包括基本焊接和固件上传。
AI助手已提取文章相关产品:



很久以来,我就想做类似的项目了。但是手机集成工作的复杂性让我感到害怕。而且如果以后我有新的想法,也很难再重新利用这个项目。

现在,有了Blynk,这一切变得易如反掌:)

因此,我花了一个晚上,完成了这个项目。我希望大家会对这个项目感兴趣。

为了让这个项目正常工作,你需要:

1. 硬件 

  • 四轴飞行器(无需调整飞行器)

  • ESP8266 模组(ESP-07,ESP-12或者类似的开发板)

  • USB <-> TTL串口转换器(3.3V)

  • 面包板 + 跳线

  • Amic A7105无线收发器模组

2. 软件


3. 技能

  • 可能需要进行简单的焊接(取决于你使用的硬件)

  • 将固件上传至 ESP8266

    [good example here]

参考资料和致谢

· Hubsan X4 协议破解:http://www.rcgroups.com/forums/showthread.php?t=1... 

· ESP8266 脚位对应关系:http://esp8266.ru/esp8266-pin-register-strapping/

· 原始的 Arduino 库+ A7105 引脚分配表:https://github.com/napsternxg/coptermanager-arduin...

· 这份非常有用的指导性文件:http://www.instructables.com/id/Easy-Android-contr...


好的,让我们开始吧!

第一步:设置 Blynk 应用程序



每次我使用 Blynk 的时候,它都会让我想起三录仪。


     Tricoder: multifunction hand-held device used for sensor scanning, data analysis, and recording data.


Blynk 带有不同的部件(比如按钮、滑动装置、显示装置)。

你可以执行你想要执行的动作。这是一个通用遥控器,也可以显示和绘制数据。

下面是如何开始的一些简单步骤:

1. 安装 Blynk 应用程序:

  1. Android

  2. iOS
      (iOS 系统的软件目前还没有操纵杆配置,但在未来两周内将添加该配置)

2. 创建 Blynk 账户。
    按下登入界面的“创建账户”按钮。

3. 将 Blynk 库安装到Arduino IDE中:https://github.com/blynkkk/blynk-library/releases(如果你忘记如何安装 Arduino 库的话:请  点击这里

(可选步骤)

你可以安装本地 Blynk 服务器,以获得最佳操控性能和响应。点击这里阅读更多关于这方面的内容: https://github.com/blynkkk/blynk-server/blob/mast...

顺便说一下,我们现在是通过 BT 4.0 BLE 、随后通过WiFi添加直接连接,以清除服务器连接(专门为类似情况设置)。

第二步:用导线连接 A7105 和 ESP8266



ESP8266 and A7105 的运行电压都是3.3V,我们无需使用任何变压器,直接将它们连接起来即可。

顺便说一下,这也是我选择使用 ESP8266的原因之一。另外一个原因就很明显了: ESP8266 带有WiFi连接功能。:)

你可能需要焊接少数几条导线或者使用实验板确保连接稳定。

第三步:配置 Blynk 项目


1. 创建一个新项目,选择 ESP8266

2. 按下按钮,发送认证令牌到你的邮箱

3. 添加Button部件

    将其命名为“Bind”并连接到虚拟管脚1。

    设定模式为“Switch”

4. 添加另外一个Button部件

    将其命名为“Lights”并连接到虚拟管脚6。

    设定模式为“Switch”

5. 添加两个操纵杆部件,安装图示内容配置

    提示:你可以通过改变参数值来控制灵敏度/移位。

第四步:编写代码&上传固件

我会帮你剩下一些时间:这是一个草图,你可以按照这个草图给你的设备编写程序:)

事实上,我花了好几个小时向 ESP8266 上移植和修复原始的coptermanager,每次coptermanager不能正常工作或者崩溃的时候我都百思不得其解^_^

但一旦我成功地让 ESP8266 和 Hubsan 一起工作,让 Hubsan X4 和 Blynk 交互就是一件易如反掌的事情了

不到15分钟!
Everything I needed was to map commands of the coptermanager to the Blynk Virtual Pins:

现在我要做的就是把commands of the coptermanagerBlynk Virtual Pins


V1 - COPTER_BIND      Binds and returns the copter ID
V2 - COPTER_THROTTLE  (range 0x00 - 0xFF)  throttle (top/down)
V3 - COPTER_RUDDER    (range 0x34 - 0xCC)  rudder (rotate left/right)
V4 - COPTER_AILERON   (range 0x45 - 0xC3)  aileron (drift left/right)
V5 - COPTER_ELEVATOR  (range 0x3E - 0xBC)  elevator (forward/backward)
v6 - COPTER_LED       (1 or 0)  enable/disable LEDs


然后:

1. 在 Arduino IDE中打开提供的草图

2. 更新 Blynk 认证令牌(来自email),更新coptermanager.ino文件夹中的WiFi证书

3. 将它上传到你的 ESP8266中!


第五步:飞起来!


不管你信不信,这样就搞定啦:)

1. 给你的 ESP8266 上电,确保它连接到 Blynk 服务器。

2. 给你的Hubsan X4上电。

3. 轻按应用程序中的“Run”按钮(三角形,位于右上角)

4. 轻按“BIND”按钮。四轴飞行器上的灯此时应当停止闪烁。非常棒!

5. 使用第二个按钮尝试打开和关闭灯。哇哦!

6. 现在……小心地……把你的手指轻轻地放到这两个操纵杆上……

 

版权声明:

本译文仅用于学习和交流目的。非商业转载请注明译者、出处,并保留文章在译言的完整链接。

原文来源:http://www.instructables.com/

原文标题:Control quadcopter from your phone in 30 minutes! (ESP8266 + A7105 + Blynk App for iOS/Android)

原文地址:http://www.instructables.com/id/Control-quadcopter-from-your-phone-in-20-minutes-E/?ALLSTEPS




您可能感兴趣的与本文相关内容

我们将基于 **STM32CubeMX + HAL 库 + 蓝牙模块(如 HC-05/HC-06 或 ESP8266)** 实现一个完整的 **蓝牙遥控无人机飞行控制系统**,支持: - 通过手机 APP 发送指令 - 解析蓝牙串口数据 - 控制无人机的 **油门、偏航、俯仰、横滚** - 集成你已有的 **MPU6050 姿态解算** 和 **串级 PID 控制系统** --- ## ✅ 硬件与软件环境 | 项目 | 配置 | |------|------| | MCU | STM32F103C8T6 / F4系列等 | | 开发工具 | STM32CubeMX + Keil / STM32CubeIDE | | 蓝牙模块 | HC-05 / HC-06(SPP 协议),连接到 USART2 | | 通信方式 | UART 接收字符串或二进制协议 | | 手机APP | 可使用“蓝牙串口助手”或自定义APP | --- ## ✅ 功能目标 实现以下功能: - 手机发送控制指令(例如:`R:50,P:30,Y:20,T:70`) - STM32 解析指令 → 提取 Roll, Pitch, Yaw, Throttle - 结合 MPU6050 姿态 → 运行串级PID → 输出PWM控制电机 --- ## ✅ 第一步:STM32CubeMX 配置 ### 1. 时钟配置(以 F103 为例) - SYS: 选择 `Serial Wire` 调试接口 - RCC: HSE 外部晶振使能 - Clock Configuration: 设置系统主频为 72MHz ### 2. UART 配置(用于蓝牙) - USART2: - Mode: Asynchronous - Baud Rate: 9600 或 115200(根据蓝牙模块设置) - NVIC: 使能中断(优先级高于主循环) > 📌 引脚连接示例: ``` HC-05 TX → PA3 (USART2_RX) HC-05 RX → PA2 (USART2_TX) ``` ### 3. 生成代码并添加外设句柄 ```c extern UART_HandleTypeDef huart2; ``` --- ## ✅ 第二步:蓝牙接收模块(非阻塞方式) 我们使用 **中断 + 缓冲区** 方式接收数据,避免阻塞主循环。 ### 文件:`bluetooth.h` ```c // bluetooth.h #ifndef __BLUETOOTH_H #define __BLUETOOTH_H #include <stdint.h> #include <string.h> // 最大命令长度 #define BT_BUFFER_SIZE 64 #define BT_CMD_TERMINATOR '\n' // 控制结构体 typedef struct { int16_t roll; // -100 ~ +100 int16_t pitch; // -100 ~ +100 int16_t yaw; // -100 ~ +100 int16_t throttle; // 0 ~ 100 uint8_t updated; // 标志位:是否接收到新指令 } BT_Control_t; // 函数声明 void Bluetooth_Init(void); void Bluetooth_Parse(void); // 在主循环中调用解析 extern BT_Control_t bt_cmd; #endif ``` --- ### 文件:`bluetooth.c` ```c // bluetooth.c #include "bluetooth.h" #include "usart.h" // 自动生成的头文件 #include "string.h" #include "stdio.h" BT_Control_t bt_cmd = {0}; uint8_t bt_rx_byte = 0; uint8_t bt_rx_buffer[BT_BUFFER_SIZE]; uint8_t bt_rx_index = 0; void Bluetooth_Init(void) { // 启动 UART 中断接收 HAL_UART_Receive_IT(&huart2, &bt_rx_byte, 1); } // UART 回调函数(需在 main.c 中重写) void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == huart2.Instance) { if (bt_rx_byte == BT_CMD_TERMINATOR || bt_rx_index >= BT_BUFFER_SIZE - 1) { bt_rx_buffer[bt_rx_index] = '\0'; // 触发解析 Bluetooth_Parse(); // 重置缓冲区 bt_rx_index = 0; } else { bt_rx_buffer[bt_rx_index++] = bt_rx_byte; } // 继续开启下一次中断接收 HAL_UART_Receive_IT(&huart2, &bt_rx_byte, 1); } } void Bluetooth_Parse(void) { char *buffer = (char*)bt_rx_buffer; // 示例格式: R:50,P:30,Y:20,T:70\n int r = 0, p = 0, y = 0, t = 0; int parsed = sscanf(buffer, "R:%d,P:%d,Y:%d,T:%d", &r, &p, &y, &t); if (parsed == 4) { bt_cmd.roll = (int16_t)(r > 100 ? 100 : (r < -100 ? -100 : r)); bt_cmd.pitch = (int16_t)(p > 100 ? 100 : (p < -100 ? -100 : p)); bt_cmd.yaw = (int16_t)(y > 100 ? 100 : (y < -100 ? -100 : y)); bt_cmd.throttle = (int16_t)(t > 100 ? 100 : (t < 0 ? 0 : t)); bt_cmd.updated = 1; // 标记更新 } // 可选:打印调试信息 // printf("Parsed: R%d P%d Y%d T%d\r\n", r, p, y, t); } ``` > ⚠️ 注意:你需要在 `main.c` 的 `HAL_UART_RxCpltCallback` 中调用 `Bluetooth_Parse()` 或确保回调被正确注册。 --- ## ✅ 第三步:整合到主控逻辑(`main.c`) ```c // main.c #include "main.h" #include "mpu6050.h" #include "imu.h" #include "pid.h" #include "cascade_pid.h" #include "bluetooth.h" #include "motor.h" // 自定义电机混控 extern UART_HandleTypeDef huart2; CascadePID_Controller cpid; _st_AngE Angle = {0}; float base_throttle = 0.0f; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); // 蓝牙串口 MPU_Init(); MPU_Calibrate(100); imu_rest(); CascadePID_Init(&cpid); Motor_Init(); // 初始化PWM输出 Bluetooth_Init(); // 启动蓝牙接收中断 float dt; uint32_t last_tick = HAL_GetTick(); while (1) { uint32_t now = HAL_GetTick(); dt = (now - last_tick) / 1000.0f; if (dt < 0.015f) { // 最小时间间隔保护 HAL_Delay(1); continue; } last_tick = now; // --- 1. 获取IMU数据并更新姿态 --- MpuGetData(); GetAngle((const _st_Mpu*)&MPU6050, &Angle, dt); // --- 2. 检查蓝牙是否有新命令 --- if (bt_cmd.updated) { bt_cmd.updated = 0; // 清除标志 // --- 3. 将遥控输入映射为目标角度 --- float target_roll = ((float)bt_cmd.roll) * 30.0f / 100.0f; // ±30° float target_pitch = ((float)bt_cmd.pitch) * 30.0f / 100.0f; float target_yaw = ((float)bt_cmd.yaw) * 90.0f / 100.0f; // ±90°快速转向 base_throttle = ((float)bt_cmd.throttle) * 1000.0f; // 映射到PWM范围 // --- 4. 运行串级PID --- float out_roll, out_pitch, out_yaw; CascadePID_Update(&cpid, target_roll, target_pitch, target_yaw, Angle.roll, Angle.pitch, Angle.yaw, MPU6050.gyroX, MPU6050.gyroY, MPU6050.gyroZ, dt, &out_roll, &out_pitch, &out_yaw); // --- 5. 混控输出到四个电机 --- Motor_Mixer(out_roll, out_pitch, out_yaw, base_throttle); } else { // 无指令时停机(安全机制) Motor_StopAll(); } HAL_Delay(20); // 控制频率 ~50Hz } } ``` --- ## ✅ 手机端操作建议 ### 使用任意蓝牙串口APP(如:Serial Bluetooth Terminal) 发送指令格式(每行一条): ``` R:0,P:0,Y:0,T:20 R:50,P:0,Y:0,T:40 R:0,P:-30,Y:60,T:50 ``` 含义: - `R`: Roll(左负右正) - `P`: Pitch(前负后正) - `Y`: Yaw(左转负,右转正) - `T`: Throttle(油门百分比) > 💡 你可以开发一个简单的 Android/iOS App 实现摇杆控制,自动拼接并发送这些命令。 --- ## ✅ 安全增强建议 | 功能 | 实现方法 | |------|----------| | **超时保护** | 如果超过1秒未收到指令 → 自动降落 | | **指令校验** | 添加校验和或固定起始符(如 `$`) | | **最小油门检测** | 防止意外启动 | | **状态反馈** | 通过蓝牙回传当前姿态 `printf("A:%.1f,%.1f,%.1f\r\n", Angle.roll, ...);` | --- ## ✅ 扩展功能设想 1. **双向通信**:手机显示当前姿态角、电池电压等 2. **模式切换**:通过蓝牙切换“定高模式”、“航向锁定”等 3. **参数调节**:手机发送 `KP:3.0,KI:0.02,KD:0.5` 修改PID参数 4. **日志记录**:通过蓝牙导出飞行数据用于分析 ---请问该蓝牙部分怎么在e调试软件上使用,请详细说明
10-02
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值