• 树莓派(四)树莓派外设开发基础篇


    嵌入式之路,贵在日常点滴

                                                                    ---阿杰在线送代码

    目录

    一、wiringPi库是什么

    二、如何获取 

    三、如何使用 

    EG1:控制继电器 

    EG2:超声波的使用

    其他 


    一、wiringPi库是什么

    wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等。

    二、如何获取 

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

    使用以下命令查看

    gpio -v
    • 已经安装 

    未安装会提示指令不认识

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

    三、如何使用 

    EG1:控制继电器 


    其实继电器简单来说就是一个开关,VCC表示电源正极、GND表示电源负极、IN表示信号输入脚,COM表示公共端,NC(normal close)表示常闭端,NO(normal open)表示常开端 

    继电器:使非可编程的设备变得可控制可编程

    一般情况下是常闭状态 

    这里简单地描述一下大部分的继电器模块:

    Vcc接电源正极,Gnd接电源负极,In接信号端(输入高电平公共端连常闭,输入低电平公共端连常开),如下图所示,你就可以明白了,当IN脚输入高电平时,NC与COM相连(左图);当输入低电平时,NO与COM相连(右图)。

     

    继电器实现的控制电路优点:用低电压控制高电压;远距离控制;自动控制。 


            1、硬件连接

    树莓派的引脚图

     

    查看io口详情

    gpio readall

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

             2、编程

    在使用wiringPi库时,你需要包含头文件 #include。凡是写wiringPi的程序,都包含这个头文件。

    参考 

    ①硬件初始化函数 

    使用wiringPi时,你必须在执行任何操作前初始化树莓派,否则程序不能正常工作

    可以调用下表函数之一进行初始化,它们都会返回一个int , 返回 -1 表示初始化失败。

    int wiringPiSetup (void)

    返回:执行状态,

    -1表示失败

    程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16

    需要root权限

    int wiringPiSetupGpio (void)返回执行状态,-1表示失败

    程序中使用的是BCM GPIO 引脚编号表。

    需要root权限

    ②通用GPIO控制函数 

    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 之一

    读取一个引脚的电平值  LOW  HIGH ,返回
    void analogWrite(int pin, int value)

    pin:引脚

    value:输出的模拟量

    模拟量输出

    树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,

    需要增加另外的模块
    int analogRead (int pin)

    pin:引脚

    返回:引脚上读取的模拟量

    模拟量输入

    树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,

    需要增加另外的模块

    void pwmWrite (int pin, int value)

    pin:引脚

    value:写入到PWM寄存器的值,范围在0~1024之间。

    输出一个值到PWM寄存器,控制PWM输出。
    pin只能是wiringPi 引脚编号下的1脚(BCM下的18脚)
     
    void pullUpDnControl (int pin, int pud)

     pin:引脚

    pud:拉电阻模式

    可取的值:PUD_OFF        不启用任何拉电阻。关闭拉电阻。
                 PUD_DOWN    启用下拉电阻,引脚电平拉到GND
                 PUD_UP         启用上拉电阻,引脚电平拉到3.3v

    对一个设置IO模式为 INPUT 的输入引脚设置拉电阻模式。

    与Arduino不同的是,树莓派支持的拉电阻模式更丰富。

    树莓派内部的拉电阻达50K欧姆

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

    1. 编写程序
    1. #include
    2. #include
    3. #define SWITCHER 7
    4. int main()
    5. {
    6. int cmd;
    7. if(wiringPiSetup() == -1){
    8. printf("硬件初始化失败\n");
    9. }
    10. pinMode(SWITCHER,OUTPUT);
    11. digitalWrite(SWITCHER,HIGH);
    12. while(1){
    13. printf("输入0-接通;1-断开\n");
    14. scanf("%d",&cmd);
    15. if(cmd == 0){
    16. digitalWrite(SWITCHER,LOW);//低电平接通
    17. }else if(cmd == 1){
    18. digitalWrite(SWITCHER,HIGH);//高电平断开
    19. }else{
    20. printf("input error\n");
    21. }
    22. }
    23. return 0;
    24. }

    导致输入提示一直刷屏的原因并非缺少getchar(),而是忘记return 0 

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

            2、编译,运行

    1. gcc demo1.c -lwiringPi
    2. ./a.out

    EG2:超声波的使用

    Linux下时间函数:struct timeval结构体

    • 结构体原型
    1. #include "sys/time.h"
    2. struct timeval
    3. {
    4. __time_t tv_sec; /* Seconds. */
    5. __suseconds_t tv_usec; /* Microseconds. */
    6. };
    • 用法

    ①定义2个结构体变量 

    1. struct timeval tv1;
    2. struct timeval tv2;

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

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

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

    ③计算开始,结束的时间 

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

    或者 

    1. unsigned long long timeSum = 0;
    2. timeSum = tv1.tv_sec-tv2.tv_sec +(tv1.tv_usev-tv2.tv_usec)/1000000;//以s为单位

    超声波原理简述

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

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

    代码详解:

    1. #include
    2. #include
    3. #include
    4. #define Trig 4
    5. #define Echo 5
    6. void ultraInit(void)
    7. {
    8. pinMode(Echo, INPUT);
    9. pinMode(Trig, OUTPUT);
    10. }
    11. float disMeasure(void)
    12. {
    13. struct timeval tv1;
    14. struct timeval tv2;
    15. long start, stop;
    16. float dis;
    17. digitalWrite(Trig, LOW);
    18. delayMicroseconds(2);
    19. digitalWrite(Trig, HIGH);
    20. delayMicroseconds(10);//发出超声波脉冲
    21. digitalWrite(Trig, LOW);//10us的TTL
    22. //统计高电平持续的时间
    23. while(!(digitalRead(Echo) == 1));
    24. gettimeofday(&tv1, NULL);//获取当前时间,开始接收到返回信号的时候
    25. while(!(digitalRead(Echo) == 0));
    26. gettimeofday(&tv2, NULL);//获取当前时间,最后接收到返回信号的时候
    27. start = tv1.tv_sec * 1000000 + tv1.tv_usec; //单位为us
    28. stop = tv2.tv_sec * 1000000 + tv2.tv_usec;
    29. dis = (float)(stop - start) / 1000000 * 34000 / 2;//s×cm/s=cm
    30. return dis;
    31. }
    32. int main()
    33. {
    34. float dis;
    35. if(wiringPiSetup() == -1){
    36. printf("setup wiringPi failed !");
    37. return 1;
    38. }
    39. ultraInit();
    40. while(1){
    41. dis = disMeasure();
    42. printf("distance = %0.2f cm\n",dis);
    43. delay(1000);
    44. }
    45. return 0;
    46. }

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

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

    其他 

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

    原因是:生成这个隐藏文件

     

    解决方案:

    1、把前面打开该文件的窗口关闭;

    2、强制删除隐藏文件 :用ls -a可以看到生成的.swp隐藏文件,再用rm指令删除即可。

     

     

     

  • 相关阅读:
    expect脚本中使用scp命令的方法,expect脚本中scp命令获取不了值的问题完美解决方法
    阿里巴巴API接口解析,实现按关键字搜索商品
    灵界的科学丨二、耳朵及手指识字的实验启示
    javaScript 防抖/节流,探索学习,对新手友好的内容
    C++:基于文件流拷贝文件(附完整源码)
    数据结构 2.2 单循环链表
    pandas 笔记:get_dummies分类变量one-hot化
    AD常用操作(最全-不断添加更新中)
    AnyCast技术
    用C++实现一个日期类
  • 原文地址:https://blog.csdn.net/weixin_50546241/article/details/126357998