赞
踩
目录
2.利用gettimeofday()计算时间,实现超声波测距
在上篇已经刷好了Armbian系统,安装wiringPi完成基本的开发环境准备,接下来就是基于WiringPi配合常用模块来了解了解angePi的基本外设 — 通用输入输入设备GPIO、串口UART、IIC协议等。
(在上面的文章里,已经记录了HC-SR04的测距原理,这里简单略过)
具体体现在代码中,只需要知道以下关键信息:
向TRIG引脚发送一个10us 的脉冲信号(高电平),开始发送超声波
开始发送波的同时,ECHO会被置为高电平直到波返回,置为低电平
(ECHO持续高电平的时间 = 超声波往返路程的花费的时间)
已知波在空气中传播速度为340 m/s。通过路程=速度×时间计算得出
获取当前时间到新纪元时间Epoch的距离时间(可精确到微妙)
Epoch是指定为1970年1月1日0时0分0秒的格林威治时间
(也就是说该函数能获取当前时间距离1970年1月1日0时0分0秒那一刻xxxxxx秒xxxxxx微妙)
(模块坏了,没接上测试)
- #include<wiringPi.h>
- #include<unistd.h>
- #include<sys/time.h>
- #include<stdio.h>
- #include<stdlib.h>
-
- #define TRIG 23
- #define ECHO 25
-
- void init_hardware(){
- int retn;
- retn=wiringPiSetup();
- if(retn < 0){
- perror("init hardware");
- exit(-1);
- }
- }
-
- void init_pins(){
- pinMode(ECHO,INPUT);
- pinMode(TRIG,OUTPUT);
- }
-
- float measure_distance(){
- long start_usec,stop_usec;
- struct timeval rawtime1,rawtime2;
- float distance;
- digitalWrite(TRIG,LOW);
- delayMicroseconds(2);
- digitalWrite(TRIG,HIGH);
- delayMicroseconds(10);
- digitalWrite(TRIG,LOW);//start send ultrasonic
- // printf("%d\n",digitalRead(ECHO));
- while(!(digitalRead(ECHO) == 1));
- gettimeofday(&rawtime1, NULL);
-
- while(!(digitalRead(ECHO) == 0));//low
- gettimeofday(&rawtime2,NULL);
-
- start_usec =rawtime1.tv_sec*1000000+rawtime1.tv_usec;
- stop_usec =rawtime2.tv_sec*1000000+rawtime2.tv_usec;
- distance=(float)(stop_usec-start_usec)/1000000*17000;
- return distance;
- }
-
- int main(){
- float distance;
- init_hardware();
- init_pins();
- while(1){
- distance = measure_distance();
- printf("%0.2f cm\n",distance);
- delay(1000);
- }
- return 0;
- }
在前面的文章里,已经记录了SG90的相关信息,这里简单略过
体现在代码中,需要以下关键信息
设置定时器,可精确到us(微秒)级别,比alarm()函数精度更高
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/989205
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。