zoukankan      html  css  js  c++  java
  • 树莓派4硬件---GPIO篇

      树莓派拿到手已经两个多月了,其实从最开始的期待安装好ROS,到前几天完成了ROS的源码编译安装,对linux的调教也时花了些时间的。现在终于想起来,树莓派上还有GPIO,还没有用过了。说干就干,开始。以下操作都是在树莓派已经安装好了官方的系统,也已经升级到了最新版了。总共有40个GPIO,实际管脚图为:

      

      在计算机中,通常用高、低两个电压来表示二进制的1和0。树莓派也是如此。GPIO用相同的方式来表示数据。每个GPIO的PIN都能处于输入或输出状态。当处于输出状态时,系统可以把1或0传给该PIN。如果是1,那么对应的物理PIN向外输出3.3V的高电压,否则输出0V的低电压。相应的,处于输入状态的PIN可以探测物理PIN上的电压。如果是高电压,那么该PIN将向系统返回1,否则返回0。就是利用上述简单机制,GPIO实现了和物理电路的互动。通过管脚图,不难看出使用方法和其他的开发板是一样的,先设置管脚的方向,再设置管脚的数值。将其配置为输入或输出,通过读写相应的IO的寄存器值,获取IO状态,通过值取得IO的数值,完成IO的状态的改变。

    创建一个python代码:

     1 import RPi.GPIO as GPIO
     2 import time
     3 GPIO.setmode(GPIO.BCM)
     4 GPIO.setup(21,GPIO.OUT)
     5 
     6 while True :
     7     GPIO.output(21,GPIO.HIGH)
     8     time.sleep(0.05)
     9     GPIO.output(21,GPIO.LOW)
    10     time.sleep(0.05)

    创建一个C代码:

    使用bash搞定:用bash命令来控制GPIO21。在Linux中,外部设备经常被表示成文件。向文件写入或读取字符,就相当于向设备输出或者从设备输入字符。树莓派上的GPIO端口也是如此,其代表文件位于/sys/class/gpio/下。首先,激活GPIO21:

    echo 21 > /sys/class/gpio/export 

    上边命令的意思,是把字符"21"写入到/sys/class/gpio/export。可以看到,命令执行后,/sys/class/gpio/下面增加了代表GPIO21的一个目录,目录名就是gpio21。下一步,我们把GPIO21置于输出状态:

    echo out > /sys/class/gpio/gpio21/direction

    文件/sys/class/gpio/gpio21/direction用于控制GPIO21的方向。我们向里面写入了代表输出的字符"out"。

    echo 1 > /sys/class/gpio/gpio21/value

    最后,向GPIO21写入1,从而让PIN处于高电压:可以看到,LED灯亮了起来。如果想关掉LED灯,只需要向GPIO21写入0:

    echo 0 > /sys/class/gpio/gpio21/value

    使用完毕GPIO21,可以删除该端口:

    echo 21 > /sys/class/gpio/unexport

    /sys/class/gpio/gpio21随即消失。

    2 Python GPIO实现

        【安装过程】
            【1】先安装python-dev,输入以下指令。
    sudo apt-get install python-dev
            【2】安装RPi.GPIO,依次输入以下指令。特别说明,由于RPi.GPIO仍处于不断完善的过程中,请参考前言中的链接下载最新的安装代码。
    # 下载 
    $ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz
    # 解压缩 
    $ tar xvzf RPi.GPIO-0.5.3a.tar.gz 
    # 进入解压之后的目录 
    $ cd RPi.GPIO-0.5.3a 
    # 启动安装 
    $ sudo python setup.py install

        【示例代码】
        新建一个名为led.py的文件,该文件具体内容如下:
    # -*- coding: utf-8 -*-
    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】GPIO.setmode(GPIO.BOARD),采用插座引脚编号方式。
        【2】由于采用插座引脚编号方式,此处的11脚相当于BCM2835寄存器编号方式的引脚11。

    4 WiringPi实现

        【安装过程】
        详见【树莓派学习笔记——wiringPi简介、安装和管脚说明】
        【示例代码】
        新建一个名为blink.c文件,该文件具体内容如下:
    #include <wiringPi.h>
    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,请参考系列博文——【Linux学习笔记——例说makefile 索引博文】

    5 BCM2835 C Library

        【安装过程】
        特别说明,由于BCM2835 C Library仍处于不断完善的过程中,请参考前言中的链接下载最新的安装代码。
    # 下载
    $ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.35.tar.gz 
    # 解压缩
    $ tar xvzf bcm2835-1.35.tar.gz 
    # 进入压缩之后的目录
    $ cd bcm2835-1.35
    # 配置
    ./configure
    # 从源代码生成安装包
    make
    # 执行检查
    sudo make check
    # 安装 bcm2835库
    sudo make install

        【示例代码】
        新建一个名为blink.c的程序,程序的具体内容如下:
    #include <bcm2835.h>

    // 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共享库,
    参考文献:https://blog.csdn.net/xukai871105/article/details/12684617

    参考文献:https://www.cnblogs.com/vamei/p/6751992.html

  • 相关阅读:
    Android 隐式意图激活另外一个Actitity
    Android 显示意图激活另外一个Actitity
    Android 创建一个新的Activity
    调用meitu秀秀.so文件实现美图功能
    Android C代码回调java方法
    Android 在C代码中调用logcat
    Android java传递int类型数组给C
    Android java传递string类型数据给C
    使用pywin32处理excel文件
    利用 pywin32 操作 excel
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/11728108.html
Copyright © 2011-2022 走看看