一、介绍

   振动开关也称为弹簧开关或振动传感器,是一种电子开关。它会产生振动力,并将结果传送给电路装置,从而触发其工作。它包含以下部分:导电振动弹簧,开关主体,触发销和包装壳。


二、组件

★Raspberry Pi 3主板*1

★树莓派电源*1

★40P软排线*1

★振动开关传感器模块*1

★双色LED模块*1

★面包板*1

★跳线若干

三、实验原理


  在震动开关模块中,导电的振动弹簧和触发销被精确地放置在开关体中,并且通过粘合剂结合到固化位置。通常,弹簧和触发销不接触,一旦摇动,弹簧就会摇动并与触发器引脚接触,以传导并产生触发信号。
  在此实验中,将双色LED模块连接到树莓派以指示更改。敲击或敲击振动传感器时,它将打开,双色led将闪烁绿色,再次敲击它将变为红色,每一次敲击后会在两种颜色之间切换。

四、实验步骤

  第1步:连接电路,该实验与实验6(轻触开关按键实验)相同。 这里激光模块的实物与模块原理图的端口名称不一致,我们按照实物的端口名称来连接。

树莓派 T型转接板 振动开关
GPIO 0(序号11) GPIO 17 SIG(DO)
5V 5V VCC
GND GND GND
树莓派 T型转接板 双色LED
GPIO 1(序号12) GPIO 18 R(红色端口)
GND GND GND
GPIO 2(序号13) GPIO 27 G(绿色端口)

  第2步:这次编程有两个函数要注意,是关于输入的高级应用。
  有多种方式将GPIO的输入导入到程序中,polling( 轮询 )式 和 interrupt( 中断 )式( edge detection 边缘检测 ),“轮询”式如果程序在错误的时间读取值,可能会错过输入。我们这里采用中断式。
  如果您没有将输入引脚连接到任何东西,它将“浮动”。换句话说,读取的值是未定义的,因为它没有连接到任何东西,直到你按下按钮或开关。它可能会由于接收电源干扰而改变很大的值。
  为了解决这个问题,我们使用一个向上拉或向下拉电阻器。这样,就可以设置输入的默认值。可以使用硬件或者软件实现上下拉电阻。在硬件方式中,常常在输入通道与3.3V(上拉)或0V(下拉)之间使用10K电阻。GPIO模块允许您在编程中这样配置:

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)# or
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

  我们很多时候并不关心电平值, 而关心电平从低到高,或从高到低的变化(如编码器测速/按键按下弹开等), 为避免主程序忙于其它事情错过引脚的电平改变, 有两种方式:
  wait_for_edge() 函数
   event_detected() 函数

   wait_for_edge()函数是为了阻止程序的执行,直到检测到边缘为止。换句话说,等待按钮按下的示例可以改写成:

GPIO.wait_for_edge(channel, GPIO.RISING)

   注意检测的边缘参数有 GPIO.RISING, GPIO.FALLING , GPIO.BOTH (上升沿, 下降沿 或 升降沿), 这样用几乎不占用CPU,如果你只希望在确定的时间段内查询,可以使用 timeout 参数:

# wait for up to 5 seconds for a rising edge (timeout is in milliseconds)
channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000)
if channel is None:print('Timeout occurred')
else:print('Edge detected on channel', channel)

  event_detected()函数被设计用来与其他事物一起在循环中使用, 不同于polling轮询, 它不会在CPU忙于处理其他事物时错过输入状态的变化。 这使得使用Pygame 或 PyQt 时非常有用,因为其中有一个主循环监听和及时响应GUI事件的基础。
  只要检测到指定参数的边缘事件(上升沿, 下降沿 或 升降沿)发生时,调用GPIO.event_detected(channel)的值就为"ture"(真)。

#Note that you can detect events for GPIO.RISING, GPIO.FALLING or GPIO.BOTH.
GPIO.add_event_detect(channel, GPIO.RISING)  # add rising edge detection on a channel
do_something()
if GPIO.event_detected(channel):print('Button pressed')

  不过需要自己新建一个线程去循环检测event_detected()的值,还算是比较麻烦的。
  可采用另一种办法轻松检测状态,这种方式是直接传入一个回调函数:GPIO通过在add_event_detect()函数中添加callback参数,RPI.GPIO为回调函数运行第二个线程。这意味着回调函数可以与主程序同时运行,以立即响应边缘。
  For example:

def my_callback(channel):print('This is a edge event callback function!')print('Edge detected on channel %s'%channel)print('This is run in a different thread to your main program')
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback) # 这里添加了回调函数callback这个参数,就不需要GPIO.event_detected(channel)函数了

  如果你想要不止一个回调函数:

def my_callback_one(channel):print('Callback one')
def my_callback_two(channel):print('Callback two')
GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, my_callback_one)
GPIO.add_event_callback(channel, my_callback_two)

  请注意,在这种情况下,回调函数是按顺序运行的,而不是并发的。这是因为只有一个线程用于回调,其中每个回调都按照它们被定义的顺序运行。

  由于存在开关抖动(用示波器可以看到),每次按下开关会调用多次回调函数,这不是我们希望的,有两种方式处理开关抖动:
  ①在开关两个引脚之间添加一个0.1uF的电容
  ②软件消抖
  ③二者结合使用
  使用软件消抖时, 给回调函数添加一个弹跳时间的参数( bouncetime= ), 弹跳时间(参照单片机可以为10~20ms)在ms级别, 下面的程序用200ms来消抖:

# add rising edge detection on a channel, ignoring further edges for 200ms for switch bounce handling
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200)

  由于某些原因, 你的程序可能不希望用边缘检测了,可以停止它们:

GPIO.remove_event_detect(channel)

  第3步:正式编程。 定义针脚参数和初始化设置函数setup(),其中就用到了上面讲解的GPIO输入高级应用,本次实验不使用检测函数GPIO.add_event_detect(),采用“轮询”式,在循环中直接查询GPIO.input(TiltPin)的值来判定是否振动。

#!/usr/bin/env python
import RPi.GPIO as GPIO
import timeVibratePin = 11
Rpin   = 12
Gpin   = 13tmp = 0def setup():GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical locationGPIO.setup(Gpin, GPIO.OUT)     # Set Green Led Pin mode to outputGPIO.setup(Rpin, GPIO.OUT)     # Set Red Led Pin mode to outputGPIO.setup(VibratePin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Set BtnPin's mode is input, and pull up to high level(3.3V)

  第4步: 定义Led(x)函数,控制双色LED灯闪烁。定义Print(x),打印按键是否切换开关的提示消息。

def Led(x):  #控制双色LED灯闪烁的函数if x == 0:GPIO.output(Rpin, 1)  #红灯亮GPIO.output(Gpin, 0)    #绿灯灭if x == 1:GPIO.output(Rpin, 0)GPIO.output(Gpin, 1)def Print(x):   #打印按键是否切换开关的提示消息global tmpif x != tmp:if x == 0:print '    **********'print '    *     ON *'print '    **********'if x == 1:print '    **********'print '    * OFF    *'print '    **********'tmp = x

  第5步: 当模块平稳没有振动时,GPIO.input(TiltPin)的值为0,IF语句不执行;
  当振动时,GPIO.input(TiltPin)的值为1,执行IF语句。每次执行IF语句时,Led(state)中的state值都与上次不同,所以LED的颜色会在红绿之间切换。

def loop():state = 0while True:if GPIO.input(VibratePin):  #每当振动产生时state = state + 1if state > 1:state = 0Led(state)Print(state)time.sleep(1)

  第6步: 创建destroy()函数,清除LED状态。创建程序入口,并包含异常处理。

def destroy():GPIO.output(Gpin, GPIO.LOW)       # Green led offGPIO.output(Rpin, GPIO.LOW)       # Red led offGPIO.cleanup()                     # Release resourceif __name__ == '__main__':     # Program start from heresetup()try:loop()except KeyboardInterrupt:  # When 'Ctrl+C' is pressed, the child program destroy() will be  executed.destroy()

树莓派基础实验8:振动开关实验相关推荐

  1. 树莓派4bpython串口通信解读数据_树莓派基础实验36:通用串口通信实验

    一.介绍 对于树莓派 3B+来说,他的UART功能有三种: 1.内部蓝牙使用: 2.控制终端使用: 3.与其他设备进行串口通信. 在树莓派基础实验35:USB TO TTL模块实验中学习了通过串口对树 ...

  2. 树莓派基础实验20:火焰报警传感器实验

    一.介绍    火焰传感器模块通过捕获来自火焰的红外波长来执行检测.它可以用来探测火焰是否存在,在这个实验中,我们使用火焰传感器来检测火焰并发出报警信号. 二.组件 ★Raspberry Pi主板*1 ...

  3. 树莓派基础实验18:声音传感器实验

    一.介绍    声音传感器是一种接受声波并将其转换为电信号的组件,它像麦克风一样检测周围环境中的声音强度. 二.组件 ★Raspberry Pi主板*1 ★树莓派电源*1 ★40P软排线*1 ★PCF ...

  4. 树莓派基础实验14:PS2操纵杆实验

    一.介绍    操纵杆是一种输入设备,由一根可在基座上旋转,并向其控制的设备报告其角度或方向的操纵杆组成.操纵杆通常用于控制视频游戏和机器人.这里使用操纵杆PS2. 二.组件 ★Raspberry P ...

  5. 树莓派基础实验39:解析无线电接收机PWM、SBUS信号

    一.介绍   虽然如今或者将来,5G网络的建设带来人工智能和工业自动化的全面升级,生产活动中劳动力的需求大大减少,大量的劳动力将向内容生产行业和服务行业转移.教育.医疗.娱乐.公共管理等诸多领域,乃至 ...

  6. 树莓派基础实验31:MPU6050陀螺仪加速度传感器实验

    一.介绍    MPU6050是世界上第一款也是唯一一款专为智能手机.平板电脑和可穿戴传感器的低功耗.低成本和高性能要求而设计的6轴运动跟踪设备.    它集成了3轴MEMS陀螺仪,3轴MEMS加速度 ...

  7. 树莓派基础实验16:霍尔传感器实验

    一.介绍    霍尔传感器是根据霍尔效应制作的一种磁场传感器.霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855-1938)于1879年在研究金属的导电机构时发现的.后来发现半导体. ...

  8. 树莓派基础实验17:温度传感器实验

    一.介绍    温度传感器是检测温度并将其转换为输出信号的组件.根据材料和部件的特点,温度传感器可分为热电阻和热电偶两种,热敏电阻是前者的一种,他由半导体材料制成.大多数热敏电阻是负温度系数(NTC) ...

  9. 树莓派基础实验29:I2C LCD1602实验

    一.介绍    众所周知,虽然液晶显示器和其他显示器大大的丰富了人机交互,但他们有一个共同的弱点.当它们连接到控制器时,需要占用大量的IO口,但是一般的控制器没有那么多的外部端口,也限制了控制器的其他 ...

最新文章

  1. url传递中文的解决方案
  2. 记一次Linux系统内存占用较高得排查
  3. 每天一个linux命令(23):Linux 目录结构
  4. 运行gulp项目报错:AssertionError: Task function must be specified。
  5. 【vlfeat】O(n)排序算法——计数排序
  6. 解析并符号 读取dll_风电场用风功率采集测风塔数据报文格式解析浅谈
  7. c++怎么将文件中的数据读出并赋值给字符串_web前端开发过程中如何写JavaScript程序?...
  8. Dubbo(十一)dubbo的超时重试配置以及启动检查
  9. MiniApp微信小程序入口在安卓手机桌面
  10. GSL数学库解多参数方程
  11. Python常用的设计模式
  12. pdf pmp书籍第六版_PMP项目管理 第六版 (带目录完整高清版).pdf
  13. 腾讯信鸽集成华为厂商通道
  14. 高一到高三计算机笔记,高中数学笔记总结高一至高三,很全.doc
  15. flutter微信分享,qq分享
  16. 【日常学习】使用anaconda管理环境并安装cuda和cudnn和tensorflow
  17. 剑指offe【31-67】
  18. python 提取出字符串括号中的内容,正则表达式
  19. 关于浏览器极速模式怎么设置
  20. ZeroMQ教程中文版

热门文章

  1. 关于pyecharts可视化地图中国经济、人口等数据
  2. 可以测试妇科病的软件,判断一个女人有没有妇科病,都有哪些科学的检查方法?...
  3. python pdb 安装_入门 Python 调试器 pdb
  4. 新浪微博4周年抽红包 Python脚本
  5. 难得的伯克希尔-哈撒韦 伤心的G华路之一
  6. laravel 批量上传图片
  7. 采用SmartQQ 协议可制作聊天机器人
  8. 如何解决pytorch 编译时CUDA版本与运行时CUDA版本不对应
  9. 邮件大师 for linux,linux下如何安装邮件系统postfix?linux下如何对邮件系统postfix设置?,大师求解答...
  10. 吉他谱软件guitar pro2023吉他和弦、六线谱、BASS四线谱绘制