简介
如今IOT技术发展的如火如荼,IOT技术带动了相关产业的蓬勃发展,智能家具就是其中之一。在智能家具领域通常会用到一个重要的部件用于报警,那就是倾斜开关。倾斜开关常见的有水银倾斜开关和滚珠倾斜开关。在本课中我使用滚珠倾斜开关SW520D检测外界震动,当有震动时候红色LED闪烁。
实验所需部件
本课需要用到如下部件:
Raspberry pi3 x1
面包板 x1
T型板 x1
40-Pin Cable x1
电阻200Ω x1
红色LED x1
SW520D x1
跳线 x若干
工作原理
SW520D是一种常用的滚珠式倾斜开关,SW520D由两个导电电极和金属滚珠组成,两个电极和滚珠被一起封装在金色外壳内,如图所示
SW520D倾斜开关被焊接到一个微型PCB板上,组成一个倾斜开关模块。这个模块电路基本上集中在电压比较器芯片LM393周围,这个模块包含倾斜传感器(SW520D)、放大器、标准3针引脚、电源指示灯,指示模块正确供电以及状态指示灯,指示倾斜开关有倾斜。
当倾斜开关直立使金属滚珠与导电电极接触时候,就会使电路导通,DO输出低电平(0V),状态指示灯亮起;当倾斜开关倾斜到一定程度后,金属滚珠不与导电电极接触,电路断开,DO输出高电平(5V),状态指示灯熄灭,其大致原理如图
SW520D模块原理图
实验接线图
个部件按照如下图所示连接
电路图
实物连接图
软件
在raspberry pi上有两种主流的编程方式,一种是用C语言编程,这种方式跟Arduino非常相似;另一种是使用python编程,我们会提供两种编程语言代码,根据个人习惯使用相应的语言。
1 如何你是C语言用户,请按如何操作
1) 在/home/pi下新建一个文件sw520d.c(文件名随意)
cd ~
sudo nano sw520d.c
其中sudo表示已超级用户权限运行;nano是一款文本编辑器,关于nano的具体使用可以在命令行窗口输入man nano查看官方文档或者访问https://www.nano-editor.org/dist/v2.2/nano.html了解更多信息
2) 编码
首先需要添加程序所需用到的头文件,wiringPi是Pi用C语言对GPIO口编程所依赖的库文件;stdio是C语言中的标准输入输出库文件,像printf、scanf等函数都需要这个库 的支持。
#include <wiringPi.h> #include <stdio.h>
接下来需要定义LED灯和SW520D倾斜模块使用那个GPIO端口
#define LedPin 21 #define Sw520dPin 22
定义LED使用GPIO .21,SW520D倾斜模块使用GPIO .22.可能你会感到疑惑,为什么上面的电路图里面LED灯接到5号端口上,SW520D接到了6号端口上,为什么这里变成了21和22了?是因为raspberry pi的端口一般有BCM、wPi两种编码方式,BCM是博通公司对Pi端口的编码方式;wPi是wiringPi里面对Pi GPIO编码方式。上面的电路图中使用的是BCM编码,在这里因为是使用基于C语言的wiringPi库编程所以采用了wPi编码方式。在命令行运行gpio readall可以查看GPIO两种编码方式。
// When initialize wiring failed, print messageto screen if(wiringPiSetup() == -1){ printf("setup wiringPi failed !"); return 1; } pinMode(LedPin, OUTPUT); pinMode(Sw520dPin,INPUT);
将LedPin引脚设定为输出模式;将Sw520dPin引脚设定为输入模式
printf("\n"); printf("\n"); printf("========================================\n"); printf("| LED alarm |\n"); printf("| ------------------------------ |\n"); printf("| If SW520D tilt |\n"); printf("| |\n"); printf("| LED will Blink |\n"); printf("| |\n"); printf("| OSOYOO|\n"); printf("========================================"); printf("\n"); printf("\n"); while(1){ if(!(digitalRead(Sw520dPin))){ // LED off digitalWrite(LedPin, HIGH); printf("\n"); printf("-------------------|\n"); printf("| Not tilt... |\n"); printf("-------------------|\n"); delay(1000); } else{ // LED blink digitalWrite(LedPin, LOW); delay(500); digitalWrite(LedPin,HIGH); delay(500); printf("\n"); printf("===================|\n"); printf("| tilting! |\n"); printf("===================|\n"); } }
这段代码显示首先是在屏幕上打印出一些提示信息,接着进入while循环语句,不停读取Sw520dPin脚电平,如果读取到Sw520dPin为低电平,也就是SW520D没有倾斜的时候,会向屏幕打印”Not tilt…”,LED灯不会闪烁;如果读取到Sw520dPin为高电平,也就是SW520D有倾斜的时候,会向屏幕打印”tilting!”,LED灯会已500ms频率闪烁。
写完程序后输入ctrl X按照提示输入Y再回车保存退出,在命令行输入 sudo wget http://osoyoo.com/driver/sw520d.c 获取完整的程序源码
3) 编译程序
C语言属于高级语言,在运行之前需要用编译器编译成可执行文件,在当前路径下输入
gcc -Wall -o sw520d sw520d.c -lwiringPi
-Wall:使编译时候提示更多错误信息,使代码变得健壮
-o:指定编译后的程序名字,可以任意指定,此处指定为sw520d
sw520d.c:表示待编译的源文件
-lwiringPi:指定编译需要的依赖文件
4) 运行程序
在当前路径下输入:sudo ./sw520d
回车就能运行代码了。
5)测试
运行程序后首先是向屏幕打印出 一系列提示信息,接着开始读取倾斜模块引脚电平,如果将倾斜模块插在面包板上,LED灯不会亮起,呈熄灭状态,屏幕打印出”Not tilt…”;如果拿着面包板摇动,LED灯会闪烁,屏幕打印出”tilting!”.
2 如果你是Python用户,请看下文。
如果你的系统是最新版本的Raspbian Jessie with PIXEL是已经安装了python的,而且还有python的集成开发环境,在开始->Programming->Python 3(IDLE)可以找到,你若通过HDMI直接接到显示器上,你可以直接在Python 3(IDLE)里编程,详细使用请看之前的文章(还没写),若通过远程登录请参照下面的方法。
1) 在/home/pi下新建一个文件sw520d.py(文件名随意)
cd ~
sudo nano sw520d.py
2) 编码
import RPi.GPIO as GPIO import time
这两句话是导入脚本需要用到的模块,import在python下是一个关键字,表示导入模块,其中RPi.GPIO是针对Pi GPIO开发的一个Python库;time是python自带的一个标准库,延时函数调用就要依赖于这个库
# set #5 as LED pin LedPin = 5 # set #6 as SW520D Pin Sw520dPin = 6
定义LED和SW520D模块与那个GPIO口连接,这里的5 和6是BCM编码方式,在命令行运行gpio readall可以查看GPIO编码方式。
#print message at the begining ---custom function def print_message(): print ('==================================') print ('| LED Alarm |') print ('| ---------------- |') print ('| If SW520D Tilt |') print ('| |') print ('| LED Will Blink |') print ('| ---------------- |') print ('| |') print ('| OSOYOO|') print ('==================================\n') print ('Program is running...') print ('Please press Ctrl+C to end the program...')
print_message()是自定义的一个函数,向终端打印信息,关于函数定义请查看这里 了解更多信息。
#setup function for some setup---custom function def setup(): GPIO.setwarnings(False) #set the gpio modes to BCM numbering GPIO.setmode(GPIO.BCM) #set LedPin's mode to output,and initial level to HIGH(3.3V) GPIO.setup(LedPin,GPIO.OUT,initial=GPIO.HIGH) GPIO.setup(Sw520dPin,GPIO.IN)
GPIO.setmode(GPIO.BCM)函数设定GPIO为BCM编码方式编码方式;GPIO.setup(LedPin,GPIO.OUT,initial=GPIO.HIGH)函数将LedPin设定为输出模式并且初始电平为高电平;GPIO.setup(Sw520dPin,GPIO.IN)函数将Sw520d设定为输入模式。
#main function def main(): #print info print_message() while True: #read Sw520dPin's level if(GPIO.input(Sw520dPin)): GPIO.output(LedPin,GPIO.LOW) time.sleep(0.5) GPIO.output(LedPin,GPIO.HIGH) time.sleep(0.5) print ('********************') print ('* tilting! *') print ('********************') print ('\n') else: GPIO.output(LedPin,GPIO.HIGH) print ('====================') print ('= Not tilt... =') print ('====================') print ('\n') time.sleep(1)
在主函数main()中先调用了print_message()函数向终端打印信息,接着进入while循环中读取Sw520d引脚的电平,如果读取到的电平为高电平,LED灯0.5s闪烁一次,并且终端打印”tilting!”;如果读取到的电平是低电平,将LedPin端口置高,向终端打印”Not tilt…”。
写完程序后输入ctrl X按照提示输入Y再回车保存退出,在命令行输入 sudo wget http://osoyoo.com/driver/sw520d.py 获取完整的程序源码
4) 运行程序
python是一种脚本语言,可以直接运行,在当前路径下输入:sudo ./sw520d.py
回车就能运行代码了。
5)测试
运行程序后首先是向屏幕打印出 一系列提示信息,接着开始读取倾斜模块引脚电平,如果将倾斜模块插在面包板上,LED灯不会亮起,呈熄灭状态,屏幕打印出”Not tilt…”;如果拿着面包板摇动,LED灯会闪烁,屏幕打印出”tilting!”.
DownLoad Url osoyoo.com