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()