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
$ sudo apt-get install python-dev
$ sudo apt-get install python-pip
$ sudo pip install rpi.gpio
测试安装成功:
安装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
实验一----------接线图---------------
说明:使用wiringpi这个库,类似arduino的编程风格,代码设置的GPIO编号为wiringPi pin、如果你想使用BCM GPIO则可以将wiringPiSetup() 改为wiringPiSetupGpio(),那么对应的led_pin也需要改为BCM GPIO编号对应的GPIO,即GPIO24。
示例代码:
#include <wiringPi.h> #include <stdio.h> #include <stdlib.h> int led_pin = 5; int main () { if (wiringPiSetup() == -1) { printf(“Setup wiringPi failed!”); return 1; } printf(“linker_led pin : GPIO%d (wiringPi pin)\n”,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
说明:这里调用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:
实验二-----------接线图------------
说明:这个示例较实验一多增加一个GPIO,使用了读取GPIO状态的函数:digitalRead(pin_value)
示例代码:
#include <stdlib.h> int button_pin = 4; int led_pin = 5; int main () { printf(“wiringPi pin\n”); printf(“linker_led pin : GPIO%d\n”,led_pin); printf(“linker_button pin : GPIO%d\n”,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
说明:这个示例较实验一多增加一个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)\n”) 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处于点亮状态:
测试代码下载
mark######mark######您好,请教一个问题,问什么我按照您的操作,安装了wiringPi的库,在目标板Raspberry Pi B+上的根目录下面进行了build,让后编写了如下的代码:
1 #include <stdio.h>
2 #include <wiringPi.h>
3 #include <stdlib.h>
4
5 int led_pin = 5;
6 int mian()
7 {
8 if(wiringPiSetup()==-1)
9 {
10 printf("Setup wiringPi failed!");
11 return 1;
12 }
13 printf("Now,i am control the GPIO of Raspberry Pi B+");
14 pinMode(led_pin,OUTPUT);
15 while(1)
16 {
17 digitalWrite(led_pin,1); delay(300);
18 digitalWrite(led_pin,0); delay(300);
19 }
20 return 0;
21 }
但是编译的时候出现的下面的问题:
pi @raspberrypi :~/WorkSpace/Raspberry Pi/GPIO/C_Control $ gcc main.c -o main -lwiringPi
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/crt1.o:在函数‘_start’中:
/build/glibc-H706YU/glibc-2.19/csu/../ports/sysdeps/arm/start.S:119:对‘main’未定义的引用
collect2: error: ld returned 1 exit status
pi @raspberrypi :~/WorkSpace/Raspberry Pi/GPIO/C_Control $ gcc main.c -o main -l wiringPi
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/crt1.o:在函数‘_start’中:
/build/glibc-H706YU/glibc-2.19/csu/../ports/sysdeps/arm/start.S:119:对‘main’未定义的引用
collect2: error: ld returned 1 exit status
想请问这是什么问题,该如何解决!多谢了!
######问题解决的们需要到 wiringPi/wiringPi的文件下面,看到很多对应的.h和.c文件在这个目录下面执行如下指令: make make install 这样就建立安装了Dynamic lib和Static Lib
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。