[转]树莓派gpio口控制
2015-08-22 21:45
288 查看
0.前言
树莓派现在越来越火,网上树莓派的资料也越来越多。树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个。
【 【开发语言】——python
【 【开发语言】——C语言
【 【开发语言】——C语言 【简单介绍】BCM2835 C
Library可以理解为使用C语言实现的相关底层驱动,它给我的感觉更像STM32的库函数,BCM2835 C
Library的驱动库包括GPIO、SPI和UART等,可以通过学习BCM2835 C
Library熟悉BCM2835相关的寄存器操作。如果有机会开发树莓派上的linux驱动,或自主开发python或PHP扩展驱动,可以从
BCM2835 C Library找到不少的“灵感”。
【相关博文】
更多树莓派学习笔记请参考——【1.硬件准备
【树莓派】——在开始所有的实验之前,你需要一块完整的树莓派。
【IO扩展板】——可以通过淘宝购买IO扩展板,或者购买万用板和杜邦线自行制作IO扩展板。
图1 树莓派扩展板——图片来自 天猫 大菠萝数码专营店
图2 运行效果图
图3 GPIO编号方式——该图片来自wiringPi说明文档
树莓派的软件扩展库虽然很多,但也导致了扩展库“碎片化”的问题,例如操作树莓派的GPIO端口,GPIO的编号便存在三种不同的方式
编号侧重P1插座侧,从上到下,从左到右。正如图3的Header一栏。
编号 【3】wiringPi编号方式
编号侧重实现逻辑,把扩展GPIO端口从0开始编号,这种编号方便编程。正如图3 WiringPi一栏。
【举例说明】
插座编号方式 11 -> BCM2835编号方式 17 -> wiringPi编号方式 GPIO0。无论如何它都是同一个IO管脚。
【1】直接在树莓派中编写
树莓派中有几款代码(文本)编辑软件,可以在树莓派中编写代码。
【2】在windows中编写
可以在windows中编写代码,如果是Python脚本可通过FTP软件传输到树莓派中,然后使用SSH客户端登录到树莓派中执行Python脚本。如
果是C语言文件,除了使用FTP传输之外还需要在树莓派上编译才可以生成可执行文件(相当于windows上的exe文件)。相关软件操作请参考【 【3】在其他linux中编写
与windows中编写代码不同,在其他linux发行版(例如ubuntu)中可安装交叉工具链,交叉编译C文件生成在树莓派的可执行文件,那么使用FTP传输可执行文件至树莓派即可。其实方式【1】和方式【3】是几乎相同的。
图4 原理图
2 Python GPIO实现
【1】先安装python-dev,输入以下指令。
sudo apt-get install python-dev
【2】安装RPi.GPIO,依次输入以下指令。特别说明,由于RPi.GPIO仍处于不断完善的过程中,请参考前言中的链接下载最新的安装代码。
# 下载
$ wget # 解压缩
# 进入解压之后的目录
# 启动安装
新建一个名为led.py的文件,该文件具体内容如下:
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】 【2】由于采用插座引脚编号方式,此处的11脚相当于BCM2835寄存器编号方式的引脚11。
4 WiringPi实现
详见【 新建一个名为blink.c文件,该文件具体内容如下:
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,请参考系列博文——【5 BCM2835 C Library
特别说明,由于BCM2835 C Library仍处于不断完善的过程中,请参考前言中的链接下载最新的安装代码。
# 下载
# 解压缩
# 进入压缩之后的目录
新建一个名为blink.c的程序,程序的具体内容如下:
// 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共享库,如果不熟悉gcc指令和makefile,请看看我的其他博文吧。
6 未来做些什么
实践GPIO输入功能,实践SPI功能,实践I2C功能等。最后综合以上若干内容结合web做些好玩的应用。
树莓派现在越来越火,网上树莓派的资料也越来越多。树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个。
【 【开发语言】——python
【 【开发语言】——C语言
【 【开发语言】——C语言 【简单介绍】BCM2835 C
Library可以理解为使用C语言实现的相关底层驱动,它给我的感觉更像STM32的库函数,BCM2835 C
Library的驱动库包括GPIO、SPI和UART等,可以通过学习BCM2835 C
Library熟悉BCM2835相关的寄存器操作。如果有机会开发树莓派上的linux驱动,或自主开发python或PHP扩展驱动,可以从
BCM2835 C Library找到不少的“灵感”。
【相关博文】
更多树莓派学习笔记请参考——【1.硬件准备
【树莓派】——在开始所有的实验之前,你需要一块完整的树莓派。
【IO扩展板】——可以通过淘宝购买IO扩展板,或者购买万用板和杜邦线自行制作IO扩展板。
图1 树莓派扩展板——图片来自 天猫 大菠萝数码专营店
图2 运行效果图
2.注意事项
【编号方式】图3 GPIO编号方式——该图片来自wiringPi说明文档
树莓派的软件扩展库虽然很多,但也导致了扩展库“碎片化”的问题,例如操作树莓派的GPIO端口,GPIO的编号便存在三种不同的方式
编号侧重P1插座侧,从上到下,从左到右。正如图3的Header一栏。
编号 【3】wiringPi编号方式
编号侧重实现逻辑,把扩展GPIO端口从0开始编号,这种编号方便编程。正如图3 WiringPi一栏。
【举例说明】
插座编号方式 11 -> BCM2835编号方式 17 -> wiringPi编号方式 GPIO0。无论如何它都是同一个IO管脚。
【1】直接在树莓派中编写
树莓派中有几款代码(文本)编辑软件,可以在树莓派中编写代码。
【2】在windows中编写
可以在windows中编写代码,如果是Python脚本可通过FTP软件传输到树莓派中,然后使用SSH客户端登录到树莓派中执行Python脚本。如
果是C语言文件,除了使用FTP传输之外还需要在树莓派上编译才可以生成可执行文件(相当于windows上的exe文件)。相关软件操作请参考【 【3】在其他linux中编写
与windows中编写代码不同,在其他linux发行版(例如ubuntu)中可安装交叉工具链,交叉编译C文件生成在树莓派的可执行文件,那么使用FTP传输可执行文件至树莓派即可。其实方式【1】和方式【3】是几乎相同的。
图4 原理图
2 Python GPIO实现
【1】先安装python-dev,输入以下指令。
sudo apt-get install python-dev
【2】安装RPi.GPIO,依次输入以下指令。特别说明,由于RPi.GPIO仍处于不断完善的过程中,请参考前言中的链接下载最新的安装代码。
# 下载
$ wget # 解压缩
# 进入解压之后的目录
# 启动安装
新建一个名为led.py的文件,该文件具体内容如下:
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】 【2】由于采用插座引脚编号方式,此处的11脚相当于BCM2835寄存器编号方式的引脚11。
4 WiringPi实现
详见【 新建一个名为blink.c文件,该文件具体内容如下:
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,请参考系列博文——【5 BCM2835 C Library
特别说明,由于BCM2835 C Library仍处于不断完善的过程中,请参考前言中的链接下载最新的安装代码。
# 下载
# 解压缩
# 进入压缩之后的目录
新建一个名为blink.c的程序,程序的具体内容如下:
// 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共享库,如果不熟悉gcc指令和makefile,请看看我的其他博文吧。
6 未来做些什么
实践GPIO输入功能,实践SPI功能,实践I2C功能等。最后综合以上若干内容结合web做些好玩的应用。
相关文章推荐
- SDUT2015暑假集训14级周赛4
- Spring学习笔记-spring基础知识概述
- java并发编程---ThreadLocal
- Victor and Machine(推公式或者模拟)
- Python 中怎么写 swap()交换函数
- HDU 2017 一系列统计数据
- 共享文件
- HDU 5352(MZL's City-费用流)
- 树状数组
- HDU 5412 区间第K值 带修改 树状数组套平衡树
- B\S备忘录26——windows下的mysql cluster搭建
- 九度oj 1133
- Java安全管理器(Security Manager)
- html页面上轮播图片举例
- 1349 - Optimal Bus Route Design(二分图最小权完美匹配)
- (leetcode)Two Sum
- Effective C++ 条款14 在资源管理类中小心copying行为
- Java之旅hibernate(1)——初始
- 零基础学C语言 笔记五 算术表达式
- HDU 5417 Victor and Machine——BestCoder Round #52(div.2)