树莓派外设开发综述
1.树莓派的接口:
IO:input output
INPUT:震动传感器,烟雾报警器,火焰....涉及到要给主控芯片输入数据的就用INPUT
OUTPUT:继电器,蜂鸣器......需要主控芯片输出高、低电平(不涉及给主控芯片数据处理的)用OUTPUT
PWM
串口
IIC
SPI
IIS
2.wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等。
GPIO常用函数
int wiringPiSetup (void) = 使用wiringPi时,你必须在执行任何操作前初始化树莓派,否则程序不能正常工作。可以调用下表函数之一进行初始化,它们都会返回一个int , 返回 -1 表示初始化失败。
void digitalWrite (int pin, int value) = 让对一个已近配置为输出模式的 引脚 输出指定的电平信号
int digitalRead (int pin) = 读取引脚的电平值
void pinMode (int pin, int mode) = 配置引脚的IO模式
void delayMicroseconds (unsigned int howLong) = 时间控制函数us
void delay (unsigned int howLong) = 时间控制函数ms
struct timeval //存储秒和微秒的时间 { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ };
int gettimeofday(struct timeval*tv,struct timezone *tz )//获取当前时间
实例代码_继电器:
#include <stdio.h>
#include <wiringPi.h>
#include <string.h>
#define Power 7
int main()
{
char cmd[6] = {'\0'};
if(wiringPiSetup() == -1)
{
printf("初始化GPIO失败\n");
return -1;
}
pinMode(Power,OUTPUT);
digitalWrite(Power,HIGH);
while(1)
{
printf("请输入1/2:ON->导通.OFF->断开\n");
memset(cmd,'\0',sizeof(cmd));
gets(cmd);
if(strcmp(cmd,"1 ON") == 0)
{
digitalWrite(Power,LOW);
}
else if(strcmp(cmd,"1 OFF") == 0)
{
digitalWrite(Power,HIGH);
}
else
{
printf("输入错误,退出程序\n");
return -2;
}
}
}
实例代码_超声波:
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#define Echo 1
#define Trig 4
void pinMode_Init()
{
pinMode(Echo,INPUT);
pinMode(Trig,OUTPUT);
}
float UT()
{
float dis;
long start,stop;
struct timeval t1,t2;
/* {
__time_t tv_sec; // Seconds.
__suseconds_t tv_usec; // Microseconds.
} */
digitalWrite(Trig,LOW);
delayMicroseconds(2);
digitalWrite(Trig,HIGH);
delayMicroseconds(10);
digitalWrite(Trig,LOW);
while(digitalRead(Echo) == 0)//digitalRead 读
gettimeofday(&t1,NULL);//gettimeofday 获取当前时间 原型: int gettimeofday(struct timeval*tv, struct timezone *tz);
while(digitalRead(Echo) == 1)
gettimeofday(&t2,NULL);
start = t1.tv_sec*1000000 + t1.tv_usec;//tv_sec转换成微秒+tv_usec = 发送时间
stop = t2.tv_sec*1000000 + t2.tv_usec;// = 返回时间
dis = (float)(stop-start)/1000000*34000/2;//stop-start = 波在空气中运行的时间/1000000(转换成秒)*34000cm/s,除以2是因为我只需要一 段一段时间的距离
return dis;
}
void main()
{
float dis;
if(wiringPiSetup() == -1)
{
printf("GPIO初始化失败\n");
}
pinMode_Init();
printf("各项初始化成功\n");
while(1)
{
dis = UT();
printf("距离 = %0.2f cm\n",dis);
delay(1000);
}
}
UART常用函数
1.使用串口前我们需要对串口进行配置
使用时需要包含头文件:#include <wiringSerial.h>
int serialOpen (char *device, int baud)
device:串口的地址,在Linux中就是设备所在的目录。
默认一般是"/dev/ttyAMA0",我的是这样的。
baud:波特率
返回:正常返回文件描述符,否则返回-1失败。
void serialPutchar (int fd, unsigned char c)
fd:文件描述符
c:要发送的字符
void serialPuts (int fd, char *s)
fd:文件描述符
c:要发送的字符串
int serialDataAvail (int fd)
fd:文件描述符
返回:串口缓存中已经接收的,可读取的字节数,-1代表错误
int serialGetchar (int fd)
接受一个字符,10s内没接收到数据,将返回-1
*size_t write (int fd,const void * buf,size_t count)
fd:文件描述符buf:需要发送的数据缓存数组count:发送buf中的前count个字节数据返回:实际写入的字符数,错误返回-1
*size_t read(int fd,void * buf ,size_t count);
fd:文件描述符buf:接受的数据缓存的数组count:接收的字节数.返回:实际读取的字符数。
实例代码:
#include<stdio.h>
#include<wiringPi.h>
#include<wiringSerial.h>//串口的头文件
int main()
{
int fd;
int cmd;
wiringPiSetup();//初始化串口
fd=serialOpen("/dev/ttyAMA0",9600);//1.串口的地址,2.配置波特率
while(1)
{
//serialPutchar(fd,'l');//发送一个字符
//read(fd,buffer,sizeof(buffer));//也可以通过read来读取接受的数据
while(serialDataAvail(fd) != -1)//1.接受缓冲区,2.错误返回-1
{
cmd = serialGetchar(fd);//1.10s过后还没有读到数据返回-1,2.返回值是int型
//printf("get char:%c\n",cmd);
if(cmd == 'w')
{
serialPuts(fd,"Li Jian Hua\r\n");//发送一个字符串
//delayMicroseconds(1000000);//每间隔1s打印一次
}
}
}
return 0;
}