DIY树莓派小车(二)树莓派4B安装并使用摄像头和超声波模块

一. 摄像头模块

安装摄像头

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

运行结果

参考树莓派3B–超声波测距(HC-SR04)的使用

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Python开发树莓派4B超声波避障小车时,你可以使用以下例代码: ```python import RPi.GPIO as GPIO import time # 设置GPIO模式为BCM GPIO.setmode(GPIO.BCM) # 定义超声波的引脚 TRIG_PIN = 23 ECHO_PIN = 24 # 定义电机的引脚 IN1_PIN = 17 IN2_PIN = 27 IN3_PIN = 22 IN4_PIN = 10 # 设置引脚为输入或输出 GPIO.setup(TRIG_PIN, GPIO.OUT) GPIO.setup(ECHO_PIN, GPIO.IN) GPIO.setup(IN1_PIN, GPIO.OUT) GPIO.setup(IN2_PIN, GPIO.OUT) GPIO.setup(IN3_PIN, GPIO.OUT) GPIO.setup(IN4_PIN, GPIO.OUT) def get_distance(): # 发送超声波信号 GPIO.output(TRIG_PIN, GPIO.HIGH) time.sleep(0.0001) GPIO.output(TRIG_PIN, GPIO.LOW) # 监听回波 while GPIO.input(ECHO_PIN) == GPIO.LOW: pulse_start = time.time() while GPIO.input(ECHO_PIN) == GPIO.HIGH: pulse_end = time.time() # 计算距离(单位:厘米) pulse_duration = pulse_end - pulse_start distance = pulse_duration * 17150 distance = round(distance, 2) return distance def stop(): GPIO.output(IN1_PIN, GPIO.LOW) GPIO.output(IN2_PIN, GPIO.LOW) GPIO.output(IN3_PIN, GPIO.LOW) GPIO.output(IN4_PIN, GPIO.LOW) def forward(): GPIO.output(IN1_PIN, GPIO.HIGH) GPIO.output(IN2_PIN, GPIO.LOW) GPIO.output(IN3_PIN, GPIO.HIGH) GPIO.output(IN4_PIN, GPIO.LOW) def backward(): GPIO.output(IN1_PIN, GPIO.LOW) GPIO.output(IN2_PIN, GPIO.HIGH) GPIO.output(IN3_PIN, GPIO.LOW) GPIO.output(IN4_PIN, GPIO.HIGH) def turn_left(): GPIO.output(IN1_PIN, GPIO.LOW) GPIO.output(IN2_PIN, GPIO.HIGH) GPIO.output(IN3_PIN, GPIO.HIGH) GPIO.output(IN4_PIN, GPIO.LOW) def turn_right(): GPIO.output(IN1_PIN, GPIO.HIGH) GPIO.output(IN2_PIN, GPIO.LOW) GPIO.output(IN3_PIN, GPIO.LOW) GPIO.output(IN4_PIN, GPIO.HIGH) try: while True: # 获取距离 dist = get_distance() print("Distance: {} cm".format(dist)) # 判断是否需要避障 if dist < 20: # 停止小车的运动 stop() else: # 小车继续前进 forward() time.sleep(0.1) except KeyboardInterrupt: # 清理GPIO设置 GPIO.cleanup() ``` 这段代码使用了RPi.GPIO库来控制树莓派的GPIO引脚。在代码中,首先设置了超声波传感器和电机的引脚。然后,定义了一些控制电机运动的函数:`stop()`、`forward()`、`backward()`、`turn_left()`和`turn_right()`。在主循环中,通过调用`get_distance()`获取当前距离,并根据距离判断是否需要避障。如果距离小于20厘米,调用`stop()`函数停止小车的运动,否则调用`forward()`函数使小车前进。你可以根据实际情况,修改这些函数中的引脚设置以适配你的硬件。最后,通过捕获`KeyboardInterrupt`异常,在程序退出前进行GPIO的清理工作。 请注意,具体的小车控制代码因硬件和具体需求而异,上述代码只是一个示例,你需要根据你的实际情况进行相应的修改和适配。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值