树莓派-5-GPIO的应用

【树莓派4B学习】一、环境搭建、开机及登录树莓派4B
【树莓派4B学习】二、树莓派4B介绍与一些必要的软件安装配置
【树莓派4B学习】三、接入USB摄像头,搭建Python2.7.16+OpenCV3.2.0开发环境
【树莓派4B学习】四、使用USB摄像头和motion实现监控
【树莓派4B学习】五、树莓派4B的OpenCV基本操作
【树莓派4B学习】六、树莓派4BOpenCV的视频/摄像头基本操作
【树莓派4B学习】七、树莓派4B的GPIO基础操作

1 wiringPi和BCM和BOARD编码

1.1 管脚信息

树莓派上提供了一组GPIO(General Purpose Input Output,即通用输入/输出)接口,这些接口可以用于做一些电子相关的实验:控制一些硬件设备,如最常见的发光二极管、电机等,或者读取一些信号的状态,如开关、传感器等。这里需要注意的是,树莓派中的GPIO只支持数字输入输出,即1和0对应高电平3.3V和低电平0V,因此必要的时候可能需要数模转换。

树莓派中执行:
$gpio readall得到关于树莓派管脚的信息
在这里插入图片描述
RXD是Receive Data接收数据的引脚
TXD是Transmit Data发送数据的引脚

比如,BOARD编码中的37号引脚
在wiringPi 中的编码就是25号引脚
在BCM 中的编码就是26号引脚
它们的功能都是GPIO.25(通用输入输出管脚25)

在wiringPi中, 你要使用GPIO.25号管脚, 你就得驱动25
而在BCM中, 你要使用GPIO.25号管脚, 你就得驱动26
在这里插入图片描述

1.2 使用场合

BOARD编码和BCM一般都在python库中使用。

import RPi.GPIO as GPIO  //引入RPi.GPIO库
GPIO.setmode(GPIO.BCM) //设置引脚编号为BCM编码方式;
GPIO.setmode(GPIO.BOARD) //设置GPIO引脚为BOARD编码方式。

而wiringPi一般用于C++等平台。

LIBS += -lwiringPi
#include "wiringPi.h"
wiringPiSetup();

1.3 I2C总线

I2C总线介绍
在这里插入图片描述
SDA----串行数据线----Serial Data Line 
SCL-----串行控制线----Serial Control Line 
通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

SDA在SCL 高电平期间由高电平跳变为低电平,然后由主机发送一个字节的数据.数据传送完毕,由主机发出停止信号,SDA在SCL 高电平期间由低电平跳变为高电平。

1.4 SPI总线

SPI详细解释
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。

(1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;(2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;

2 RPI.GPIO

在这里插入图片描述
在这里插入图片描述

2.1 SDK

Help on package RPi.GPIO in RPi:

NAME
    RPi.GPIO - Copyright (c) 2012-2019 Ben Croston

DESCRIPTION
    Permission is hereby granted, free of charge, to any person obtaining a copy of
    this software and associated documentation files (the "Software"), to deal in
    the Software without restriction, including without limitation the rights to
    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
    of the Software, and to permit persons to whom the Software is furnished to do
    so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.

PACKAGE CONTENTS
CLASSES
    builtins.object
        PWM

    class PWM(builtins.object)
     |  Pulse Width Modulation class
     |
     |  Methods defined here:
     |
     |  ChangeDutyCycle(...)
     |      Change the duty cycle
     |      dutycycle - between 0.0 and 100.0
     |
     |  ChangeFrequency(...)
     |      Change the frequency
     |      frequency - frequency in Hz (freq > 1.0)
     |
     |  __init__(self, /, *args, **kwargs)
     |      Initialize self.  See help(type(self)) for accurate signature.
     |
     |  start(...)
     |      Start software PWM
     |      dutycycle - the duty cycle (0.0 to 100.0)
     |
     |  stop(...)
     |      Stop software PWM
     |
     |  ----------------------------------------------------------------------
     |  Static methods defined here:
     |
     |  __new__(*args, **kwargs) from builtins.type
     |      Create and return a new object.  See help(type) for accurate signature.
FUNCTIONS
    add_event_callback(...)
        Add a callback for an event already defined using add_event_detect()
        channel      - either board pin number or BCM number depending on which mode is set.
        callback     - a callback function

    add_event_detect(...)
        Enable edge detection events for a particular GPIO channel.
        channel      - either board pin number or BCM number depending on which mode is set.
        edge         - RISING, FALLING or BOTH
        [callback]   - A callback function for the event (optional)
        [bouncetime] - Switch bounce timeout in ms for callback

    cleanup(...)
        Clean up by resetting all GPIO channels that have been used by this program to INPUT with no pullup/pulldown and no event detection
        [channel] - individual channel or list/tuple of channels to clean up.  Default - clean every channel that has been used.

    event_detected(...)
        Returns True if an edge has occurred on a given GPIO.  You need to enable edge detection using add_event_detect() first.
        channel - either board pin number or BCM number depending on which mode is set.

    getmode(...)
        Get numbering mode used for channel numbers.
        Returns BOARD, BCM or None

    gpio_function(...)
        Return the current GPIO function (IN, OUT, PWM, SERIAL, I2C, SPI)
        channel - either board pin number or BCM number depending on which mode is set.
    input(...)
        Input from a GPIO channel.  Returns HIGH=1=True or LOW=0=False
        channel - either board pin number or BCM number depending on which mode is set.

    output(...)
        Output to a GPIO channel or list of channels
        channel - either board pin number or BCM number depending on which mode is set.
        value   - 0/1 or False/True or LOW/HIGH

    remove_event_detect(...)
        Remove edge detection for a particular GPIO channel
        channel - either board pin number or BCM number depending on which mode is set.

    setmode(...)
        Set up numbering mode to use for channels.
        BOARD - Use Raspberry Pi board numbers
        BCM   - Use Broadcom GPIO 00..nn numbers

    setup(...)
        Set up a GPIO channel or list of channels with a direction and (optional) pull/up down control
        channel        - either board pin number or BCM number depending on which mode is set.
        direction      - IN or OUT
        [pull_up_down] - PUD_OFF (default), PUD_UP or PUD_DOWN
        [initial]      - Initial value for an output channel

    setwarnings(...)
        Enable or disable warning messages

    wait_for_edge(...)
        Wait for an edge.  Returns the channel number or None on timeout.
        channel      - either board pin number or BCM number depending on which mode is set.
        edge         - RISING, FALLING or BOTH
        [bouncetime] - time allowed between calls to allow for switchbounce
        [timeout]    - timeout in ms

DATA
    BCM = 11
    BOARD = 10
    BOTH = 33
    FALLING = 32
    HARD_PWM = 43
    HIGH = 1
    I2C = 42
    IN = 1
    LOW = 0
    OUT = 0
    PUD_DOWN = 21
    PUD_OFF = 20
    PUD_UP = 22
    RISING = 31
    RPI_INFO = {
    
    'MANUFACTURER': 'Sony', 'P1_REVISION': 3, 'PROCESSOR': 'BC...
    RPI_REVISION = 3
    SERIAL = 40
    SPI = 41
    UNKNOWN = -1
    VERSION = '0.7.0'

FILE
    /usr/lib/python3/dist-packages/RPi/GPIO/__init__.py

2.2 双色LED灯实验

树莓派学习笔记1:python控制双色LED灯
树莓派基础实验1:双色LED灯实验

实现红绿LED 灯交替闪亮,并间隔2秒。
注意:GPIO 输出High 电平为3.3v。
在这里插入图片描述
Board11–R
中间接地
Board12–G

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

pins = {
    
    'pin_R':11, 'pin_G':12}  #引脚字典
sleep_time =2

GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
for i in pins:
	GPIO.setup(pins[i], GPIO.OUT)   # Set pins' mode is output
	GPIO.output(pins[i], GPIO.LOW) # Set pins to low(0V) to off led

def loop():	
	while True:
            GPIO.output(pins['pin_R'], GPIO.HIGH)   # give high
            time.sleep(sleep_time)
            GPIO.output(pins['pin_R'], GPIO.LOW)  # give low
            
            GPIO.output(pins['pin_G'], GPIO.HIGH)  # give high
            time.sleep(sleep_time)
            GPIO.output(pins['pin_G'], GPIO.LOW)
def destroy():
	for i in pins:
		GPIO.output(pins[i], GPIO.LOW)    # Turn off all leds
	GPIO.cleanup()

if __name__ == "__main__":
	try:
		loop()
	except KeyboardInterrupt:
		destroy()

中断ctrl+c。

2.3 温度传感器DS18b20

参考树莓派+温度传感器实现室内温度监控

在这里插入图片描述
(1)允许单总线接口

$ sudo raspi-config
进入interfacing options
enable one-wire interface
重启

(2)完成接线
该模块使用的是单总线数字温度传感器 DS18B20,外界供电电压范围为 3.0 V 至 5.5 V,无需备用电源。
测量温度范围为-55 ° C 至+125 ℃ , 华氏相当于是67 ° F 到 257° F。
其中 -10 °C 至+85 ° C 范围内精度为±0.5 ° C 。

GND-----Board----9
DQ-------Board----7
VCC-----Board----1

(3)升级内核
$ sudo apt-get update
$ sudo apt-get upgrade

2.4 温湿度传感器DHT11

DHT11温湿度传感器编程思路以及代码的实现
树莓派下DHT11温湿度传感器控制程序(python)

利用树莓派连接DHT11读取温湿度
DHT11是一个数字传感器,由两个不同的传感器组成一个封装。该传感器包含一个NTC(负温度系数)温度传感器,一个电阻型湿度传感器和一个8位微控制器,用于转换来自这些传感器的模拟信号并产生数字输出。

NTC(Negative Temperature Coefficient)是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。

DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~50℃。

(2)DHT11和RaspberryPi接线图
将DHT11传感器的VCC和GND引脚连接到RaspberryPi的+5V和GND,然后将传感器的数据输出连接到GPIO4,即RaspberryPi的物理引脚7。

在这里插入图片描述

3 异常及解决

(1)树莓派4B gpio readall 出现Oops - unable to determine board type… model: 17
树莓派使用GPIO接口是基于wiringPi的。
在这里插入图片描述解决方案:
$wget https://project-downloads.drogon.net/wiringpi-latest.deb
#sudo dpkg -i wiringpi-latest.deb
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_20466211/article/details/114135350