Arduino+STM32+超声波模块RCWL-1605、HC-SR04
超声波模块有很多型号,如 HC-SR04、HY-SRF05、RCWL-1605 等,但基本上都用到四根引脚:VCC、GND、Trigger 触发引脚、Echo 回声引脚。
工作原理:给 Trigger 引脚一个 10 微秒以上的高电平,然后监听 Echo 引脚发出的的高电平脉冲宽度 t,这个时间 t 就是声音从发出到返回的耗时,再乘以声音的速度就得到距离(是来回的距离所以还要除以 2)。
本程序基于 STM32F103 芯片,但用的是 Arduino 开发框架。主程序很简单:
const int EchoPin = PA6; //超声波模块Echo引脚
const int TriggerPin = PA7; //超声波模块Trigger引脚
const int LED = PA1; //用于显示距离太近的LED灯
HardwareSerial Serial1(PA10, PA9); //串口输出用于调试
float distance; //检测到的距离
//通过Trigger引脚发送高电平信号,再检测Echo引脚的高电平时间,得到距离(厘米)
float getDistance() {
digitalWrite(TriggerPin, HIGH);
delayMicroseconds(10); //高电平保持10微秒以上再拉低
digitalWrite(TriggerPin, LOW);
float duration = (float)pulseIn(EchoPin, HIGH); //获取Echo引脚高电平保持时间,单位是微秒(1us=0.000001s)
return duration * 0.017; //声速340m/s,来回要除以2得170,还要转换微秒、厘米
}
void setup() {
pinMode(EchoPin, INPUT);
pinMode(TriggerPin, OUTPUT);
pinMode(LED, OUTPUT);
Serial1.begin(115200);
}
void loop() {
distance = getDistance();
analogWrite(LED, (distance < 30) ? 200 : 255); //懒得加限流电阻,直接改电压,小于30厘米就亮
// Serial1.print(distance);
// Serial1.println(" cm");
delay(200); //延时至少30毫秒以防上次回波的干扰
}
如果不用 pulseIn(),可以手动判断:
// 不用pulseIn的写法(效果同上,可忽略)
float getDistance2(){
digitalWrite(TriggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(TriggerPin, LOW);
unsigned long duration = millis();
while(!digitalRead(EchoPin)){}
duration = micros();
while(digitalRead(EchoPin)){}
duration = micros() - duration;
return ((float)duration) * 0.017;
}

浙公网安备 33010602011771号