欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2023/12/10 编程问答 60 豆豆
生活随笔 收集整理的这篇文章主要介绍了 树莓派外设开发基础(wiringPi库) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

目录

  • 外设开发综述及wiringPi库
    • 是什么
    • 如何获取
    • 如何使用
      • EG1:控制继电器
      • EG2:超声波的使用
        • Linux下时间函数:struct timeval结构体
        • 超声波原理简述
        • 代码详解
  • 其他
    • 1.配置ssh时出现的乱码问题
    • 2. .swp文件的处理

外设开发综述及wiringPi库

是什么

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

如何获取

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

使用以下命令查看

gpio -v
  • 已经安装

  • 未安装

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

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

如何使用

EG1:控制继电器

  • 硬件连接
  • 查看io口详情

    gpio readall

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

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

    下面是连接实物图,因为连接了WIFI,没有用到串口线。

  • 编程
  • 树莓派的接口函数详解: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控制继电器

  • 编写程序
  • #include <wiringPi.h> #include <stdio.h>#define SWITCHER 7int 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 自动对齐

  • 编译,运行
  • 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 5void 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; //单位为usstop = tv2.tv_sec * 1000000 + tv2.tv_usec;dis = (float)(stop - start) / 1000000 * 34000 / 2;//s×cm/s=cmreturn 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指令删除即可。

    总结

    以上是生活随笔为你收集整理的树莓派外设开发基础(wiringPi库)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。