嵌入式之路,贵在日常点滴
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ---阿杰在线送代码
目录
一、wiringPi库是什么
二、如何获取?
三、如何使用?
EG1:控制继电器?
EG2:超声波的使用
其他?
一、wiringPi库是什么
wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等。
二、如何获取?
树莓派的镜像固件中可能不会带有wiringPi库
使用以下命令查看
gpio -v
未安装会提示指令不认识
安装教程博文中补充失效的下载连接?
三、如何使用?
EG1:控制继电器?
其实继电器简单来说就是一个开关,VCC表示电源正极、GND表示电源负极、IN表示信号输入脚,COM表示公共端,NC(normal close)表示常闭端,NO(normal open)表示常开端?
继电器:使非可编程的设备变得可控制可编程
一般情况下是常闭状态?
这里简单地描述一下大部分的继电器模块:
Vcc接电源正极,Gnd接电源负极,In接信号端(输入高电平公共端连常闭,输入低电平公共端连常开),如下图所示,你就可以明白了,当IN脚输入高电平时,NC与COM相连(左图);当输入低电平时,NO与COM相连(右图)。
?
继电器实现的控制电路优点:用低电压控制高电压;远距离控制;自动控制。?
? ? ? ? 1、硬件连接
树莓派的引脚图
?
查看io口详情
gpio readall
继电器驱动电压3.3v 选择pin7作为信号引脚?
?? ? ? ? 2、编程
在使用wiringPi库时,你需要包含头文件 #include<wiringPi.h>。凡是写wiringPi的程序,都包含这个头文件。
参考?
①硬件初始化函数?
使用wiringPi时,你必须在执行任何操作前初始化树莓派,否则程序不能正常工作。
可以调用下表函数之一进行初始化,它们都会返回一个int , 返回 -1 表示初始化失败。
int wiringPiSetup (void) | 返回:执行状态, -1表示失败 | 程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16 需要root权限 | int wiringPiSetupGpio (void) | 返回执行状态,-1表示失败 | 程序中使用的是BCM GPIO 引脚编号表。 需要root权限 |
②通用GPIO控制函数?
void pinMode (int pin, int mode) | pin:配置的引脚 mode:指定引脚的IO模式 可取的值:INPUT、OUTPUT、PWM_OUTPUT,GPIO_CLOCK ????? | 作用:配置引脚的IO模式
注意: 只有wiringPi 引脚编号下的1脚(BCM下的18脚) 支持PWM输出 只有wiringPi编号下的7(BCM下的4号)支持GPIO_CLOCK输出 | void digitalWrite (int pin, int value) | pin:控制的引脚 value:引脚输出的电平值。 ?可取的值:HIGH,LOW分别代表高低电平 | 让对一个已近配置为输出模式的 引脚? 输出指定的电平信号 | int digitalRead (int pin) | pin:读取的引脚 返回:引脚上的电平,可以是LOW HIGH 之一 | 读取一个引脚的电平值? LOW? HIGH ,返回 | void analogWrite(int pin, int value) | pin:引脚 value:输出的模拟量 | 模拟量输出 树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API, 需要增加另外的模块 | int analogRead (int pin) | pin:引脚 返回:引脚上读取的模拟量 | 模拟量输入 树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API, 需要增加另外的模块 | void pwmWrite (int pin, int value) | pin:引脚 value:写入到PWM寄存器的值,范围在0~1024之间。 | 输出一个值到PWM寄存器,控制PWM输出。 pin只能是wiringPi 引脚编号下的1脚(BCM下的18脚) ? | void pullUpDnControl (int pin, int pud) | ?pin:引脚 pud:拉电阻模式 可取的值:PUD_OFF ? ? ? ?不启用任何拉电阻。关闭拉电阻。 ???????????? PUD_DOWN ? ?启用下拉电阻,引脚电平拉到GND ???????????? PUD_UP ? ? ? ? 启用上拉电阻,引脚电平拉到3.3v | 对一个设置IO模式为 INPUT 的输入引脚设置拉电阻模式。 与Arduino不同的是,树莓派支持的拉电阻模式更丰富。 树莓派内部的拉电阻达50K欧姆 |
EG:从键盘输入0,1控制继电器
- 编写程序
#include <wiringPi.h>
#include <stdio.h>
#define SWITCHER 7
int main()
{
int cmd;
if(wiringPiSetup() == -1){
printf("硬件初始化失败\n");
}
pinMode(SWITCHER,OUTPUT);
digitalWrite(SWITCHER,HIGH);
while(1){
printf("输入0-接通;1-断开\n");
scanf("%d",&cmd);
if(cmd == 0){
digitalWrite(SWITCHER,LOW);//低电平接通
}else if(cmd == 1){
digitalWrite(SWITCHER,HIGH);//高电平断开
}else{
printf("input error\n");
}
}
return 0;
}
导致输入提示一直刷屏的原因并非缺少getchar() ,而是忘记return 0 ?
代码快速对齐 ①gg ?回首行 ②=G ?自动对齐?
? ? ? ? 2、编译,运行
gcc demo1.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;
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);//获取当前时间,最后接收到返回信号的时候
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()
{
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;
}
--------------------------------------------------时间控制函数----------------------------------------------------- void delay (unsigned int howLong) 毫秒级,最大延时49天
void delayMicroseconds (unsigned int howLong) 微妙级,最大延时71分钟
其他?
当两个窗口同时对同一个目标文件进行编辑时,就会提示生成隐藏文件目标.swp,警告修改编辑的可能不是最新的文件。若.swp文件存在,则每次打开目标文件都会ATTENTION
原因是:生成这个隐藏文件
?
解决方案:
1、把前面打开该文件的窗口关闭;
2、强制删除隐藏文件 :用ls -a 可以看到生成的.swp隐藏文件,再用rm 指令删除即可。
?
?
?
|