树莓派外设开发

树莓派接口

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

结果:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

◣星河◢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值