IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 树莓派(四)树莓派外设开发基础篇 -> 正文阅读

[嵌入式]树莓派(四)树莓派外设开发基础篇

嵌入式之路,贵在日常点滴

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ---阿杰在线送代码

目录

一、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控制继电器

  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指令删除即可。

?

?

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:22:30  更:2022-08-19 19:25:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 12:57:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码