树莓派外设开发基础(wiringPi库)

参考:树莓派外设开发基础篇
作者:丶PURSUING
发布时间:2021-02-05 18:20:53
网址:https://blog.csdn.net/weixin_44742824/article/details/113673019?spm=1001.2014.3001.5501

外设开发综述及wiringPi库

是什么

树莓派中一个集成了很多API(特定平台,特定接口)的库,使得开发像printf一样简单。
初学只需会调库,之后再深入到自己写wiringPi库,IO的上层以及底层的驱动代码。

在这里插入图片描述

如何获取

树莓派的镜像固件中可能不会带有wiringPi库

使用以下命令查看

gpio -v
  • 已经安装

在这里插入图片描述

  • 未安装

由于我的树莓派自带了WiringPi库,没有亲自安装过,参考

安装教程博文补充失效的下载连接

如何使用

EG1:控制继电器

  1. 硬件连接

查看io口详情

gpio readall

在这里插入图片描述

注意了IO口编号可不是中间排针的序号!!

继电器驱动电压3.3v
选择pin7作为信号引脚

下面是连接实物图,因为连接了WIFI,没有用到串口线。
在这里插入图片描述

  1. 编程

树莓派的接口函数详解:https://www.cnblogs.com/lulipro/p/5992172.html

包含头文件#incldue <wiringPi.h>

①硬件初始化函数

函数返回值说明
int wiringPiSetup (void)-1表示失败使用wiringPi 引脚编号表,编号为 0~16。root
int wiringPiSetupGpio (void)-1表示失败使用BCM GPIO引脚编号表。root

②通用GPIO控制函数

函数可取值(pin👉0,1,2…)说明
void pinMode (int pin, int mode)value INPUT、OUTPUT、PWM_OUTPUT,GPIO_CLOCK只有wiringPi 引脚编号下的1脚(BCM下的18脚) 支持PWM输出;只有wiringPi编号下的7(BCM下的4号)支持GPIO_CLOCK输出
void digitalWrite (int pin, int value)HIGH,LOW输出高低电平
函数参数说明说明
int digitalRead (int pin)返回引脚上的电平
void analogWrite(int pin, int value)value:输出的模拟量树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,需要增加另外的模块
int analogRead (int pin)返回引脚上读取的模拟量树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,需要增加另外的模块
void pwmWrite (int pin, int value)value:写入到PWM寄存器的值,范围在0~1024之间。pin只能是wiringPi 引脚编号下的1脚(BCM下的18脚)

EG:从键盘输入0,1控制继电器

  1. 编写程序
#include <wiringPi.h>
#include <stdio.h>

#define SWITCHER 7

int main()
{
        int cmd;

        if(wiringPiSetup() == -1){
                printf("硬件初始化失败\n");
                return -1;
        }
        pinMode(SWITCHER,OUTPUT);
        digitalWrite(SWITCHER,HIGH);

        while(1){
                printf("输入0-接通;1-断开并回车\n");
                scanf("%d",&cmd);
                //getchar();
                if(cmd == 0){
                        digitalWrite(SWITCHER,LOW);
                }else if(cmd == 1){
                        digitalWrite(SWITCHER,HIGH);
                }else{
                        printf("input error\n");
                }

        }
        return 0;
}

编译时候记得链库 -lwiringPi

代码快速对齐
gg 回首行
=G 自动对齐

  1. 编译,运行
gcc relay.c -lwiringPi
./a.out

EG2:超声波的使用

Linux下时间函数:struct timeval结构体
  • 结构体原型
#include "sys/time.h"
 
struct timeval  
{  
__time_t tv_sec;        /* Seconds. */  
__suseconds_t tv_usec;  /* Microseconds. */  
}; 
  • 用法

①定义2个结构体变量

struct timeval tv1;
struct timeval tv2;

②获取某个事件的开始,结束信息

gettimeofday(&tv1, NULL);
//....事件
gettimeofday(&tv2, NULL);

int gettimeofday(struct timeval *tv, struct timezone *tz);
timezone structure 已经过时了
tz 通常设置为 NULL.

③计算开始,结束的时间

long start, stop;
start = tv1.tv_sec * 1000000 + tv1.tv_usec;  //单位为us
stop  = tv2.tv_sec * 1000000 + tv2.tv_usec;

或者

unsigned long long timeSum = 0;
timeSum = tv1.tv_sec-tv2.tv_sec +(tv1.tv_usev-tv2.tv_usec)/1000000;//以s为单位
超声波原理简述

触发信号为10us的TTL,接收信号检测高电平持续的时间,再由公式计算即可。

TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑"1",0V等价于逻辑"0",这被称做TTL信号系统

代码详解
#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;
        struct timeval tv2;

        /*
         *     struct timeval
         *     {
         *         time_t tv_sec;        //Seconds.
         *         suseconds_t tv_usec;  //Microseconds.
         *     };
         */

        long start, stop;
        float dis;

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

        digitalWrite(Trig, HIGH);
        delayMicroseconds(10);
        digitalWrite(Trig, LOW);//10us的TTL

        //统计高电平持续的时间
        while(!(digitalRead(Echo) == 1));
        gettimeofday(&tv1, NULL);

        while(!(digitalRead(Echo) == 0));
        gettimeofday(&tv2, NULL);
        /*
         * int gettimeofday(struct timeval *tv, struct timezone *tz);
         * The functions gettimeofday() and settimeofday() can get and set the time as well as a timezone.
         * timezone structure 已经过时了;
         * tz 通常设置为 NULL.
         */
        start = tv1.tv_sec * 1000000 + tv1.tv_usec;  //单位为us
        stop  = tv2.tv_sec * 1000000 + tv2.tv_usec;

        dis = (float)(stop - start) / 1000000 * 34000 / 2;//s×cm/s=cm

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

-----------------------------------------------------------------时间控制函数-----------------------------------------------------------
void delay (unsigned int howLong)
毫秒级,最大延时49天

void delayMicroseconds (unsigned int howLong)
微妙级,最大延时71分钟

其他

1.配置ssh时出现的乱码问题

输入命令 sudo raspi-config 后如下图所示。底层逻辑无问题,可操作,仅为显示乱码
在这里插入图片描述
将字符编码由default更改为UTF-8即可

2. .swp文件的处理

2. .swp文件的处理

当两个窗口同时对同一个目标文件进行编辑时,就会提示生成隐藏文件目标.swp,警告修改编辑的可能不是最新的文件。若.swp文件存在,则每次打开目标文件都会ATTENTION

解决方法
ls -a可以看到生成的.swp隐藏文件,再用rm指令删除即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

行稳方能走远

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

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

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

打赏作者

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

抵扣说明:

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

余额充值