树莓派输入检测
GPIO口的作用无非就是输入输出和通信,前面在LED控制中已经了解了输出功能的用法,今天通过一个寻迹模块作为输入传感器来试试树莓派的输入检测功能。IO口的输入模块可以说很多很多,例如常见的按键、光电开关、磁性开关等等,这些都可以作为我们一个系统的输入传感器,他们的输入信号既有数字信号又有模拟信号,这些输入信号在输入我们的控制器之前都需要经过其过程通道进行调理转换,例如按键这类开关量的输入信号就需要经过消抖处理,交变信号需要经过检波、采集有效值、放大等一系列操作转换成直流信号,有关过程通道的详细介绍可以参考笔者另外一个系列智能车浅谈——过程通道篇。
模块介绍
厂家介绍:(下图来自某宝优信电子模块详情)
实物图如下:
原理图如下:
相信参加了近几年的电赛或者是自己做过寻迹小车的同学对此模块都很熟悉了,这里我们简单捋一下整电路的原理,这个来说原理是一个电压比较器,其中负相输入端是通过一个变阻器来给定参考电压(通过调节变阻器阻止可以改变灵敏度),正向输入端接了一个TCRT5000的红外传感器,它的原理是当发射管的光反射到接收管就导通;当没有东西遮挡红外对管时,接收管无法接收发射管的红外光,不导通,此时正向端电压存在,且比参考电压高,D0输出高电平,开关指示灯不工作;当有东西遮挡红外对管,切不是黑色物体时,红外光被反射给接收管,接收管导通,正向输入电压被拉地,此时正向段电压小于参考电压,D0输出低电平,开关指示灯开始工作。
接线图
笔者此处还是使用的板载编码为7的引脚,接线图如下所示:
树莓派 | 红外模块 |
---|---|
5V | VCC |
GND | GND |
GPIO7 | D0 |
获取方式
GPIO命令获取(BCM编码)
在点亮LED中我们最开始使用的GPIO命令中我们就有使用过查询IO口状态的指令,需要注意,商家的注意事项已经提示,树莓派玩家需要将I/O口设置成输入模式,才能正常使用。
了解这些后咱来实际操作一下:
emmm突然忘记了引脚编码、不急啊,打开终端命令,输入gpio readall,回车就会出现你想看见的东西。
输入命令gpio -g mode 4 input回车(设置引脚模式为输入)
然后输入 gpio -g read 4 回车(读取引脚状态)
笔者此时的传感器已经导通,输出为低电平,可以看见返回的也是0
然后将传感器远离遮挡物或者朝天花板,当开关指示灯熄灭时
输入gpio -g read 4 回车,会发现返回的是1。
C语言获取IO状态(wPi编码)
打开C语言IDE Geany,输入以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#define KEY 7 //wiringPi模式第7号脚
int main()
{
if(wiringPiSetup()==-1)
{
perror("树莓派启动失败");
exit(-1);
}
pinMode(KEY,INPUT);//设置引脚为输入
while(1)
{
if(digitalRead(KEY)==0)
{
//遮挡低电平,未遮挡高电平
puts("被遮挡...");
}
}
return 0;
}
需要进一步了解wiringpi库中函数的参考此博文。
按照之前的操作命名key.c,保存到桌面,然后打开终端命令;
输入 cd Desktop 切换至桌面目录
然后入gcc -o key key.c -lwiringPi编译和生成key的执行文件,
最后输入sudo ./key回车。
此时遮挡传感器就会看见命令行出现以下效果。
可以发现命令窗口打印了一堆被遮挡,这显然有些不太友好
我们先按Ctrl+C关闭当前运行,对代码进行修改。
Ctrl + C 终止
Ctrl + D 退出
Ctrl + S 挂起
Ctrl + Q 解挂
修改代码如下:(其实就类似与我们对按键输入执行了一个消抖)
// An highlighted block
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#define KEY 7 //wiringPi模式第7号脚
int main()
{
if(wiringPiSetup()==-1)
{
perror("树莓派启动失败");
exit(-1);
}
pinMode(KEY,INPUT);//设置输入
//判断是否遮挡
while(1)
{
if(digitalRead(KEY)==0)
{
//遮挡低电平,未遮挡高电平
//第一次判断是否遮挡
delayMicroseconds(20000);//延时20ms
if(digitalRead(KEY)==0){
//第二次判断是否遮挡
while(digitalRead(KEY)==0);//等待
puts("按下...");
}
}
}
return 0;
}
然后再次打开命令终端,一套龙操作,就可以实现以下效果。
Python获取IO状态(设置成了wPi编码模式)
打开Thonny,输入以下代码并保存,
// An highlighted block
import wiringpi
GPIO_Output_Pin = 0 #定义GPIO_Output_Pin为0脚
GPIO_Intput_Pin = 7 #定义GPIO_Intput_Pin为7脚
OUTPUT = 1 #定义OUTPUT为1即输出
INPUT = 0 #定义INPUT为0即输入
HIGH = 1 #定义HIGH为1即高点平
LOW = 0 #定义HIGH为1即高点平
wiringpi.wiringPiSetup() #设置GPIO编号为wPi方式
wiringpi.pinMode(GPIO_Output_Pin,OUTPUT) #设置GPIO_Output_Pin为OUTPUT输出模式
wiringpi.pinMode(GPIO_Intput_Pin,INPUT) #设置GPIO_Intput_Pin为INPUT输入模式
while 1:
wiringpi.digitalWrite(GPIO_Output_Pin,HIGH)#设置GPIO_Output_Pin输出高电平
print('GPIO_Output_Pin OUTPUT =>HIGH')
print('GPIO_Intput_Pin INPUT <=',wiringpi.digitalRead(GPIO_Intput_Pin))#打印从GPIO_Intput_Pin读到的数据
wiringpi.delay(1000) #延时1000ms
print() #为了输出美观 打印换行
wiringpi.digitalWrite(GPIO_Output_Pin,LOW)#设置GPIO_Output_Pin输出低电平
print('GPIO_Output_Pin OUTPUT =>LOW')
print('GPIO_Intput_Pin INPUT <=',wiringpi.digitalRead(GPIO_Intput_Pin))#打印从GPIO_Intput_Pin读到的数据
wiringpi.delay(1000) #延时1000ms
print() #为了输出美观 打印换行
总结
有关树莓派输入就记录到这,至于能做啥,大家就自由发挥吧,有啥高级的项目欢迎大家投食,总不能一直高射炮打蚊子,如有不妥之处欢迎大家指导。
树莓派4B入门学习笔记汇总
树莓派4B学习笔记——系统烧录及初次开机
树莓派4B学习笔记——点亮你的LED
树莓派4B学习笔记——IO输入检测
树莓派4B学习笔记——IO通信篇(I2C)
树莓派4B学习笔记——IO通信篇(SPI)
树莓派4B学习笔记——IO通信篇(1-Wire)
树莓派4B学习笔记——IO通信篇(UART)