跳转到内容

避障大师

避障是无人机智能化的重要功能。在本项目中,你将学习如何用超声波传感器实现前方避障功能。

  • 超声波传感器原理
  • 传感器接口编程
  • 条件逻辑设计
  • 实时控制
物品数量说明
ESP32 无人机1-
HC-SR04 超声波模块1测距传感器
面包板、杜邦线若干连接用

将 HC-SR04 连接到 ESP32:

HC-SR04ESP32
VCC5V
GNDGND
TrigGPIO 18
EchoGPIO 19

解压 obstacle_avoid.zip,用 VS Code 打开。

打开 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;
}

打开 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);
}
}

在无人机前方移动障碍物(如纸箱),观察是否能自动避开。

  • 检查传感器连接
  • 调整声速参数
  • 优化代码执行频率
  • 减少不必要的延迟

恭喜你!你已经实现了无人机的避障功能,这是智能化的重要一步!

在下一个项目中,你将学习如何利用摄像头实现视觉识别功能。