zoukankan      html  css  js  c++  java
  • Arduino 各种模块篇 震动模块 常开 震动传感器模块

    以下是店家提供的一部分资料

    一共就需要3根线

    ——————————————————分割线————————————————————————

    用途:
    用于各种震动触发作用,报盗报警,智能小车,电子积木等。
    请注意这个模块在感应到小的震动时触发时间会很短,不够驱动继电器,有些人的资料显示可以直接和继电器模块相连,实际运用效果不佳。
    模块特色:
    1、采用本公司生产的各种灵敏度震动开关,默认用SW-18020P震动传感器,。
    2、比较器输出,信号干净,波形好,驱动能力强,超过15mA
    3、工作电压3.3V-5V
    4、输出形式 :数字开关量输出(0和1)
    5、设有固定螺栓孔,方便安装
    6、小板PCB尺寸:3.2cm x 1.4cm
    7、使用宽电压LM393比较器

    模块使用说明:

    1、产品不震动时,震动开关呈断开状态,输出端输出高电平,绿色指示灯不亮;

    2、产品震动时,震动开关瞬间导通,输出端输出低电平,绿色指示灯亮;

    3、输出端可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境是否有震动,起到报警作用

    本系列模块的产品正反面外观图

    单片机测试程序

    /******************************************
    东莞市丰川电子有限公司
    传感器触发测试
    单片机:STC89C52
    波特率:9600
    产品用途:震动感应触发,报警触发。
    *****************************************/
    #include <reg52.h>
    unsigned char date;
    #define uchar unsigned char
    #define uint unsigned int
    sbit key1=P0^1;


    /* 函数申明 -----------------------------------------------*/
    void delay(uint z);
    void Initial_com(void);

    //***********************************************************

    /*
    ********************************************************************************
    ** 函数名称 : delay(uint z)
    ** 函数功能 : 延时函数
    ********************************************************************************
    */
    void delay(uint z)
    {
    uint i,j;
    for(i=z;i>0;i--)
    for(j=110;j>0;j--);
    }


    //******************************

    //*****串口初始化函数***********

    //******************************
    void Initial_com(void)
    {
    EA=1; //开总中断
    ES=1; //允许串口中断
    ET1=1; //允许定时器T1的中断
    TMOD=0x20; //定时器T1,在方式2中断产生波特率
    PCON=0x00; //SMOD=0
    SCON=0x50; // 方式1 由定时器控制
    TH1=0xfd; //波特率设置为9600
    TL1=0xfd;
    TR1=1; //开定时器T1运行控制位

    }


    //*************************
    //**********主函数*********
    //*************************
    main()
    {
    Initial_com();
    while(1)
    {

    if(key1==0)
    {
    delay(); //消抖动
    if(key1==0) //确认触发
    {
    SBUF=0X01;
    delay(200);


    }

    }

    if(RI)
    {
    date=SBUF; //单片机接受
    SBUF=date; //单片机发送
    RI=0;
    }


    }
    }

    ——————————————————分割线————————————————————————

    看上面的51例子还不算太难。

    现在我们看一下分析原理:

    原帖地址:http://blog.sina.com.cn/s/blog_624e2b450100olkw.html

    实验器材:Arduino 168P 基础套件 互动媒体

              1.Arduino 168P 开发板一个

              2.USB下载线一条

              3. SW-18010P 震动传感器一个

              4.LED一个

              5.200欧姆电阻一个

              6.面包板一块

              7.面包板跳线若干条

    实验目的:学习SW-18010P 震动传感器的工作原理,以及如何使用Arduino 控制SW-18010P 震动传感器。

    实验电路:实验电路如下图所示

     

     Arduino <wbr>震动传感器的制作与测试

    实验原理:SW-18010P 震动传感器这是一款基于弹簧摆动原理设计的震动传感器,震动势能传到弹簧末端引起共振,左右摆动碰触到金属外壁形成通路。在静止时任何角度都为开路OFF状态,当受到外力碰撞或者大力晃动时,弹簧变形和中心电极接触导通使两个引脚瞬间导通为ON状态,当外力消失时,电路恢复为开路OFF状态。由于导通时间和弹簧的刚性有关,所以该震动传感器的输出带宽很窄,在使用Arduino读取时,建议使用外部中断功能。

    Arduino <wbr>震动传感器的制作与测试Arduino <wbr>震动传感器的制作与测试

       

    实验步骤

    一.     按照以上电路正确搭建实验电路。

    二.    将我提供的调试程序下载到Arduino开发板中。

    三.    晃动SW-18010P 震动传感器看LED的工作情况。

    实验程序:

    Arduino外部中断代码:

    #define SensorLED     13
    #define SensorINPUT   2 
    
    unsigned char state = 0;
    
    void setup()
    {
      pinMode(SensorLED, OUTPUT);
      pinMode(SensorINPUT, INPUT);
      attachInterrupt(0, blink, FALLING);//D2口为外部中断0,当有下降沿触发的时候调用blink函数
    
    }
    void loop()
    {
          if(state!=0)
          {
            state = 0;
            digitalWrite(SensorLED,HIGH);
            delay(500);
          } 
          else
            digitalWrite(SensorLED,LOW);
    } 
    
    
    void blink()//数字输入传感器下降沿触发中断服务函数
    {
      state++;
    }

     

    最后结果可观察数字口13脚上的L指示灯,震动后可以看见L灯亮500ms。

     

    ————————————————————————以上内容部分摘自网络————————————————————

    现在自己写了一个程序。

    是用analogRead来判断的。

    将震动模块的数字口插在A0口上。

    得到一个0-1023的数字。

    在晃动的时候,可以得到28 或者 一个差不多的两位数,不晃动的时候,得到的是1021,1022,1023,说明没有震动。

    有震动,便内部导通,向外发送一个电讯号。

    代码如下:

     

    int sensorPin = A0;
    //int ledPin = 7;
    int sensorValue = 0;
    void setup()
    {
      //pinMode(ledPin,OUTPUT);
      Serial.begin(9600);
    }
    
    void loop(){
      sensorValue = analogRead(sensorPin);
      delay(100);
      Serial.println(sensorValue);
    }

     

    显示效果如下,

    有一个缺点就是,数字滚动速度太快。所以得到的都是刷新值。

    一般情况下,晃动一下,我们会希望大约有2秒钟的延迟,因为人的反映速度相对电脑来说还是很慢的。所以,我们可以这么做。

     把LED等连接到Pin7, 震动感应器,连接到A0口

    按照下面的代码尝试

    int sensorPin = A0;
    int ledPin = 7;
    int sensorValue = 0;
    void setup()
    {
      pinMode(ledPin,OUTPUT);
      Serial.begin(9600);
      digitalWrite(ledPin, LOW);
    }
    
    void loop(){
      sensorValue = analogRead(sensorPin);
      if (sensorValue < 100)
      {
        digitalWrite(ledPin, HIGH);
        delay(2000);  // delay for 2 sec if sensor's shaked
      }else{
        digitalWrite(ledPin, LOW);
      }
      Serial.println(sensorValue);
    }

    这样,每次碰到传感器,它都会亮两秒钟,如果两秒内还在有震动的话,会继续亮。

    这样,人就反映过来了。当然,可以适当修改一下时间,比如不是两秒,是1秒也行。总之要人眼能反映过来才好。

    效果一般,但是达到既定的预期效果。

    几元钱的小传感器,已经不错了。加上模块才几块钱,这个传感器电阻估计不到1元吧。

    灵敏度来说,可以用。呵呵~

     

  • 相关阅读:
    强化训练1
    强化训练2
    变量的本质
    抽象层
    安装vs2015
    解决思路
    分析栈的缺点
    (转)使用yuicompressor-maven-plugin压缩js及css文件(二)
    (转)yuicompressor 与 maven结合,打包,压缩js,css (一)
    (转)Properties Editor为你解除通过native2ascii进行Unicode转码的烦恼
  • 原文地址:https://www.cnblogs.com/spaceship9/p/3001130.html
Copyright © 2011-2022 走看看