嵌入式之路,贵在日常点滴
---阿杰在线送代码
目录
wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等。
树莓派的镜像固件中可能不会带有wiringPi库
使用以下命令查看
gpio -v
未安装会提示指令不认识
其实继电器简单来说就是一个开关,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时,你必须在执行任何操作前初始化树莓派,否则程序不能正常工作。
可以调用下表函数之一进行初始化,它们都会返回一个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
|
只有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 不启用任何拉电阻。关闭拉电阻。 | 对一个设置IO模式为 INPUT 的输入引脚设置拉电阻模式。 与Arduino不同的是,树莓派支持的拉电阻模式更丰富。 树莓派内部的拉电阻达50K欧姆 |
EG:从键盘输入0,1控制继电器
- #include
- #include
-
- #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
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
- #include
- #include
-
- #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
指令删除即可。