树莓派开发 超声波模块

一、工作原理

(1)树莓派向 Trig 脚发送一个 10us 的脉冲信号。
(2) HC-SR04 接收到信号,开始发送超声波,并把 Echo置为高电平,然后准备接收返回的超声波。
(3) HC-SR04 接收到返回的超声波,把 Echo 置为低电平。
(4)Echo 高电平持续的时间就是超声波从发射到返回的时间间隔。
(5)计算距离:
距离(单位:m) = (start - end) * 声波速度 / 2
声波速度取 343m/s 。
然后再把测得的距离转换为 cm。
距离(单位:cm) = (start - end) * 声波速度 / 2 * 100
= (start - end) * 17150

二、实现代码

#include <wiringPi.h>  
#include <stdio.h>  
#include <sys/time.h>  
  
#define Trig 4
#define Echo 5
  
void ultraInit(void)  
{  
    pinMode(Echo, INPUT);  
    pinMode(Trig, OUTPUT);  
}  
  
float disMeasure(void)  
{  
    struct timeval tv1;  
    struct timeval tv2;  
    long start, stop;  
    float dis;  
  
    digitalWrite(Trig, LOW);  
    delayMicroseconds(2);  
  
    digitalWrite(Trig, HIGH);  
    delayMicroseconds(10);      //发出超声波脉冲  
    digitalWrite(Trig, LOW);  
      
    while(!(digitalRead(Echo) == 1));  
    gettimeofday(&tv1, NULL);           //获取当前时间  
  
    while(!(digitalRead(Echo) == 0));  
    gettimeofday(&tv2, NULL);           //获取当前时间  
  
    start = tv1.tv_sec * 1000000 + tv1.tv_usec;   //微秒级的时间  
    stop  = tv2.tv_sec * 1000000 + tv2.tv_usec;  
  
    dis = (float)(stop - start) / 1000000 * 34300 / 2;  //求出距离  
  
    return dis;  
}  
  
int main(void)  
{  
    float dis;  
  
    if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen  
        printf("setup wiringPi failed !");  
        return 1;   
    }  
  
    ultraInit();  
      
    while(1){  
        dis = disMeasure();  
        printf("distance = %0.2f cm\n",dis);  
        delay(1000);  
    }  
  
    return 0;  
}

用到新函数

struct timeval  //在gettimeofday函数说明中有
gettimeofday() //获取当前时间
delayMicroseconds(1//延迟1微秒
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于树莓pico使用超声波模块,你需要连接超声波传感器到树莓pico的GPIO引脚上。一般来说,超声波传感器有四个引脚:VCC, GND, Trig和Echo。其中,VCC连接到树莓pico的3.3V电源引脚,GND连接到树莓pico的GND引脚,Trig连接到树莓pico的任意GPIO输出引脚,Echo连接到树莓pico的任意GPIO输入引脚。 然后,你需要使用Python编写程序来读取超声波传感器的距离数据。具体的编程步骤可以参考以下代码示例: ```python import machine import time # 设置GPIO引脚号 trig_pin = machine.Pin(0, machine.Pin.OUT) echo_pin = machine.Pin(1, machine.Pin.IN) # 发送超声波信号 def send_trigger_pulse(pin): pin.low() time.sleep_us(2) pin.high() time.sleep_us(5) pin.low() # 读取超声波传感器距离数据 def get_distance(trig_pin, echo_pin): send_trigger_pulse(trig_pin) while echo_pin.value() == 0: signaloff = time.ticks_us() while echo_pin.value() == 1: signalon = time.ticks_us() timepassed = signalon - signaloff distance = (timepassed * 0.0343) / 2 return distance # 循环读取超声波传感器距离数据 while True: distance = get_distance(trig_pin, echo_pin) print("Distance: %d cm" % distance) time.sleep(1) ``` 这段代码中,我们使用了machine模块来控制GPIO引脚的输入输出,使用time模块来进行时间延迟和计时。在get_distance函数中,我们先发送一个超声波信号,然后等待传感器返回的回波信号,并计算回波时间,最后通过计算距离公式计算出距离值。在循环中,我们不断读取距离数据并打印输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值