为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > wiringPi基本操作示例

wiringPi基本操作示例

2020-09-18 3页 doc 96KB 36阅读

用户头像

is_072127

暂无简介

举报
wiringPi基本操作示例树莓派wiringPi库详解wiringPi是一个很棒的树莓派10控制库,使用C语言开发,提供了丰富的接口:GPI0控制,中断,多线程,等等。java的pi4j项目也是基于wiringPi的,我最近也在看源代码,到时候整理好了会放出来的。下面开始wiringPi之旅吧!安装进入wiringPi的github(https://git.drogon.net/?p=wiringPi;a=summary)下载安装包。点击页面的第一个链接的右边的snapshot,下载安装压缩包。然后进入安装包所在的目录执行以下命令:>tarxfzwir...
wiringPi基本操作示例
树莓派wiringPi库详解wiringPi是一个很棒的树莓派10控制库,使用C语言开发,提供了丰富的接口:GPI0控制,中断,多线程,等等。java的pi4j项目也是基于wiringPi的,我最近也在看源代码,到时候整理好了会放出来的。下面开始wiringPi之旅吧!安装进入wiringPi的github(https://git.drogon.net/?p=wiringPi;a=summary)下载安装包。点击页面的第一个链接的右边的snapshot,下载安装压缩包。然后进入安装包所在的目录执行以下命令:>tarxfzwiringPi-98bcb20.tar.gz〃98bcb20为版本标号,可能不同>cdwiringPi-98bcb20>./build验证wiringPi的是否安装成功,输入gpio-v,会在终端中输出相关wiringPi的信息。否则安装失败。编译和运行假如你写了一个LEDtest.c的项目,则如下编译:g++-Wall-oLEDtestLEDtest.cpp-lwiringPi-Wall是为了使能所有警告,以便发现程序中的问题//使用C++编程,gcc-Wall-oLEDtestLEDtest.c-lwiringPi//使用C语言编程运行:sudo./LEDtest屯查看引脚编号格使用如下控制台下命令>gpioreadall也可以查看下面的图。注意:查看时,将树莓派的USB接口面对自己,这样看才是正确的。树莓派40Pin引脚wirmgPi编码BCM编码功能名物理引脚BOARDig^功能名BCM编码wiringPt编码3.3V125V82SDA.1345V93SCL.156GND74GPI0778_p(D二1415GIMD910mco1516017GPIOO1112GPICM181227GPIO.21314GND322GPIO.31516GPIO.42343.3V1718GPIO伤2451210MOSI1920GND139MISO2122GPIO.62561411SCLK2324CEOa10GND2526CE1亠z71130QSDA.02726SCL0131215GPIO.212930GND226GPIO.223132GPIO.2612262313GPIO.233334GND2419GP1O.243536GPIO.2716272526GPIO253736GPIO.28202aGMD3940GPIO,292129表格由树莓派实验室绘制http://shumeipflitnxez+com;I硬件初始化函数使用wiringPi时,你必须在执行任何操作前初始化树莓派,否则程序不能正常工作。可以调用下表函数之一进行初始化,它们都会返回一个int,返回-1表示初始化失败。intwiringPiSetup(void)返回:执行状态,-1表示失败当使用这个函数初始化树莓派引脚时,引脚的编号为0T6需要root权限程序使用的是wiringPi引脚编号表。当使用这个函数初始化树莓派引脚时,程序中使用的是BCMGPIO引脚编intwiringPiSetupGpio返回执行状态,-1表示号表。(void)失败需要root权限wiringPiSetupPhys(void)不常用,不做介绍/wiringPiSetupSys(void);不常用,不做介绍/[通用GPIO控制函数pin:配置的引脚作用:配置引脚的IO模式mode:指定引脚的IO模式注意:voidpinMode(intpin,intmode)可取的值:INPUT、OUTPUT、PWMOUTPUT,只有wiringPi引脚编号下的1脚(BCM下的18GPIO_CLOCK脚)支持PWM输出只有wiringPi编号下的7(BCM下的4号)支持GPIOCLOCK输出voiddigitalWrite(intpin,intvalue)pin:控制的引脚value:引脚输出的电平值。可取的值:HIGH,LOW分别代表高低电平让对一个已近配置为输出模式的引脚输出指定的电平信号intdigitalRead(intpin)pin:读取的引脚读取一个引脚的电平值LOWHIGH,返回返回:引脚上的电平,可以是LOWHIGH之一voidanalogWrite(intpin,intvalue)intanalogRead(intpin)pin:引脚value:输出的模拟量pin:引脚返回:引脚上读取的模拟量模拟量输出树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,需要增加另外的模块模拟量输入树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,需要增加另外的模块voidpwmWrite(intpin,intvalue)pin:引脚value:写入到PWM寄存器的值,范围在0~1024之间。输出一个值到PWM寄存器,控制PWM输出。pin只能是wiringPi引脚编号下的1脚(BCM下的18脚)voidpullUpDnControl(intpin,intpud)pin:引脚pud:拉电阻模式可取的值:PUD-OFFPUD_DOWNPUD_UP关闭拉电阻引脚电平拉到3.3v引脚电平拉到0v接地对一个设置IO模式为INPUT的输入引脚设置拉电阻模式。与Arduino不同的是,树莓派支持的拉电阻模式更丰富。树莓派内部的拉电阻达50K欧姆LED闪烁程序#include#include#includevwiringPi.h>constintLEDpin=1;intmain(){if(-仁=wiringPiSetup()){cerr«"setuperror'n"TOC\o"1-5"\h\zexit(-1);}pinMode(LEDpin,OUTPUT);for(size_ti=0;i<10;++i){digitalWrite(LEDpin,HIGH);delay(600);digitalWrite(LEDpin,LOW);delay(600);}cout«"bye"<#includevwiringPi.h>#includeusingnamespacestd;constintPWMpin=1;//只有wiringPi编号下的1脚(BCM标号下的18脚)支持voidsetup();intmain(){setup();intval=0;intstep=2;while(true)if(val>1024){step=-step;val=1024;}elseif(val<0){step=-step;val=0;}pwmWrite(PWMpin,val);val+=step;delay(10);}return0;}voidsetup(){if(-1==wiringPiSetup()){cerrvv"setuperror'n";exit(-1);}pinMode(PWMpin,PWM_OUTPUT);}[时间控制函数unsignedintmillis(void)这个函数返回一个从你的程序执行wiringPiSetup初始化函数(或者wiringPiSetupGpio)至当前时间经过的毫秒数。返回类型是unsignedint,最大可记录大约49天的毫秒时长。unsignedintmicros(void)这个函数返回一个从你的程序执行wiringPiSetup初始化函数(或者wiringPiSetupGpio)至当前时间经过的微秒数。返回类型是unsignedint,最大可记录大约71分钟的时长。voiddelay(unsignedinthowLong)将当前执行流暂停指定的毫秒数。因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsignedint类型,最大延时时间可达49天voiddelayMicroseconds(unsignedinthowLong)将执行流暂停指定的微秒数(1000微秒=1毫秒=0.001秒)。因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsignedint类型,最大延时时间可达71分钟中断wiringPi提供了一个中断处理注册函数,它只是一个注册函数,并不处理中断。他无需root权限。返回值:返回负数则代表注册失败pin:接受中断信号的引脚edgeType:触发的方式。INT_EDGE_FALLING:下降沿触发INT_EDGE_RISING:上升沿触发intwiringPiISR(intpin,intINT_EDGE_BOTH:上下降都会触edgeType,void发(*function)(void))INT_EDGE_SETUP:编程时用不至注册的函数会在中断发生时执行和51单片机不同的是:这个注册的中断处理函数会和main函数并发执行(同时执行,谁也不耽误谁)当本次中断函数还未执行完毕,这个时候树莓派又触发了一个中断,那么这个后来的中断不会被丢弃,它仍然可以被执行。但是wiringPi最多可以跟踪并记录后来的仅仅1个中断,如果不止1个,则他们会被忽略,得不到执行。function:中断处理函数的指针,它是一个无返回值,无参数的函数。通过1脚检测因为按键按下引发的下降沿,触发中断,反转11控制的LED曰#include#includevwiringPi.h>#includeusingnamespacestd;voidButtonPressed(void);voidsetup();/********************************/constintLEDPin=11;constintButtonPin=1;/*******************************/intmain(){setup();//注册中断处理函数if(0>wiringPilSR(ButtonPin,INT_EDGE_FALLING,ButtonPressed)){cerrvv"interruptfunctionregisterfailure"<编译时需要添pthread库链接-lpthreadintsoftPwmCreate(intpin,intinitialValue,intpjn.用来作为软件PWM输出的使用一个指定的pin引脚创建一个模拟的pwmRange)引脚PWM输出引脚initalValue:引脚输出的初始值pwmRange:PWM值的范围上限建议使用100.返回:0表示成功。pin:通过softPwmCreate创建的voidsoftPwmWrite(intpin,intvalue)引脚更新引脚输出的PWM值value:PWM引脚输出的值串口通信使用时需要包含头文件:#includeintserialOpen(char*device,intbaud)device:串口的地址,在Linux中就是设备所在的目录。默认一般是"/dev/ttyAMA0",我的是这样的。打开并初始串口baud:波特率返回:正常返回文件描述符,否则返回-1失败。fd:文件描述符关闭fd关联的串口voidserialClose(intfd)voidserialPutchar(intfd,unsignedcharc)fd:文件描述符c:要发送的数据发送一个字节的数据到串口voidserialPuts(intfd,char*s)fd:文件描述符s:发送的字符串,字符串要以’\0'结尾发送一个字符串到串口像使用C语言中的printf—样发送数据到串口voidserialPrintf(intfd,char*message,…)fd:文件描述符message:化的字符串intserialDataAvail(intfd)fd:文件描述符获取串口缓存中可用的字节数。intserialGetchar(intfd)判断返回:串口缓存中已经接收的,可读取的字节数,-1代表错误fd:文件描述符返回:读取到的字符从串口读取一个字节数据返回。如果串口缓存中没有可用的数据,则会等待秒,如果10后还有没,返回-1所以,在读取前,做好通过serialDataAvail下。voidserialFlush(intfd)fd:文件描述符刷新,清空串口缓冲中的所有可用的数据。*size_twrite(intfd,constvoidbuf,size_tcount)fd:文件描述符buf:需要发送的数据缓存数组count:发送buf中的前count个字节数据返回:实际写入的字符数,错误返回-1这个是Linux下的10库函数,需要包含头文件#include当要发送到的数据量过大时,wiringPi建议使用这个函数。*size_tread(intfd,void*buf,size_tcount);fd:文件描述符buf:接受的数据缓存的数组count:接收的字节数.返回:实际读取的字符数。这个是Linux下的标准I0库函数,需要包含头文件#include当要接收的数据量过大时,wiringPi建议使用这个函数。初次使用树莓派串口编程,需要配置。我开始搞了很久,以为是程序写错了还一直在调试。。。(〜—一—)〜/*修改cmdline.txt文件*/>cd/boot/>sudovimcmdline.txt删除【】之间的部分dwc_otg.lpm_enable=0【console=ttyAMA0,115200】kgdboc=ttyAMAO,115200console=tty1root=/dev/mmcblk0p2rootfstype=ext4elevator=deadlinerootwait/*修改inittab文件*/>cd/etc/>sudoviminittab注释掉最后一行内容:,在前面加上#号#T0:23:respawn:/sbin/getty-LttyAMAO115200vtlOOsudoreboot重启下面是双机通信的一个例子C51代码,作为串口通信的接发送。serial库请看另一篇文章#include#include"serial.h"function**************bitisOpenPressed(void);bitisClosePressed(void);voiddelay(unsignedintt);sbitcloseButton=P2A0;//与关闭按键相连的引脚sbitopenButton=P2A1;//与打开按键相连的引脚voidmain(void){closeButton=1;//拉高openButton=1;//拉高EA=1;//打开总中断serial」nit(9600);//初始化51串口while(1){if(isClosePressed())//如果关闭按钮按下{serial_write(0);//发送数据0给树莓派delay(10);}elseif(isOpenPressed())//如果打开按钮按下serial_write(delay(10);1);//发送数据1给树莓派}}}bitisOpenPressed(void){bitpress=0;if(0==openButton){delay(5);if(0==openButton){while(!openButton)Jpress=1;}}returnpress;}bitisClosePressed(void){bitpress=0;if(0==closeButton){delay(5);if(0==closeButton){while(!closeButton)Jpress=1;}}returnpress;}voiddelay(unsignedintt){unsignedinti;unsignedcharj;for(i=t;i>0;i--)for(j=120;j>0;j--)树莓派代码,作为串口通信的接收方#include#include#includevwiringPi.h>#includevwiringSerial.h>usingnamespacestd;voidsetup();constintLEDPin=11;intmain(){setup();intfd;//Linux的思想是:将一切10设备,都看做文件,fd就是代表串口抽象出来的文件if((fd=serialOpen("/dev/ttyAMA0",9600))==-1)//初始化串口,波特率9600{cerrvv"serialopenerror"<=1)//如果串口缓存中有数据{intdata=serialGetchar(fd);if(data==0)//接受到51发送的数据0//closeleddigitalWrite(LEDPin,LOW);}elseif(data==1)//接受到51发送的数据1{//openleddigitalWrite(LEDPin,HIGH);}}}return0;}voidsetup(){if(-1==wiringPiSetup()){cerr«"setuperror"<dPin:移位芯片的串行数据入口引脚,比如74HC595的SER脚cPin:移位芯片的时钟引脚。如74HC595的11将val串化,通过芯片转化为并voidshiftOut(uint8_tdPin,uint8_tcPin,order:行输出uint8_torder,uint8_tval)LSBFIRST先发送数据的低位如常见的74HC595MSBFIRST先发送数据的高位val:要发送的8位数据uint8_tshiftIn(uint8_tdPin,uint8_tcPin,uint8_torder)同上。将并行数据,通过芯片转化为串行输出。用过595的都知道还有一个引脚:12脚,Rpin,用于把移位寄存器中的数据更新到存储寄存器中,然后wiringPi的API中没有使用这个引脚。我建议使用的时候自己加上。#include#includevwiringPi.h>#include#includeusingnamespacestd;constintSERpin=1;constintSCKpin=2;constintRCKpin=3;/************************/voidsetup();//serialdatainput//shiftregisterclock//storageregisterclockintmain(){setup();for(inti=0;i<8;++i){digitalWrite(RCKpin,LOW);1<
/
本文档为【wiringPi基本操作示例】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索