树莓派4硬件---GPIO篇

  树莓派拿到手已经两个多月了,其实从最开始的期待安装好ROS,到前几天完成了ROS的源码编译安装,对linux的调教也时花了些时间的。现在终于想起来,树莓派上还有GPIO,还没有用过了。说干就干,开始。以下操作都是在树莓派已经安装好了官方的系统,也已经升级到了最新版了。总共有40个GPIO,实际管脚图为:

  

  在计算机中,通常用高、低两个电压来表示二进制的1和0。树莓派也是如此。GPIO用相同的方式来表示数据。每个GPIO的PIN都能处于输入或输出状态。当处于输出状态时,系统可以把1或0传给该PIN。如果是1,那么对应的物理PIN向外输出3.3V的高电压,否则输出0V的低电压。相应的,处于输入状态的PIN可以探测物理PIN上的电压。如果是高电压,那么该PIN将向系统返回1,否则返回0。就是利用上述简单机制,GPIO实现了和物理电路的互动。通过管脚图,不难看出使用方法和其他的开发板是一样的,先设置管脚的方向,再设置管脚的数值。将其配置为输入或输出,通过读写相应的IO的寄存器值,获取IO状态,通过值取得IO的数值,完成IO的状态的改变。

创建一个python代码:

 1 import RPi.GPIO as GPIO
 2 import time
 3 GPIO.setmode(GPIO.BCM)
 4 GPIO.setup(21,GPIO.OUT)
 5
 6 while True :
 7     GPIO.output(21,GPIO.HIGH)
 8     time.sleep(0.05)
 9     GPIO.output(21,GPIO.LOW)
10     time.sleep(0.05)

创建一个C代码:

使用bash搞定:用bash命令来控制GPIO21。在Linux中,外部设备经常被表示成文件。向文件写入或读取字符,就相当于向设备输出或者从设备输入字符。树莓派上的GPIO端口也是如此,其代表文件位于/sys/class/gpio/下。首先,激活GPIO21:

echo 21 > /sys/class/gpio/export 

上边命令的意思,是把字符"21"写入到/sys/class/gpio/export。可以看到,命令执行后,/sys/class/gpio/下面增加了代表GPIO21的一个目录,目录名就是gpio21。下一步,我们把GPIO21置于输出状态:

echo out > /sys/class/gpio/gpio21/direction

文件/sys/class/gpio/gpio21/direction用于控制GPIO21的方向。我们向里面写入了代表输出的字符"out"。

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

最后,向GPIO21写入1,从而让PIN处于高电压:可以看到,LED灯亮了起来。如果想关掉LED灯,只需要向GPIO21写入0:

echo 0 > /sys/class/gpio/gpio21/value

使用完毕GPIO21,可以删除该端口:

echo 21 > /sys/class/gpio/unexport

/sys/class/gpio/gpio21随即消失。

2 Python GPIO实现

【安装过程】
        【1】先安装python-dev,输入以下指令。
sudo apt-get install python-dev
        【2】安装RPi.GPIO,依次输入以下指令。特别说明,由于RPi.GPIO仍处于不断完善的过程中,请参考前言中的链接下载最新的安装代码。
# 下载 
$ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz
# 解压缩 
$ tar xvzf RPi.GPIO-0.5.3a.tar.gz 
# 进入解压之后的目录 
$ cd RPi.GPIO-0.5.3a 
# 启动安装 
$ sudo python setup.py install

【示例代码】
    新建一个名为led.py的文件,该文件具体内容如下:
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# BOARD编号方式,基于插座引脚编号
GPIO.setmode(GPIO.BOARD)
# 输出模式
GPIO.setup(11, GPIO.OUT)

while True:
GPIO.output(11, GPIO.HIGH)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
time.sleep(1)
    【运行】
    如果在windows上编写代码,请使用FTP软件下载到树莓派中,使用SSH客户端登陆树莓派,cd命令进入文件所在目录,然后输入指令
    sudo python led.py
    好吧,扩展板上的LED等开始闪烁了。最后使用Ctrl+C结束Python程序。
    【简单说明】
    【1】GPIO.setmode(GPIO.BOARD),采用插座引脚编号方式。
    【2】由于采用插座引脚编号方式,此处的11脚相当于BCM2835寄存器编号方式的引脚11。

4 WiringPi实现

【安装过程】
    详见【树莓派学习笔记——wiringPi简介、安装和管脚说明】
    【示例代码】
    新建一个名为blink.c文件,该文件具体内容如下:
#include <wiringPi.h>
int main(void)
{
wiringPiSetup() ;
pinMode (0, OUTPUT) ;
for(;;)
{
digitalWrite(0, HIGH) ; delay (500) ;
digitalWrite(0, LOW) ; delay (500) ;
}
}
    【运行】    
    如果在windows上编写代码,请使用FTP软件下载到树莓派中,使用SSH客户端登陆树莓派,cd命令进入文件所在目录,然后输入gcc指令
    gcc -Wall -o blink blink.c -lwiringPi
    接着输入以下命令执行程序
    sudo ./blink
    程序顺利运行,最后使用ctrl+c可以结束程序。

【简单说明】
    【1】不确定的最后状态,由于程序停止的时间未知,所有LED可能为点亮状态也可能会熄灭状态。
    【2】和python的程序相比,GPIO的端口号似乎发生了变化,但是实际上为同一个IO,只是IO的编号方式略有不同。
    【3】-lwiringPi表示动态加载wiringPi共享库,如果不熟悉gcc指令和makefile,请参考系列博文——【Linux学习笔记——例说makefile 索引博文】

5 BCM2835 C Library

【安装过程】
    特别说明,由于BCM2835 C Library仍处于不断完善的过程中,请参考前言中的链接下载最新的安装代码。
# 下载
$ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.35.tar.gz 
# 解压缩
$ tar xvzf bcm2835-1.35.tar.gz 
# 进入压缩之后的目录
$ cd bcm2835-1.35
# 配置
./configure
# 从源代码生成安装包
make
# 执行检查
sudo make check
# 安装 bcm2835库
sudo make install

【示例代码】
    新建一个名为blink.c的程序,程序的具体内容如下:
#include <bcm2835.h>

// P1插座第11脚
#define PIN RPI_GPIO_P1_11

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

bcm2835_gpio_write(PIN, LOW);
bcm2835_delay(100);
}
bcm2835_close();
return 0;
}
    【运行】       
    如果在windows上编写代码,请使用FTP软件下载到树莓派中,使用SSH客户端登陆树莓派,cd命令进入文件所在目录,然后输入gcc指令
    gcc -o blink blink.c -lbcm2835
    接着执行该程序,输入以下指令
    sudo ./blink
    程序顺利运行,最后使用ctrl+c可以结束程序。
    【1】和wiringPi的情况相似,若关闭程序LED灯可能点亮也可能熄灭。
    【2】虽然GPIO端口再次发生了变化,但还是指向那个LED灯。
    【3】-lbcm2835表示动态加载bcm2835共享库,
参考文献:https://blog.csdn.net/xukai871105/article/details/12684617

参考文献:https://www.cnblogs.com/vamei/p/6751992.html

原文地址:https://www.cnblogs.com/guochaoxxl/p/11728108.html

时间: 2024-10-06 14:24:34

树莓派4硬件---GPIO篇的相关文章

树莓派上的GPIO字符驱动程序

前言 主要是在嵌入式Linux(树莓派)中如何使用已有的函数库编写应用程序操纵GPIO,如何编写字符设备驱动程序在内核程序中使用GPIO 硬件连接图 虚拟文件系统操作GPIO Linux可以通过访问sys/class/gpio下的一些文件,通过对这些文件的读写来实现对于GPIO的访问. 树莓派下面的可用的GPIO如下图所示,需要注意树莓派一代和二代的区别 首先用一个小灯来测试下操作.首先向export中写入18,表示启用18号gpio端口,执行之后,可以看到该目录下多出了一个gpio18的目录.

开启树莓派的硬件看门狗功能

前段时间挖矿,将CGMiner设置为开机启动,由于各种问题系统不是很稳定,时不时的就停了L 网上查了一下,树莓派居然自带硬件的看门狗功能,立即尝试了一把,基本上能够解决我的问题 ? 原理很简单: 看门狗(Watchdog)需要不停的喂骨头(heartbeat) 如果在规定的时间内都没有喂(默认15秒),系统自动重启 ? 不过,一秒钟要吃一块骨头,还要不停的吃,还真是吃不饱的狗呀,呵呵~~~ ? 下面是开启该功能的脚本 // 开启模块 sudo modprobe bcm2708_wdog sudo

树莓派学习笔记——GPIO功能学习

树莓派学习笔记——GPIO功能学习

(10)用树莓派B+的GPIO接口控制发光二极管闪烁

从本篇开始,将逐步学习和分享树莓派GPIO相关操作,由于本人也是这方面的小白,关于接口.跳线.面包板.电流电压之类的叙述,可能有不准确的地方,还请大家仅将本系列文章作为入门读物. 本文需要的一些元件:母对公杜邦线N条,面包板1块,暂不需要面包板外接电源,发光二极管(电压2V-3.3V),电阻约400欧1个. 必须要了解的知识:根据树莓派官方文档的描述(见https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/REA

树莓派文档翻译 - 使用 - GPIO: 树莓派A和B

https://www.raspberrypi.org/documentation/usage/gpio/README.md 2016/6/25 GPIO: 树莓派A和B ##介绍GPIO和在树莓派上进行物理编程 树莓派的强大特性就是那一排在板子周围的GPIO(一般目的的输入输出)插针,就在黄色的视频输出插孔的旁边. GPIO pins 这些pin是pi和外界世界的物理接口.最简单,你可以把他们当作可以打开和关闭的开关(输入)或者树莓派可以打开或者关闭(输出).26个插针的17个是GPIO插针,

利用Python的xlrd和xlwt功能,开发小程序用于实现硬件GPIO译码 工作日志

待完成: 增加CA的位置识别,完成WCDMA.CDMA.GSM 译码动作 02/12  完成输入表格建立,完成译码基本框架 输入逻辑说明: State 表示 天线的状态,取值0-30 Up/Down 表示 上下天线 取值 0-1 : 0表示上天线 1表示下天线 CA表示线控是GPIO 是单频段线控 还是 CA频段线控 取值 0-3  :0 单频段,3表示4CC Band 表示 同一个天线状态,最多可以同时支持的频段各数 GPIO表示当前的天线状态读输入GPIO 以LTE为例如下表所示: 实现效果

【硬件设置篇】概述

自EST问世以来.都会有朋友问些周边硬件的问题,如外置卡要怎样接?电源模块是长什么样的.盘柜接一边为神么会那么吵?怎样接才正确?这次小编来个全面扫盲. 总接线示范图,小编根据连路,分四个视频来给大家讲解 <sas硬盘口介绍> <LSI9211-8I卡接法> <电源模块介绍与接法> <戴尔MD1000盘柜接法> 看完视频,再操作,这样就可以少走弯路,GOOD LUCK!

4、树莓派3B+的GPIO

GPIO(General Purpose I/O Ports)意思为通用输入/输出端口. 可以在终端重直接查看GPIO的定义. 在终端中直接输入 gpio readall 原文地址:https://www.cnblogs.com/trilobita/p/10505648.html

树莓派python 控制GPIO

sudo pip install rpi.gpio #!/usr/bin/env python # encoding: utf-8 import RPi.GPIO as GPIO import time # 指定GPIO口的选定模式为GPIO引脚编号模式 GPIO.setmode(GPIO.BCM) # 指定GPIO14的模式为输出模式,且初始状态为低电平. # 如果上面GPIO口的选定模式指定为主板模式的话,这里就应该指定8号而不是14号. GPIO.setup(14, GPIO.OUT,in