树莓派和HSR04设计实现超声波测距模块
1、树莓派系统安装
配置:
设备:树莓派 3B+
SD 卡:闪迪 16GB 内存卡
HDMI 显示器一台
HDMI转VGA线
SD读卡器
系统烧录
可以前去树莓派官网进行下载
树莓派系统镜像官网:
我们需要选择适合我们的树莓派版本的最新版系统镜像,这里我们选择是镜像是:
SD卡格式化
下载好之后我们选择使用 balenaEtcher 跨平台系统烧录工具进行系统烧录,这里我们选择从文件进行烧录
然后选择我们的 SD 卡直接进行烧录即可,这里烧录完成后会有系统完整性检测机制,建议不要跳过,这样能保证我们的系统不出现问题。
烧录成功后,我们插上 SD 卡和显示器,准备好键鼠,就可以开始使用了
换源
首先,我们使用自己的网络连接到树莓派的官方镜像源是很慢的,所以这里我们需要通过换源来提升下载速度,这里首先我们需要下载 vim 作为文件编辑器
编辑 /etc/apt/sources.list 文件
# 打开文件 sources.list
sudo vim /etc/apt/sources.list
修改其中内容:
# 将原文件中所有内容删除,修改为以下内容
deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb http://mirrors.aliyun.com/debian-security/ bullseye-security main
deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main
deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
接着#打开文件 sources.list.d/raspi.list
sudo vim /etc/apt/sources.list.d/raspi.list
将原文件中所有内容删除,修改为以下内容
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
更新
sudo apt-get update
sudo apt-get upgrade
安装 Fcitx 输入法,google 拼音输入法
sudo apt-getinstall fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin
2、树莓派远程连接 —— VNC 配置
这里 VNC 是树莓派自带的,我们并不需要下载
首先打开树莓派的设置,勾选并启用 VNC 相关选项:
这里我们需要开启 SSH 与 VNC 选项
然后我们需要执行命令,打开 VNC,命令如下:
sudo raspi-config
执行命令后,会出现如下画面,这里选择内部设置:
这样我们的 VNC 就已经配置好并启动了
设置 VNC 开机自启动
VNC 每次都要先在树莓派上打开 VNCserver,要不然就有可能无法正常的使用 VNCviewer 连接树莓派,这样太麻烦了,所以需要把 VNCserver 设置为开机自启
首先编辑 VNC-Server 文件
sudo vim /etc/init.d/vncserver
# 将下面的配置信息写道配置文件中
#!/bin/sh
### BEGIN INIT INFO
# Provides: vncserver
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop vncserver
### END INIT INFO
export USER='pi' #用户名 pi
eval cd ~$USER
case "$1" in
start)
# 启动命令行。此处自定义分辨率、控制台号码或其它参数。
su $USER -c '/usr/bin/vncserver -depth 24 -geometry 1024x768 :1'
echo "Starting VNCServer for $USER "
;;
stop)
su $USER -c '/usr/bin/vncserver -kill :1'
echo "VNCServer stopped"
;;
*)
echo "Usage: /etc/init.d/vncserver {start|stop}"
exit 1
;;
esac
exit 0
然后我们对这个文件加上权限:
sudo chmod 755 /etc/init.d/vncserver
注意:只有加完权限之后才可以将它设置为开机自启
最后通过命令设置开机自动启动
sudo update-rc.d vncserver defaults
接下来重启树莓派即可直接使用 VNC 在同一局域网下连接设备
这里虽然设置了 VNC 开机自动启动,但是为了保险,我们还是需要安装 nomachine 或 SSH 用来远程连接
Windows 安装 VNC
这里我们直接官网下载 VNC 安装使用即可,VNC Viewer 官网地址:VNC Viewer
安装完成之后,我们打开 VNC,并添加一个新的连接
这里我们只需要填写 ip 剩下的采用默认设置即可
我们可以通过电脑开热点查看树莓派的ip地址
保存后,点击连接就能看到我们想要的画面了
3、用树莓派3B+和HC-SR04超声波测距模块实现测距
1、材料准备
①树莓派3B+
②杜邦线四根(母对母)
③HC-SR04超声波测距模块
(买DC3.3v-5v这种型号,Vcc去接 3.3v DC 电源)
(如果你买的是DC5v这种型号,Vcc只能接 5v DC 电源,则Echo引脚返回的是 5v信号,由于树莓派的 GPIO口 接收超过 3.3v 的信号可能会被烧毁,因此还需要自己加一个分压电路,太麻烦)
2、树莓派40Pin引脚对照表
3、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高电平持续的时间
4.组件连接
我是这样接的
HC-SR04的Vcc引脚接树莓派的17引脚(3.3v)
HC-SR04的GND引脚接树莓派的39引脚(Ground)
HC-SR04的Trig引脚接树莓派的15引脚(GPIO22)
HC-SR04的Echo引脚接树莓派的11引脚(GPIO17)
5.树莓派上的操作
RPi.GPIO包提供了一个控制树莓派GPIO(General-purpose input/output)的类
test.py
# coding=UTF-8
import RPi.GPIO as GPIO
import time
# 设置警告信息为不输出
GPIO.setwarnings(False)
# 使用BCM针脚编号方式
GPIO.setmode(GPIO.BCM)
# 控制引脚GPIO22
trig = 22
# 接收引脚GPIO17
echo = 17
# 设置trig引脚为输出模式,初始化输出为低电平
GPIO.setup(trig, GPIO.OUT, initial=GPIO.LOW)
# 设置echo引脚为输入模式
GPIO.setup(echo, GPIO.IN)
HIGH = 1
LOW = 0
# 测量函数
def measure():
# 树莓派向trig引脚发送信号,一个持续10us的方波脉冲
GPIO.output(trig, HIGH)
time.sleep(0.00001)
GPIO.output(trig, LOW)
# HC - SR04接收到脉冲信号,开始发送超声波并将Echo引脚置为高电平
# echo引脚之前一直接收低电平信号,一旦收到高电平信号就开始记录时间
while GPIO.input(echo) == LOW:
pass
start = time.time()
# 当 HC-SR04 接收到返回的超声波 时,把Echo引脚置为低电平
# 也就是说echo引脚接收到的高电平结束,终止计时
while GPIO.input(echo) == HIGH:
pass
end = time.time()
# 计算距离,单位厘米,这里的340m/s是超声波在空气中的传播速度
distance = round((end - start)*340/2*100, 2)
print("distance:{0}cm".format(distance))
# 循环测距,间隔为1秒
while True:
measure()
time.sleep(1)
# 清理脚本使用过的 GPIO 通道
GPIO.cleanup()
运行效果如下:
4、总结
树莓派实现测距相较于其他的方式更为简单,难的地方主要在于前期的配置问题,如果配置出错,后面就无法进行。当然出错也是提升我们自身水平的一种的一个标准。