Linux树莓派外设开发

树莓派外设开发综述

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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

No Iverson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值