使用Linux系统运行WiringPi库实现GPIO控制 (linux运行wiringpi)

随着物联网技术的快速发展,越来越多的设备需要通过GPIO控制来实现硬件连接和数据传输。而Linux系统提供了强大的GPIO控制功能,并且可以通过开源的WiringPi库实现对GPIO的控制。本文将介绍如何在Linux系统中使用WiringPi库实现GPIO控制。

一、WiringPi库

WiringPi库是一个用于树莓派和其他Linux系统的GPIO控制库,由Gordon Henderson创建。该库提供了C语言、C++和Shell等语言的接口,可以方便地实现GPIO输入和输出控制。WiringPi库的安装非常简单,可以通过以下命令进行安装:

“`

sudo apt-get install wiringpi

“`

安装完成后,就可以在代码中引用WiringPi库了。

二、初始化GPIO

在使用WiringPi库控制GPIO之前,需要先初始化GPIO。在C语言中,可以通过以下代码进行初始化:

“`

#include

int mn(void)

{

wiringPiSetup();

return 0;

}

“`

在这段代码中,wiringPiSetup()函数会对GPIO进行初始化,并返回一个状态值。如果初始化成功,该函数会返回0,如果初始化失败,会返回-1。

在C++语言中,可以通过以下代码进行初始化:

“`

#include

int mn(void)

{

wiringPiSetupGpio();

return 0;

}

“`

在这段代码中,wiringPiSetupGpio()函数会对GPIO进行初始化,使用BCM GPIO编号。同样地,如果初始化成功,该函数会返回0,如果初始化失败,会返回-1。

三、控制GPIO输出

在初始化完成后,就可以对GPIO进行输入和输出的控制了。我们来看如何控制GPIO输出。在C语言中,可以通过以下代码实现GPIO的输出控制:

“`

#include

#define PIN 1

int mn(void)

{

int i;

pinMode(PIN, OUTPUT);

while(1)

{

digitalWrite(PIN, HIGH);

delay(500);

digitalWrite(PIN, LOW);

delay(500);

}

return 0;

}

“`

在这段代码中,我们定义了一个输出引脚的编号为1。然后,我们使用pinMode()函数将引脚设置为输出模式。接下来,我们使用digitalWrite()函数对引脚的电平进行控制,实现GPIO的输出。在这里,我们使用一个死循环来控制GPIO的输出,每500ms将GPIO的电平设置为高电平,再将GPIO的电平设置为低电平,实现LED灯的闪烁效果。

在C++语言中,也可以通过以下代码实现GPIO的输出控制:

“`

#include

#define PIN 1

int mn(void)

{

int i;

pinMode(PIN, OUTPUT);

while(1)

{

digitalWrite(PIN, HIGH);

delay(500);

digitalWrite(PIN, LOW);

delay(500);

}

return 0;

}

“`

在这段代码中,我们同样定义了一个输出引脚的编号为1。然后,我们使用pinMode()函数将引脚设置为输出模式。在C++语言中,digitalWrite()函数的写法略有不同,需要使用枚举类型来表示GPIO的电平,如下所示:

“`

#include

#define PIN 1

int mn(void)

{

int i;

pinMode(PIN, OUTPUT);

while(1)

{

digitalWrite(PIN, HIGH);

delay(500);

digitalWrite(PIN, LOW);

delay(500);

}

return 0;

}

“`

在这段代码中,我们使用枚举类型来表示GPIO的电平,HIGH表示高电平,LOW表示低电平。其余的代码与C语言相同。

四、控制GPIO输入

除了控制GPIO的输出,我们还可以通过GPIO实现输入控制。在C语言中,可以通过以下代码实现GPIO的输入控制:

“`

#include

#include

#define PIN 1

int mn(void)

{

int i;

int val;

pinMode(PIN, INPUT);

while(1)

{

val = digitalRead(PIN);

printf(“val=%d\n”, val);

delay(500);

}

return 0;

}

“`

在这段代码中,我们同样定义了一个引脚的编号为1。然后,我们使用pinMode()函数将引脚设置为输入模式。接下来,我们使用digitalRead()函数读取GPIO的电平值,并将其打印到终端上。同样地,我们使用一个死循环来控制GPIO的输入,每500ms读取一次GPIO的电平值,并打印到终端上。

在C++语言中,也可以通过以下代码实现GPIO的输入控制:

“`

#include

#include

#define PIN 1

int mn(void)

{

int i;

int val;

pinMode(PIN, INPUT);

while(1)

{

val = digitalRead(PIN);

printf(“val=%d\n”, val);

delay(500);

}

return 0;

}

“`

在这段代码中,我们同样定义了一个引脚的编号为1。然后,我们使用pinMode()函数将引脚设置为输入模式。在C++语言中,digitalRead()函数的写法同样略有不同,仍然需要使用枚举类型来表示GPIO的电平值,如下所示:

“`

#include

#include

#define PIN 1

int mn(void)

{

int i;

int val;

pinMode(PIN, INPUT);

while(1)

{

val = digitalRead(PIN);

printf(“val=%d\n”, val);

delay(500);

}

return 0;

}

“`

在这段代码中,我们同样使用枚举类型来表示GPIO的电平值,HIGH表示高电平,LOW表示低电平。其余的代码与C语言相同。

五、

相关问题拓展阅读:

  • 树莓派怎么安装wiringpi库
  • linux服务器nginx环境下rewrite规则怎么写
  • 如何在 Visual Studio 上用 C/C++ 写 Linux 程序

树莓派怎么安装wiringpi库

1.简介wiringPi

wiringPi , 安装好这个库后可以直接 调用函数配置和控制GPIO功能

下图中左边是wiringPi封装好后的引脚,右边是树莓派本身的引脚(bcm2835库也使用它)

还有一张图可以参考:

2.树莓派中安装wiringPi方法:

mkdir temp

cd temp

wget

tar xf wiringPi.tgz

cd wiringPi/wiringPi/

make

make install

测试LED的程序:#include

#include

#include

int main (int argc,char* argv)

{

if (argc

printf(“Usage example: ./led 4 \n”);

return 1;

}

int pinNumber = atoi(argv);

if (-1 == wiringPiSetup()) {

printf(“Setup wiringPi failed!”);

return 1;

}

pinMode(pinNumber, OUTPUT); // set mode to output

while(1) {

digitalWrite(pinNumber, 1); // output a high level

delay(800);

digitalWrite(pinNumber, 0); // output a low level

delay(800);

}

return 0;

}

3.相关问题

使用wiringPi的程序进行测试编译时出现了如下问题:

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_write_byte’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_read_byte’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_write_byte_data’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_write_word_data’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_read_word_data’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_read_byte_data’

collect2: ld returned 1 exit status

网上少个相关资料,发现 是少装了库的原因:

需要安装这几个库: i2c-tools, libi2c-dev ,python-bus

执行命令 sudo apt-get install libi2c-dev ,会自动安装这三个。

然后重新编译就可以了。

make clean

sudo make uninstall

make

sudo make install

在linux服务器nginx环境下rewrite规则怎么写

server {

….

rewrite ^(.*)-htm-(.*)$ $1.php?$2 last;

}

/thread-htm-fid-2.html 重写成 /thread.php?fid-2.html

具体方法如下:

1、在/usr/local/nginx/conf/nginx.conf文件末尾加入虚拟主机配置,实例如下:

server

 {

   listen;

   server_name  

   index index.html index.htm index.php;

   root  /wwwroot/

www.hebaodans.com;

   location ~ .*\.(php|php5)?$

   {     

     #fastcgi_pass  unix:/tmp/php-cgi.sock;

     fastcgi_pass  127.0.0.1:9000;

     fastcgi_index index.php;

     include fcgi.conf;

   }

  

  #include rewite rule file or you can directly write here

  include rewrite.conf;

log_format  hebaodanscom  ‘$remote_addr – $remote_user  “$request” ‘

‘$status $body_bytes_sent “$http_referer” ‘

‘”$http_user_agent” $http_x_forwarded_for’;

   access_log  /logs/hebaodanscom.log  hebaodanscom;

 }

2、vi /usr/local/nginx/conf/rewrite.conf   输入以下规则:

location / {

 

if (!-e $request_filename)

{

#————START —————WORLDPRESS————

rewrite ^ /index.php last;

#————END —————WORLDPRESS————

 

 

  #————————zen-cart start——————

  # From Ultimate SEO URLs

  rewrite “^(.*)-p-(.*).html” /index.php?main_page=product_info&products_id=$2&% last;

  rewrite “^(.*)-c-(.*).html” /index.php?main_page=index&cPath=$2&% last;

  rewrite “^(.*)-m-(+).html” /index.php?main_page=index&manufacturers_id=$2&% last;

  rewrite “^(.*)-pi-(+).html” /index.php?main_page=popup_image&pID=$2&% last;

  rewrite “^(.*)-pr-(+).html” /index.php?main_page=product_reviews&products_id=$2&% last;

  rewrite “^(.*)-pri-(+).html” /index.php?main_page=product_reviews_info&products_id=$2&% last;

  # For Open Operations Info Manager

  rewrite “^(.*)-i-(+).html” /index.php?main_page=info_manager&pages_id=$2&% last;

  # For dreamscape’s News & Articles Manager

  rewrite “^news/?” /index.php?main_page=news&% last;

  rewrite “^news/rss.xml” /index.php?main_page=news_rss&% last;

  rewrite “^news/archive/?” /index.php?main_page=news_archive&% last;

  rewrite “^news/({4})-({2})-({2}).html” /index.php?main_page=news&date=$1-$2-$3&% last;

  rewrite “^news/archive/({4})-({2}).html” /index.php?main_page=news_archive&date=$1-$2&% last;

  rewrite “^news/(.*)-a-(+)-comments.html” /index.php?main_page=news_comments&article_id=$2&% last;

  rewrite “^news/(.*)-a-(+).html”  /index.php?main_page=news_article&article_id=$2&% last;

  # All other pages

  # Don’t rewrite real files or directories

  #RewriteCond %{REQUEST_FILENAME} !-f 

  #RewriteCond %{REQUEST_FILENAME} !-d

  rewrite “^(.*).html” /index.php?main_page=$1&% last;

  #—————————-zen-cart end—————–

}

}

保存后,运行 kill -HUP `cat /usr/local/nginx/nginx.pid` 平滑重启即可生效。

nginx虚拟主机配置实例

1、在/usr/local/nginx/conf/nginx.conf文件末尾加入虚拟主机配置,实例如下:

server

{

listen;

server_name

index index.html index.htm index.php;

root /wwwroot/

www.hebaodans.com;

location ~ .*\.(php|php5)?$

{

#fastcgi_pass unix:/tmp/php-cgi.sock;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fcgi.conf;

}

#include rewite rule file or you can directly write here

include rewrite.conf;

log_format hebaodanscom ‘$remote_addr – $remote_user “$request” ‘

‘$status $body_bytes_sent “$http_referer” ‘

‘”$http_user_agent” $http_x_forwarded_for’;

access_log /logs/hebaodanscom.log hebaodanscom;

}

2、vi /usr/local/nginx/conf/rewrite.conf 输入以下规则:

location / {

if (!-e $request_filename)

{

#————START —————WORLDPRESS————

rewrite ^ /index.php last;

#————END —————WORLDPRESS————

#————————zen-cart start——————

# From Ultimate SEO URLs

rewrite “^(.*)-p-(.*).html” /index.php?main_page=product_info&products_id=$2&% last;

rewrite “^(.*)-c-(.*).html” /index.php?main_page=index&cPath=$2&% last;

rewrite “^(.*)-m-(+).html” /index.php?main_page=index&manufacturers_id=$2&% last;

rewrite “^(.*)-pi-(+).html” /index.php?main_page=popup_image&pID=$2&% last;

rewrite “^(.*)-pr-(+).html” /index.php?main_page=product_reviews&products_id=$2&% last;

rewrite “^(.*)-pri-(+).html” /index.php?main_page=product_reviews_info&products_id=$2&% last;

# For Open Operations Info Manager

rewrite “^(.*)-i-(+).html” /index.php?main_page=info_manager&pages_id=$2&% last;

# For dreamscape’s News & Articles Manager

rewrite “^news/?” /index.php?main_page=news&% last;

rewrite “^news/rss.xml” /index.php?main_page=news_rss&% last;

rewrite “^news/archive/?” /index.php?main_page=news_archive&% last;

rewrite “^news/({4})-({2})-({2}).html” /index.php?main_page=news&date=$1-$2-$3&% last;

rewrite “^news/archive/({4})-({2}).html” /index.php?main_page=news_archive&date=$1-$2&% last;

rewrite “^news/(.*)-a-(+)-comments.html” /index.php?main_page=news_comments&article_id=$2&% last;

rewrite “^news/(.*)-a-(+).html” /index.php?main_page=news_article&article_id=$2&% last;

# All other pages

# Don’t rewrite real files or directories

#RewriteCond %{REQUEST_FILENAME} !-f

#RewriteCond %{REQUEST_FILENAME} !-d

rewrite “^(.*).html” /index.php?main_page=$1&% last;

#—————————-zen-cart end—————–

}

}

保存后,运行 kill -HUP `cat /usr/local/nginx/nginx.pid` 平滑重启即可生效。

直接在根目录下面创建一个文件名为nginx.conf的文件

如何在 Visual Studio 上用 C/C++ 写 Linux 程序

如今我们正在开发一个新的插件,一个能够让开发者在 Visual Studio (以下简称 VS ) 上建构能够在 Linux 上运行 C++ 程序的套件。开发者可以借由这个插件将 C++ 程序移转到 Linux 服务器、PC 以及移动设备上,也同时可以借由这个插件将这些机器连结至你的 VS 上。 VS 将会自动地复制一份并在远端建构你的来源档,再运行带有除错器的应用程序。我们的这项计划也针对特殊的架构提供系统支持,包含 ARM 等。下方文章将继续介绍使用我们这套全新的 Linux 计划。

目前我们仅支持在远端的目标 Linux 机器提供建构服务。我们并没有限制特定的 Linux 发布版本,但我们仍旧在一些工具的表现上有些相依性的差异。需要特别注意的是,我们需要 openssh-server、g++、gdb 以及 gdbserver。用你最习惯的套件管理工具来安装他们,例如在 Debian 类型的 Linux 就可以使用:

view plain copy

sudo apt-get install openssh-server g++ gdb gdbserver

安装

下载 Visual C++ for Linux Development extension 或从 Visual Studio 上的插件管理员来获得。目前我们在Visual Studio 上的 Android Tools 上已有相依支持。如果你已经安装了 VS 的话,你可以借由 Add Remove Programs 来新增这些功能,编辑 VS 然后在 Visual C++ 移动设备开发下选择他们。

要开始一个新的项目可以透过以下路径:Templates > Visual C++ > Cross Platform > Linux。

目前我们有三个可以使用的模板:针对像 Raspberry Pi 等物联网装置设计的 Blink、最基本的应用程序样板 Console Application 以及让开发者自己选择需要加入的来源档以及从预设设定起的 Empty。

你的之一个 VS Linux 项目

我们从建构一个主控台 app 开始。从模板新增完你的项目后,在 printf 叙述句的地方设下一个中断点,然后敲击 F5 或远端 GDB 除错器按钮。根据预设值,这个主控台 app 设定与 debug/x64 的环境相容。如果你的远端连线标的是 x86 或 arm 架构,那你需要先改变上述设定。在我演示的这个范例我使用的是 x64 Ubuntu VM。

由于这是之一次连结到标的的 Linux 机器,所以会弹出一个连接资讯视窗,是由在建构项目时所触发的。

我们同时支持密码以及认证形式的验证方式,包含使用复杂密码的认证。在之一次成功连接后,我们会将你的连结资讯储存以便在日后需要连接时快速存取。你可以从 Tools > Options > Cross Platform > Linux 的路径来管理你已储存的连结资讯,以及是的,密码/复杂密码是已加密形式储存的。我们也同时计划在未来的更新版本中,在连接时无需储存连结资讯。

在连接的过程中,你的来源档会被复制到远端的 Linux 机器上,并触发 gcc 并根据项目的属性设定来建构原始码。在项目建构完毕之后,你的程序将会在远端的机器上执行,并停止在我们先前所设下的中断点上。

Linux 项目属性

我们可以借由以下的项目属性来理解,东西是怎么被部署到远端 Linux 机器上的。

在 remote settings 下,你可以看到 remote 根目录是预设在 ~/projects/ ,且该路径下的远端项目目录会与我们的项目名称相符。从 Linux 机器上去看的话,我们可以在 ~/projects/ConsoleApplication1 下发现建构后的成品 main.cpp。

根据项目的 General setting,可以了解到我们针对 Output 以及 Intermediate 路径是怎么设定的。除此之外,你可以发现到这个项目是被设定成一个应用程序的 — 代表我们的项目执行档 ConsoleApplication1.out 是在 bin/x64/Debug/ 路径下。另外可以注意到的是,我们也同时支持静态以及动态的设定格式。

Linux 物联网项目

现在我们来研究物联网装置的部分 — 以 Raspberry Pi 为例。你可以使用任何类型的 Pi 来执行 Raspbian。在我们的 Blink 范例里我们使用 wiringPi — 如果你没有这个安装选项你也可以选择从 apt 或来源档来安装。在 Tools > Options 搜寻 Linux 来新增一个连结,然后点击 “add” 来新增一个连结到你的 Raspberry Pi。

从项目属性设定的地方查看 Build Events 下的 Remote Post-Build Events。

你可以借由这个设定在远端已建构好项目的 Linux 标的上执行指令。这个模板已先预设了针对 LED 输出的 GPIO pin,所以我们不需要再以 root 的身份执行我们的执行档。

现在将一个 LED 连接到 Raspberry Pi 上的 pin 17 位置,如下图:

打开 main.cpp 档,并在之一个 digitalWrite 后 delay call 的地方设下中断点,然后敲击 F5。你可以看到你的 LED 灯亮起,且执行程序会在你下中断点的地方停住。将你的程序持续执行到下一个 digitalWrite call 之后便可以看到 LED 灯熄灭。

可以透过浏览我们的物联网研发专页,来追踪所有我们目前针对这样的系统所释出的功能。

桌面应用程序

我们刚已在上述的文章中,介绍了无介面 (headless) 以及装置型的 Linux 应用程序,那桌面型的呢?在这里我们将介绍一点特别的:我们将在 Linux 桌面上执行一个 OpenGL 应用程序。首先要确定的是,你的 Linux 桌面已经设定为包含 OpenGL 的环境,下述是我们会需要用到的 apt 套件:libgles1-mesa、libgles1-mesa-dev、freeglut3 以及 freeglut3-dev。

接下来请先创建一个空的 Linux 项目,然后前往 Julien Guertault’s OpenGL 教学下载旋转方块的来源档,将其解压缩并将 main.c 加到你的项目下。要能够运行 Intellisense,你需要将 OpenGL 的标头 (headers) 新增到 VC++ Directories,你可以从 OpenGL Registry 里下载他们。现在前往你的项目属性设定,然后新增 export DISPLAY=:0.0 到 Pre-Launch command 下。

然后,在 Linker Input 下新增 “m;GL;GLU;glut” 到 Library Dependencies 栏位。

另外,确认你的远端设定是对应到对的机器。

接下来按下 F5。

还有一些有趣值得下中断点的地方,例如大约在 80 行左右的位置有可以调整方块旋转的设定(试着调整看看 alpha 值),或在 KeyboardFunc 里可以检查按下键盘时所输入的值。

开启原生 Linux 应用开发之旅吧

我们期望您与我们对于这些新开放的可能拥有一样的期待。

linux运行wiringpi的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux运行wiringpi,使用Linux系统运行WiringPi库实现GPIO控制,树莓派怎么安装wiringpi库,在linux服务器nginx环境下rewrite规则怎么写,如何在 Visual Studio 上用 C/C++ 写 Linux 程序的信息别忘了在本站进行查找喔。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《使用Linux系统运行WiringPi库实现GPIO控制 (linux运行wiringpi)》
文章链接:https://zhuji.vsping.com/27134.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。