(转)树莓派wiringPi库详解

article/2025/10/28 5:25:13

https://www.cnblogs.com/lulipro/p/5992172.html

    <div id="post_detail">

树莓派wiringPi库详解

wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等。java 的pi4j项目也是基于wiringPi的,我最近也在看源代码,到时候整理好了会放出来的。

下面开始wiringPi之旅吧!

 

安装

进入  wiringPi的github (https://git.drogon.net/?p=wiringPi;a=summary) 下载安装包。点击页面的第一个链接的右边的snapshot,下载安装压缩包。

然后进入安装包所在的目录执行以下命令:

>tar xfz wiringPi-98bcb20.tar.gz   //98bcb20为版本标号,可能不同
>cd wiringPi-98bcb20
>./build

 

验证wiringPi的是否安装成功,输入gpio -v,会在终端中输出相关wiringPi的信息。否则安装失败。

 

 

 

 

 

编译 和运行

假如你写了一个LEDtest.c 的项目,则如下。

复制代码
编译:

g++ -Wall -o LEDtest LEDtest.cpp -lwiringPi //使用C++编程 , -Wall 是为了使能所有警告,以便发现程序中的问题

gcc -Wall -o LEDtest LEDtest.c -lwiringPi //使用C语言编程

运行:

sudo ./LEDtest

复制代码

 

 

查看引脚编号表格

使用如下控制台下命令

> gpio readall

 也可以查看下面的图。

注意:查看时,将树莓派的USB接口面对自己,这样看才是正确的。

 

 

 

wiringPi库API大全

在使用wiringPi库时,你需要包含头文件 #include<wiringPi.h>。凡是写wiringPi的程序,都包含这个头文件。

 

硬件初始化函数

使用wiringPi时,你必须在执行任何操作前初始化树莓派,否则程序不能正常工作。

可以调用下表函数之一进行初始化,它们都会返回一个int , 返回 -1 表示初始化失败。

 

int wiringPiSetup (void)返回:执行状态,-1表示失败

当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16

需要root权限

int wiringPiSetupGpio (void)返回执行状态,-1表示失败

当使用这个函数初始化树莓派引脚时,程序中使用的是BCM GPIO 引脚编号表。

需要root权限

wiringPiSetupPhys(void) 不常用,不做介绍 /
wiringPiSetupSys (void) ; 不常用,不做介绍 /

 

 

 

 

通用GPIO控制函数

void pinMode (int pin, int mode)

pin:配置的引脚

mode:指定引脚的IO模式

可取的值:INPUT、OUTPUT、PWM_OUTPUT,GPIO_CLOCK

     


作用:配置引脚的IO模式

注意:
只有wiringPi 引脚编号下的1脚(BCM下的18脚) 支持PWM输出

只有wiringPi编号下的7(BCM下的4号)支持GPIO_CLOCK输出

void digitalWrite (int pin, int value)

pin:控制的引脚

value:引脚输出的电平值。

 可取的值:HIGH,LOW分别代表高低电平

让对一个已近配置为输出模式的 引脚  输出指定的电平信号 int digitalRead (int pin)

pin:读取的引脚

返回:引脚上的电平,可以是LOW HIGH 之一

读取一个引脚的电平值  LOW  HIGH ,返回 void analogWrite(int pin, int value)

pin:引脚

value:输出的模拟量

模拟量输出

树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,

需要增加另外的模块

int analogRead (int pin)

pin:引脚

返回:引脚上读取的模拟量

模拟量输入

树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,

需要增加另外的模块

void pwmWrite (int pin, int value)

pin:引脚

value:写入到PWM寄存器的值,范围在0~1024之间。

输出一个值到PWM寄存器,控制PWM输出。
pin只能是wiringPi 引脚编号下的1脚(BCM下的18脚)

void pullUpDnControl (int pin, int pud)

 pin:引脚

pud:拉电阻模式

可取的值:PUD-OFF        关闭拉电阻
             PUD_DOWN    引脚电平拉到3.3v
             PUD_UP         引脚电平拉到0v 接地

对一个设置IO模式为 INPUT 的输入引脚设置拉电阻模式。

与Arduino不同的是,树莓派支持的拉电阻模式更丰富。

树莓派内部的拉电阻达50K欧姆

 

 

 LED闪烁程序

复制代码
#include<iostream>
#include<cstdlib>
#include<wiringPi.h>   

const int LEDpin = 1;

int main()
{
if(-1==wiringPiSetup())
{
cerr<<“setup error\n”;
exit(-1);
}
pinMode(LEDpin,OUTPUT);

  </span><span style="color: #0000ff;">for</span>(size_t i=<span style="color: #800080;">0</span>;i&lt;<span style="color: #800080;">10</span>;++<span style="color: #000000;">i){digitalWrite(LEDpin,HIGH); delay(</span><span style="color: #800080;">600</span><span style="color: #000000;">);digitalWrite(LEDpin,LOW);delay(</span><span style="color: #800080;">600</span><span style="color: #000000;">);}cout</span>&lt;&lt;<span style="color: #800000;">"</span><span style="color: #800000;">------------bye-------------</span><span style="color: #800000;">"</span>&lt;&lt;<span style="color: #000000;">endl;</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;   

}

复制代码
View Code

 

 

 PWM输出控制LED呼吸灯的例子

复制代码
#include<iostream>
#include<wiringPi.h>
#include<cstdlib>
using namespace std;

const int PWMpin = 1; //只有wiringPi编号下的1脚(BCM标号下的18脚)支持
void setup();

int main()
{

setup();
</span><span style="color: #0000ff;">int</span> val = <span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">int</span> step = <span style="color: #800080;">2</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">while</span>(<span style="color: #0000ff;">true</span><span style="color: #000000;">)
{</span><span style="color: #0000ff;">if</span>(val&gt;<span style="color: #800080;">1024</span><span style="color: #000000;">){step </span>= -<span style="color: #000000;">step;    val </span>= <span style="color: #800080;">1024</span><span style="color: #000000;">;}</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(val&lt;<span style="color: #800080;">0</span><span style="color: #000000;">){step </span>= -<span style="color: #000000;">step;val </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;}pwmWrite(PWMpin,val);val</span>+=<span style="color: #000000;">step;delay(</span><span style="color: #800080;">10</span><span style="color: #000000;">);
}</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

void setup()
{
if(-1==wiringPiSetup())
{
cerr<<“setup error\n”;
exit(-1);
}
pinMode(PWMpin,PWM_OUTPUT);
}

复制代码
View Code

 




时间控制函数

unsigned int millis (void)
这个函数返回 一个 从你的程序执行 wiringPiSetup  初始化函数(或者wiringPiSetupGpio ) 到 当前时间 经过的 毫秒数。
返回类型是unsigned int,最大可记录 大约49天的毫秒时长。
unsigned int micros (void) 这个函数返回 一个 从你的程序执行 wiringPiSetup  初始化函数(或者wiringPiSetupGpio ) 到 当前时间 经过的 微秒数。
返回类型是unsigned int,最大可记录 大约71分钟的时长。 void delay (unsigned int howLong) 将当前执行流暂停 指定的毫秒数。因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsigned int 类型,最大延时时间可达49天 void delayMicroseconds (unsigned int howLong) 将执行流暂停 指定的微秒数(1000微秒 = 1毫秒 = 0.001秒)。
因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsigned int 类型,最大延时时间可达71分钟

 

 

 

 

中断

wiringPi提供了一个中断处理注册函数,它只是一个注册函数,并不处理中断。他无需root权限。

 

int wiringPiISR (int pin, int edgeType,  void (*function)(void))

返回值:返回负数则代表注册失败

pin:接受中断信号的引脚

edgeType:触发的方式。

 INT_EDGE_FALLING:下降沿触发
 INT_EDGE_RISING:上升沿触发
 INT_EDGE_BOTH :上下降都会触发
 INT_EDGE_SETUP:编程时用不到。       

    

function:中断处理函数的指针,它是一个无返回值,无参数的函数。

注册的函数会在中断发生时执行

和51单片机不同的是:这个注册的中断处理函数会和main函数并发执行(同时执行,谁也不耽误谁)

当本次中断函数还未执行完毕,这个时候树莓派又触发了一个中断,那么这个后来的中断不会被丢弃,它仍然可以被执行。但是wiringPi最多可以跟踪并记录后来的仅仅1个中断,如果不止1个,则他们会被忽略,得不到执行。

 

 

 通过1脚检测 因为按键按下引发的 下降沿,触发中断,反转11控制的LED

 

复制代码
#include<iostream>
#include<wiringPi.h>
#include<cstdlib>
using namespace std;

void ButtonPressed(void);
void setup();

//
const int LEDPin = 11;
const int ButtonPin = 1;
/***/

int main()
{

setup();</span><span style="color: #008000;">//</span><span style="color: #008000;">注册中断处理函数</span>
<span style="color: #0000ff;">if</span>(<span style="color: #800080;">0</span>&gt;<span style="color: #000000;">wiringPiISR(ButtonPin,INT_EDGE_FALLING,ButtonPressed))
{cerr</span>&lt;&lt;<span style="color: #800000;">"</span><span style="color: #800000;">interrupt function register failure</span><span style="color: #800000;">"</span>&lt;&lt;<span style="color: #000000;">endl;exit(</span>-<span style="color: #800080;">1</span><span style="color: #000000;">);
}</span><span style="color: #0000ff;">while</span>(<span style="color: #800080;">1</span><span style="color: #000000;">)
;</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

void setup()
{
if(-1==wiringPiSetup())
{
cerr<<“wiringPi setup error”<<endl;
exit(-1);
}

pinMode(LEDPin,OUTPUT);    </span><span style="color: #008000;">//</span><span style="color: #008000;">配置11脚为控制LED的输出模式</span>
digitalWrite(LEDPin,LOW);  <span style="color: #008000;">//</span><span style="color: #008000;">初始化为低电平</span>
pinMode(ButtonPin,INPUT); // 配置1脚为输入 pullUpDnControl(ButtonPin,PUD_UP); // 将1脚上拉到3.3v }

//中断处理函数:反转LED的电平
void ButtonPressed(void)
{

digitalWrite(LEDPin,  (HIGH</span>==digitalRead(LEDPin))?<span style="color: #000000;">LOW:HIGH );

}

复制代码
View Code

 

 

 

多线程

wiringPi提供了简单的Linux系统下的通用的 Posix threads线程库接口来支持并发。

 

int piThreadCreate(name)

name:被包装的线程执行函数

返回:状态码。返回0表示成功启动,反之失败。

源代码:
int piThreadCreate (void *(*fn)(void *))
{
  pthread_t myThread ;

  return pthread_create (&myThread, NULL, fn, NULL) ;
}

包装一个用PI_THEEAD定义的函数为一个线程,并启动这个线程。

首先你需要通过以下方式创建一个特特殊的函数,这个函数中的代码就是在新的线程中将执行的代码。,myTread是你自己线程的名字,可自定义。


PI_THREAD (myThread)
{//在这里面写上的代码会和主线程并发执行。
}

在wiringPi.h中,我发现这样一个宏定义:#define PI_THREAD(X) void *X (void *dummy)
那么,被预处理后我们写的线程函数会变成下面这个样子,请注意返回值,难怪我每次写都会警告,因为没有返回一个指针,
那么,以后注意返回NULL,或者 (void*)0
void *myThread (void *dummy)
{
 //在这里面写上的代码会和主线程并发执行。
}


piLock(int keyNum)keyNum:0-3的值,每一个值代表一把锁

使能同步锁。wiringPi只提供了4把锁,也就是keyNum只能取0~3的值,官方认为有这4把锁就够了。

keyNum:0,1,2,3 每一个数字就代表一把锁。

源代码:

void piLock (int keyNum)
{
  pthread_mutex_lock (&piMutexes [keyNum]) ;
}

 

piUnlock(int keyNum) keyNum:0-3的值,每一个值代表一把锁

解锁,或者说让出锁。

源代码:

void piUnlock (int key)
{
  pthread_mutex_unlock (&piMutexes [key]) ;
}

int piHiPri (int priority)

priority:优先级指数,0~99

返回值:0,成功

         -1:,失败

设定线程的优先级,设定线程的优先级变高,不会使程序运行加快,但会使这个线程获得相当更多的时间片。priority是相对的。比如你的程序只用到了主线程,

和另一个线程A,主线程设定优先级为1,A线程设定为2,那也代表A比main线程优先级高。

 

 

凡是涉及到多线程编程,就会涉及到线程安全的问题,多线程访问同一个数据,需要使用同步锁来保障数据操作正确性和符合预期。

当A线程锁上 锁S 后,其他共用这个锁的竞争线程,只能等到锁被释放,才能继续执行。

成功执行了piLock 函数的线程将拥有这把锁。其他线程想要拥有这把锁必须等到这个线程释放锁,也就是这个线程执行piUnlock后。

同时要扩展的知识是:volatile 这个C/C++中的关键字,它请求编译器不缓存这个变量的数据,而是每次都从内存中读取。特别是在多线程下共享放变量,必须使用volatile关键字声明才是保险的。

 

 

 

 

 

 

softPwm,软件实现的PWM

树莓派硬件上支持的PWM输出的引脚有限,为了突破这个限制,wiringPi提供了软件实现的PWM输出API。

需要包含头文件:#include <softPwm.h>

编译时需要添pthread库链接  -lpthread

 

int softPwmCreate (int pin, int initialValue, int pwmRange)

pin:用来作为软件PWM输出的引脚

initalValue:引脚输出的初始值

pwmRange:PWM值的范围上限

建议使用100.

返回:0表示成功。

使用一个指定的pin引脚创建一个模拟的PWM输出引脚 void softPwmWrite (int pin, int value)

pin:通过softPwmCreate创建的引脚

value:PWM引脚输出的值

更新引脚输出的PWM值

 

 

串口通信

使用时需要包含头文件:#include <wiringSerial.h>

int serialOpen (char *device, int baud)

device:串口的地址,在Linux中就是设备所在的目录。

默认一般是"/dev/ttyAMA0",我的是这样的。

 baud:波特率

返回:正常返回文件描述符,否则返回-1失败。

打开并初始串口
void serialClose (int fd) fd:文件描述符 关闭fd关联的串口 void  serialPutchar (int fd, unsigned char c)

fd:文件描述符

c:要发送的数据

发送一个字节的数据到串口 void  serialPuts (int fd, char *s)

fd:文件描述符

s:发送的字符串,字符串要以'\0'结尾

发送一个字符串到串口 void  serialPrintf (int fd, char *message, …)

fd:文件描述符

message:格式化的字符串

像使用C语言中的printf一样发送数据到串口 int   serialDataAvail (int fd)

fd:文件描述符

返回:串口缓存中已经接收的,可读取的字节数,-1代表错误

 获取串口缓存中可用的字节数。 int serialGetchar (int fd)

fd:文件描述符

返回:读取到的字符

从串口读取一个字节数据返回。

如果串口缓存中没有可用的数据,则会等待10秒,如果10后还有没,返回-1

所以,在读取前,做好通过serialDataAvail判断下。

void serialFlush (int fd)

fd:文件描述符

刷新,清空串口缓冲中的所有可用的数据。

*size_t write (int fd,const void * buf,size_t count)

fd:文件描述符

buf:需要发送的数据缓存数组

count:发送buf中的前count个字节数据

返回:实际写入的字符数,错误返回-1

这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h>

当要发送到的数据量过大时,wiringPi建议使用这个函数。

*size_t read(int fd,void * buf ,size_t count);

fd:文件描述符

buf:接受的数据缓存的数组

count:接收的字节数.

返回:实际读取的字符数。

这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h>

当要接收的数据量过大时,wiringPi建议使用这个函数。

 

初次使用树莓派串口编程,需要配置。我开始搞了很久,以为是程序写错了 还一直在调试。。。(~ ̄— ̄)~

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

 

 

下面是双机通信的一个例子

C51代码,作为串口通信的接发送。serial库请看另一篇文章

复制代码
#include<reg52.h>
#include"serial.h"

/function*****/
bit isOpenPressed(void);
bit isClosePressed(void);
void delay(unsigned int t);
/******************************/

sbit closeButton = P2^0; //与关闭按键相连的引脚
sbit openButton = P2^1; //与打开按键相连的引脚

void main(void)
{

  closeButton </span>= <span style="color: #800080;">1</span>;      <span style="color: #008000;">//</span><span style="color: #008000;">拉高</span>openButton  = <span style="color: #800080;">1</span>;      <span style="color: #008000;">//</span><span style="color: #008000;">拉高</span>
EA = 1; // 打开总中断 serial_init( 9600); // 初始化51串口
  <span style="color: #0000ff;">while</span>(<span style="color: #800080;">1</span><span style="color: #000000;">){</span><span style="color: #0000ff;">if</span>(isClosePressed())     <span style="color: #008000;">//</span><span style="color: #008000;">如果关闭按钮按下</span>

{
serial_write(0); //发送数据 0给树莓派
delay(10);
}

      </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(isOpenPressed()) <span style="color: #008000;">//</span><span style="color: #008000;">如果打开按钮按下</span>

{
serial_write(1); //发送数据 1给树莓派
delay(10);
}
}
}

bit isOpenPressed(void)
{
bit press =0;

   </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">0</span>==<span style="color: #000000;">openButton){delay(</span><span style="color: #800080;">5</span><span style="color: #000000;">);</span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">0</span>==<span style="color: #000000;">openButton){</span><span style="color: #0000ff;">while</span>(!<span style="color: #000000;">openButton);press </span>= <span style="color: #800080;">1</span><span style="color: #000000;">;}}</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> press;    

}

bit isClosePressed(void)
{
bit press =0;

   </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">0</span>==<span style="color: #000000;">closeButton){delay(</span><span style="color: #800080;">5</span><span style="color: #000000;">);</span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">0</span>==<span style="color: #000000;">closeButton){</span><span style="color: #0000ff;">while</span>(!<span style="color: #000000;">closeButton);press </span>= <span style="color: #800080;">1</span><span style="color: #000000;">;}}</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> press;    

}

void delay(unsigned int t)
{
unsigned int i ;
unsigned char j;
for(i = t;i>0;i–)
for(j=120;j>0;j–)
;
}

复制代码
View Code

 

树莓派代码,作为串口通信的接收方

复制代码
#include<iostream>
#include<cstdlib>
#include<wiringPi.h>
#include<wiringSerial.h>
using namespace std;

void setup();
const int LEDPin = 11;

int main()
{
setup();

</span><span style="color: #0000ff;">int</span> fd; <span style="color: #008000;">//</span><span style="color: #008000;">Linux 的思想是:将一切IO设备,都看做 文件,fd就是代表串口抽象出来的文件</span><span style="color: #0000ff;">if</span>((fd = serialOpen(<span style="color: #800000;">"</span><span style="color: #800000;">/dev/ttyAMA0</span><span style="color: #800000;">"</span>,<span style="color: #800080;">9600</span>))==-<span style="color: #800080;">1</span>)    <span style="color: #008000;">//</span><span style="color: #008000;">初始化串口,波特率9600</span>

{

    cerr</span>&lt;&lt;<span style="color: #800000;">"</span><span style="color: #800000;">serial open error</span><span style="color: #800000;">"</span>&lt;&lt;<span style="color: #000000;">endl;exit(</span>-<span style="color: #800080;">1</span><span style="color: #000000;">);}</span><span style="color: #0000ff;">while</span>(<span style="color: #0000ff;">true</span><span style="color: #000000;">)
{</span><span style="color: #0000ff;">if</span>(serialDataAvail(fd) &gt;= <span style="color: #800080;">1</span>)    <span style="color: #008000;">//</span><span style="color: #008000;">如果串口缓存中有数据</span>

{
int data = serialGetchar(fd);

        </span><span style="color: #0000ff;">if</span>(data==<span style="color: #800080;">0</span>)   <span style="color: #008000;">//</span><span style="color: #008000;">接受到51发送的 数据 0</span>

{
// close led
digitalWrite(LEDPin,LOW);

        }</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(data==<span style="color: #800080;">1</span>)  <span style="color: #008000;">//</span><span style="color: #008000;">接受到51发送的 数据 1</span>

{
//open led
digitalWrite(LEDPin,HIGH);
}
}

}</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

void setup()
{
if(-1==wiringPiSetup())
{
cerr<<“set up error”<<endl;
exit(-1);
}

pinMode(LEDPin,OUTPUT);
digitalWrite(LEDPin,HIGH);

}

复制代码
View Code

 

 

shift移位寄存器芯片API

需要包含头文件  #include <wiringShift.h>

void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val)

dPin:移位芯片的串行数据入口引脚,比如74HC595的SER脚

cPin:移位芯片的时钟引脚。如74HC595的11脚

order:

   LSBFIRST 先发送数据的低位

   MSBFIRST先发送数据的高位

     

val:要发送的8位数据

将val串化,通过芯片转化为并行输出

如常见的74HC595

 uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order)

同上。 

将并行数据,通过芯片转化为串行输出。

 

用过595的都知道还有一个引脚:12脚,Rpin,用于把移位寄存器中的数据更新到存储寄存器中,然后wiringPi的API中没有使用这个引脚。我建议使用的时候自己加上。

 

#include<iostream>
#include<wiringPi.h>
#include <wiringShift.h>
#include<cstdlib>
using namespace std;

const int SERpin = 1; //serial data input
const int SCKpin = 2; //shift register clock
const int RCKpin = 3; // storage register clock
/********************/
void setup();

/***********************/

int main()
{
setup();

</span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=<span style="color: #800080;">0</span>;i&lt;<span style="color: #800080;">8</span>;++<span style="color: #000000;">i)
{digitalWrite(RCKpin,LOW);shiftOut(SERpin,SCKpin,LSBFIRST,</span><span style="color: #800080;">1</span>&lt;&lt;<span style="color: #000000;">i);digitalWrite(RCKpin,HIGH);delay(</span><span style="color: #800080;">800</span><span style="color: #000000;">);
}
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

void setup()
{
if(-1==wiringPiSetup())
{
cerr<<“setup error\n”;
exit(-1);
}

pinMode(SERpin,OUTPUT);
pinMode(RCKpin,OUTPUT);
pinMode(SCKpin,OUTPUT);

}

View Code

 

 

 

树莓派硬件平台特有的API

并没有列全,我只是列出了相对来说有用的,其他的,都基本不会用到。

pwmSetMode (int mode)

mode:PWM运行模式

设置PWM的运行模式。

pwm发生器可以运行在2种模式下,通过参数指定:
     PWM_MODE_BAL   :树莓派默认的PWM模式
     PWM_MODE_MS    :传统的pwm模式,

pwmSetRange (unsigned int range)

range,范围的最大值

0~range

设置pwm发生器的数值范围,默认是1024 pwmSetClock (int divisor)   This sets the divisor for the PWM clock.
To understand more about the PWM system, you’ll need to read the Broadcom ARM peripherals manual. piBoardRev (void)

返回:树莓派板子的版本编号

1或者2

/

 

 

就这样,以后会更新。

 

 

 

 欢迎转载,请注明出处:www.cnblogs.com/lulipro

 为了获得更好的阅读体验,请访问原博客地址。

限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

代码钢琴家



 

作者:lulipro-代码钢琴家
出处:http://www.cnblogs.com/lulipro/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。为了获得更好的阅读体验,请访问原博客地址。限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

分类: 树莓派
好文要顶 关注我 收藏该文
lulipro
关注 - 22
粉丝 - 183
+加关注
6
0
« 上一篇: 【C51】74HC573芯片
» 下一篇: 使用Notepad++代替笨拙的Arduino IDE
	</div><div class="postDesc">posted @ <span id="post-date">2016-10-27 21:54</span> <a href="https://www.cnblogs.com/lulipro/">lulipro</a> 阅读(<span id="post_view_count">30166</span>) 评论(<span id="post_comment_count">12</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=5992172" rel="nofollow">编辑</a> <a href="#" "AddToWz(5992172);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=259039,cb_entryId=5992172,cb_blogApp=currentBlogApp,cb_blogUserGuid='67ae1b0a-01a4-e511-9fc1-ac853d9f53cc',cb_entryCreatedDate='2016/10/27 21:54:00';loadViewCount(cb_entryId);var cb_postType=1;var isMarkdown=false;</script>

	<div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3616892" class="layer">#1楼</a><a name="3616892" id="comment_anchor_3616892"></a>  <span class="comment_date">2017-02-12 19:05</span> <a id="a_comment_author_3616892" href="http://home.cnblogs.com/u/1105100/" target="_blank">yuepengdaifei</a> <a href="http://msg.cnblogs.com/send/yuepengdaifei" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3616892" class="blog_comment_body">请问如何树莓派才能正常使用analogread?文中说“树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,需要增加另外的模块”,那么需要什么模块呢?<br>我现有一传感器的输出电压要用analogread来读取,然而用analogread读取值一直为0。。。求助。。。O(∩_∩)O谢谢!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" "return voteComment(3616892,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" "return voteComment(3616892,'Bury',this)">反对(0)</a></div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3616922" class="layer">#2楼</a><a name="3616922" id="comment_anchor_3616922"></a>[<span class="louzhu">楼主</span>]  <span class="comment_date">2017-02-12 21:35</span> <a id="a_comment_author_3616922" href="https://www.cnblogs.com/lulipro/" target="_blank">lulipro</a> <a href="http://msg.cnblogs.com/send/lulipro" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3616922" class="blog_comment_body"><a href="#3616892" title="查看所回复的评论" "commentManager.renderComments(0,50,3616892);">@</a>

yuepengdaifei
我看了下wiringPi 官方的说明,里面提到了2款扩展板:Gertboard,quick2Wire analog board可以用来支持模拟信号。但是这2个扩展板很贵,网上卖的也很少。你可以试试用一些AD转换芯片。我的建议是直接使用Arduino板去做,如Uno .价格也很便宜,板子自身支持模拟信。自带的2个函数就可以:analogRead(),analogWrite()
<img src="//images2015.cnblogs.com/blog/858860/201702/858860-20170212213401666-568194383.png" alt="" border=“0” “=”">

支持(0) 反对(0)
http://pic.cnblogs.com/face/858860/20170316220126.png

	<div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3835221" class="layer">#3楼</a><a name="3835221" id="comment_anchor_3835221"></a>  <span class="comment_date">2017-11-08 19:20</span> <a id="a_comment_author_3835221" href="http://home.cnblogs.com/u/844933/" target="_blank">薬師</a> <a href="http://msg.cnblogs.com/send/%E8%96%AC%E5%B8%AB" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3835221" class="blog_comment_body">博主您好,我参照您demo写了一个硬件的pwm控制,但是只要一调用pwmSetRange()  ,   pwmSetMode() 这两个函数就会导致USB鼠标键盘全部灯都不亮了,而且也没pwm信号输出,请问您有遇到过这种情况吗</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" "return voteComment(3835221,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" "return voteComment(3835221,'Bury',this)">反对(0)</a></div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3835234" class="layer">#4楼</a><a name="3835234" id="comment_anchor_3835234"></a>[<span class="louzhu">楼主</span>]  <span class="comment_date">2017-11-08 19:39</span> <a id="a_comment_author_3835234" href="https://www.cnblogs.com/lulipro/" target="_blank">lulipro</a> <a href="http://msg.cnblogs.com/send/lulipro" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3835234" class="blog_comment_body"><a href="#3835221" title="查看所回复的评论" "commentManager.renderComments(0,50,3835221);">@</a>

薬師
是不是因为电源不足呢?树莓派2B以后的都建议使用5V 2A~2.5A的电源。

支持(0) 反对(0)
http://pic.cnblogs.com/face/858860/20170316220126.png

	<div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3835236" class="layer">#5楼</a><a name="3835236" id="comment_anchor_3835236"></a>  <span class="comment_date">2017-11-08 19:40</span> <a id="a_comment_author_3835236" href="http://home.cnblogs.com/u/844933/" target="_blank">薬師</a> <a href="http://msg.cnblogs.com/send/%E8%96%AC%E5%B8%AB" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3835236" class="blog_comment_body">应该不是吧,我也是 5V 2A的电源,而且我用命令行工具 gpio 去设置的话,是可以出pwm波的</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" "return voteComment(3835236,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" "return voteComment(3835236,'Bury',this)">反对(0)</a></div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3835239" class="layer">#6楼</a><a name="3835239" id="comment_anchor_3835239"></a>[<span class="louzhu">楼主</span>]  <span class="comment_date">2017-11-08 19:44</span> <a id="a_comment_author_3835239" href="https://www.cnblogs.com/lulipro/" target="_blank">lulipro</a> <a href="http://msg.cnblogs.com/send/lulipro" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3835239" class="blog_comment_body"><a href="#3835236" title="查看所回复的评论" "commentManager.renderComments(0,50,3835236);">@</a>

薬師
我看了下,wiringPi的库中没有你说的pwmSetRange和 pwmSetMode函数呀?
要不你试试用softPWM系列函数。

支持(0) 反对(0)
http://pic.cnblogs.com/face/858860/20170316220126.png

	<div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3835240" class="layer">#7楼</a><a name="3835240" id="comment_anchor_3835240"></a>[<span class="louzhu">楼主</span>]  <span class="comment_date">2017-11-08 19:47</span> <a id="a_comment_author_3835240" href="https://www.cnblogs.com/lulipro/" target="_blank">lulipro</a> <a href="http://msg.cnblogs.com/send/lulipro" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3835240" class="blog_comment_body"><a href="#3835236" title="查看所回复的评论" "commentManager.renderComments(0,50,3835236);">@</a>

薬師
我找到了,你可以看下官方的说明:http://wiringpi.com/reference/raspberry-pi-specifics/

支持(0) 反对(0)
http://pic.cnblogs.com/face/858860/20170316220126.png

	<div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3835242" class="layer">#8楼</a><a name="3835242" id="comment_anchor_3835242"></a>  <span class="comment_date">2017-11-08 19:49</span> <a id="a_comment_author_3835242" href="http://home.cnblogs.com/u/844933/" target="_blank">薬師</a> <a href="http://msg.cnblogs.com/send/%E8%96%AC%E5%B8%AB" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3835242" class="blog_comment_body">软pwm达不到我的需求,频率太低了呢,我也是用的 wiringPiSetup啊,没有用不能用的Sys模式</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" "return voteComment(3835242,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" "return voteComment(3835242,'Bury',this)">反对(0)</a></div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3835255" class="layer">#9楼</a><a name="3835255" id="comment_anchor_3835255"></a>[<span class="louzhu">楼主</span>]  <span class="comment_date">2017-11-08 20:01</span> <a id="a_comment_author_3835255" href="https://www.cnblogs.com/lulipro/" target="_blank">lulipro</a> <a href="http://msg.cnblogs.com/send/lulipro" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3835255" class="blog_comment_body"><a href="#3835242" title="查看所回复的评论" "commentManager.renderComments(0,50,3835242);">@</a>

薬師
硬件支持的PWM频率是100MHz,太高就没办法了吧。

支持(0) 反对(0)
http://pic.cnblogs.com/face/858860/20170316220126.png

	<div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3835256" class="layer">#10楼</a><a name="3835256" id="comment_anchor_3835256"></a>  <span class="comment_date">2017-11-08 20:01</span> <a id="a_comment_author_3835256" href="http://home.cnblogs.com/u/844933/" target="_blank">薬師</a> <a href="http://msg.cnblogs.com/send/%E8%96%AC%E5%B8%AB" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3835256" class="blog_comment_body">我只用了9k的那个</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" "return voteComment(3835256,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" "return voteComment(3835256,'Bury',this)">反对(0)</a></div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3836374" class="layer">#11楼</a><a name="3836374" id="comment_anchor_3836374"></a>  <span class="comment_date">2017-11-09 21:37</span> <a id="a_comment_author_3836374" href="http://home.cnblogs.com/u/844933/" target="_blank">薬師</a> <a href="http://msg.cnblogs.com/send/%E8%96%AC%E5%B8%AB" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3836374" class="blog_comment_body">找到问题了,我没有用root权限运行,使用了root权限去跑之后就没问题了</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" "return voteComment(3836374,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" "return voteComment(3836374,'Bury',this)">反对(0)</a></div></div></div><div class="feedbackItem"><div class="feedbackListSubtitle"><div class="feedbackManage">&nbsp;&nbsp;<span class="comment_actions"></span></div><a href="#3836377" class="layer">#12楼</a><a name="3836377" id="comment_anchor_3836377"></a>[<span class="louzhu">楼主</span>]<span id="comment-maxId" style="display:none;">3836377</span><span id="comment-maxDate" style="display:none;">2017/11/9 21:40:34</span>  <span class="comment_date">2017-11-09 21:40</span> <a id="a_comment_author_3836377" href="https://www.cnblogs.com/lulipro/" target="_blank">lulipro</a> <a href="http://msg.cnblogs.com/send/lulipro" title="发送站内短消息" class="sendMsg2This">&nbsp;</a></div><div class="feedbackCon"><div id="comment_body_3836377" class="blog_comment_body"><a href="#3836374" title="查看所回复的评论" "commentManager.renderComments(0,50,3836374);">@</a>

薬師
。。。这bug出的真是无语 xD

支持(0) 反对(0)
http://pic.cnblogs.com/face/858860/20170316220126.png


刷新评论 刷新页面 返回顶部
【推荐】超50万C++/C#源码: 大型实时仿真组态图形源码
【推荐】百度云“猪”你开年行大运,红包疯狂拿,低至1折
【推荐】专业便捷的企业级代码托管服务 - Gitee 码云
【活动】2019第四届全球人工技术大会解码“智能+时代”
</div><!--end: forFlow -->
</div>

http://chatgpt.dhexx.cn/article/rNqh75ac.shtml

相关文章

树莓派学习笔记——wiringPi GPIO使用详解

1.前言 最近认真学习了树莓派&#xff0c;从浅到深认真分析了wiringPi实现代码&#xff0c;借助树莓派学习linux收获颇丰。深入学习linux一段时间后发现它非常有魅力&#xff0c;一个简单的IO口输出操作尽有那么多的“玩法”。wiringPi是一个简单易用的函数库&#xff0c;通过w…

树莓派在下载Wiringpi时遇到的问题1.软件包 wiringpi 没有可安装候选2.失败:域名解析暂时失败。 wget: 无法解析主机地址 “project-downloads.drogon.ne

项目场景&#xff1a; 最近无聊,在玩实验室的树莓派,在装Wringpi时遇到了一些问题,记录一下 错误1 我用的是树莓派4B,在sudo apt-get install wiringpi时报了如下错误: 正在读取软件包列表… 完成 正在分析软件包的依赖关系树… 完成 正在读取状态信息… 完成 没有可用的软件…

树莓派学习笔记——wiringPi简介、安装和管脚说明

1.WiringPi简介 WiringPi是应用于树莓派平台的GPIO控制库函数&#xff0c;WiringPi遵守GUN Lv3。wiringPi使用C或者C开发并且可以被其他语言包转&#xff0c;例如python、ruby或者PHP等。WiringPi中的函数类似于Arduino的wiring系统&#xff0c;这使得熟悉arduino的用户使用wri…

WiringPi介绍及安装方法

WiringPi介绍及安装方法 1.WiringPi简介 WiringPi是应用于树莓派平台的GPIO控制库函数&#xff0c;WiringPi遵守GUN Lv3。wiringPi使用C或者C开发并且可以被其他语言包转&#xff0c;例如python、ruby或者PHP等。WiringPi中的函数类似于Arduino的wiring系统&#xff0c;这使得…

树莓派wiringPi库详解

达者为先 师者之意 树莓派wiringPi库详解 1 WiringPi安装2 wiringPi库编译和运行3 wiringPi库API大全3.1 硬件初始化函数3.2 通用GPIO控制函数3.3 时间控制函数3.4 中断3.5 多线程3.6 softPwm软件实现的PWM3.7 串口通信3.8 shift移位寄存器芯片API3.9 树莓派硬件平台特有的API…

第七课:树莓派WiringPi库

目录 一、WiringPi库介绍 二、WiringPi安装 方法一&#xff1a; 安装git工具&#xff08;已安装跳过&#xff09;&#xff08;前提已更换国内下载源&#xff09; ①&#xff1a;输入一下指令 ​②&#xff1a; 输入指令--在线获得 WiringPi 的源代码&#xff08;2019后不…

树莓派——wiringPi库详解

文章目录 查看树莓派引脚编号wiringPi库API大全硬件初始化函数通用GPIO控制函数时间控制函数串口通信串口通信配置测试代码串口通信实例 中断多线程其他 wiringPi&#xff08;特定平台&#xff0c;特定功能接口&#xff09;库是基于c语言开发的&#xff0c;提供了丰富的接口&am…

【树莓派】了解wiringPi库、控制继电器

目录 一、wiringPi库二、继电器1、继电器介绍及接线说明2、树莓派控制继电器 一、wiringPi库 wiringPi是一个很棒的树莓派IO控制库&#xff0c;使用C语言开发&#xff0c;提供了丰富的接口&#xff1a;GPIO控制&#xff0c;中断&#xff0c;多线程等。 在树莓派命令行输入gpio…

树莓派开发—— wiringPi 库的使用

一、wiringPi 的安装 参考文献&#xff1a; https://www.cnblogs.com/lulipro/p/5992172.html 进入 wiringPi的github (https://git.drogon.net/?pwiringPi;asummary) 下载安装包。点击页面的第一个链接的右边的snapshot,下载安装压缩包。 然后进入安装包所在的目录执行以下…

WiringPi安装及使用详解

这个文章先不要看&#xff0c;现在写的跟屎一样&#xff0c;我会断断续续的对本文章进行修改和优化&#xff0c;第一部分没问题&#xff0c;可以参考 WiringPi安装及使用详解 1、WiringPi的安装 2、Wiring常用命令详解 3、Python调用WiringPi库进行开发 1、安装WiringPi 登…

【wrodpress】wordpress发表文章后无法显示

搭建完wordpress&#xff0c;发表第一篇博客测试。文章发布后&#xff0c;首页已经能显示出文章的标题&#xff0c;但是点进去后却提示该页无法显示。 而且可以看到 因为我写的标题是文字&#xff0c;所以标题默认就是文字&#xff0c;而wordpress生成的链接中包含中文字符是…

如何在Hexo博客发布文章

1、markdown格式上传&#xff1a;Hexo默认使用的格式是markdown格式的文件&#xff0c;所以上传markdown文件可以自动转化为HTML格式的文章&#xff1b; 2、将.md文件复制到你hexo博客文件夹 中 source 下的 _posts 中&#xff0c;默认只有一个 hello-world.md&#xff1b; 3、…

微信公众号申请及文章发送详细流程介绍

文章目录 准备工作一、注册订阅号1.打开微信公众平台网址2.点击右上角立即注册&#xff0c;选择订阅号3.填写信息 二、登录微信公众号发表文章1.登录刚注册的公众号2.选择发表文章类型发表文章3.编辑好文章后可以选择阅览查看内容 三、管理微信公众号1.设置自己公众号内容2.管理…

使用wxjava实现发表内容、预览信息以及推送文章

大家好,我是雄雄。 文章目录 前言保存草稿的方法获取草稿箱列表根据media_id获取草稿箱信息给指定人发送预览文章推送文章(按照标签推送)前言 今天分享的内容有如下几个: 保存草稿根绝media_id会哦去草稿箱的信息发表内容,并不是发发布(已发表的内容不会推送给用户,不占…

CSDN 文章审核中的有趣现象

简 介&#xff1a; 对于今天CSDN记录实验博文在审核过程中遇到的“审核未通过”进行查询&#xff0c;通过“二分法” 逐步定位到影响审核通过的具体词语&#xff0c;经过修改之后&#xff0c;便完成了 CSDN 中的文章审核。莫名其妙的审核不通过&#xff0c;来自于输入文字中的 …

csdn发布不了文章的解决

插件的问题 问题 csdn发布不了文章&#xff0c;点击“发布后”&#xff0c;没有任何反应&#xff1b;编辑框也出现了莫名其妙的框图&#xff08;附图1&#xff09; 本以为是csdn在更新&#xff0c;经咨询客服4006600108&#xff08;可能是浏览器插件或者缓存的问题&#xff0…

在CSDN写文章是一种什么体验?

大家好&#xff0c;我是记得诚。 不知不觉&#xff0c;距离我第一篇博客&#xff0c;已快三年了&#xff0c;时间过得真快。 今天简单写一篇文章&#xff0c;记录自己在CSDN的成长进步。 开始 写博客是受杨秀章老师的启发&#xff0c;看到他充满烟火气的文字&#xff0c;给…

27.blog前端-发布文章

点击写文章&#xff0c;会跳转到该页面 点击右上角的发布&#xff0c;会弹出发布的对话框因此&#xff0c;我们要调用文章分类列表和文章标签列表的接口 以及如果是点击文字的编辑按钮进入该页面的话&#xff0c;还需要通过调用文章id获取文章详情的接口 还需要调用发布文章的…

Python爬取网上文章并发表到微信公众号

前言 话说懒惰是人类进步的原动力&#xff0c;古人诚不欺我。最近在折腾一个微信公众号&#xff0c;开始的时候在网上找一些资源然后进行二次创作然后发表到微信公众号&#xff0c;但是这就要自己先把里面的图片下载下来然后文字也复制过来然后再慢慢的上传到微信公众号&#…

如何用CSDN发布文章

CSDN怎么写博客&#xff1f; 1、首先打开CSDN官网&#xff0c;进行注册或者登录 2、登录后点击右上角的创作中心 3、进入以后点击左上角的发布 4、可以开始写入你要写的内容&#xff0c;先写入标题 5、然后再写你要写的内容&#xff0c;左侧写内容&#xff0c;右侧可以预览&a…