树莓派wiringPi库的使用补充

一、读取超声波传感器值

1.超声波传感器测距原理

       想要读取超声波传感器的值,我们要了解一下超声波是怎么样测量距离的:
       (1) 首先,声音在空气中传播是以 340 m/s 的速度传播,超声波也不例外;
       (2) 超声波测量的距离是通过:距离=时间(t)X 速度(s) 的公式来计算;
       (3) 超声波检测的发射之后,被障碍物反射回来的声波,因此测量结果要除以 2 才对。
       发射口发射一个的声波,记录返回的时间/2,然后乘以声波的速度就可以了。

2.超声波传感器模块介绍

       超声波传感器有两个声波口,分别是发射口和接收口:
在这里插入图片描述
图中 T 为发射口,R 为接收口,像两个大眼睛。模块有四个接口管脚:

管脚功能
VCC电源脚,接+5V
Trig发射端,树莓派IO应为输出模式
Echo接收端,树莓派IO应为输入模式
GndGND

3.编程思路

Created with Raphaël 2.2.0 开始 wiringPiSetup();初始化 Trig拉高10us后拉低 记录发射时间 检测Echo的高电平‘ 记录Echo被拉高的时间 计算实际两次时间的间隔 计算距离 结束

4.编程实现

#include <stdio.h>
#include <wiringPi.h>
#include <sys/time.h>

#define Echo 0
#define Trig 2

void ultrasonicInit()
{
        pinMode(Echo,INPUT);  
        pinMode(Trig,OUTPUT);

}
float getUtrasonicDetance()
{
        struct timeval time_head;//时间获取结构体
        struct timeval time_tail;//时间获取结构体
        long   time_start,time_stop;
        float destance;

        digitalWrite(Trig,LOW); //先拉低发射口,保证方波的形状
        delayMicroseconds(2);
		/****   发射一个方波   ******/
        digitalWrite(Trig,HIGH);//拉高低电平
        delayMicroseconds(10);  //延迟10us
        digitalWrite(Trig,LOW); //拉低

        while(!digitalRead(Echo));
        gettimeofday(&time_head,NULL);//记录发射时间

        while(digitalRead(Echo));//检测Echo的高电平
        gettimeofday(&time_tail,NULL);//记录接收到信号的时间
		/*****    换算时间单位 s -> us ******/
        time_start=time_head.tv_sec * 1000000 + time_head.tv_usec;
        time_stop =time_tail.tv_sec * 1000000 + time_tail.tv_usec;
		/***      计算距离       ************/
        destance=(float)(time_stop-time_start)/1000000*34000/2;

        return destance;

}
int main()
{
        if(wiringPiSetup()==-1){
                printf("Setup IO fail!");
                return -1;
        }
        ultrasonicInit();
        while(1){
                printf("destance:%0.2f cm\n",getUtrasonicDetance());//打印测量距离
                delay(500);//延时0.5s
        }

        return 0;
}

结果演示 :
在这里插入图片描述
关于 gettimeofday 函数的补充:
        gettimeofday 函数声明在 sys/time.h 头文件当中,是一个时间获取函数。
函数原型: int gettimeofday(struct timeval *tv, struct timezone *tz);
函数说明:
               1. struct timeval *tv 时间存储结构体,声明在 sys/time.h 头文件,不用再次定义,结构体原型:

struct timeval {
     			 time_t      tv_sec;     // seconds 秒
          		 suseconds_t tv_usec;    // microseconds 微秒
           };

               2. struct timezone *tz 这个结构体用于修正时差,通常赋值:NULL,结构体原型:

struct timezone {
               int tz_minuteswest;     /* minutes west of Greenwich 格林威治时间往西方的时差 */ 
               int tz_dsttime;         /* type of DST correction 时间的修正方式*/
           };

用法:

struct timeval t1;
long time_sec;
gettimeofday(&t1,NULL);
time_sec=t1.tv_sec;

验证代码:
      每秒打印一次时间

#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>

int main()
{
        struct timeval t1;
        while(1){
                gettimeofday(&t1,NULL);
                printf("time:%ld\n",t1.tv_sec);
                delay(1000);
        }
        return 0;
}

运行结果:
在这里插入图片描述

二、串口通信

       串口通信的相关概念,就不过多做介绍,都已经非常熟悉了。两个设备通过串口来通信的话,只需要数据格式和波特率一样就可以,就相当于两个人说话,都说同一种语言,和差不多的语速才能沟通。这语言就是数据格式,串口的数据格式一般是 N 81 格式,即 No check 8Date 1stop(无校验位,8位数据,1位停止)。

1.树莓派使用串口之前的准备工作

       树莓派第一次使用串口,最好做一下配置,不然可能不能正常使用串口。

/* 修改 cmdline.txt文件 */

>cd /boot/
>sudo vim cmdline.txt

删除【】之间的部分
dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

/*修改 inittab文件 */

>cd /etc/
>sudo vim inittab

注释掉最后一行内容:,在前面加上 # 号

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

重启

sudo reboot 

2.连接串口

       我们使用的是 USB转串口模块 来连接树莓派和我们的电脑 连接,串口都会有 TXD和RXT 两根线,分别对应 数据输出数据输入,所以连接的时候要交叉连接,即:TXD ->RXDRXD->TXD。可以不用接VCC,但是一定要接 GND ,否则数据会出现错误,甚至无法通信。
在这里插入图片描述

3.编程思路

Created with Raphaël 2.2.0 开始 wiringPiSetup();初始化 serialOpen();打开串口 serialPuts();发送字符串 read();读取串口数据 结束

4.编程实现

       相关函数介绍请转跳:wiringPi库详解,要使用串口的相关API的话,需要引用 wiringSetial.h 头文件。

#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define Baud 9600


int main()
{
        char *date;
        int Serial_fd;
        date=(char *)malloc(128);
        char Serial_readBuf[128];
        wiringPiSetup();
        Serial_fd=serialOpen("/dev/ttyAMA0",Baud);
        if(Serial_fd==-1){
                printf("Serial open fail\n");
                return 0;
        }
        while(1){

                printf(">");
                fgets(date,sizeof(date),stdin);
                getchar();
                serialPuts(Serial_fd,date);
                if(fork()==0){
                        while(1){
                                if(serialDataAvail(Serial_fd)>=1){
                                        if(read(Serial_fd,Serial_readBuf,sizeof(Serial_readBuf))>0){
                                                printf("read:%s\n",Serial_readBuf);
                                        }
                                        memset(Serial_readBuf,0,sizeof(Serial_readBuf));//每次接收完之后,清空数组
                                }
                        }
                }
        }
        return 0;
}

结果演示:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 树莓派wiringpipython是一种用于树莓派的GPIO控制,它可以通过Python语言来控制树莓派的GPIO引脚,实现各种功能。这个提供了丰富的API,可以方便地读取和写入GPIO引脚的状态,还可以设置引脚的工作模式和中断等。使用树莓派wiringpipython可以让开发者更加方便地开发树莓派应用程序。 ### 回答2: 树莓派WiringPiPython是树莓派模型B及以后版本的IO控制,它可以通过C、C++和Python等编程语言控制树莓派的GPIO口,实现电路的输入和输出操作。WiringPi提供许多IO输入和输出模式,可以满足各种不同的应用场景。 Python是一种高级编程语言,拥有简单直观的语法,易于学习和使用WiringPi和Python的结合,使得树莓派IO口的控制更加方便,即使没有C或C++的编程基础,也可以通过Python轻松地控制树莓派的IO口。 使用树莓派WiringPiPython进行GPIO口的编程和控制,需要先安装WiringPi和Python的开发环境。安装完成后,可以通过Python进行GPIO口的操作。例如,对于GPIO口PIN0,可以通过以下代码实现输出操作: import wiringpi wiringpi.wiringPiSetup() wiringpi.pinMode(0, 1) wiringpi.digitalWrite(0, 1) 上述代码首先调用wiringpiwiringPiSetup()方法初始化系统,然后使用pinMode()方法设置PIN0为输出模式,最后使用digitalWrite()方法将PIN0的输出电平设置为高电平。 除了输出操作外,WiringPiPython还可以实现GPIO口的输入操作,读取输入电平,并根据输入电平的状态进行相应的操作。例如,以下代码实现了读取GPIO口PIN1的输入值: import wiringpi wiringpi.wiringPiSetup() wiringpi.pinMode(1, 0) value = wiringpi.digitalRead(1) print(value) 上述代码中,通过pinMode()方法设置GPIO口PIN1为输入模式,然后使用digitalRead()方法读取PIN1引脚的输入电平状态,并将结果输出。 总之,树莓派WiringPiPython具有简单、易用、功能丰富等特点,可以帮助用户实现各种不同的GPIO口控制应用。 ### 回答3: 树莓派是一款非常受欢迎的单板式计算机,许多人使用它来实现各种小型项目。要让树莓派与各种外部设备通信,需要使用GPIO(广义输入/输出)引脚。为了更轻松地编写GPIO控制的代码,可以使用WiringPi,该包含了C语言和Python语言的API。 WiringPi提供了简单的方法来控制树莓派的GPIO引脚。基于WiringPi,可以轻松地编写LED闪烁、按钮检测、舵机控制等常见的GPIO通信应用程序。 使用WiringPi的Python接口,可以使用Python编写与WiringPi兼容的代码。Python是一种流行的高级编程语言,拥有简单的语法、易于编写和调试的软件。使用WiringPi的Python接口,开发人员可以使用Python语言编写GPIO引脚控制程序,提供更快、更灵活、更快的开发流程。 WiringPi的Python接口提供简单的API,以控制引脚的状态。对于初学者来说,这些API十分重要。通过编写简单的代码块,开发人员可以轻松地控制每个引脚的状态,以及设置处理和输入事件的回调函数。 该包含了WiringPi-Python命令行工具,使用户可以轻松地使用命令行控制GPIO引脚,有助于测试和调试。 总之,WiringPiPython是一种非常强大的工具,允许开发人员编写树莓派上运行的GPIO控制的Python应用程序,快速开发原型,以及进行快速的研发和迭代。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值