树莓派由于有GPIO接口因此相比于普通电脑,可以很方便的操作各种硬件和传感器。在树莓派上使用传感器主要是两个步骤,一是接线,二是写代码。本篇博客就介绍一些树莓派常见传感器的用法。 在进行下文之前,先放一张树莓派3B+的GPIO接口图,以便查阅,图片来自树莓派实验室网站。下文所有接口编号若没有特别说明均采用BOARD编码。 注意接口的编号顺序是将USB接口那一端对着你,然后从上到下和上表对应的,而不是相反的,这个需要注意一下。
其实关于各种传感器的介绍,网上已经有很多了,而且甚至淘宝的详情页介绍的都很全,这里就不介绍了。本博客主要介绍一些实用的东西,即模块的接线和使用。
1.超声波测距传感器
测距传感器有很多种,这里我买的是比较便宜,也比较方便使用的HC-SR04超声波测距模块,可以返回测量的距离,模块如下。
(1)接口与接线
HC-SR04共有4个引脚,分别是Vcc
、Trig
、Echo
和Gnd
。Vcc
是供电口,需要5V电压供电。如果电压过低,模块不能正常工作,测量的数据不对。Gnd
是接地口,Trig
是触发口,Echo
是接收数据的口。
具体接法是Vcc
接树莓派任意5V电压输出口,Gnd
接树莓派任意Gnd
口,Trig
和Echo
分别接树莓派任意的GPIO口即可。我这里Trig
和Echo
分别接到了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.红外避障传感器
红外避障传感器的用途是判断指定的距离范围内是否有障碍物。它也是个测距传感器,但和超声波测距传感器不同的是,它返回的只是True
或False
,它只会判断是否有障碍物,有的话就返回低电平,否则返回高电平。
它不会返回具体的障碍物的距离,只是有没有。模块如下。
(1)接口与接线
它一共有三个接口,分别是Vcc
、Out
、Gnd
,因此按照提示将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)接口与接线
它一共有三个接口,分别是Vcc
、Do
、Gnd
,因此按照提示将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)接口与接线
它一共有三个接口,分别是Vcc
、R
、G
、B
,因此按照提示将Vcc
接到树莓派3.3V或者5V输出接口。R
、G
、B
分别接到任意的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!")
正常运行后,便会得到如下输出结果。
本文作者原创,未经许可不得转载,谢谢配合