树莓派常用传感器使用

Dec 10,2018   4694 words   17 min

Tags: RaspberryPi

树莓派由于有GPIO接口因此相比于普通电脑,可以很方便的操作各种硬件和传感器。在树莓派上使用传感器主要是两个步骤,一是接线,二是写代码。本篇博客就介绍一些树莓派常见传感器的用法。 在进行下文之前,先放一张树莓派3B+的GPIO接口图,以便查阅,图片来自树莓派实验室网站。下文所有接口编号若没有特别说明均采用BOARD编码。 注意接口的编号顺序是将USB接口那一端对着你,然后从上到下和上表对应的,而不是相反的,这个需要注意一下。

其实关于各种传感器的介绍,网上已经有很多了,而且甚至淘宝的详情页介绍的都很全,这里就不介绍了。本博客主要介绍一些实用的东西,即模块的接线和使用。

1.超声波测距传感器

测距传感器有很多种,这里我买的是比较便宜,也比较方便使用的HC-SR04超声波测距模块,可以返回测量的距离,模块如下。

(1)接口与接线

HC-SR04共有4个引脚,分别是VccTrigEchoGndVcc是供电口,需要5V电压供电。如果电压过低,模块不能正常工作,测量的数据不对。Gnd是接地口,Trig是触发口,Echo是接收数据的口。 具体接法是Vcc接树莓派任意5V电压输出口,Gnd接树莓派任意Gnd口,TrigEcho分别接树莓派任意的GPIO口即可。我这里TrigEcho分别接到了7和22。

(2)测试代码

接线完成后,通过下面代码即可进行测试。

# coding=utf-8
import RPi.GPIO as GPIO
import time

Trig_Pin = 7
Echo_Pin = 22


def getDistance():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(Trig_Pin, GPIO.OUT, initial=GPIO.LOW)
    GPIO.setup(Echo_Pin, GPIO.IN)
    GPIO.output(Trig_Pin, GPIO.HIGH)
    time.sleep(0.00015)
    GPIO.output(Trig_Pin, GPIO.LOW)
    while not GPIO.input(Echo_Pin):
        pass
    t1 = time.time()
    while GPIO.input(Echo_Pin):
        pass
    t2 = time.time()
    return (t2 - t1) * 340 * 100 / 2


try:
    while True:
        dis = getDistance()
        print 'Distance:%0.2f cm' % dis
        time.sleep(1)
except KeyboardInterrupt:
    GPIO.cleanup()

正常运行会得到以下输出。

2.红外避障传感器

红外避障传感器的用途是判断指定的距离范围内是否有障碍物。它也是个测距传感器,但和超声波测距传感器不同的是,它返回的只是TrueFalse,它只会判断是否有障碍物,有的话就返回低电平,否则返回高电平。 它不会返回具体的障碍物的距离,只是有没有。模块如下。

(1)接口与接线

它一共有三个接口,分别是VccOutGnd,因此按照提示将Vcc接到树莓派3.3V输出接口,网上说需要5V,但实测接到3.3V也可以正常工作。Gnd接到任意的接地口,Out用于信号输出,接到树莓派任意的GPIO口。这里我接到了35号GPIO口。 距离阈值可以通过模块上的蓝色小方块调节。

(2)测试代码
# coding=utf-8
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
# 定义引脚
GPIO_PIN = 35
# 设置引脚为输入
GPIO.setup(GPIO_PIN, GPIO.IN)

while True:
    # 当有障碍物时,传感器输出低电平,所以检测低电平
    if GPIO.input(GPIO_PIN) == 0:
        print "obstacle"
        time.sleep(1)
    else:
        print "ok"
        time.sleep(1)

正常运行会得到以下输出。

3.震动传感器

常闭型传感器,作用就是检测震动,震动时电路接通,平时电路不通,模块如下。

(1)接口与接线

它一共有三个接口,分别是VccDoGnd,因此按照提示将Vcc接到树莓派3.3V输出接口。Gnd接到任意的接地口,Do用于信号输出,接到树莓派任意的GPIO口。这里我接到了32号GPIO口。 敏感度可以通过模块上的蓝色小方块调节。

(2)测试代码
# coding=utf-8
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
# 定义引脚
GPIO_PIN = 32
GPIO.setup(GPIO_PIN, GPIO.IN)

while True:
    if GPIO.input(GPIO_PIN) == 1:
        print "shake"
        time.sleep(1)
    else:
        print "ok"
        time.sleep(1)

正常运行结果如下。

4.RGB彩灯

就是分别有红绿蓝三种不同颜色的LED灯,通过PWM调节,可以调节三个灯的亮度,进而混合出多种颜色,如下。

(1)接口与接线

它一共有三个接口,分别是VccRGB,因此按照提示将Vcc接到树莓派3.3V或者5V输出接口。RGB分别接到任意的GPIO口即可。这里我分别接到了40、38、36接口。

(2)测试代码
# coding=utf-8
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

R, G, B = 40, 38, 36

GPIO.setup(R, GPIO.OUT)
GPIO.setup(G, GPIO.OUT)
GPIO.setup(B, GPIO.OUT)

pwmR = GPIO.PWM(R, 70)
pwmG = GPIO.PWM(G, 70)
pwmB = GPIO.PWM(B, 70)

pwmR.start(0)
pwmG.start(0)
pwmB.start(0)

t = 0.4
for i in range(3):

    print "loop " + (i + 1).__str__() + "/3"

    # 红色灯全亮,蓝灯,绿灯全暗(红色)
    pwmR.ChangeDutyCycle(0)
    pwmG.ChangeDutyCycle(100)
    pwmB.ChangeDutyCycle(100)
    time.sleep(t)

    # 绿色灯全亮,红灯,蓝灯全暗(绿色)
    pwmR.ChangeDutyCycle(100)
    pwmG.ChangeDutyCycle(0)
    pwmB.ChangeDutyCycle(100)
    time.sleep(t)

    # 蓝色灯全亮,红灯,绿灯全暗(蓝色)
    pwmR.ChangeDutyCycle(100)
    pwmG.ChangeDutyCycle(100)
    pwmB.ChangeDutyCycle(0)
    time.sleep(t)

    # 红灯,绿灯全亮,蓝灯全暗(黄色)
    pwmR.ChangeDutyCycle(0)
    pwmG.ChangeDutyCycle(0)
    pwmB.ChangeDutyCycle(100)
    time.sleep(t)

    # 红灯,蓝灯全亮,绿灯全暗(洋红色)
    pwmR.ChangeDutyCycle(0)
    pwmG.ChangeDutyCycle(100)
    pwmB.ChangeDutyCycle(0)
    time.sleep(t)

    # 绿灯,蓝灯全亮,红灯全暗(青色)
    pwmR.ChangeDutyCycle(100)
    pwmG.ChangeDutyCycle(0)
    pwmB.ChangeDutyCycle(0)
    time.sleep(t)

    # 红灯,绿灯,蓝灯全亮(白色)
    pwmR.ChangeDutyCycle(0)
    pwmG.ChangeDutyCycle(0)
    pwmB.ChangeDutyCycle(0)
    time.sleep(t)

    # 调整红绿蓝LED的各个颜色的亮度组合出各种颜色
    for i in range(0, 101, 1):
        pwmR.ChangeDutyCycle(i)
        time.sleep(0.02)

    for i in range(100, -1, -1):
        pwmR.ChangeDutyCycle(i)
        time.sleep(0.02)

    for i in range(0, 101, 1):
        pwmG.ChangeDutyCycle(i)
        time.sleep(0.02)

    for i in range(100, -1, -1):
        pwmG.ChangeDutyCycle(i)
        time.sleep(0.02)

    for i in range(0, 101, 1):
        pwmB.ChangeDutyCycle(i)
        time.sleep(0.02)

    for i in range(100, -1, -1):
        pwmB.ChangeDutyCycle(i)
        time.sleep(0.02)

    for i in range(0, 101, 1):
        pwmB.ChangeDutyCycle(i)
        pwmG.ChangeDutyCycle(i)
        pwmR.ChangeDutyCycle(i)
        time.sleep(0.02)

    for i in range(100, -1, -1):
        pwmB.ChangeDutyCycle(i)
        pwmG.ChangeDutyCycle(i)
        pwmR.ChangeDutyCycle(i)
        time.sleep(0.02)

pwmR.stop()
pwmG.stop()
pwmB.stop()

GPIO.cleanup()

正常运行即可打开LED灯并且实现变色,循环3次然后自动关闭。

5.温度传感器

温度传感器的作用就是测量温度,我买的是DHT22温湿度传感器,既可以测量温度,也可以测量湿度。相比于DHT11,DHT22更加准确。

(1)接口与接线

它的接口和上面的很类似,一个Vcc,一个Gnd,还有一个Out输出口,所以看名字也就知道应该怎么接了。电源接5V或3.3V都可以,Out接任意GPIO口,Gnd接树莓派任意Gnd接口。模块如下。

(2)测试代码

为了获取传感器数据,使用一个叫做AdaFruit的库,这个库在Github上,因此需要简单安装一下。在终端中输入以下命令。

git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install

这样安装完成即可正常使用。测试代码如下。

# coding=utf-8
import Adafruit_DHT
import time
# 定义sensor型号为DHT22
sensor = Adafruit_DHT.DHT22
# BCM number
pin = 26
# 循环
while True:
	try:
		hu, temp = Adafruit_DHT.read_retry(sensor, pin)
		print('temperature:{0:0.1f}°C humidity:{1:0.1f}%'.format(temp,hu))
		time.sleep(2)
	except RuntimeError as e:
		print("error\n{0}".format(e))
	except:
		print("error\nFailed to read sensor data!")

正常运行后,便会得到如下输出结果。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部