树莓派外设开发

树莓派外设开发

wiringPi (特定平台,特定功能接口)库API(常用)

wiringPi 是树莓派IO控制库,有很多接口:GPIO控制,中断,多线程等。

使用 wiringPi 时,需要先初始化树莓派,而且要包含头文件 #include <wiringPi.h>

以下为两个常用的函数,返回 -1 表示初始化失败

int wiringPiSetup(void)     // 当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi引脚编号表,引脚编号为0-16;需要 root 权限
int wiringPiSetupGpio(void) // 当使用这个函数初始化树莓派引脚时,程序中使用的是BCM GPIO引脚编号表,需要 root 权限
#include <wiringPi.h>

int main()
{
        wiringPiSetup();
}

// 编译时 gcc test.c -lwiringPi , 注意加 -lwiringPi 

GPIO控制函数

void pinMode(int pin, int mode)  // 配置引脚的IO模式
/* 
pin: 配置引脚
mode:指定引脚的IO模式(INPUT, OUTPUT, PWM_OUTPUT, GPIO_CLOCK)
*/
void digitalWrite(int pin, int value)// 可对已配置的引脚输出指定的电平信号
/*
pin:控制的引脚
value:电平值(HIGH或LOW)
*/
int digitalRead(int pin) // 读取引脚的电平值
/*
pin:读取的引脚
返回引脚上的电平
*/  
//树莓派引脚不支持 AD 转换,需另加模块
void analogWrite(int pin, int value) // 模拟量输入
void analogread(int pin) // 模拟量输出 

关于wiringPi函数大合集:https://projects.drogon.net/raspberry-pi/wiringpi/functions/

树莓派简单控制继电器

#include <wiringPi.h>
#include <stdio.h>

#define RELAY 7

int main()
{
        int cmd;

        if(wiringPiSetup() == -1)
        {
                printf("初始化失败\n");
                return -1;
        }

        pinMode(RELAY, OUTPUT);
        digitalWrite(RELAY, HIGH);

        while(1)
        {
                printf("请输入暗号:1-ON,0-OFF\n");
                scanf("%d", &cmd);
                if(cmd == 1)
                {
                        digitalWrite(RELAY, LOW);
                }
                else if(cmd == 0)
                {
                        digitalWrite(RELAY, HIGH);
                }
        }
}

树莓派简单控制继电器组

// 由于只是进行简单的测试,所以并没有进行函数的封装
#include <wiringPi.h>
#include <stdio.h>
#include <string.h>

#define SWI1 26
#define SWI2 27
#define SWI3 28
#define SWI4 29

int main()
{
	char cmd[12] = {'\0'};

	if(wiringPiSetup() == -1)
	{
		printf("初始化失败\n");
		return -1;
	}

	pinMode(SWI1, OUTPUT);
	pinMode(SWI2, OUTPUT);
	pinMode(SWI3, OUTPUT);
	pinMode(SWI4, OUTPUT);

	digitalWrite(SWI1, HIGH);
	digitalWrite(SWI2, HIGH);
	digitalWrite(SWI3, HIGH);
	digitalWrite(SWI4, HIGH);

	while(1)
	{
		printf("请输入暗号:1,2,3,4-on,1,2,3,4-off\n");
		memset(cmd, '\0', sizeof(cmd));
		gets(cmd);
		if(strcmp(cmd,"1 on") == 0)
		{
			digitalWrite(SWI1, LOW);
		}
		else if(strcmp(cmd, "1 off") == 0)
		{
			digitalWrite(SWI1, HIGH);
		}
		if(strcmp(cmd,"2 on") == 0)
		{
			digitalWrite(SWI2, LOW);
		}
		else if(strcmp(cmd, "2 off") == 0)
		{
			digitalWrite(SWI2, HIGH);
		}
		if(strcmp(cmd,"3 on") == 0)
		{
			digitalWrite(SWI3, LOW);
		}
		else if(strcmp(cmd, "3 off") == 0)
		{
			digitalWrite(SWI3, HIGH);
		}
		if(strcmp(cmd,"4 on") == 0)
		{
			digitalWrite(SWI4, LOW);
		}
		else if(strcmp(cmd, "4 off") == 0)
		{
			digitalWrite(SWI4, HIGH);
		}
		if(strcmp(cmd,"all on") == 0)
		{
			digitalWrite(SWI1, LOW);
			digitalWrite(SWI2, LOW);
			digitalWrite(SWI3, LOW);
			digitalWrite(SWI4, LOW);
		}
		else if(strcmp(cmd, "all off") == 0)
		{
			digitalWrite(SWI1, HIGH);
			digitalWrite(SWI2, HIGH);
			digitalWrite(SWI3, HIGH);
			digitalWrite(SWI4, HIGH);
		}
	}
	return 0;
}

树莓派简单控制超声波

#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>
#define Trig    4
#define Echo    5

void ultraInit(void)
{
    pinMode(Echo, INPUT);  //设置端口为输入
    pinMode(Trig, OUTPUT);  //设置端口为输出
}

float disMeasure(void)
{
    struct timeval tv1;  //timeval是time.h中的预定义结构体 其中包含两个一个是秒,一个是微秒
    struct timeval tv2;
    long start, stop;
    float dis;

    digitalWrite(Trig, LOW);
    delayMicroseconds(10);

    digitalWrite(Trig, HIGH);
    delayMicroseconds(10);      //发出超声波脉冲
    digitalWrite(Trig, LOW);

    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(void)
{
    float dis;
    if(wiringPiSetup() == -1){ //如果初始化失败,就输出错误信息 程序初始化时务必进行
        printf("setup wiringPi failed !");
        return -1;
    }
    ultraInit();
    while(1){
        dis = disMeasure();
        printf("distance = %0.2f cm\n",dis);
        delay(1000);
    }
    return 0;
}

可参考这位博主:https://www.cnblogs.com/yuemo/p/8888342.html

关于struct timeval结构体

// 原型为
struct timeval
{
	__time_t  tv_sec;        /* 秒 */
	__suseconds_t  tv_usec;  /* 微秒 */
};

关于gettimeofday()函数

/*
获取当前时间和时区信息,  
把它放入*TV和*TZ。 如果TZ为NULL, *TZ不被填充。  
成功时返回0,错误时返回-1。  
注意:这种形式的时区信息已经过时了。  
使用<time.h>中声明的函数和变量。  
*/
extern int gettimeofday (struct timeval *__restrict __tv,
                         __timezone_ptr_t __tz) __THROW __nonnull ((1));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Luish Liu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值