目录
外设开发综述及wiringPi库
是什么
树莓派中一个集成了很多API(特定平台,特定接口)的库,使得开发像printf一样简单。
初学只需会调库,之后再深入到自己写wiringPi库,IO的上层以及底层的驱动代码。
如何获取
树莓派的镜像固件中可能不会带有wiringPi库
使用以下命令查看
gpio -v
-
已经安装
- 未安装
由于我的树莓派自带了WiringPi库,没有亲自安装过,参考
如何使用
EG1:控制继电器
- 硬件连接
查看io口详情
gpio readall
注意了IO口编号可不是中间排针的序号!!
继电器驱动电压3.3v
选择pin7作为信号引脚
- 编程
树莓派的接口函数详解:https://www.cnblogs.com/lulipro/p/5992172.html
包含头文件#incldue <wiringPi.h>
①硬件初始化函数
函数 | 返回值 | 说明 |
---|---|---|
int wiringPiSetup (void) | -1表示失败 | 使用wiringPi 引脚编号表,编号为 0~16。root |
int wiringPiSetupGpio (void) | -1表示失败 | 使用BCM GPIO引脚编号表。root |
②通用GPIO控制函数
EG:从键盘输入0,1控制继电器
1.编写程序
#include <wiringPi.h>
#include <stdio.h>
#define SWITCHER 7
int main()
{
int cmd;
if(wiringPiSetup() == -1){
printf("硬件初始化失败\n");
return -1;
}
pinMode(SWITCHER,OUTPUT);
digitalWrite(SWITCHER,HIGH);
while(1){
printf("输入0-接通;1-断开并回车\n");
scanf("%d",&cmd);
//getchar();
if(cmd == 0){
digitalWrite(SWITCHER,LOW);
}else if(cmd == 1){
digitalWrite(SWITCHER,HIGH);
}else{
printf("input error\n");
}
}
return 0;
}
编译时候记得链库 -lwiringPi
代码快速对齐
①gg
回首行
②=G
自动对齐
2.编译,运行
gcc relay.c -lwiringPi
./a.out
EG2:超声波的使用
Linux下时间函数:struct timeval结构体
-
结构体原型
#include "sys/time.h"
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
- 用法
①定义2个结构体变量
struct timeval tv1;
struct timeval tv2;
②获取某个事件的开始,结束信息
gettimeofday(&tv1, NULL);
//....事件
gettimeofday(&tv2, NULL);
int gettimeofday(struct timeval *tv, struct timezone *tz);
timezone structure 已经过时了
tz 通常设置为 NULL.
③计算开始,结束的时间
long start, stop;
start = tv1.tv_sec * 1000000 + tv1.tv_usec; //单位为us
stop = tv2.tv_sec * 1000000 + tv2.tv_usec;
或者
unsigned long long timeSum = 0;
timeSum = tv1.tv_sec-tv2.tv_sec +(tv1.tv_usev-tv2.tv_usec)/1000000;//以s为单位
超声波原理简述
触发信号为10us的TTL,接收信号检测高电平持续的时间,再由公式计算即可。
TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑"1",0V等价于逻辑"0",这被称做TTL信号系统
代码详解
#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>
#define Trig 4
#define Echo 5
void ultraInit(void)
{
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
}
float disMeasure(void)
{
struct timeval tv1;
struct timeval tv2;
/*
* struct timeval
* {
* time_t tv_sec; //Seconds.
* suseconds_t tv_usec; //Microseconds.
* };
*/
long start, stop;
float dis;
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);//10us的TTL
//统计高电平持续的时间
while(!(digitalRead(Echo) == 1));
gettimeofday(&tv1, NULL);
while(!(digitalRead(Echo) == 0));
gettimeofday(&tv2, NULL);
/*
* int gettimeofday(struct timeval *tv, struct timezone *tz);
* The functions gettimeofday() and settimeofday() can get and set the time as well as a timezone.
* timezone structure 已经过时了;
* tz 通常设置为 NULL.
*/
start = tv1.tv_sec * 1000000 + tv1.tv_usec; //单位为us
stop = tv2.tv_sec * 1000000 + tv2.tv_usec;
dis = (float)(stop - start) / 1000000 * 34000 / 2;//s×cm/s=cm
return dis;
}
int main(void)
{
float dis;
if(wiringPiSetup() == -1){
printf("setup wiringPi failed !");
return 1;
}
ultraInit();
while(1){
dis = disMeasure();
printf("distance = %0.2f cm\n",dis);
delay(1000);
}
return 0;
}
其他
1.配置ssh时出现的乱码问题
输入命令 sudo raspi-config 后如下图所示。底层逻辑无问题,可操作,仅为显示乱码
将字符编码由default更改为UTF-8即可
2. .swp文件的处理
当两个窗口同时对同一个目标文件进行编辑时,就会提示生成隐藏文件目标.swp,警告修改编辑的可能不是最新的文件。若.swp文件存在,则每次打开目标文件都会ATTENTION
解决方法
用ls -a
可以看到生成的.swp隐藏文件,再用rm
指令删除即可。