[香橙派开发系列]使用wiringPi控制26个引脚
前言
不管是对什么开发板来说,开发需要使用到一些包,像stm32就需要用到一些包,香橙派也是一样的,也是需要使用到一些软件包才能进行开发。
一、香橙派使用的包
香橙派这里使用的包是wiringOP,这个包有python版,所以用python进行开发要方便一点,但是呢,毕竟我是学嵌入式的,开发单片机都是使用C语言,让我使用python确实不太好,所以我昨天就研究了一下,在/usr/src/目录下有两个wiringOP文件夹

这有一个wiringOP和一个wiringOP-Python,有一个是C语言的,有一个是Python的,这里我看了一下wiringOP下的文件,发现它是由wiringPi这个包进行改写的,但是还是可以使用wiringPi中的函数进行开发

知道了这个就可以开始开发了,所以我花了点时间对wiringPi中的函数进行了一下学习,随便写了这篇文章。
二、使用wiringPi包的命令
学过树莓派的应该对这个包比较熟悉,没有学过的就跟着我一起来学习吧。
首先使用得先获得这个包,如果你是在香橙派官网中下载的ubuntu或者是其他系统的话,这个包是会在里面的,所以可以不用下载。如果你不是从官网上下载的,需要下载一下这个包。
1.下载wiringOP
首先需要更新一下软件包
sudo apt update
然后下载一下git
sudo apt install -y git
下载完成后就可以用git从github上拉取wiringOP软件包了
git clone https://github.com/orangepi-xunlong/wiringOP.git -b next
然后编译一下这个软件包,先到wiringOP这个目录
cd wiringOP
然后编译一下
sudo ./build clean
然后运行进行安装
sudo ./build
安装好后检查一下这个包是否安装成功,这里使用
gpio readall
进行查看,如果出现下面的界面就证明安装成功了

这个界面是可以查看你这个香橙派所对应的引脚和状态的界面。
2.gpio readall信息分析

这里可以看到有很多信息,首先就是芯片的型号H616,然后表格里面有GPIO、wPi、Name、Mode、V、Physical。下面我那个表给大家说明一下
| 名称 | 说明 |
|---|---|
| GPIO | 引脚在寄存器中的地址 |
| wPi | 在wiringPi中所对应的值 |
| Name | 引脚的名称 |
| Mode | 引脚的状态 |
| V | 改引脚的电平值 |
| Physical | 引脚的位置 |
这里的wPi是在后面会经常使用的一个值,这个需要经常查看一下。
Mode的状态可以看下面的表
| 状态 | 说明 |
|---|---|
| OFF | 关闭 |
| OUT | 输出 |
| IN | 输入/上拉输入/下拉输入 |
3.设置gpio的模式
学过32的应该知道,要对引脚操作首先需要打开时钟,然后配置引脚的模式,但是在香橙派中就不用这么麻烦,因为底层和用户层之间有一个HAL板件支持包,所以操作起来就非常的简单,只需要设置一下引脚模式即可,这里我设置一下PC10(因为这个引脚好插杜邦线),首先用命令的模式来进行设置。
这里先将PC10设置为输出模式out,首先找到PC10的wPi值,这里通过前面说的gpio readall就可以查找到,它的wPi值是16,就可以使用下面的命令来进行设置了
gpio mode 16 out
设置完成后可以用gpio readall查看一下状态

可以看到PC10的mode变成了OUT。
输出模式就是输出一些电平,比如说一开始电平V是0,那么变成了输出模式后这个引脚就会输出低电平。
4.设置gpio输出的电平
学过单片机的都知道,在单片机中输出的只有高电平和低电平,这个在程序中的表达是:1表示高电平,0表示低电平,所以我们可以通过程序来控制单片机引脚输出高电平和低电平。
控制操作也是比较简单,使用的是下面的指令:
gpio write wPi 电平
wPi不用多说了,电平是0和1来表示,比如说我让刚才的PC10变成高电平,使用的命令是
gpio write 16 1
执行完成后就会让PC10变成高电平了,这里还是使用gpio readall来进行查看

可以看到这个引脚的电平变成了高电平,如果对这个概念还是不明白的话,我用面包板搭建一个简单的电路展示一下

这里我将LED的负极连接到PC10这个引脚上,然后正极连接到单片机上的3.3V位置,可以看到现在的LED没有亮,是因为PC10这个引脚是高电平,两端都是高电平是不会通的。
现在我将PC10改成低电平再来看看效果
gpio write 16 0

效果如下

可以看到这个已经亮了,这个就是改变引脚的电平的指令,并且讲一下电平的概念。
三、wiringPi软件实现
前面讲的都是命令行的实现,但是咱不可能一直用命令来写一个复杂的功能,最重要的还是要落实在程序方面,所以现在来给大家介绍一下软件怎么写。
1.初始化函数
首先在软件中需要初始化一下引脚,使用的函数是
int wiringPiSetup (void) ;
这个函数会初始化一下引脚,但是你调用这个函数的话,在执行的时候需要提升一下权限或者使用root才可以执行,当然这个初始化函数有一个替代的函数,这个替代的函数不需要提权
int wiringPiSetupSys (void)
这个函数不是使用操作系统来进行初始化,而是使用/sys/class/gpio接口来进行初始化的,在此种模式下的管脚号是 Broadcom 的 GPIO 管脚号,这种方法我们不考虑。
我们首先用一下第一个函数来进行一下初始化
#include <wiringPi.h>
#include <stdio.h>
int main(){
wiringPiSetup();
return 0;
}
这样就可以进行一下初始化的操作,然后就可以进行后面的操作了。
2.设置gpio的模式
这里使用的是
void pinMode (int pin, int mode)
这个函数需要配合上面说的wiringPiSetup函数进行初始化,否则使用不了

第一个参数是wPi的值,第二个参数是设置的模式,可以有下面的几种模式:
| 模式 | 说明 |
|---|---|
| OUTPUT | 输出模式 |
| INPUT | 输入模式 |
| PWM_OUTPUT | 脉冲输出 |
| GPIO_CLOCK | GPIO时钟 |
这些模式都是用宏定义定义了的,直接写即可。
然后我们将PC10的模式设置为输出模式
#include <wiringPi.h>
#include <stdio.h>
int main(){
wiringPiSetup(); // 记得初始化
pinMode(16, OUTPUT);
return 0;
}
这样就可以将PC10设置为输出模式了。
3.输出电平
然后我们就可以通过代码来输出电平了,这里我们可以按照32的写法,写一个死循环,但是毕竟这个是高级的单片机,所以我们就不写死循环了,毕竟你一个香橙派不止可以跑一个程序,所以这里直接写到循环外面。
使用的函数是
void digitalWrite (int pin, int value)
这个函数的参数和上面的一样,只不过要说一下value,这个就是电平值
| 值 | 说明 |
|---|---|
| 1 | 高电平 |
| 0 | 低电平 |
然后添加进去
#include <wiringPi.h>
#include <stdio.h>
int main(){
wiringPiSetup(); // 记得初始化
pinMode(16, OUTPUT);
digitalWrite(16, 0);
return 0;
}
写完后我们就可以执行一下这个代码了。
4.执行代码
这里执行代码需要先进行一下编译,编译使用gcc这个工具,没有这个工具的可以下载一下
sudo apt install gcc
然后就可以开始编译了,这里不写Makefile文件,直接用命令进行编译,命令如下:
gcc -o 编译出来的文件名 需要编译的文件.c -lwiringPi
这里如果不写-o和编译出来的文件名,编译出来的可执行文件是a.out。
需要注意一下,最后的-lwiringPi是必须要加上的,如果不加上就会出现下面的问题

这个就像你用pthread线程一样,在编译的时候不加-pthread,所以需要加上。
编译完成后如果没有出问题就可以用
./a.out
来执行了。
如果你用-o来规定了

可以使用
./别名
来运行,我这是openLED,所以是
./openLED
执行了LED灯就会亮了。
最后
学会了如何操作gpio后就可以控制一些传感器或者元器件了,所以先得把gpio的操作学好就可以控制一些复杂的东西了,后面香橙派还有很多功能我还没有研究完成,等需要用到什么就使用什么即可。
下一章我会介绍一下输入模式,毕竟在读传感器的时候不能只输出,还得输入呢
[香橙派开发系列]使用wiringPi控制26个引脚的更多相关文章
- openlayers4 入门开发系列之图层控制(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- arcgis api for js入门开发系列七图层控制(含源代码)
上一篇实现了demo的地图分屏对比模块,本篇新增图层控制模块,截图如下(源代码见文章底部): 图层控制模块实现的思路如下: 1.在地图配置文件map.config.js里面配置图层目录树节点信息,作为 ...
- arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理
在前面两篇随笔<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>和<ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程>开始 ...
- openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍
openresty开发系列2--nginx的简单安装,正向.反向代理及常用命令和信号控制介绍 一.nginx的安装下载及编译安装1.Nginx下载:nginx-1.13.0.tar.gz,下载到:/u ...
- 树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
摘要 这片文章主要是记录自己的整活过程,涉及到的技术包括.NET IoT, .NET Web, .NET MAUI,框架采用的也是最新的.NET 7. 本人是用的树莓派Zero 2 W(ubuntu- ...
- 8天掌握EF的Code First开发系列之2 Code First开发系列之领域建模和管理实体关系
本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 理解Code First及其约定和配置 创建数据表结构 管理实体关系 三种继承模式 本章小结 本人的实验环境是V ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- Android 开发系列教程之(一)Android基础知识
什么是Android Android一词最早是出现在法国作家维里耶德利尔·亚当1986年发表的<未来夏娃>这部科幻小说中,作者利尔·亚当将外表像人类的机器起名为Android,这就是And ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
随机推荐
- 语义分割评价指标(Dice coefficient, IoU)
语义分割任务常用的评价指标为Dice coefficient和IoU.Dice和IoU都是用来衡量两个集合之间相似性的度量,对于语义分割任务而言即用来评估网络预测的分割结果与人为标注结果之间的相似度. ...
- mongodb安装及启动配置文件,允许远程访问连接
windows安装https://www.runoob.com/mongodb/mongodb-window-install.html https://www.runoob.com/mongodb/m ...
- DotNet Web应用单文件部署系列
目录 一. pubxml文件配置 二. 打包wwwroot文件夹 三. 混淆dll文件 四. csproj文件配置 五. 批处理 六. Windows服务安装 七. ...
- 京东云上centos8.2 安装 consul1.11.1
做个笔记下 -- 前言 部分内容有参考网友的,但是地址不记得了! 安装内容基本参考官网的和上一个网友的 官网地址: https://www.consul.io/downloads 以下是使用root方 ...
- js-文件读写和上传下载的简单例子01
现下,网络越来越快,浏览器的功能和性能越来越好,所以很多时候,已经不需要一些复杂的框架来实现不是非常复杂的功能. 我们只有在以下情况才会考虑使用框架或者现成的第三方组件: 1.功能复杂,自己写没有必要 ...
- 19-Docker数据持久化
什么是Docker数据持久化 容器在运行时会在镜像层上加上一层:可写层. 当删除容器时,可写层就会一起被删除,数据丢失. 数据持久化就是就是将数据持久化保存,删除容器之后,数据仍然存在. 方法1-挂载 ...
- LangChain转换链:让数据处理更精准
上篇文章<5分钟了解LangChain的路由链>里主要介绍了路由链,核心类是LLMRouterChain和MultiPromptChain.本文介绍LangChain里的另外1个重要的链: ...
- 安卓Camera-HAL显示值与比例
安卓Camera-HAL显示值与比例 参考:https://blog.csdn.net/wang714818/article/details/78049649?utm_source=blogxgwz4 ...
- Hadoop集群管理之fsimage和edits工作机制
客户端对hdfs进行写文件时会首先被记录在edits文件中. edits修改时元数据也会更新. 每次hdfs更新时edits先更新后客户端才会看到最新信息. fsimage:是namenode中关于元 ...
- Go 如何对多个网络命令空间中的端口进行监听
Go 如何对多个网络命令空间中的端口进行监听 需求为 对多个命名空间内的端口进行监听和代理. 刚开始对 netns 的理解不够深刻,以为必须存在一个新的线程然后调用 setns(2) 切换过去,如果有 ...