简介

如今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 https://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 https://osoyoo.com/driver/sw520d.py 获取完整的程序源码

4) 运行程序

python是一种脚本语言,可以直接运行,在当前路径下输入:sudo ./sw520d.py

回车就能运行代码了。

5)测试

运行程序后首先是向屏幕打印出 一系列提示信息,接着开始读取倾斜模块引脚电平,如果将倾斜模块插在面包板上,LED灯不会亮起,呈熄灭状态,屏幕打印出”Not tilt…”;如果拿着面包板摇动,LED灯会闪烁,屏幕打印出”tilting!”.