Arduino实例:超声波测距

95 篇文章 ¥59.90 ¥99.00
本文详细介绍了如何利用Arduino UNO和超声波传感器模块进行距离测量。通过设置传感器引脚、发射超声波、计算脉冲宽度及转换为距离,实现了简单而精确的测距功能。该技术适用于避障机器人、智能停车系统等应用场景。

超声波传感器是一种常用的距离测量设备,它能够通过发射超声波并测量反射回来的波的时间来计算距离。在本文中,我们将使用Arduino来实现超声波测距功能。

硬件准备:

  • Arduino UNO开发板
  • 超声波传感器模块
  • 杜邦线若干

接线图如下:

Arduino UNO  超声波传感器
    5V      -->  VCC
    GND     -->  GND
    10      -->  Trig
    11      -->  Echo

代码实现:

// 定义超声波传感器的引脚
const int trigPin = 10;
const int echoPin = 11;

// 定义变量
long duration;
int distance;

void setup() {
  // 初始化串口通信
  Serial.begin(9600);
  // 设置超声波传感器引脚模式
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  // 发射超声波
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // 接收超声波的返回信号,并计算距离
### 基于Arduino的模糊PID控制超声波测距 #### 连接硬件组件 为了实现基于Arduino的模糊PID控制进行超声波测距,首先需要正确连接各个硬件组件。超声波传感器(如HC-SR04)应通过其触发引脚(Trig)和回响引脚(Echo)分别连接至Arduino的数字I/O引脚[^3]。 对于舵机而言,通常会将其信号线接到Arduino的一个PWM引脚上以便精确控制角度位置;而电源线则需外接稳压源来确保足够的驱动电流[^4]。 #### 初始化设置 在程序初始化阶段,定义并配置好所使用的针脚编号以及创建必要的对象实例: ```cpp #include <Servo.h> // 定义超声波传感器接口 const int trigPin = 9; const int echoPin = 10; // 创建伺服电机对象 Servo myServo; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // 启动串口通信用于调试输出 Serial.begin(9600); // 将舵机附加到指定引脚 myServo.attach(3); } ``` #### 获取距离数据 编写函数`getDistance()`用来获取当前测量的距离值,在此过程中利用了脉冲反射原理计算时间差从而得出实际长度[^2]: ```cpp float getDistance(){ digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin,HIGH); delayMicroseconds(10); digitalWrite(trigPin,LOW); long duration = pulseIn(echoPin, HIGH); float distance = (duration / 2) * 0.0343; // 单位:cm return distance; } ``` #### PID控制器构建 接下来是核心部分——模糊PID控制器的设计。这里简化处理只展示基本框架,具体参数调整依赖实验测试优化: ```cpp class FuzzyPID{ private: double Kp,Ki,Kd; public: void setGains(double p,double i,double d){ Kp=p; Ki=i; Kd=d; } double compute(double target,double current){ static double lastError=0,integral=0; double error=target-current; integral+=error; double derivative=(error-lastError)/0.1; // 时间间隔设为固定 lastError=error; return Kp*error + Ki*integral + Kd*derivative; } }; FuzzyPID fuzzyPid; ``` #### 主循环逻辑 最后,在主循环里调用上述功能完成整个系统的运作流程,并不断更新目标位置使机器人能够沿着预定路径前进或避开障碍物[^1]: ```cpp void loop() { const float desiredDist = 30.0f; // 预期保持的安全间距 cm float actualDist=getDistance(); double controlSignal=fuzzyPid.compute(desiredDist,actualDist); // 使用得到的控制量去改变舵机的角度或者其他动作... int angle=map(controlSignal,-255,255,0,180); // 映射范围适应实际情况 myServo.write(angle); delay(100); // 循环周期设定 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值