“树莓派系列教程:如何点亮一个LED灯(下)”的版本间的差异

来自丢石头百科
(本章讲解如果通过库函数编程操作树莓派GPIO)
 
 
(未显示同一用户的2个中间版本)
第1行: 第1行:
 
+
WiringPi包括一套gpio命令,使用gpio命令可以控制树莓派上的各种接口,通过以下指令可以测试wiringPi是否安装成功。
上一章我们讲解了在linux系统下如何通过读写设备文件的方式控制GPIO点亮LED灯,本章我们继续讲解如果通过使用中间层库函数编程控制GPIO.
 
一、wiringPi
 
WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi中的函数类似于Arduino的wiring系统。官网:
 
http://wiringpi.com/
 
 
 
1、wiringPi安装
 
(1)方案1-使用GIT工具
 
通过GIT获得wiringPi的源码
 
<syntaxhighlight lang="python">
 
git clone git://git.drogon.net/wiringPi
 
cd wiringPi
 
./build
 
</syntaxhighlight> build脚本会帮助你编译和安装wiringPi
 
    (2)方案1-使用GIT工具
 
我们可以在网站上直接下载最新版本编译使用,
 
https://git.drogon.net/?p=wiringPi;a=summary
 
 
 
 
 
 
 
[[File:104117se19sve2z4q2sqqz.png]]
 
 
 
在windows上下载wiringPi库,并复制到树莓派中,运行如下命令解压安装。(xxx代表版本号)
 
 
 
<syntaxhighlight lang="python">
 
tar -zxvf wiringPi-xxx.tar.gz
 
cd wiringPi-xxx
 
./build</syntaxhighlight>       详细安装教程请参考wiringPI官网:
 
http://wiringpi.com/download-and-install/
 
 
 
2、测试
 
wiringPi包括一套gpio命令,使用gpio命令可以控制树莓派上的各种接口,通过以下指令可以测试wiringPi是否安装成功。
 
  
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
第38行: 第7行:
 
[[File:110612g0e4dt0zlejt4l1n.jpg]]
 
[[File:110612g0e4dt0zlejt4l1n.jpg]]
  
       从上图可以知道树莓派管脚有三种编号方式,下面以Pioneer600扩展板的LED1为例,第一种为板上编号(37),即中间两列,表示第几号插针。第二中为wiringPi编码(25),使用wiringPi库编程时是用wiringPi编号,第三种为BCM编号,这个是更加BCM管脚来编号的,使用bcm2835库或python的RPi.GPIO编程时使用BCM编号。
+
从上图可以知道树莓派管脚有三种编号方式,下面以Pioneer600扩展板的LED1为例,第一种为板上编号(37),即中间两列,表示第几号插针。第二中为wiringPi编码(25),使用wiringPi库编程时是用wiringPi编号,第三种为BCM编号,这个是更加BCM管脚来编号的,使用bcm2835库或python的RPi.GPIO编程时使用BCM编号。
 
我们可以使用gpio命令操作树莓派GPIO,下面我们可以gpio命令控制Pioneer600扩展的LED1.
 
我们可以使用gpio命令操作树莓派GPIO,下面我们可以gpio命令控制Pioneer600扩展的LED1.
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
第55行: 第24行:
 
https://projects.drogon.net/raspberry-pi/wiringpi/the-gpio-utility/
 
https://projects.drogon.net/raspberry-pi/wiringpi/the-gpio-utility/
  
===      3、wiringPi程序: ===<syntaxhighlight lang="python">
+
=== WiringPi ===
 +
<syntaxhighlight lang="python">
 
#include <wiringpi.h>
 
#include <wiringpi.h>
 
char LED = 25;  
 
char LED = 25;  
第82行: 第52行:
 
http://wenku.baidu.com/link?url=U_APBvE_ga5pSSwPwWABIGJymLVwyC-0W9AEOT2cjhlZzoLywa0-QpElYNT2yHvNV0P7BbqTZCgG0ctaqZLi_ovkAGXREBOE6h68eTt-Q3y
 
http://wenku.baidu.com/link?url=U_APBvE_ga5pSSwPwWABIGJymLVwyC-0W9AEOT2cjhlZzoLywa0-QpElYNT2yHvNV0P7BbqTZCgG0ctaqZLi_ovkAGXREBOE6h68eTt-Q3y
  
 +
=== bcm2835 ===
 +
bcm2835库是树莓派cpu芯片的库函数,相当于stm32的固件库一样,底层是直接操作寄存器。而wiringPi库和python的RPi.GPIO库其底层都是通过读写linux系统的设备文件操作设备。
  
 +
从bcm22835官网(http://www.airspayce.com/mikem/bcm2835/)下载最新版本的库,然后解压安装。
  
          二、 bcm2835
 
bcm2835库是树莓派cpu芯片的库函数,相当于stm32的固件库一样,底层是直接操作寄存器。而wiringPi库和python的RPi.GPIO库其底层都是通过读写linux系统的设备文件操作设备。
 
         1、安装bcm2835库
 
从bcm22835官网(
 
http://www.airspayce.com/mikem/bcm2835/
 
)下载最新版本的库,然后解压安装。
 
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
 
tar -zxvf bcm2835-1.xx.tar.gz
 
tar -zxvf bcm2835-1.xx.tar.gz
第97行: 第64行:
 
sudo make check
 
sudo make check
 
sudo make install</syntaxhighlight>
 
sudo make install</syntaxhighlight>
  2、示例程序
+
 
新建名为led.c的文件,添加如下程序。
+
'''示例程序'''
 +
 
 +
新建名为led.c的文件,添加如下程序。
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
 
#include <bcm2835.h>
 
#include <bcm2835.h>
第118行: 第87行:
 
     return 0;
 
     return 0;
 
}</syntaxhighlight>
 
}</syntaxhighlight>
编译并执行程序,按Ctrl+C可结束程序。
+
编译并执行程序,按Ctrl+C可结束程序。
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
 
gcc –Wall led.c –o led –lbcm2835
 
gcc –Wall led.c –o led –lbcm2835
 
sudo ./led</syntaxhighlight>  
 
sudo ./led</syntaxhighlight>  
注:(1)-lbcm2835表示动态加载bcm2835库
+
注:
(2)注意bcm2835程序管脚使用bcm编号,和wiringPi编号不一样。
+
# -lbcm2835表示动态加载bcm2835库
(3)和wiringPi一样,程序结束时GPIO的状态不确定。
+
# 注意bcm2835程序管脚使用bcm编号,和wiringPi编号不一样。
三、python
+
# 和wiringPi一样,程序结束时GPIO的状态不确定。
1、安装RPi.GPIO
+
 
(1)先安装python-dev,输入以下指令。
+
=== python ===
 +
安装RPi.GPIO
 +
 
 +
先安装python-dev,输入以下指令。
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
 
sudo apt-get install python-dev</syntaxhighlight>
 
sudo apt-get install python-dev</syntaxhighlight>
  (2)安装RPi.GPIO<syntaxhighlight lang="python">
+
 
 +
安装RPi.GPIO<syntaxhighlight lang="python">
 
#下载
 
#下载
 
wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz
 
wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz
第139行: 第112行:
 
#启动安装 :
 
#启动安装 :
 
sudo python setup.py install</syntaxhighlight>
 
sudo python setup.py install</syntaxhighlight>
 +
 +
或者
 +
<syntaxhighlight lang="python">
 +
sudo apt install python3-
 +
</syntaxhighlight>
 
  2.示例程序
 
  2.示例程序
 
新建led.py文件,添加如下代码并保存。
 
新建led.py文件,添加如下代码并保存。
第163行: 第141行:
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
 
sudo python led.py</syntaxhighlight>
 
sudo python led.py</syntaxhighlight>
注:(1)#!/usr/bin/env python,定义python解析脚本的绝对路径。
+
注:
    (2)# -*- coding: utf-8 -*- ,python文件为utf-8格式,否则无法写入中文注释。
+
 
         (3)  GPIO.setmode(GPIO.BCM),采用bcm编号方式。
+
1. #!/usr/bin/env python,定义python解析脚本的绝对路径。
    (4) python程序使用try except语言,当按下Ctrl+C结束程序是会触发异常,程序执行gpio.cleanup()语句清楚GPIO管脚状态。
+
 
 +
2. # -*- coding: utf-8 -*- ,python文件为utf-8格式,否则无法写入中文注释。
 +
 
 +
3. GPIO.setmode(GPIO.BCM),采用bcm编号方式。
 +
 
 +
4. python程序使用try except语言,当按下Ctrl+C结束程序是会触发异常,程序执行gpio.cleanup()语句清楚GPIO管脚状态。
 +
 
 
对python语言不是很熟悉的孩童,可以查看Python基础教程:
 
对python语言不是很熟悉的孩童,可以查看Python基础教程:
 
http://www.runoob.com/python/python-tutorial.html
 
http://www.runoob.com/python/python-tutorial.html
第172行: 第156行:
 
这里有一个python语言的wiringPi库,有兴趣的可以参考:
 
这里有一个python语言的wiringPi库,有兴趣的可以参考:
 
https://github.com/WiringPi/WiringPi2-Python
 
https://github.com/WiringPi/WiringPi2-Python
 +
 +
== 系列教程 ==
 +
{{Raspberry Pi Study}}

2020年11月20日 (五) 15:37的最新版本

WiringPi包括一套gpio命令,使用gpio命令可以控制树莓派上的各种接口,通过以下指令可以测试wiringPi是否安装成功。

gpio -v
gpio readall

110612g0e4dt0zlejt4l1n.jpg

从上图可以知道树莓派管脚有三种编号方式,下面以Pioneer600扩展板的LED1为例,第一种为板上编号(37),即中间两列,表示第几号插针。第二中为wiringPi编码(25),使用wiringPi库编程时是用wiringPi编号,第三种为BCM编号,这个是更加BCM管脚来编号的,使用bcm2835库或python的RPi.GPIO编程时使用BCM编号。 我们可以使用gpio命令操作树莓派GPIO,下面我们可以gpio命令控制Pioneer600扩展的LED1.

gpio -g mode 26 out

设置管脚为输出模式,-g参数表示是以BCM编号方式,如果去掉这个参数测以wiringPi编号方式,即为25。

gpio -g write 26 1

设置管脚为高电平,点亮LED.

gpio -g write 26 0

设置管脚为低电平,熄灭LED,

gpio -g read 26

读取管脚当前状态 更多gpio命令请查看: https://projects.drogon.net/raspberry-pi/wiringpi/the-gpio-utility/

WiringPi

#include <wiringpi.h>
char LED = 25; 

int main(void)
{
    if(wiringPiSetup() < 0)return 1;
    pinMode (LED,OUTPUT) ;

    while(1)
    {   
        digitalWrite(LED, 1) ;
        delay (200);
        digitalWrite(LED, 0) ;
        delay (200);
    }   
}

使用vi将代码添加到led.c文件中,运行如下命令编译并执行程序。按Ctrl+C终止程序。

gcc -Wall led.c o led -lwiringPi 
sudo ./led
注:(1)-Wall 表示编译时显示所有警告,-lwringPi表示编译时动态加载wringPi库
(2)终止程序后,LED的状态为不确定,这和python程序相比显得有点不足。

关于更多wiringPi的库函数,可参看wiringPi官网,也可参考wiringPi用户手册。

http://wenku.baidu.com/link?url=U_APBvE_ga5pSSwPwWABIGJymLVwyC-0W9AEOT2cjhlZzoLywa0-QpElYNT2yHvNV0P7BbqTZCgG0ctaqZLi_ovkAGXREBOE6h68eTt-Q3y

bcm2835

bcm2835库是树莓派cpu芯片的库函数,相当于stm32的固件库一样,底层是直接操作寄存器。而wiringPi库和python的RPi.GPIO库其底层都是通过读写linux系统的设备文件操作设备。

从bcm22835官网(http://www.airspayce.com/mikem/bcm2835/)下载最新版本的库,然后解压安装。

tar -zxvf bcm2835-1.xx.tar.gz
cd bcm2835-1.xx
./configure
make
sudo make check
sudo make install

示例程序

新建名为led.c的文件,添加如下程序。

#include <bcm2835.h>

#define PIN 26
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(500);
        bcm2835_gpio_write(PIN, LOW);
        bcm2835_delay(500);
    }   
    bcm2835_close();
    return 0;
}

编译并执行程序,按Ctrl+C可结束程序。

gcc Wall led.c o led lbcm2835
sudo ./led

注:

  1. -lbcm2835表示动态加载bcm2835库
  2. 注意bcm2835程序管脚使用bcm编号,和wiringPi编号不一样。
  3. 和wiringPi一样,程序结束时GPIO的状态不确定。

python

安装RPi.GPIO

先安装python-dev,输入以下指令。

sudo apt-get install python-dev

安装RPi.GPIO

#下载
wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz
#解压:
tar -zxvf RPi.GPIO-0.5.11.tar.gz
#进入解压之后的目录 :
cd RPi.GPIO-0.5.3a
#启动安装 :
sudo python setup.py install

或者

sudo apt install python3-
2.示例程序

新建led.py文件,添加如下代码并保存。

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time

LED = 26

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)
try:
    while True:
        GPIO.output(LED,GPIO.HIGH)
        time.sleep(1)
        GPIO.output(LED,GPIO.LOW)
        time.sleep(1)
except:
    print("except")
GPIO.cleanup()
执行程序,按Ctrl+C结束程序
sudo python led.py

注:

1. #!/usr/bin/env python,定义python解析脚本的绝对路径。

2. # -*- coding: utf-8 -*- ,python文件为utf-8格式,否则无法写入中文注释。

3. GPIO.setmode(GPIO.BCM),采用bcm编号方式。

4. python程序使用try except语言,当按下Ctrl+C结束程序是会触发异常,程序执行gpio.cleanup()语句清楚GPIO管脚状态。

对python语言不是很熟悉的孩童,可以查看Python基础教程: http://www.runoob.com/python/python-tutorial.html

这里有一个python语言的wiringPi库,有兴趣的可以参考: https://github.com/WiringPi/WiringPi2-Python

系列教程

树莓派系列教程