一. 摄像头模块
安装摄像头
我使用的是CSI视频接口的摄像头,500万像素,实图如下
摄像头的排线如下,需要将有金属条纹的一面(左图)朝向树莓派的HDMI接口,具有蓝色胶带的一面(右图)朝向USB接口
具体连接方式可参考下图
使树莓派支持摄像头
sudo raspi-config
选择Interface Options选项
选择Camera选项
选择Yes
完成配置
需要重启
测试
拍照:以下命令将使树莓派拍摄一张照片,命名为image.jpg,保存到当前目录下
raspistill -o image.jpg
录像:以下命令使树莓派拍摄一段5000毫秒的视频,命名为video.h264,保存到当前目录下
raspivid -o video.h264 -t 5000
raspivid 的输出是一段未压缩且不含声音的 H.264 视频流,可以使用gpac将其转为常用的mp4格式,以便播放
安装gpac
sudo apt install gpac -y
将上述video.h264视频转换为video.mp4,帧率为24
MP4Box -fps 24 -add video.h264 video.mp4
通过网页查看视频输出
使用motion可以实现简单的远程视频监控
安装motion
sudo apt install motion -y
编辑/etc/default/motion文件,开启守护进程
sudo nano /etc/default/motion
编辑/etc/motion/motion.conf文件
sudo nano /etc/motion/motion.conf
以下仅列出部分配置,详细的配置文档见Motion - Config File Options
#将deamon off 改成 deamon on
deamon on
#设置视频分辨率
width 800
height 600
#视频帧率
framerate 24
stream_maxrate 30
#允许非本机访问总控制页面
webcontrol_localhost off
#允许非本机查看视频监控
stream_localhost off
启动motion
sudo systemctl start motion
sudo motion
打开浏览器,输入如下url查看视频输出
http://树莓派IP:8080/
或
http://树莓派IP:8081/
结束motion进程
sudo killall -TERM motion
二. HC-SR04超声波模块
HC-SR04实图如下,其有四个引脚,分别为Vcc、Trig、Echo、End
HC-SR04模块具体参数如下图(淘宝)
HC-SR04模块的工作原理
(1)树莓派向 Trig 脚发送一个 10us 的脉冲信号。
(2) HC-SR04 接收到信号,开始发送超声波,并把 Echo置为高电平,然后准备接收返回的超声波。
(3) HC-SR04 接收到返回的超声波,把 Echo 置为低电平。
(4)Echo 高电平持续的时间就是超声波从发射到返回的时间间隔。
(5)计算距离:
距离(单位:m) = (startTime - endTime) * 声波速度 / 2
声波速度取 343m/s 。
接线
HC-SR04只有4个引脚,接线比较简单,具体见下表
HC-SR04引脚 | 树莓派GPIO(BCM编码) | 说明 |
---|---|---|
Vcc | - | 5v电源,可直接用树莓派供电 |
Gnd | - | 接地 |
Trig | 任意GPIO,我使用的是GPIO5 | 接收树莓派控制信号 |
Echo | 任意GPIO,我使用的是GPIO6 | 返回测距信息 |
代码
#导入 GPIO库
import RPi.GPIO as GPIO
import time
#设置 GPIO 模式为 BCM
GPIO.setmode(GPIO.BCM)
#定义 GPIO 引脚使用BCM编码
TRIG = 5
ECHO = 6
#设置 GPIO 的工作方式 (IN / OUT)
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
# 获取距离信息
def getDistance():
# 向Trig引脚发送10us的脉冲信号
GPIO.output(TRIG, GPIO.HIGH)
time.sleep(0.00001)
GPIO.output(TRIG, GPIO.LOW)
# 开始发送超声波的时刻
while GPIO.input(ECHO)==0:
pass
startTime=time.time()
# 收到返回超声波的时刻
while GPIO.input(ECHO)==1:
pass
endTime=time.time()
# 计算距离 距离=(声波的往返时间*声速)/2
timeDelta = endTime - startTime
distance = (timeDelta * 34300) / 2
return distance
if __name__ == '__main__':
try:
while True:
dist = getDistance()
print("Distance = {:.2f} cm".format(dist))
time.sleep(1) # 每间隔1秒测量一次
except KeyboardInterrupt:
print("Stopped")
GPIO.cleanup()
运行结果
评论(0)
您还未登录,请登录后发表或查看评论