开发者社区> 问答> 正文

Raspberry Pi GPIO 使用入门:报错

Raspberry Pi有许多的GPIO(General Purpose Input Output:通用输入/输出),可以用来控制和读取数字电路中TTL电平的逻辑0和逻辑1。我们要使用RPiGPIO首先要知其GPIO的定义,常用的有两种编号定义:WiringPi PinBCM GPIOGPIO的驱动库我这里介绍两种给大家,一种为C语言的WiringPi,另一种为pythonRPi.GPIO;实验中将使用这两种语言来教会大家使用GPIO。本篇文章将通过2个小实验带你学习Raspberry Pi GPIO的简单使用步骤,一个是控制LED闪烁,另外一个是开关控制LED闪烁。

GPIO定义图解

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

图片1

2种不同编号的定义:

图片

安装GPIO库

(1)更新源:

   $ sudo apt-get update

2)安装python

   $ sudo apt-get install python-dev

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

$ sudo apt-get install python-pip

4)利用pip安装rpi.gpio

$ sudo pip install rpi.gpio

测试安装成功:

图片4

(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

图片17

实验一

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

图片5

图片6

C语言示例

说明:使用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

图片7

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

图片8

实验一运行效果图

LED OFF :

图片9

LED ON:

图片10

实验二

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

图片11图片12

C语言示例

说明:这个示例较实验一多增加一个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

图片13

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)\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

图片14

实验二运行效果图

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

图片15

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

图片16

测试代码下载

测试代码下载:

python-test

c-test


linksprite学习中心




展开
收起
kun坤 2020-06-07 16:53:23 1483 0
1 条回答
写回答
取消 提交回答
  • 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

    2020-06-07 16:53:39
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载