树莓派GPIO控制

2023-05-16

树莓派GPIO控制

陈拓  2018.06.09/2018.06.10

0.  概述

本文介绍树莓派 Zero W的GPIO控制,并用LED看效果。也适宜于树莓派3B+。

0.1 树莓派GPIO编号方式

  • 功能物理引脚

从左到右,从上到下:左边奇数,右边偶数:1-40

  • BCM

编号侧重CPU寄存器,根据BCM2835的GPIO寄存器编号。

  • wiringPi

编号侧重实现逻辑,把扩展GPIO端口从0开始编号,这种编号方便编程。如图 WiringPi一栏。

操作GPIO时一定先要清楚使用那一套编号。

1.  准备

1.1 硬件

  • 树莓派Pi Zero W
  • LED3mm5mm
  • 1KΩ电阻
  • 杜邦线3根
  • 电脑(我用Windows 7)

1.2 GPIO接口

1.3 接线

首先我们把LED和树莓派连接。LED的正极串联一个1KΩ电阻接树莓派的GPIO18(pin12),负极接地。

这个图是用Fritzing画的。

2.  测试

2.1 连接电脑和树莓派

用putty连接电脑和树莓派3B+(或者Pi Zero W),看本文最后的参考文档Host Nameraspberrypi.local,端口22,用户名pi,密码raspberry

注意:boot分区有一个名为ssh的空文本文件,这个ssh文件容易丢失,如果ssh不能登录了,先检查ssh是否丢失。

2.2 用Shell命令直接控制GPIO

  • 使GPIO18从内核空间暴露到用户空间中

pi@raspberrypi:~ $ sudo echo 18 >/sys/class/gpio/export

> 是IO重定向符号,IO重定向是指改变linux标准输入和输出的默认设备,指向一个用户定义的设备。echo 18 > export就是把18写入到export文件中。

执行该操作之后,/sys/class/gpio目录下会增加一个gpio18文件夹。

  • 查看GPIO18引脚(在Liunx中设备都以文件的形式,引脚也是设备)

pi@raspberrypi:~ $ cd/sys/class/gpio/gpio18

pi@raspberrypi:/sys/class/gpio/gpio18 $ ls

  • 设置GPIO18为输出模式

pi@raspberrypi:/sys/class/gpio/gpio18 $sudo echo out > direction

  • 向value文件中输入1,GPIO输出高电平,LED点亮

pi@raspberrypi:/sys/class/gpio/gpio18 $sudo echo 1 > value

  • 向value文件中输入0,GPIO输出低电平,LED熄灭

pi@raspberrypi:/sys/class/gpio/gpio18 $sudo echo 0 > value

  • 返回家目录

pi@raspberrypi:/sys/class/gpio $ cd ~

  • 注销GPIO18接口

pi@raspberrypi:~ $ sudo echo 18 > /sys/class/gpio/unexport

2.3 用Shell脚本控制GPIO

  • 新建一个名为ledonoff.sh的脚本。

pi@raspberrypi:~ $sudo nano ledonoff.sh

脚本写下面的内容:

echo $1 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio$1/direction

echo 1 > /sys/class/gpio/gpio$1/value

sleep 5   #延时5

echo 0 > /sys/class/gpio/gpio$1/value

echo $1 > /sys/class/gpio/unexport

说明:shell脚本可传入参数,例如$1代表第1个参数,$2代表第2个参数,以此类推。

  • 为ledonoff.sh添加可执行权限

pi@raspberrypi:~ $ sudo chmod +xledonoff.sh

  • 运行脚本

pi@raspberrypi:~ $ sudo ./ledonoff.sh 18

运行结果:LED点亮,持续5秒钟关闭。

2.4 用Python通过PRI.GPIO命令控制GPIO

用Python控制GPIO,最便捷的方法就是使用python类库,比如树莓派系统本身集成的RPi.GPIO。

在putty的ssh终端输入命令:

  • 进入python交互界面

pi@raspberrypi:~ $ python

>>> 这是python的提示符。

  • 导入python类库RPi.GPIO,命名为别名为GPIO

>>> import RPi.GPIO as GPIO

引入之后,就可以使用 GPIO 模块的函数了。

  • 设置BOARD编码方式,基于BCM

树莓派3 GPIO有三种编码方式:物理引脚BOARD编码,BCM编码,以及 wiringPi 编码。

>>> GPIO.setmode(GPIO.BCM)

  • 输出模式

>>> GPIO.setup(18,GPIO.OUT)

  • GPIO18输出高电平,LED点亮

>>> GPIO.output(18,GPIO.HIGH)

  • GPIO18输出低电平,LED熄灭

>>> GPIO.output(18,GPIO.LOW)

  • 用完后进行清理

>>> GPIO.cleanup()

  • 退出python交互界面

>>> Ctrl+D

2.5 用Python脚本控制GPIO

  • 新建一个名为blinky.py的脚本。

pi@raspberrypi:~ $sudo nano blinky.py

脚本写下面的内容:

import RPi.GPIO as GPIO

import time

GPIO.setmode(GPIO.BCM)

GPIO.setup(18,GPIO.OUT)

while True:

   GPIO.output(18,GPIO.HIGH)

   time.sleep(1)

   GPIO.output(18,GPIO.LOW)

   time.sleep(1)

GPIO.cleanup()

说明:while True下面的循环体要缩进,用空格或Tab(但不能混用)键缩进就行。

  • 为blinky.py添加可执行权限

pi@raspberrypi:~ $ sudo chmod +x blinky.py

  • 运行Python脚本

pi@raspberrypi:~ $ sudo python blinky.py

LED闪烁。

  • 停止运行

用 Ctrl+C 来中断循环。

3.  借助wiringPi GPIO用C语言控制GPIO

树莓派内核中已经编译自带了gpio的驱动,我们常通过一些第三方写好的库函数来完成具体的操作,比较常见的操作库函数有:

  • Python GPIO

Python GPIO已经集成到了树莓派内核,为树莓派官方资料中推荐且容易上手。python GPIO是一个小型的python库,可以帮助用户完成raspberry相关IO口操作,但是python GPIO库还没有支持SPI、I2C或者1-wire等总线接口。

常见C语言库有:

  • wiringPi (http://wiringpi.com/)

wiringPi适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。作者给出了大量的说明和示例代码,这些示例代码也包括UART设备,I2C设备和SPI设备等。

  • BCM2835 C Library (http://www.airspayce.com/mikem/bcm2835/)

BCM2835 C Library可以理解为使用C语言实现的相关底层驱动,BCM2835C Library的驱动库包括GPIO. SPI和UART等,可以通过学习BCM2835 C Library熟悉BCM2835相关的寄存器操作。如果有机会开发树莓派上的linux驱动,或自主开发python或PHP扩展驱动,可以从BCM2835 C Library找到不少的“灵感”。

3.1 WiringPi GPIO安装

WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3。wiringPi使用C或者C++开发并且可以被其他语言包转,例如python、ruby或者PHP等。

wiringPi包括一套gpio控制命令,使用gpio命令可以控制树莓派GPIO管脚。用户可以利用gpio命令通过shell脚本控制或查询GPIO管脚。

  • wiringPi安装

更新列表:

pi@raspberrypi:~ $sudo apt-get update

更新软件:

pi@raspberrypi:~ $sudo apt-get upgrade

安装:

pi@raspberrypi:~ $sudo apt-get install wiringpi

  • 测试

wiringPi包括一套gpio命令,使用gpio命令可以控制树莓派上的各种接口,通过以下指令可以测试wiringPi是否安装成功。

pi@raspberrypi:~ $ gpio -v

  • 查看GPIO图

pi@raspberrypi:~ $ gpio readall

3.2 编写代码

  • 新建一个名为led_blink.c的源程序

pi@raspberrypi:~ $sudo nano led_blink.c

  • 内容如下

#include <wiringPi.h>

int main(void) {

   wiringPiSetup();

   pinMode (1, OUTPUT);

   for(;;) {

       digitalWrite(1, HIGH);delay (500);

       digitalWrite(1, LOW);delay (500) ;

    }

}

说明:看看上一小节的图,BCM编号的GPIO18引脚在wiringPi编号中是1。

3.3 编译运行

  • 编译

pi@raspberrypi:~ $ gcc led_blink.c -oled_blink -l wiringPi

-l wiringPi表示动态加载wiringPi共享库。

  • 运行

pi@raspberrypi:~ $ sudo ./led_blink

用 Ctrl+C 来中断循环。

4.  借助BCM2835 C Library用C语言控制GPIO

4.1 下载安装

先看看最新版本:http://www.airspayce.com/mikem/bcm2835

  • 下载bcm2835-1.56.tar.gz

pi@raspberrypi:~ $ wgethttp://www.airspayce.com/mikem/bcm2835/bcm2835-1.56.tar.gz

  • 解压缩

pi@raspberrypi:~ $ tar xvzfbcm2835-1.56.tar.gz

  • 配置编译

进入压缩之后的目录:

pi@raspberrypi:~ $ cd bcm2835-1.56

执行配置命令:

pi@raspberrypi:~/bcm2835-1.56 $ ./configure

pi@raspberrypi:~/bcm2835-1.56 $ make

  • 执行检查

pi@raspberrypi:~/bcm2835-1.56 $ sudo makecheck

  • 安装bcm2835库:

pi@raspberrypi:~/bcm2835-1.56 $ sudo makeinstall

4.2 编写代码

  • 新建一个名为blink_led.c的源程序

pi@raspberrypi:~/bcm2835-1.56$ cd ~

pi@raspberrypi:~ $sudo nano blink_led.c

  • 内容如下

#include <bcm2835.h>

#define PIN RPI_GPIO_P1_12

int main(int argc, char **argv) {

   if (!bcm2835_init())

       return 1;

   bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);

   while (1) {

       bcm2835_gpio_write(PIN, HIGH);

       bcm2835_delay(500);

       bcm2835_gpio_write(PIN, LOW);

       bcm2835_delay(500);

    }

   bcm2835_close();

   return 0;

}

说明:GPIO的编号方式不同,采用PCB板的物理接口编号,led连在树莓派Zero W板子的12引脚上。

4.3 编译运行

  • 编译

pi@raspberrypi:~ $ gcc blink_led.c -oblink_led -l bcm2835

-l bcm2835表示动态加载bcm2835共享库

  • 运行

sudo ./blink_led

用 Ctrl+C 来中断循环。

5. 用Node.js控制GPIO

见《树莓派连接阿里云物联网平台-属性(nodejs)》

https://blog.csdn.net/chentuo2000/article/details/103705694

6. 引脚复用

通过设置改变引脚的功能,见参考文档“树莓派Zero W添加音频输出”。

参考文档

1. 树莓派介绍 树莓派介绍_晨之清风-CSDN博客_树莓派简介

2. 电脑连接树莓派Zero W 电脑连接树莓派Zero W_晨之清风-CSDN博客_树莓派zerow

3. 电脑连接树莓派3B+ 电脑连接树莓派3B+_晨之清风-CSDN博客_电脑连接树莓派3b

4. 树莓派Zero W+温度传感器DS18B20 树莓派+温度传感器DS18B20_晨之清风-CSDN博客_树莓派 温度传感器

5. 树莓派Zero W添加音频输出 树莓派Zero W添加音频输出_晨之清风-CSDN博客_树莓派 音频

6. 树莓派GPIO控制--C语言篇树莓派GPIO控制--C语言篇_hu7850的博客-CSDN博客_树莓派c语言控制gpio

7. 远程控制通讯——基于树莓派 Python gpiozero 远程控制LED灯并返回控制结果https://blog.csdn.net/NCTU_to_prove_safety/article/details/65446454

8. RPi Low-level peripherals
https://elinux.org/RPi_Low-level_peripherals

9. 樹莓派+溫度感測器實現室內溫度監控:http://shumeipai.nxez.com/2013/10/03/raspberry-pi-temperature-sensor-monitors.html

10. Raspberry Pi Temperature Sensor
http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派GPIO控制 的相关文章

  • (五)GPIO标准接口函数

    目录 一 什么是GPIO的标准接口函数二 GPIO标准接口函数三 GPIO口号四 出错的解决方法 xff1a 五 编译内核出错 一 什么是GPIO的标准接口函数 前面访问GPIO的方法 xff1a request mem region 申请
  • mt6762添加gpio按键方法与问题调试

    mt6762添加gpio按键方法与问题调试 1 配置dts文件 xff0e 定义gpio87为拍照键 对于keycode 61 212 gpio keys gpio keys compatible 61 34 gpio keys 34 in
  • DSP中GPIO位域

    在TMS320F2812中 xff0c 对于程序中寄存器的名称是如何映射到物理地址的 xff0c 这里做一下详细的讲解 主要应用到三个文件 xff1a CMD h DSP28 GLobalVariableDefs c xff0c 其中CMD
  • STM32Cube STM32L053配置GPIO达到最低功耗详解含测量实际电流值

    外部有上拉电阻 xff0c 设置输入模式 xff0c 此模式最省电 设置输入模式 GPIO InitStruct Mode 61 GPIO MODE INPUT GPIO InitStruct Pull 61 GPIO NOPULL 外部有
  • GPIO实验

    一 GPIO简介 GPIO xff08 General purpose input output xff09 即通用型输入输出 xff0c GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连 xff0c 从而实
  • TX2/Xavier Linux GPIO 计算

    目录 Linux GPIO子系统TX2 Linux GPIO计算Xavier Linux GPIO计算参考用C快捷计算TX2 Linux GPIO用C快捷计算Xavier Linux GPIODebug微信公众号 Linux GPIO子系统
  • NVIDIA Jetson Xavier NX 控制GPIO

    NVIDIA Jetson Xavier NX 控制GPIO 文章目录 NVIDIA Jetson Xavier NX 控制GPIO前言一 简介二 代码实例1 gpio h2 gpio cpp 三 拓展 前言 在linux系统中以文件io的
  • 28335之GPIO输入

    include 34 DSP2833x Device h 34 include 34 DSP2833x Examples h 34 define LED GpioDataRegs GPADAT bit GPIO0 GPIO配置函数 void
  • jetson nano GPIO控制说明

    文章目录 一 GPIO介绍二 安装GPIO库python库C 43 43 库 三 几种常用的通信协议UARTPWMI2CI2SSPI 四 控制函数说明python xff08 参考 https pypi org project Jetson
  • RT-Thread记录(十三、I/O 设备模型之PIN设备)

    讲完UART设备之后 我们已经熟悉RT Thread I O 设备模型了 回头看看基本的 PIN 设备 目录 前言 一 PIN 设备模型解析 1 1 初识 GPIO 操作函数 1 2 PIN 设备框架 1 3 PIN 设备驱动框架层 实现的
  • 品味树莓派:GPIO口定义、电气特性、启动状态等基础说明

    文章目录 目录 GPIO口定义 电气特性 启动状态 总结 目录 树莓派相比成品化的电脑来说有很多独立的GPIO口可供开发使用 可以方便的实现很多实物相关的功能 本文将对树莓派开放给用户的GPIO口的针脚定义 电气特性 启动状态等基础内容做个
  • STM32F103 GPIO输出模式2MHz,10MHz,50MHz波形对比

    在STM32F103中GPIO的输出模式有三种速度配置 如图所示 经过测试发现 这三种速度的输出模式与IO的翻转频率没有关系 它们影响的可能是驱动能力 下面是在IO极限频率 18MHz 下 三种模式的波形
  • 【STM32F4】二、I/O引脚的复用和映射

    目录 一 基本概念 1 什么是I O引脚 2 什么是I O引脚的复用 二 如何配置I O引脚复用 1 复用器 GPIOx AFRL GPIOx AFRH 和复用功能 AF 2 程序编写 2 1 打开I O时钟和复用功能对应外设时钟 2 2
  • 【树莓派】error: command ‘/usr/bin/arm-linux-gnueabihf-gcc‘ failed with exit code 1(已解决)

    输入以下命令 export CFLAGS fcommon pip3 install RPi GPIO 参考网址 https askubuntu com questions 1290037 error while installing rpi
  • 学习笔记:STM32的ACD

    STM32f103系列有3个ADC ADC1 ADC2 ADC3 通道 ADC1和ADC2都有16个外部通道 2个内部通道 连接到温度传感器和内部参考电压 VREFINT 1 2V ADC3有8个外部通道 通道列表 通道顺序转换 使用多个通
  • 在 ARM 上的 Linux 中写入和读取内存映射设备寄存器

    我正在尝试按照以下步骤读取和写入 ARM9 SAM9X25 上的寄存器 http infocenter arm com help index jsp topic com arm doc faqs ka3750 html我以以下代码结束 in
  • 使用多个线程多次调用一个方法

    我想要一个 LED 闪烁 同时我的 Raspberry 上正在做一些工作 我在 Python 脚本中使用 LED 线程 初始代码 import RPi GPIO import time import threading pinLED 10
  • Raspberry Pi RuntimeError:已为此 GPIO 通道启用冲突边缘检测

    我正在遵循此处找到的教程 https www linkedin com pulse prepare your raspberry pi work aws iot kay lerch I have not even begun the int
  • Raspberry Pi RPi.GPIO 错误并带有威胁回调

    我被 Python 包中的 wait for edge 函数困住了RPi http sourceforge net p raspberry gpio python wiki Inputs 我为 GPIO 下降添加了多个事件检测 只要回调函数
  • Sphinx:如何排除自动模块中的导入?

    我有一个用 Python 编写的 Raspberry Pi 项目 它使用 RPi GPIO 模块 代码上的所有工作都是在 Windows 机器上完成的 其中 RPi GPIO 不会安装 每次我尝试运行 autodoc 时 它都会崩溃 说它无

随机推荐

  • C语言实现二分查找

    相较于线性查找 xff0c 二分查找在面对大量数据时的效率更高 xff0c 但它的缺点是只能对有序数组进行查找 源代码如下 xff1a include lt stdio h gt void binarysearch int a int su
  • 约瑟夫环详解

    package newjosephu public class myfinaljosephu 你可能会说crazy 我只想说ez xff01 public static void main String args circlelinkedl
  • 01背包问题(滚动数组实现的逻辑)

    package tttest public class mybetterbag public static void main String args int weight 61 1 3 4 int bagsize 61 4 int val
  • java递归实现辗转相除法

    public static int getres int a int b if b 61 0 return getres b a b return a
  • java 线索二叉树的构建

    public class test public static void main String args Node root 61 new Node 1 Node node2 61 new Node 2 Node node3 61 new
  • VINS-Mono

    非极大值抑制 NMS算法 xff0c 思想是搜索局部最大值 xff0c 抑制非极大值 输入 xff1a 目标边界框及其对应的置信度的分列表 xff0c 设定阈值 xff0c 阈值用来删除重叠较大的边界框 IoU xff1a 两个边界框的交集
  • vtk世界坐标系与屏幕坐标系的转换

    世界坐标系 gt 屏幕坐标系 double worldCoord 3 61 100 100 20 vtkSmartPointer lt vtkCoordinate gt pCoorPress 61 vtkSmartPointer lt vt
  • VTK读取DCM保存成png

    VTK读取DCM保存成png include lt vtkSmartPointer h gt include lt vtkImageViewer2 h gt include lt vtkDICOMImageReader h gt inclu
  • 姿态矩阵与姿态向量的相互转化

    罗德里格斯公式 转轴 n 是矩阵 R 特征值 1 对应的特征向量 求解此方程 再归一化 就得到了旋转轴 CV EXPORTS W void Rodrigues InputArray src OutputArray dst OutputArr
  • 电脑连接树莓派Zero W

    电脑连接树莓派ZeroW 陈拓 2018 05 16 2018 06 09 0 概述 本位介绍两种电脑连接树莓派PiZero W的方法 xff1a l 电脑通过USB以太网连接树莓派ZeroW l 电脑通过WiFi连接树莓派ZeroW 1
  • 读取 ttf 字体文件并提取汉字轮廓

    读取 ttf 字体文件并提取汉字轮廓 ttf 免费下载 ttf 下载链接 编译安装 freetype freetype下载链接 实现效果 demo下载地址
  • CRC-16/MODBUS 校验位计算

    实验指令 xff1a 前23位表示 信息头 43 信息内容 24 xff0c 25位是待计算的校验位 26位是结束码 7E 01 00 00 01 10 02 00 27 00 0C 00 02 00 00 00 00 00 50 00 3
  • QSS之QPushButton 详细介绍

    官方参考资料 span class hljs tag QPushButton span span class hljs rules span class hljs comment 前景色 span span class hljs rule
  • bochs 详细介绍

    BOCHS 简介及配置 Bochs 简介 Bochs xff08 读音同 Box xff09 是用C 43 43 开发的以 LGPL 许可证发放的开放源代码的x86 xff0c x86 64模拟器 xff0c 模拟整个PC 它被设计成可以运
  • QT信号槽传递复杂参数

    原理 1 先将想要传递的多个数据封装成一个结构体 2 然后再用QVariant打包 3 通过信号槽机制传送 4 传到目标类后再解开QVariant的到自己想要的数据 实验目标 按下按钮后 xff0c 将界面上3个控件的值传递到Product
  • Opencv 轮廓提取

    边缘检测的一般步骤 滤波 消除噪声增强 使边界轮廓更加明显检测 选出边缘点 方法一 Canny算法 特点 xff1a 轮廓细腻 include lt opencv2 opencv hpp gt include lt opencv2 high
  • opencv矩形识别

    include lt opencv2 highgui highgui hpp gt include lt opencv2 imgproc imgproc hpp gt include lt opencv2 core core hpp gt
  • 【怎么在KEIL中自定义STM32的栈顶地址】

    STM32的启动文件中定义的栈和堆的大小 xff0c 由于栈是向下生长的 所以我们一般希望将栈顶设置为RAM的最高有效地址 这样就可以最大限度保护栈不会溢出 但是STM32的启动文件居然不是这样的思路 那STM32的启动文件的分配思路是怎么
  • VaR和CVaR举例说明_笔记转载

    风险价值VaR成为金融市场风险度量的主流指标 VaR自1993年发展至今已作为金融市场风险度量的主流指标被各银行 投资公司 证券公司及金融监管机构广泛采用 VaR不仅具有概念简单 xff0c 易于沟通和理解的优点 xff0c 而且为不同金融
  • 树莓派GPIO控制

    树莓派GPIO 控制 陈拓 2018 06 09 2018 06 10 0 概述 本文介绍树莓派 Zero W的GPIO控制 xff0c 并用LED看效果 也适宜于树莓派3B 43 0 1 树莓派GPIO编号方式 功能物理引脚 从左到右 x