一. 摄像头模块

安装摄像头

我使用的是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()

运行结果