2014-5-29 18:21:02 [显示全部楼层]
62299浏览
楼主: Jane

[入门教程] Arduino教程08 震动探测「DFR0100 」

[复制链接]
【本篇课程内容于 2024年11月14日更新】
>本系教程配套硬件套件:【新版】Arduino入门套件 DFR0100


震动传探测,我们从名字中应该就可以判断,该装置能够检测物体是否在震动。我们用什么来做震动探测呢?那就是倾斜开关。其内部含有导电珠子,器件一旦震动,珠子随之滚动,就能使两端的导针导通。
通过这个原理,我们可以做一些小玩具结合起来。最常见的,比如我们看到一些小孩子穿的一闪一闪的小鞋子!走动的过程,就能使内部珠子滚动。
只要传感器检测到东西震动,就会有信号输出。这里,我们想通过倾斜开关做个简单的震动传感器,并把震动传感器和LED的结合,当传感器检测到物体震动时,LED亮起,停止震动时,LED熄灭。

元件清单
Arduino教程08 震动探测「DFR0100 」图1

硬件连接


从倾斜开关这个名字,我们可以把它和什么联想在一起?就是按键开关,倾斜开关和我们项目【交通信号灯】中介绍的按钮在硬件连接是完全相同的,原理也相似。只是使用方法不同而已。可以把下图与项目【交通信号灯】一起看,你会发现很多相似之处。倾斜开关也需要一个下拉电阻,LED需要一个限流电阻。

Arduino教程08 震动探测「DFR0100 」图2

1 震动探测线图

示例代码

样例代码:
  1. //项目 – 震动探测
  2. int SensorLED = 13;       //定义LED为数字引脚13
  3. int SensorINPUT = 3;      //连接倾斜开关到中断1,也就是数字引脚3
  4. unsigned char state = 0;
  5. void setup() {
  6.   pinMode(SensorLED, OUTPUT);         //LED为输出模式
  7.   pinMode(SensorINPUT, INPUT);        //倾斜开关为输入模式
  8.   //低电平变高电平的过程中,触发中断1,调用blink函数
  9.   attachInterrupt(1, blink, RISING);   
  10. }
  11. void loop(){
  12.       if(state!=0){              // 如果state不是0时
  13.         state = 0;               // state值赋为0
  14.         digitalWrite(SensorLED,HIGH);   // 亮灯
  15.         delay(500);          //延时500ms
  16.       }  
  17.       else
  18.         digitalWrite(SensorLED,LOW);     // 否则,关灯
  19. }
  20. void blink(){                //中断函数blink()
  21. state++;             //一旦中断触发,state就不断自加
  22. }
复制代码

当我们晃动板子时,LED灯也会随之亮,一旦停止晃动,LED灯又恢复到熄灭的状态。

代码回顾
代码虽不长,但还是不太容易理解的。先大致说下代码的运行过程。
在没有任何打扰的情况下,程序在不断运行着...,让LED一直处于关闭。突然,被人打扰了(也就是晃动板子),就跳到中断函数blink()中(当然进入中断也是要条件的,我们后面说)。此时,state不断自加导致主函数中if函数检测到state不为0了,那么就让LED亮起了,同时又重新让state为0,等待下一次中断。未发生中断,LED则恢复关闭状态。
重复的知识点不再赘述,下面重点讲解中断函数attachInterrupt()。
什么是中断?打个比方吧,比如你在家看电视,突然家里电话铃响了,那么你不得不停下看电视先去接电话,等接完电话后,你又可以继续看电视啦!在整个过程中接电话就是一个中断过程,电话铃响就是中断的标志,或者说中断条件。

Arduino教程08 震动探测「DFR0100 」图3
现在知道中断是什么意思了吧,再回到attachInterrupt()函数,它是一个当外部发生中断时,才被唤醒的函数。区别于其他函数,它依附于中断引脚才发生。大多数板子都有两个外部中断引脚:数字引脚2(中断0)和数字引脚3(中断1)。中断0与中断1是中断号,在函数中需要用到。不同板子,中断号对应引脚可能不同,可以查阅Arduino官方编程语法手册,网址如下:
http://arduino.cc/en/Reference/AttachInterrupt
Arduino教程08 震动探测「DFR0100 」图4
interrupt:中断号0或者1。如果选择0的话,连接到数字引脚2上,选择1的话,连接到数字引脚3上。

function:调用的中断函数名。写中断函数时,需要特别说明以下三点:
1、我们在写中断函数的时候,该函数不能含有参数和返回值。也就是说,要写一个无返回值的函数。
2、中断函数中不要使用delay()和millis()函数,因为数值不会继续变化。
3、中断函数中不要读取串口,串口收到的数据可能会丢失。

mode:中断的条件。只有特定的以下四种情况:
1、LOW当引脚为低电平时,触发中断。
2、CHANGE当引脚电平发生改变时,触发中断。
3、RISING当引脚由低电平变为高电平时,触发中断。
4、FALLING当引脚由高电平变为低电平时,触发中断。

知道了attachInterrupt()函数的用法,回归到我们的代码中:
attachInterrupt(1, blink, RISING);

对应上面说明看。1,指中断号1。所以倾斜开关接到数字引脚3。blink是我们下面要调用的中断函数。RISING,指引脚3在由低变为高的一瞬间,中断触发。
为什么要选RISING呢?由于硬件我们还没提到,我们就把倾斜开关想象成按键。在按键没按下时,是断开的,引脚3处于低的状态。一旦被按下,就和5V导通,变为高。这个过程是引脚由低电平变高电平的过程,所以选择RISING模式。

硬件回顾

倾斜开关
倾斜开关,也叫做滚珠开关,震动开关等等。虽然叫法不同,不过原理是相同的。就是通过珠子滚动接触导针的原理来控制电路的通断。
看下结构图就明白了。倾斜开关内部两个珠子,通过珠子滚动接触导针的原理来控制电路的接通或者断开。传感器震动或者晃动时,珠子就会接触导针,从而导通。还需要注意的一点是,由于倾斜开关的内部构造,倾斜开关只有一头是导通的,金色导针一端是导通的,银色导针一端是不导通的。这也就是为什么,往金色一端倾斜,灯会点亮,而偏向银色一端倾斜时,灯不会被点亮的原因。

Arduino教程08 震动探测「DFR0100 」图5
2 倾斜开关内部结构图




示例代码

下载附件Detecting_Vibration_Chinese.docx.ino.zip

下一篇教程:Arduino教程 09 --  感光灯

DFRobot版权所有,欢迎转载。
转载请务必标注来源: DF创客社区+作者姓名+原文网址。


luo_wenqiang  学徒

发表于 2014-6-20 19:19:35

缺少blink函数啊,把滚珠开关当成按钮开关来读?
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-6-23 09:58:48

luo_wenqiang 发表于 2014-6-20 19:19
缺少blink函数啊,把滚珠开关当成按钮开关来读?

谢谢提醒,这个编辑器有点问题
回复

使用道具 举报

翻滚的魔方  初级技师

发表于 2014-8-30 09:12:47

为什么attachInterrupt(1, blink, RISING);  要写在setup里,不是每次 Arduino 上电或重启后,setup 函数只运行一次吗?
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-9-1 10:33:54

翻滚的魔方 发表于 2014-8-30 09:12
为什么attachInterrupt(1, blink, RISING);  要写在setup里,不是每次 Arduino 上电或重启后,setup 函数只 ...

中断信号是不受loop程序执行顺序影响的,只要一有中断信号,就会立马进入中断函数。
https://arduino.cc/en/Reference/AttachInterrupt
https://www.gammon.com.au/forum/?id=11488
回复

使用道具 举报

YanMJ  见习技师

发表于 2014-10-27 21:50:04

看了百度知道,还是不清楚下拉电阻的作用,请问这里为何需要一个下拉电阻,为何要把节点电平拉低,本来不触碰开关的情况下是肯本不通电的。
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-10-28 09:51:56

YanMJ 发表于 2014-10-27 21:50
看了百度知道,还是不清楚下拉电阻的作用,请问这里为何需要一个下拉电阻,为何要把节点电平拉低,本来不触 ...

因为如果不接下拉电阻的话,这个引脚是悬空状态,电路会受到外界干扰,会不稳定。下拉电阻的目的是为了防止这些干扰,增加电路稳定性。
回复

使用道具 举报

bruceshannon  学徒

发表于 2016-1-6 20:41:22

延时500毫秒,实际LED灯亮的时间为什么变成了1秒?
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2016-1-13 18:40:23

bruceshannon 发表于 2016-1-6 20:41
延时500毫秒,实际LED灯亮的时间为什么变成了1秒?

代码确定没有写1s吗?
回复

使用道具 举报

xuluming  学徒

发表于 2016-5-2 17:52:08

  1. int SensorLED = 13;
  2. int SensorINPUT = 3;
  3. int count = 0;
  4. unsigned char state = 0;
  5. void setup() {
  6.   // put your setup code here, to run once:
  7.   Serial.begin(9600);
  8.   pinMode(SensorLED, OUTPUT);
  9.   pinMode(SensorINPUT, INPUT);
  10.   attachInterrupt(1,blink, LOW);
  11. }
  12. void loop() {
  13.   // put your main code here, to run repeatedly:
  14.   if(state!=0){
  15.     state = 0;
  16.     digitalWrite(SensorLED,HIGH);
  17.     count++;
  18.     Serial.println(count);
  19.     delay(1000);
  20.   }
  21.   else{
  22.     digitalWrite(SensorLED,LOW);
  23.   }
  24. }
  25. void blink(){
  26.   state++;
  27. }
复制代码

尝试在触发中断的时候计数,但是计数值总是不太正常,请问是哪里的问题?
回复

使用道具 举报

翻滚的魔方  初级技师

发表于 2016-7-20 11:50:44

Jane 发表于 2014-9-1 10:33
中断信号是不受loop程序执行顺序影响的,只要一有中断信号,就会立马进入中断函数。
http://arduino.cc/en ...

所以说在中断函数之中不存在时间的概念吗?或者说中断函数执行的时间很短,忽略不计,所以delay和millis不可用?在执行中断函数之后机器时间会不会改变?
回复

使用道具 举报

zuoyan  见习技师

发表于 2017-3-1 20:26:36

谢谢分享
回复

使用道具 举报

gray6666  初级技神

发表于 2017-3-27 14:32:34

感谢分享
回复

使用道具 举报

songoku  见习技师

发表于 2017-3-27 16:56:08

else里面灭灯的语句总感觉想不通,麻烦哪位大神解释解释
回复

使用道具 举报

znlzxy  学徒

发表于 2017-6-7 08:20:23

谢谢分享
回复

使用道具 举报

尘世那么美  学徒

发表于 2017-12-7 22:04:07

本帖最后由 尘世那么美 于 2017-12-7 22:14 编辑
xuluming 发表于 2016-5-2 17:52
尝试在触发中断的时候计数,但是计数值总是不太正常,请问是哪里的问题? ...

因为可能当你开关断开时,中断端口的状态是OPEN状态,所以端口读出来的值是随机的,所以会一直发生中断。从而计数不正常
回复

使用道具 举报

LeSoleil  见习技师

发表于 2019-7-17 09:18:29

太好了!
回复

使用道具 举报

绝地智者  见习技师

发表于 2019-7-19 22:15:05

厉害了,新手来顶一顶帖子,加油学习~
回复

使用道具 举报

绝地智者  见习技师

发表于 2019-7-19 22:15:12

厉害了,新手来顶一顶帖子,加油学习~
回复

使用道具 举报

岑剑伟  初级技师

发表于 2019-9-11 10:13:00

这些 代码 能不能堆叠在一起运行
回复

使用道具 举报

莫莫  见习技师

发表于 2020-11-21 14:39:12

只有一页吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail