树莓派和HC-SR04模块实现超声波测距

一、HC-SR04简介

HC-SR04有4 个引脚, 2 个电源引脚(Vcc 、GND)和 2 个控制引脚(Trig、Echo)
在这里插入图片描述
Vcc 和 Gnd 接 3.3v DC 电源,但不推荐用独立电源给它供电,可以接树莓派的引脚给它供电。
Trig 引脚用来接收来自树莓派的控制信号。接任意 GPIO 口。
Echo 引脚用来发送测距结果给树莓派。接任意 GPIO 口。

HC-SR04 的测距过程

  1. 树莓派向 Trig 脚发送一个持续 10us 的脉冲信号。
  2. HC-SR04 接收到树莓派发送的脉冲信号,开始发送超声波 ,并把 Echo置为高电平。
  3. 当 HC-SR04 接收到返回的超声波时,把 Echo 置为低电平。

可见, 超声波从发射到返回经过的时间,就是Echo高电平持续的时间

二、树莓派远程连接

1.系统准备
  • 下载树莓派系统镜像(两种渠道)
    树莓派官方的下载烧录整合工具Raspberry Pi Imager
    https://www.raspberrypi.com/software/
    2020年前的旧版系统镜像Index of /raspbian_full/images
    https://downloads.raspberrypi.org/raspbian_full/images/
2.软件准备
  • Putty (SSH通过WIFI建立远程连接)
  • VNC-Viewer(远程桌面软件)
3. 烧录系统

将SD卡插入读卡器,再插入电脑,首先格式化盘符

打开Raspberry Pi Imager选择稍旧的系统进行烧录(笔者使用最新镜像系统烧录完的时候无法通过ssh连接热点)

或者下载上面提供的旧版系统镜像的zip文件,解压后选择.img镜像文件,通过Imager烧录到SD卡中
在这里插入图片描述
烧录完成后,SD卡将会变成一个只有256MB的命名为boot的盘符。

4. 使用ssh连接电脑热点

在电脑文件开启后缀的情况下在boot盘中创建这样两个文件:

ssh空白文件和wpa_supplicant.conf文件(在进入树莓派系统设置ssh自动开启之前,树莓派每次开机后都会自动删除这两个文件,所以可以在电脑上保存这两个文件备用)
在这里插入图片描述
打开并编写wpa_supplicant.conf文件

country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
 
network={
	ssid="xxxxx"
	psk="xxxxx"
	key_mgmt=WPA-PSK
	priority=1
}

其中ssid填入需要连接网络名称,在psk后的双引号中输入网络密码。连接的网络不要使用中文名。为便于操作可以使用电脑热点,但需要在设置中调整网络频带为2.4GHz。如果使用手机热点,也需调整网络频带为2.4GHz,且电脑要同时连接手机热点才能在电脑上远程登入树莓派。
取下SD卡,将SD卡插入树莓派,接电启动,等待树莓派开机并连接热点,1/8表示成功连接上
在这里插入图片描述

右键打开设置,将设备名称为raspberry的IP地址复制下来
在这里插入图片描述

打开 Putty,在Host Name中粘贴复制下来的IP地址,点击open
在这里插入图片描述
在弹出来的界面输入用户名和密码
输入sudo raspi-config进入树莓派的系统设置,将VNC的服务开启,这样就可以远程链接树莓派的桌面。

5.VNC远程控制连接树莓派桌面

打开VNC Viewer,输入之前复制的树莓派IP地址
在这里插入图片描述
输入用户名pi和树莓派初始密码raspberry,即可远程控制树莓派的桌面。
在这里插入图片描述

三、树莓派操作

在桌面建立两个文件
在这里插入图片描述
main.py

import RPi.GPIO as GPIO
from pin_dic import pin_dic
import time


class HC_SR04(object):

    def __init__(self, pin_trig, pin_echo):
        self.pin_trig = pin_trig
        self.pin_echo = pin_echo

        GPIO.setup(self.pin_trig, GPIO.OUT)
        GPIO.setup(self.pin_echo, GPIO.IN)
        self.time_tol = 3  # 设置时间间隔确保正常工作范围在3s内

    def get_distance(self):
        s_time = time.time()  # 当前时刻起开始时间
        # 在TRIG引脚上输出一个正向脉冲
        GPIO.output(self.pin_trig, 0)  # 开始为低电平
        time.sleep(0.000002)

        GPIO.output(self.pin_trig, 1)  # trig引脚改为高电平
        time.sleep(0.00001)

        GPIO.output(self.pin_trig, 0)  # 有设置为低电平
        # 次阶段可以视为通知模块----我开始工作了!!!!准备接收

        # 等待ECHO引脚上高电平出现
        while GPIO.input(pin_echo) == 0:
            if time.time() - s_time > self.time_tol:
                return False
        # 跳出循环就是有高电平
        # 记录此时高电平出现时间
        time1 = time.time()  # 时间间隔time1

        # 等待ECHO引脚上高电平结束
        while GPIO.input(pin_echo) == 1:
            if time.time() - s_time > self.time_tol:
                return False
        # 跳出高低ping
        # 记录高电平结束时间
        time2 = time.time()

        # 计算ECHO引脚上高电平持续时间
        during = time2 - time1

        # 计算距离 单位cm
        dis = during * 344 / 2 * 100
        return dis  # 整个函数方法就是用来测距

    def destory(self):
        GPIO.cleanup()


if __name__ == "__main__":

    pin_trig = pin_dic['G20']  # 板子就是3840
    pin_echo = pin_dic['G21']

    GPIO.setmode(GPIO.BOARD)

    m_HC_SR04 = HC_SR04(pin_trig, pin_echo)  # 一个对象及其属性

    try:
        # 主循环
        while True:
            dis = m_HC_SR04.get_distance()
            if dis:
                print('distance: %.2f cm' % (dis))
                print(' ')
            else:
                print("Error")

            time.sleep(1)
    except KeyboardInterrupt:
        print('\n Ctrl + C QUIT')
    finally:
        m_HC_SR04.destory()

引脚文件pin_dic.py

pin_dic = {
           'SDA':3,
           'SLC':5,
           'G4' :7,
           'G17':11,
           'G27':13,
           'G22':15,
           'MOSI':19,
           'MISO':21,
           'SCL':23,
           'IDSD':27,
           'G5':29,
           'G6':31,
           'G13':33,
           'G19':35,
           'G26':37,
           'TXD':8,
           'RXD':10,
           'G18':12,
           'G23':16,
           'G24':18,
           'G25':32,
           'CE0':24,
           'CE1':26,
           'IDSC':28,
           'G12':32,
           'G16':36,
           'G20':38,
           'G21':40}

编写完并保存后打开终端输入以下命令:
python main.py (编译并运行该文件)
在电脑上即可看见运行效果。

四、总结

本次实践项目我负责用树莓派来完成HC-SR04模块的测距部分,此部分较为简单,相当于验证性实验,主要在环境的配置上需要注意,在实验过程中,用Raspberry Pi Imager烧录自带的新版本镜像后,SSH连接始终连接不上,后面到官网下载了旧版本镜像后便解决了问题。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值