news 2026/6/10 17:09:49

【ESP32-S3】对接HC SR04P+sg90 的180度标准舵机进行避障运动的操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【ESP32-S3】对接HC SR04P+sg90 的180度标准舵机进行避障运动的操作

【ESP32-S3】对接HC SR04P+sg90 的180度标准舵机进行避障运动的操作

    • 硬件连接说明
      • HC-SR04P 连接:
      • SG90 舵机连接:
      • 电机驱动连接(以L298N为例):
    • 注意事项

以下是一个ESP32-S3连接HC-SR04P超声波传感器和SG90舵机实现避障运动的完整代码:

#include<ESP32Servo.h>// 引脚定义constintTRIG_PIN=5;// HC-SR04P Trig引脚constintECHO_PIN=6;// HC-SR04P Echo引脚constintSERVO_PIN=7;// SG90舵机信号引脚// 避障参数constintOBSTACLE_DISTANCE=20;// 障碍物距离阈值(cm)constintMAX_DISTANCE=200;// 最大测量距离constintSERVO_CENTER=90;// 舵机中间位置constintSERVO_LEFT=150;// 舵机左转角度constintSERVO_RIGHT=30;// 舵机右转角度Servo myServo;// 舵机对象// 运动控制引脚定义(根据实际连接修改)constintMOTOR_A_IN1=8;constintMOTOR_A_IN2=9;constintMOTOR_B_IN3=10;constintMOTOR_B_IN4=11;voidsetup(){Serial.begin(115200);// 初始化超声波传感器pinMode(TRIG_PIN,OUTPUT);pinMode(ECHO_PIN,INPUT);// 初始化舵机myServo.attach(SERVO_PIN);myServo.write(SERVO_CENTER);// 舵机回中// 初始化电机驱动引脚pinMode(MOTOR_A_IN1,OUTPUT);pinMode(MOTOR_A_IN2,OUTPUT);pinMode(MOTOR_B_IN3,OUTPUT);pinMode(MOTOR_B_IN4,OUTPUT);delay(1000);Serial.println("系统初始化完成");}// 超声波测距函数floatgetDistance(){digitalWrite(TRIG_PIN,LOW);delayMicroseconds(2);digitalWrite(TRIG_PIN,HIGH);delayMicroseconds(10);digitalWrite(TRIG_PIN,LOW);longduration=pulseIn(ECHO_PIN,HIGH,30000);// 最大等待30msfloatdistance=duration*0.034/2;if(distance>MAX_DISTANCE||distance<=0){returnMAX_DISTANCE;}returndistance;}// 舵机扫描并获取指定方向距离floatscanDirection(intangle){myServo.write(angle);delay(300);// 等待舵机稳定floatdist=getDistance();delay(50);// 等待测量稳定returndist;}// 运动控制函数(需要根据实际硬件实现)voidforward(){Serial.println("前进");// 示例:直流电机控制digitalWrite(MOTOR_A_IN1,HIGH);digitalWrite(MOTOR_A_IN2,LOW);digitalWrite(MOTOR_B_IN3,HIGH);digitalWrite(MOTOR_B_IN4,LOW);}voidbackward(){Serial.println("后退");digitalWrite(MOTOR_A_IN1,LOW);digitalWrite(MOTOR_A_IN2,HIGH);digitalWrite(MOTOR_B_IN3,LOW);digitalWrite(MOTOR_B_IN4,HIGH);delay(500);// 后退固定时间stopMoving();}voidleft(){Serial.println("左转");// 差速左转digitalWrite(MOTOR_A_IN1,LOW);digitalWrite(MOTOR_A_IN2,HIGH);// 左轮后退digitalWrite(MOTOR_B_IN3,HIGH);// 右轮前进digitalWrite(MOTOR_B_IN4,LOW);delay(300);// 转向时间stopMoving();}voidright(){Serial.println("右转");// 差速右转digitalWrite(MOTOR_A_IN1,HIGH);// 左轮前进digitalWrite(MOTOR_A_IN2,LOW);digitalWrite(MOTOR_B_IN3,LOW);// 右轮后退digitalWrite(MOTOR_B_IN4,HIGH);delay(300);// 转向时间stopMoving();}voidstopMoving(){Serial.println("停止");digitalWrite(MOTOR_A_IN1,LOW);digitalWrite(MOTOR_A_IN2,LOW);digitalWrite(MOTOR_B_IN3,LOW);digitalWrite(MOTOR_B_IN4,LOW);}// 避障决策函数voidobstacleAvoidance(){// 1. 先测量正前方距离floatfrontDist=scanDirection(SERVO_CENTER);Serial.print("前方距离: ");Serial.print(frontDist);Serial.println(" cm");// 2. 如果前方无障碍if(frontDist>OBSTACLE_DISTANCE){myServo.write(SERVO_CENTER);// 舵机回中forward();delay(100);// 前进一段时间stopMoving();}// 3. 如果前方有障碍else{Serial.println("检测到障碍物,开始扫描...");stopMoving();backward();// 先后退一点// 扫描左侧floatleftDist=scanDirection(SERVO_LEFT);Serial.print("左侧距离: ");Serial.print(leftDist);Serial.println(" cm");delay(300);// 扫描右侧floatrightDist=scanDirection(SERVO_RIGHT);Serial.print("右侧距离: ");Serial.print(rightDist);Serial.println(" cm");delay(300);// 舵机回中myServo.write(SERVO_CENTER);// 决策逻辑if(leftDist>rightDist&&leftDist>OBSTACLE_DISTANCE){Serial.println("左侧空间更大,向左转");left();}elseif(rightDist>leftDist&&rightDist>OBSTACLE_DISTANCE){Serial.println("右侧空间更大,向右转");right();}else{Serial.println("两侧都有障碍,后退并旋转");backward();delay(300);// 随机选择方向旋转if(random(2)==0){left();}else{right();}}}}voidloop(){obstacleAvoidance();delay(100);// 循环延迟}// 可选:手动控制测试函数voidtestAllMovements(){Serial.println("测试所有运动...");forward();delay(1000);stopMoving();delay(500);backward();delay(1000);stopMoving();delay(500);left();delay(500);right();delay(500);Serial.println("测试完成");}

硬件连接说明

HC-SR04P 连接:

  • VCC → ESP32 5V
  • Trig → GPIO 5
  • Echo → GPIO 6
  • GND → GND

SG90 舵机连接:

  • 橙色信号线 → GPIO 7
  • 红色电源线 → 5V
  • 棕色地线 → GND

电机驱动连接(以L298N为例):

  • IN1 → GPIO 8
  • IN2 → GPIO 9
  • IN3 → GPIO 10
  • IN4 → GPIO 11
  • 电机电源接合适电源

注意事项

  1. 电源管理

    • 舵机和电机需要较大电流,建议使用外部电源供电
    • ESP32与电机驱动共地
  2. 参数调整

    • 根据实际环境调整OBSTACLE_DISTANCE阈值
    • 调整舵机角度范围,避免机械过载
    • 调整转向延迟时间以获得合适的转弯角度
  3. 安装位置

    • 超声波传感器安装在舵机上,随舵机转动
    • 确保传感器前方无遮挡
  4. PWM引脚注意
    ESP32-S3的多数GPIO都支持PWM,但某些引脚可能有使用限制

实现了基本的避障逻辑:前进时检测障碍,遇到障碍后扫描左右两侧,选择更空旷的方向转向。你可以根据实际需求调整避障策略和运动参数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:49:56

如何快速实现大模型量化部署:终极性能优化指南

如何快速实现大模型量化部署&#xff1a;终极性能优化指南 【免费下载链接】AutoAWQ AutoAWQ implements the AWQ algorithm for 4-bit quantization with a 2x speedup during inference. 项目地址: https://gitcode.com/gh_mirrors/au/AutoAWQ 还在为大语言模型推理速…

作者头像 李华
网站建设 2026/6/10 12:56:54

数字博物馆系统-计算机毕业设计源码+LW文档

摘 要 本文旨在探讨数字博物馆系统的设计与实现过程&#xff0c;以适应信息化时代背景下文化遗产保护与传播的新需求。通过对当前博物馆信息化建设的现状分析&#xff0c;明确了数字博物馆系统对于提升展览效果、扩大文化传播范围、增强观众互动体验等方面的重要意义。 文章介…

作者头像 李华
网站建设 2026/6/10 16:35:33

9、Qt 应用程序中的用户帮助功能实现

Qt 应用程序中的用户帮助功能实现 在开发应用程序时,为用户提供有效的帮助是提升用户体验的关键。Qt 提供了多种方式来为用户提供帮助,如向导、工具提示、状态栏消息以及指向产品文档的指针等。下面将详细介绍这些帮助功能的实现方法。 1. 提供帮助的原则 在考虑为应用程序…

作者头像 李华
网站建设 2026/6/9 0:50:50

12、并行编程:原理、实践与挑战

并行编程:原理、实践与挑战 1. 线程基础 在软件开发中,当需要执行大量工作时,图形用户界面可能会冻结。线程可以解决这个问题。每个应用程序通常作为一个进程运行,现代操作系统中多个应用程序可并行运行。进程相互独立,而每个进程内可包含一个或多个线程,这些线程共享资…

作者头像 李华
网站建设 2026/6/10 1:59:40

Keil4下载及安装实战案例:适用于STM32项目应用

从零搭建STM32开发环境&#xff1a;Keil4安装与实战调试全解析 你有没有遇到过这样的场景&#xff1f; 刚接手一个老项目&#xff0c;代码用的是标准外设库&#xff0c;文档写着“推荐使用Keil4开发”&#xff0c;而你的电脑上装的却是最新的STM32CubeIDE。尝试迁移工程时发现…

作者头像 李华