基于官方外设开发(1)
一、wiringPi外设SDK安装
- 安装wiringPi库
git clone https://github.com/orangepi-xunlong/wiringOP #下载源码 cd wiringOP #进入文件夹 sudo ./build clean #清除编译信息 sudo ./build #编译 通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP 下载压缩包 把压缩包通过xterm传到开发板 解压 unzip xxx.zip cd xxx sudo ./build gpio readall
- 验证指令: gpio readall
如下方所示,外设库就完成安装了
二、蜂鸣器开发
-
蜂鸣器响的原理:基本IO口的应用
-
蜂鸣器配合时间函数开发
#include <stdio.h> #include <wiringPi.h> #include <unistd.h> #define BEEP 0 //设置针脚0为蜂鸣器的控制引脚 int main (void) { wiringPiSetup () ;//初始化wiringPi库i pinMode (BEEP, OUTPUT) ;//设置IO口的输入输出,输出 while(1){ //sleep(1); usleep(100000); digitalWrite (BEEP, HIGH) ; //设置IO口输出低电平,蜂鸣器响 //sleep(1); usleep(100000); digitalWrite (BEEP, LOW) ; //设置IO口输出低电平,蜂鸣器响 } return 0; }
-
vim的设置,修改/etc/vim/vimrc文件,需要用超级用户权限
sudo vim /etc/vim/vimrc set tabstop=4 设置tab键缩进4个空格 set shiftwidth=4 设置批量对齐时候的tab键空格数为4
-
shell脚本小插曲
./build beep.c
$0 $1shell脚本处理参数,可以通过$?来处理,这里的$1是要编译的文件
简易编译的shell脚本: gcc $1 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt
三、超声波测距
- 测距原理基本说明:
超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。 - 型号:HC-SR04
接线参考:模块除了两个电源引脚外,还有TRIG,ECHO引脚 - 怎么让它发波
Trig,给Trig端口至少10us的高电平 - 怎么知道开始发了
Echo信号,由低电平跳转到高电平,表示开始发送波 - 怎么知道接收了返回波
Echo,由高电平跳转回低电平,表示波回来了 - 怎么算时间
Echo引脚维持高电平的时间!
波发出去的那一下,开始启动定时器
波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间 - 怎么算距离
距离=速度(340m/s)*时间/2 - 时序
- 时间函数
函数原型
#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中
测试代码struct timeval { long tv_sec;/*秒*/ long tv_usec;/*微妙*/ };
//计算程序在当前环境中数数10万次耗时多少 #include <sys/time.h> #include <stdio.h> //int gettimeofday(struct timeval *tv,struct timezone *tz ) void mydelay() { int i,j; for(i=0;i<100;i++){ for(j=0;j<1000;j++); } } int main() { struct timeval startTime; struct timeval stopTime; gettimeofday(&startTime,NULL); mydelay(); gettimeofday(&stopTime,NULL); long diffTime = 1000000*(stopTime.tv_sec - startTime.tv_sec) + (stopTime.tv_usec - startTime.tv_usec); printf("全志H6的Linux数100000耗时%ldus\n",diffTime); return 0; }
- 代码实现和验证
#include <stdio.h> #include <wiringPi.h> #include <unistd.h> #include <sys/time.h> #include <stdlib.h> #define ECHO 0 //0PIN #define TRIG 1 //1PIN double getDistance(void) { double dis; long time; struct timeval start; struct timeval stop; digitalWrite (TRIG, LOW) ; usleep(20); digitalWrite (TRIG, HIGH) ; usleep(10); digitalWrite (TRIG, LOW) ; while(!digitalRead(ECHO)); gettimeofday(&start,NULL); while(digitalRead(ECHO)); gettimeofday(&stop,NULL); time = 1000000*(stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec); dis = (time/1000000.0)*340.0*100.0/2.0; return dis; } int main (void) { double dis; wiringPiSetup () ; pinMode (TRIG, OUTPUT) ; pinMode (ECHO, INPUT) ; while (1) { dis = getDistance(); printf("dis = %lf\n", dis); sleep(1); } return 0; }