当前位置:   article > 正文

第二篇 香橙派的外设开发基础(上)-GPIO篇_香橙派gpio

香橙派gpio

目录

 前言

一、HC-SR04超声波测距

0.超声波测距原理

✒️如何使HC-SR04发送超声波

✒️如何接收超声波返回

✒️如何通过时间算出距离

1.Linux的获取时间gettimeofday()

✒️timeval结构体

✒️gettimeofday()函数

 2.利用gettimeofday()计算时间,实现超声波测距

二、SG90舵机

0.驱动SG90舵机原理

1.Linux的定时器

✒️itimerval结构体

✒️setitimer()函数

2.实现舵机全向转动


 前言

       在上篇已经刷好了Armbian系统,安装wiringPi完成基本的开发环境准备,接下来就是基于WiringPi配合常用模块来了解了解angePi的基本外设 — 通用输入输入设备GPIO、串口UART、IIC协议等。

一、HC-SR04超声波测距

0.超声波测距原理

《第二篇 树莓派基本外设基础》— 树莓派实现

《第三篇 SG90舵机和HC-SR04测距》— 51实现

(在上面的文章里,已经记录了HC-SR04的测距原理,这里简单略过)

具体体现在代码中,只需要知道以下关键信息:

✒️如何使HC-SR04发送超声波

向TRIG引脚发送一个10us 的脉冲信号(高电平),开始发送超声波

✒️如何接收超声波返回

开始发送波的同时,ECHO会被置为高电平直到波返回,置为低电平

ECHO持续高电平的时间 = 超声波往返路程的花费的时间)

✒️如何通过时间算出距离

已知波在空气中传播速度为340 m/s。通过路程=速度×时间计算得出

1.Linux的获取时间gettimeofday()

✒️timeval结构体

图1 - struct_timeval.h

✒️gettimeofday()函数

        获取当前时间到新纪元时间Epoch的距离时间(可精确到微妙)

        Epoch是指定为1970年1月1日0时0分0秒的格林威治时间

(也就是说该函数能获取当前时间距离197011000秒那一刻xxxxxxxxxxxx微妙)

图2 - sys/time.h

 2.利用gettimeofday()计算时间,实现超声波测距

(模块坏了,没接上测试)

  1. #include<wiringPi.h>
  2. #include<unistd.h>
  3. #include<sys/time.h>
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #define TRIG 23
  7. #define ECHO 25
  8. void init_hardware(){
  9. int retn;
  10. retn=wiringPiSetup();
  11. if(retn < 0){
  12. perror("init hardware");
  13. exit(-1);
  14. }
  15. }
  16. void init_pins(){
  17. pinMode(ECHO,INPUT);
  18. pinMode(TRIG,OUTPUT);
  19. }
  20. float measure_distance(){
  21. long start_usec,stop_usec;
  22. struct timeval rawtime1,rawtime2;
  23. float distance;
  24. digitalWrite(TRIG,LOW);
  25. delayMicroseconds(2);
  26. digitalWrite(TRIG,HIGH);
  27. delayMicroseconds(10);
  28. digitalWrite(TRIG,LOW);//start send ultrasonic
  29. // printf("%d\n",digitalRead(ECHO));
  30. while(!(digitalRead(ECHO) == 1));
  31. gettimeofday(&rawtime1, NULL);
  32. while(!(digitalRead(ECHO) == 0));//low
  33. gettimeofday(&rawtime2,NULL);
  34. start_usec =rawtime1.tv_sec*1000000+rawtime1.tv_usec;
  35. stop_usec =rawtime2.tv_sec*1000000+rawtime2.tv_usec;
  36. distance=(float)(stop_usec-start_usec)/1000000*17000;
  37. return distance;
  38. }
  39. int main(){
  40. float distance;
  41. init_hardware();
  42. init_pins();
  43. while(1){
  44. distance = measure_distance();
  45. printf("%0.2f cm\n",distance);
  46. delay(1000);
  47. }
  48. return 0;
  49. }

二、SG90舵机

0.驱动SG90舵机原理

在前面的文章里,已经记录了SG90的相关信息,这里简单略过

体现在代码中,需要以下关键信息

1.Linux的定时器

✒️itimerval结构体

图3 - sys/time.h

✒️setitimer()函数

设置定时器,可精确到us(微秒)级别,比alarm()函数精度更高

  本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/989205

推荐阅读
相关标签