一、HC-SR04简介
HC-SR04有4 个引脚, 2 个电源引脚(Vcc 、GND)和 2 个控制引脚(Trig、Echo)
Vcc 和 Gnd 接 3.3v DC 电源,但不推荐用独立电源给它供电,可以接树莓派的引脚给它供电。
Trig 引脚用来接收来自树莓派的控制信号。接任意 GPIO 口。
Echo 引脚用来发送测距结果给树莓派。接任意 GPIO 口。
HC-SR04 的测距过程
- 树莓派向 Trig 脚发送一个持续 10us 的脉冲信号。
- HC-SR04 接收到树莓派发送的脉冲信号,开始发送超声波 ,并把 Echo置为高电平。
- 当 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'] # 板子就是38和40
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连接始终连接不上,后面到官网下载了旧版本镜像后便解决了问题。