智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想!

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 19918|回复: 55
打印 上一主题 下一主题

Raspberry Pi WiringPir/python的GPIO使用入门

  [复制链接]

110

主题

396

帖子

2329

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2329
QQ
跳转到指定楼层
楼主
发表于 2014-2-11 11:52:10 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式

Raspberry Pi有许多的GPIO(General Purpose Input Output:通用输入/输出),可以用来控制和读取数字电路中TTL电平的逻辑0和逻辑


1。我们要使用RPi的GPIO首先要知其GPIO的定义,常用的有两种编号定义:WiringPi Pin和BCM GPIO。GPIO的驱动库我这里介绍两种给大家,一种为C语言的WiringPi,另一种为python的RPi.GPIO;实验中将使用这两种语言来教会大家使用GPIO。


本篇文章将通过2个小实验带你学习Raspberry Pi GPIO的简单使用步骤,一个是控制LED闪烁,另外一个是开关控制LED闪烁。


GPIO定义图解

GPIO编号图(请注意图中Revision 1/2 ):



2种不同编号的定义:



安装GPIO库

(1)更新源:

   $ sudo apt-get update

(2)安装python

   $ sudo apt-get install python-dev

(3)安装python-pippython-pip是一个可以替代easy_install的安装和管python软件包的工具)

$ sudo apt-get install python-pip

(4)利用pip安装rpi.gpio

$ sudo pip install rpi.gpio

测试安装成功:



(5)安装wringpi库:

安装git-core
$ sudo apt-get install git-core

载winringPi库
$ git clone git://git.drogon.net/wiringPi

编译和安装库 (在/wiringPi/examples目录中有一些例子可供大家参考)
$ cd wiringPi
$ ./build

另外大家可以使用下面的命令对库进行更新
$ cd wiringPi
$ git pull origin



器件清单

Raspberry Pi     x1

Linker led     x1

Linker button     x1

Wire     x5




实验一

----------接线图---------------





C语言示例
说明:使用wiringpi这个库,类似arduino的编程风格,代码设置的GPIO编号为wiringPi pin、如果你想使用BCM GPIO则可以将wiringPiSetup() 改为wiringPiSetupGpio(),那么对应的led_pin也需要改为BCM GPIO编号对应的GPIO,即GPIO24。
示例代码:
#include
#include
#include

int led_pin = 5;

int main ()
{
if (wiringPiSetup() == -1)
{
printf(“Setup wiringPi failed!”);
return 1;
}
printf(“linker_led pin : GPIO%d (wiringPi pin)”,led_pin);
pinMode(led_pin, OUTPUT); // set mode to output

while(1)
{
digitalWrite(led_pin, 1); // output a high level
delay(200);
digitalWrite(led_pin, 0); // output a low level
delay(200);
}

return 0;
}


1.新建一个.c文件写入示例代码、保存:$vi linker_led.c
2.编译代码:$ gcc linker_led.c -o linker_led -lwiringPi
3.运行代码:$sudo ./linker_led

python示例
说明:这里调用RPi.GPIO库,使用的GPIO编号为BCM GPIO、如果你想使用board GPIO则可以将GPIO.setmode(GPIO.BCM)改为GPIO.setmode(GPIO.BOARD),那么对应的led_pin也需要改为wiringPi pin编号对应的GPIO,即GPIO5。

python示例代码:

import RPi.GPIO as GPIO
import time

led_pin = 24

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin,GPIO.OUT)

print “linker led pin 24 (BCM GPIO)”

while True:

        GPIO.output(led_pin,True)
        time.sleep(0.2)
       GPIO.output(led_pin,False)
       time.sleep(0.2)



新建一个.py文件写入示例代码、保存:$vi linker_led.py
运行代码:$sudo python linker_led.py

实验一运行效果图

LED OFF :

LED ON:

实验二

-----------接线图------------



C语言示例
说明:这个示例较实验一多增加一个GPIO,使用了读取GPIO状态的函数:digitalRead(pin_value)
示例代码:
#include

int button_pin = 4;
int led_pin = 5;

int main ()
{
printf(“wiringPi pin”);
printf(“linker_led pin : GPIO%d”,led_pin);
printf(“linker_button pin : GPIO%d”,button_pin);

if (wiringPiSetup() == -1)
{
printf(“Setup wiringPi failed!”);
return 1;
}

pinMode(led_pin, OUTPUT); // set linker_led mode to output
pinMode(button_pin, INPUT); // set linker_button mode to input
while(1)
{
if( digitalRead(button_pin) )
digitalWrite(led_pin, HIGH); // output a high level
else
digitalWrite(led_pin, LOW); // output a low level

}

return 0;
}



1.新建一个.c文件写入示例代码、保存:$vi linker_button.c
2.编译代码:$ gcc linker_button.c -o linker_button -lwiringPi
3.运行代码:$sudo ./linker_button


python示例
说明:这个示例较实验一多增加一个GPIO,使用了读取GPIO状态的函数:GPIO.input(pin_value)
示例代码:

import RPi.GPIO as GPIO

led_pin = 24
button_pin = 23

GPIO.setwarnings(False)
GPIO.setmode( GPIO.BCM )
GPIO.setup( led_pin,GPIO.OUT )
GPIO.setup( button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

print (“linke r_led pin 24 , linker_button pin 23 (BCM GPIO)”)

while True:
       if GPIO.input(button_pin):
                      GPIO.output(led_pin,True)
       else :
                     GPIO.output(led_pin,False)



1.新建一个.py文件写入示例代码、保存:$vi linker_button.py
2.运行代码:$sudo python linker_button.py

实验二运行效果图

没有按下按钮,LED处于熄灭状态:

按下按钮,LED处于点亮状态:




测试代码下载:


python-test

c-test


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|手机版|智能创客 ( 桂ICP备14000828号

GMT+8, 2024-5-4 05:47 , Processed in 0.236365 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表