先解释下GPIO,General-purpose input/output,通用型输入输出接口,其实就是利用针脚的高低电位来进行信息传递的作用,以此来对外部设备进行开关控制,或者获取外部设备的控制。最常见的俩例子就是红外传感器和报警器。
红外报警器算是输入设备(以控制器为主体而言),它可以检测是否有物体出现在其前方,一旦检测到物体,则输出信号,控制器得到信号,可以做出进一步响应。
报警器则是输出响应设备,在得到信号控制后,可以进行报警响应。
下面介绍一个简单案例来对GPIO的使用流程、方法有个全面的认识。注意,一下仅仅是如何连线,具体原理等详情请见附件文档(impinjGPIO文档合集)。
https://download.csdn.net/download/xiaohaigary/11580460
一、所用设备
1、 impinj读写器、impinj GPIO盒子、24v直流电源适配器
2、红外传感器(直流三线NPN常开型)、声光报警器(5线型)
二、接线
这是GPIO盒子的示意图,其中1处接R420的GPIO口,8、9分别接外置直流24V电源,8正极,9负极。至此便完成了基本准备了,可以用impinj自带的Item Test来进行测试一下,out 1有效时4号处亮灯,out 4有效时7号处亮灯。
下一步开始连接声光报警器,这是五线报警器的接线。最左侧两根线分别是正负电源。中间灰色线是喇叭控制线,第四根(红线)是灯光控制线,第五根(黑线)是公共端即地线。
报警器怎么与GPIO盒子连接呢?
首先两根电源线可以连接在8、9位置,也可连接在10、15位置皆可。
红色灯光控制线连接在4号位,为out1。灰色线连接5号位,为out2。
最后一个黑线连接在3号处。
这样,便完成了声光报警器的连接。利用ItemTest进行测试,便可以分别控制声音和灯光进行报警。
下面在说说红外感应器的连接:
下图中标记的1、2、3便是红外传感器的三根连线。1、3分别为正负极。分别连接至10、15处的位置。2是控制线,连接至11处位。
进行测试:将手挡住红外传感器,看11处的小灯是否会亮,亮则说明传感器正常工作了。
输出信号控制原理:
这个盒子其实蛮方便的,输出是继电器输出。但是我尝试直接一端接COM一端接在out1上,然后小灯无法使用。
就咨询了厂家,原来供电只支持0-5v的小灯。
但是对于 供电即亮的两线小灯,要怎么进行控制嘞?下面依次说说对于两线小灯和四线小灯的连接方式。
核心原理:outX在有效时,会与COM连通,形成COM端的电平。
两线小灯:
如果是24v的小灯就太方便了。
灯正极---->盒子的24v+
灯负极---->盒子的out1
盒子的COM口与盒子的0V短接
这样一来当out1有效时,就接通了out1和COM口,也就接通了小灯的正负极。
但是如果是12v的两线小灯嘞?
那肯定要增加一个12v的电源咯。
灯正极---->12v+
灯负极---->盒子的out1
盒子的COM口与盒子的0V短接,并且还要和12v电源的0极短接,使两个电源共零。
四线小灯:
四线小灯是高低电平触发的灯。四根线分别为:正、负、高电平触发线、低电平触发线。
灯正极---->盒子的24v+
灯的低电平触发线---->盒子的out1
盒子的COM口与盒子的0V短接
此时盒子的out1有效时,是低电平,就会触发小灯了。
三、代码控制
下面用代码演示:红外传感器检测到物体后,令声光报警器进行报警。
package com.example.sdksamples;
import com.impinj.octane.ImpinjReader;
import com.impinj.octane.OctaneSdkException;
import com.impinj.octane.Settings;
import java.util.Scanner;
public class SetGPO {
public static void main(String[] args) {
try {
String hostname = System.getProperty(SampleProperties.hostname);
if (hostname == null) {
throw new Exception("Must specify the '"
+ SampleProperties.hostname + "' property");
}
ImpinjReader reader = new ImpinjReader();
reader.connect(hostname);
Settings settings = reader.queryDefaultSettings();
reader.applySettings(settings);
reader.setGpiChangeListener(
new GpiChangeListenerImplementation()
);
} catch (OctaneSdkException ex) {
System.out.println(ex.getMessage());
} catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace(System.out);
}
}
}
GpiChangeListenerImplementation文件为:
package com.example.sdksamples;
import com.impinj.octane.GpiChangeListener;
import com.impinj.octane.GpiEvent;
import com.impinj.octane.ImpinjReader;
import com.impinj.octane.OctaneSdkException;
public class GpiChangeListenerImplementation implements GpiChangeListener {
@Override
public void onGpiChanged(ImpinjReader reader, GpiEvent e) {
System.out.println("GPI Change--port: " + e.getPortNumber()
+ " status: " + e.isState());
try {
if(e.isState()==true){
reader.setGpo(1, true);
reader.setGpo(2, true);
}else{
reader.setGpo(1, true);
reader.setGpo(2, true);
}
} catch (OctaneSdkException ex) {
ex.printStackTrace();
}
}
}