避障大师
避障是无人机智能化的重要功能。在本项目中,你将学习如何用超声波传感器实现前方避障功能。
你将学到什么
Section titled “你将学到什么”- 超声波传感器原理
- 传感器接口编程
- 条件逻辑设计
- 实时控制
| 物品 | 数量 | 说明 |
|---|---|---|
| ESP32 无人机 | 1 | - |
| HC-SR04 超声波模块 | 1 | 测距传感器 |
| 面包板、杜邦线 | 若干 | 连接用 |
步骤 1:硬件接线
Section titled “步骤 1:硬件接线”将 HC-SR04 连接到 ESP32:
| HC-SR04 | ESP32 |
|---|---|
| VCC | 5V |
| GND | GND |
| Trig | GPIO 18 |
| Echo | GPIO 19 |
步骤 2:打开项目
Section titled “步骤 2:打开项目”解压 obstacle_avoid.zip,用 VS Code 打开。
步骤 3:编写测距函数
Section titled “步骤 3:编写测距函数”打开 ultrasonic.c,实现 ultrasonic_get_distance 函数:
float ultrasonic_get_distance(void) { // 1. 发送 10us 触发信号 gpio_set_level(TRIG_PIN, 1); ets_delay_us(10); gpio_set_level(TRIG_PIN, 0);
// 2. 测量 Echo 高电平持续时间 uint32_t start = 0, end = 0; while (!gpio_get_level(ECHO_PIN)) start = esp_timer_get_time(); while (gpio_get_level(ECHO_PIN)) end = esp_timer_get_time();
// 3. 计算距离:声速 340m/s,距离 = 时间 * 声速 / 2 float distance = (end - start) * 0.034 / 2; return distance;}步骤 4:添加避障逻辑
Section titled “步骤 4:添加避障逻辑”打开 flight_control.c,在主循环中添加:
float distance = ultrasonic_get_distance();if (distance < 50) { // 距离小于 50cm if (distance < 20) { // 距离小于 20cm // 紧急刹车 motorsSetRatio(MOTOR_M1, 0); motorsSetRatio(MOTOR_M2, 0); motorsSetRatio(MOTOR_M3, 0); motorsSetRatio(MOTOR_M4, 0); } else { // 减速并左转 motorsSetRatio(MOTOR_M1, current_ratio * 0.5); motorsSetRatio(MOTOR_M2, current_ratio * 0.8); motorsSetRatio(MOTOR_M3, current_ratio * 0.5); motorsSetRatio(MOTOR_M4, current_ratio * 0.8); }}步骤 5:测试
Section titled “步骤 5:测试”在无人机前方移动障碍物(如纸箱),观察是否能自动避开。
- 检查传感器连接
- 调整声速参数
- 优化代码执行频率
- 减少不必要的延迟
恭喜你!你已经实现了无人机的避障功能,这是智能化的重要一步!
在下一个项目中,你将学习如何利用摄像头实现视觉识别功能。