03_快速入门
gpio介绍
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。
既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。
frizting使用
在Fritzing的世界里你的灵感和创意会立刻呈现,电路设计也将变得美丽而简单!
下载地址:http://fritzing.org/download/
RPI.GPIO使用
参考手册地址:https://sourceforge.net/p/raspberry-gpio-python/wiki/Home/
若出现Unable to determine hardware version则更新wiringpi-python库
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | sudo apt-get install swig2.0 python-dev
git clone --recursive https://github.com/neuralpi/WiringPi-Python.git
cd WiringPi-Python/WiringPi
sudo ./build
cd ..
swig2.0 -python wiringpi.i
sudo python setup.py install
sudo python3 setup.py install
|
1. 点亮led灯
示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 | # -*- coding:UTF-8 -*-
"""
点亮单个led
"""
import RPi.GPIO as GPIO
import time
# 设置编码模式
GPIO.setmode(GPIO.BCM)
# 设置警告
GPIO.setwarnings(False)
# 定义使用16号引脚控制led
led_bcm16=16
# 程序初始化
def init():
# 将引脚初始默认状态
GPIO.cleanup()
# 初始化16引脚模式
GPIO.setup(led_bcm16,GPIO.OUT,initial=GPIO.LOW)
print("程序已经启动啦!")
# 程序运行函数
def run():
init()
# 2.5s之后点亮led
print("2.5s之后点亮led")
time.sleep(2.5)
GPIO.output(led_bcm16,GPIO.HIGH);
# 让程序始终处于运行的状态
while True:
pass
# 将程序跑起来
run()
|
2. 跑马灯
示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 | #-*- coding:UTF-8 -*-
"""
跑马灯教程
"""
import RPi.GPIO as GPIO
import time
# 设置端口编码模式
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# 定义端口
ledlist=[16,20,21]
# 初始化函数
def led_init():
GPIO.cleanup()
for num in ledlist:
GPIO.setup(num, GPIO.OUT, initial=GPIO.LOW);
print("led初始化完成:",num)
led_init()
def run():
count=0
# 程序始终运行
while True:
# 先将所有的灯都熄灭
for index in ledlist:
print(index)
GPIO.output(index, GPIO.LOW)
# 按照计数索引点灯
curr_index = ledlist[count%len(ledlist)]
GPIO.output(curr_index, GPIO.HIGH)
# 计数要累加
count = count+1
time.sleep(0.5)
run()
GPIO.cleanup()
|
3. 开关控制led
代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 | #-*- coding:UTF-8 -*-
"""
开关的使用
"""
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
bcm16 = 16
bcm21 = 21
def btn_init():
GPIO.cleanup()
GPIO.setup(bcm16,GPIO.OUT,initial=GPIO.LOW);
# 按钮连接的GPIO针脚的模式设置为信号输入模式,同时默认拉高GPIO口电平,
# 当GND没有被接通时,GPIO口处于高电平状态,取的的值为1
# 注意到这是一个可选项,如果不在程序里面设置,通常的做法是通过一个上拉电阻连接到VCC上使之默认保持高电平
GPIO.setup(bcm21, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def run():
btn_init()
while True:
if GPIO.input(bcm21) ==0 :
GPIO.output(bcm16,GPIO.HIGH);
print("低电平")
time.sleep(1)
else:
GPIO.output(bcm16,GPIO.LOW);
print("高电平")
time.sleep(1)
try:
run()
finally:
GPIO.cleanup()
|
4. 红外感应灯
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 | #-*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
"""
演示红外传感器的使用
"""
# 设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)
# 忽略警告信息
GPIO.setwarnings(False)
# 定义红外数据接收引脚
# 输出端:控制led亮灭
bcm16 = 16
# 输入端:读取人体感应传感器状态
bcm21 = 21
def infrared_init():
GPIO.cleanup()
# 初始化引脚
GPIO.setup(bcm21,GPIO.IN,pull_up_down=GPIO.PUD_DOWN);
GPIO.setup(bcm16,GPIO.OUT,initial=GPIO.LOW);
print("人体感应灯已经启动起来...")
def run():
while True:
if GPIO.input(bcm21) == 1:
curtime = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))
print(curtime)
GPIO.output(bcm16,GPIO.HIGH)
time.sleep(3)
GPIO.output(bcm16,GPIO.LOW)
else:
pass
try:
infrared_init()
run()
finally:
# 引脚清理
GPIO.cleanup()
print("程序执行完成")
|
5. 超声波测距
示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 | #-*- coding:UTF-8 -*-
"""
超声波传感器的使用
"""
import RPi.GPIO as GPIO
import time
# 信号发出引脚
bcm16_tri = 16
# 信号接收引脚
bcm20_echo = 20
# 开关引脚
bcm21 = 21
# 超声波测距函数
def get_distance():
GPIO.output(bcm16_tri, GPIO.HIGH)
time.sleep(0.000015)
GPIO.output(bcm16_tri, GPIO.LOW)
print("发送已经完成")
while not GPIO.input(bcm20_echo):
pass
t1 = time.time()
while GPIO.input(bcm20_echo):
pass
t2 = time.time()
print("distance is %d cm" % (((t2 - t1) * 340 / 2) * 100))
time.sleep(0.01)
return ((t2 - t1) * 340 / 2) * 100
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
def init():
GPIO.cleanup()
# 按钮连接的GPIO针脚的模式设置为信号输入模式,同时默认拉高GPIO口电平,
# 当GND没有被接通时,GPIO口处于高电平状态,取的的值为1
# 注意到这是一个可选项,如果不在程序里面设置,通常的做法是通过一个上拉电阻连接到VCC上使之默认保持高电平
GPIO.setup(bcm21, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(bcm16_tri, GPIO.OUT,initial=GPIO.LOW);
GPIO.setup(bcm20_echo, GPIO.IN)
# 运行
def run():
while True:
# 监听开关的状态
if GPIO.input(bcm21) ==0 :
get_distance();
print("低电平")
time.sleep(1)
else:
print("高电平")
time.sleep(1)
# 程序启动
try:
init();
run();
finally:
GPIO.cleanup()
|