树莓派接口
IO 口:Input,ouput
input:红外传感器、烟雾传感器、火焰传感器、震动传感器等
ouput:继电器、蜂鸣器等
PWM:电机调速,调整灯光亮度
语言识别模块、液晶屏
串口:uart、IIC、SPI、IIS
其它特地硬件的接口:flash..
树莓派 wiringPi 库
wiringPi是树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等。
在使用时需添加头文件引用 #include<wiringPi.h>
在编译时需添加库使用 gcc xxx.c -lwirinfPi
查看版本 gpio -v
查看引脚
硬件初始化函数(选择一种函数初始化即可)
int wiringPiSetup (void) 返回:执行状态,-1表示失败
当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16
需要root权限
int wiringPiSetupGpio (void) 返回执行状态,-1表示失败
当使用这个函数初始化树莓派引脚时,程序中使用的是BCM GPIO 引脚编号表。
需要root权限
gpio控制函数常用api
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 之一(HIGH返回1,LOW返回0)
树莓派控制继电器
树莓派超声波测距
工作原理:
1.超声波模块和单片机进行连接。
2.触发信号,给Trig引脚发送一个大于10us的高电平。
3.发送高电平后,模块会循环发送8个40KHZ的脉冲,与此同时Echo引脚会由低电平变成高电平,这时候就需要开启定时器开始计算Echo引脚的高电平时间,
4.模块接收到返回的超声波时,Echo电平会由高电平变成低电平,此时应该关闭定时器,这个时候的算出来的定时器的时间就是Echo持续的高电平,也就是超声波从发射到传回来的总时间。
5.(除去温度的影响)根据声速为340m/s,来计算(高电平时间 * 340m/s) / 2。 计算的时候注意自己使用定时器获得的时间的单位。记得换算。
struct timeval结构体
#include <sys/time.h>//头文件
struct timeval
{
__time_t tv_sec; /* Seconds. */ //秒级
__suseconds_t tv_usec; /* Microseconds. */ //微秒级
};
gettimeofday()函数
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果(若不使用则传入NULL即可)
delay()与delayMicrosecond()函数
void delay(unsigned milliseconds);
void delayMicroseconds(us)
delayMicroseconds()与delay()函数都可用于暂停程序执行一段时间。不同的是,delayMicroseconds()的参数单位是微秒。delay()的参数单位是毫秒,对于长度超过几千微秒的延迟,应该使用delay()函数。
功能类似同样用法的还有sleep()函数,sleep()函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态。当函数设定的计时器到期,或者接收到信号、程序发生中断都会导致程序继续执行。
在Windows系统中,sleep()函数需要一个以毫秒为单位的参数代表程序挂起时长。
在Unix类的操作系统中,调用sleep()函数需要一个以秒为单位的参数。
注意:
1、在VC中Sleep中的第一个英文字符为大写的"S",
2、在Linux下,sleep中的“s”不大写
sleep()单位为秒,usleep()里面的单位是微秒。在内核中,sleep的实现是由pause函数和alarm函数两个实现的。
3、在Codeblocks环境下是无法使用sleep函数的,因为在windows上Codeblocks采用mingw(Gnu在Window环境下的编译器,可以充分使用WindowsApi)作为编译器,而在stdlib.h中sleep的说明如下:_CRTIMP void __cdecl __MINGW_NOTHROW _sleep (unsigned long) __MINGW_ATTRIB_DEPRECATED;可以认为mingw舍弃了sleep函数,建议用Sleep实现sleep。
示例:
#include<wiringPi.h>
#include<stdio.h>
#include <sys/time.h>
#define Trig 29
#define Echo 28
void initialization() //初始化引脚
{
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
}
float disMeasure()
{
struct timeval tv1; //timeval是time.h中的预定义结构体 其中包含两个一个是
秒,一个是微秒
struct timeval tv2;
long start,stop;
float dis;
digitalWrite(Trig,HIGH);
delayMicroseconds(10); //发出10us的超声波脉冲
digitalWrite(Trig,LOW);
//波传输过程echo高电平,计算高电平时间就获取波传输的时间,单位是微秒
while(digitalRead(Echo) != 1);//检测到高电平退出循环,开始计算时间
gettimeofday(&tv1, NULL); //获取当前时间,开始接收信号时
while(digitalRead(Echo) != 0);//出现低电平时退出循环,计算时间
gettimeofday(&tv2,NULL);//获取时间,最后接收到返回信号时
start = tv1.tv_sec * 1000000 + tv1.tv_usec; //微秒级的时间
stop = tv2.tv_sec * 1000000 + tv2.tv_usec;
dis = (float)(stop - start) / 1000000 * 34000 / 2; //计算时间差求出距离
return dis;
}
int main()
{
float dis;
if(wiringPiSetup() == -1){
printf("wiringPiSetup failed!");
return -1;
}
initialization();
while(1)
{
dis = disMeasure();
printf("距离:%.3f cm\n",dis);
delay(2000);
}
return 0;
}
结果: