震动传感器详解

news2024/11/17 19:41:45

当涉及到物体的震动检测和感应时,震动模块成为一种常见且实用的工具。这种小巧而功能强大的设备可以用于各种应用,从智能家居到安防系统,再到工业自动化等领域。通过感知和转换物体震动为电信号,震动模块在许多方面都发挥着重要的作用。

本文将介绍震动模块的原理、工作方式以及其在不同领域中的应用。无论您是对电子技术感兴趣还是希望了解如何利用震动模块改进产品或系统,本文将为您提供有益的信息和见解。

1. 源码下载及前置阅读

本文首发 良许嵌入式网 :https://www.lxlinux.net/e/ ,欢迎关注!

本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载):

https://www.lxlinux.net/e/stm32/SW-18010P-tutorial.html

超全的嵌入式入门教程,欢迎小白。

  • 手把手教你安装和使用STM32CubeMX:【一文教你使用STM32CubeMX开发工具:https://www.lxlinux.net/e/stm32/stm32cubemx-tutorial.html】
  • 嵌入式基本功,为后续学习打下坚实的基础:【STM32串口接收不定长数据(接收中断+超时判断):https://www.lxlinux.net/e/stm32/stm32-usart-receive-data-using-rxne-time-out.html】
  • 嵌入式开发者的得力助手,强大的MDK仿真:【手把手教你使用MDK仿真调试:https://www.lxlinux.net/e/stm32/mdk-debug-tutorial.html】

往期精彩教程,有兴趣的小伙伴可以看看。

  • 让你轻松掌握温湿度传感器:【手把手教你玩转DHT11(原理+驱动):https://www.lxlinux.net/e/stm32/dht11-tutorial.html】
  • 计算机概念理清,生动形象,通俗易懂:【图解固件、驱动、软件的区别:https://www.lxlinux.net/e/stm32/firmware-driver-software.html】
  • 解析红外编解码模块的原理、功能和应用:【红外模块详解:https://www.lxlinux.net/e/stm32/infrared-sensor-tutorial.html】

2. 震动模块介绍

2.1 型号介绍

有很多种型号的震动模块,801S、SW-520D、SW-420、SW-18010P 等等,它们之间大同小异。

今天我们的主角是 SW-18010P,模块介绍如下。

接好 VCC 和 GND,电源指示灯将被点亮。

当检测到震动时,板载指示灯点亮;震动停止,板载指示灯熄灭。

用螺丝刀转动「灵敏度调节电位器」可以调节灵敏度。大家可以将电位器旋到最左或最右,然后测试往哪边旋可以提高灵敏度。

2.2 工作参数及引脚介绍

SW-18015P 为密封弹簧型、无方向性震动感应触发开关,任何角度均可触发。

正常使用情况下开关寿命可达20万次。

引脚接线图如下:

SW-18010PSTM32
VCC3.3或5V
GNDGND
DO任意 GPIO 口
AO模拟输出,无效,不接

3. SW-18015P原理

SW-18015P 在静止时为开路 OFF 状态, 当受到外力碰触而达到相应震动力时,或者移动速度达到适当离(偏)心力时,导电接脚会产生瞬间导通呈瞬间 ON 状态;当外力消失時,开关恢复为开路 OFF 状态。

所以,SW-18015P 在无震动或者震动强度达不到设定阈值时,DO 口输出高电平,当外界震动强度超过设定阈值时,模块 D0 输出低电平。

请注意这个模块在感应到小的震动时触发时间会很短,无法驱动继电器,有些的资料显示可以直接和继电器模块相连,但实际运用效果不佳。

4. 通信示意图

实现目标:我们有一个三色 LED 灯,无震动时,绿灯亮,红灯灭;当震动模块感受到震动,绿灯灭,红灯亮。

这个小案例的应用场景可以是博物馆等场所防盗,玻璃柜如果有震动,可能发生偷窃,开始报警。

5. 编程实战

5.1 硬件接线

本教程使用的硬件如下:

  • 单片机:STM32F103C8T6
  • 震动模块:SW-18010P
  • 小灯:三色 LED 灯模块
  • 烧录器:ST-LINK V2

接线如下:

SW-18010PSTM32LED
VCC5V
GNDGND
DOA4
A5R
A7G
GNDGND

烧录的时候接线如下表,如果不会烧录的话可以看我之前的文章【[STM32下载程序的五种方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html】。

ST-Link V2STM32
SWCLKSWCLK
SWDIOSWDIO
GNDGND
3.3V3V3

接好如下图:

开发板使用的是我们自绘的板子。大家也可以用自己的板子,只要是 STM32F103C8T6 主控芯片就行。

5.2 LED初始化

LED 灯的代码简简单单,只要进行一下两个灯的初始化就行。

void led_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    LED1_GPIO_CLK_ENABLE();                                 /* LED1时钟使能 */
    LED3_GPIO_CLK_ENABLE();                                 /* LED3时钟使能 */

    gpio_init_struct.Pin = LED1_GPIO_PIN;                   /* LED1引脚 */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);       /* 初始化LED1引脚 */


    gpio_init_struct.Pin = LED3_GPIO_PIN;                   /* LED3引脚 */
    HAL_GPIO_Init(LED3_GPIO_PORT, &gpio_init_struct);       /* 初始化LED3引脚 */

    LED1(0);                                                /* 关闭 LED1 */
    LED3(0);                                                /* 关闭 LED3 */
}

LED 的 .h文件:

#ifndef _LED_H
#define _LED_H
#include "sys.h"


/******************************************************************************************/
/* 引脚 定义 */

#define LED1_GPIO_PORT                  GPIOA
#define LED1_GPIO_PIN                   GPIO_PIN_5
#define LED1_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)             /* PA口时钟使能 */

#define LED3_GPIO_PORT                  GPIOA
#define LED3_GPIO_PIN                   GPIO_PIN_7
#define LED3_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)             /* PA口时钟使能 */

/******************************************************************************************/
/* LED端口定义 */
#define LED1(x)   do{ x ? \
                      HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) : \
                      HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET); \
                  }while(0)

#define LED3(x)   do{ x ? \
                      HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_SET) : \
                      HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_RESET); \
                  }while(0)

/* LED取反定义 */
#define LED1_TOGGLE()   do{ HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN); }while(0)        /* 翻转LED1 */
#define LED3_TOGGLE()   do{ HAL_GPIO_TogglePin(LED3_GPIO_PORT, LED3_GPIO_PIN); }while(0)        /* 翻转LED3 */

/******************************************************************************************/
/* 外部接口函数*/
void led_init(void);                                                                            /* LED初始化 */

#endif

5.3 震动模块初始化

初始化一下震动模块的 DO 引脚。

我们采用中断的方式亮红灯,需要初始化和使能一下 EXTI。

void sw_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    SW_CLK();                                               /* IO口时钟使能 */

    gpio_initstruct.Pin = SW_PIN;                           /* DO引脚 */
    gpio_initstruct.Mode = GPIO_MODE_IT_FALLING;            /* 下降沿触发 */
    gpio_initstruct.Pull = GPIO_NOPULL;                     /* 无电阻 */
    HAL_GPIO_Init(SW_GPIO, &gpio_initstruct);               /* 初始化DO引脚 */

    HAL_NVIC_SetPriority(EXTI4_IRQn,2,0);                   /* 抢占优先级2,响应优先级0 */
    HAL_NVIC_EnableIRQ(EXTI4_IRQn);                         /* 使能EXTI4 */
}

5.4 震动模块控制灯

复写「HAL_GPIO_EXTI_Callback」函数,检测到中断下降沿,则表示震动模块感受到震动,「swflag」置1。

uint16_t get_swflag(void)
{
    return swflag;

}

void set_swflag(uint16_t value)
{
    swflag = value;
}

void EXTI4_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);         /* 调用中断处理公用函数 清除中断线 的中断标志位 */
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);         /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == SW_PIN){
        if(HAL_GPIO_ReadPin(SW_GPIO, SW_PIN) ==  GPIO_PIN_RESET)                //如果有震动
        {
            swflag = 1;
        }
    }
}

5.5 主函数

主函数如下:

依据「swflag」,为0时表示无震动,绿灯亮,红灯灭;为1时表示震动模块感受到震动,绿灯灭,红灯亮。

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    delay_init(72);                     /* 延时初始化 */
    led_init();                         /* LED初始化 */
    sw_init();                          /* 震动模块初始化 */

    while(1)
    {
        if (get_swflag())                                                             //有震动时
        {
            HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET);         //红灯亮
            HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_RESET);   //绿灯灭
            delay_ms(500);
            set_swflag(0);
        }else{                                                                      //无震动时
            HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_SET);         //绿灯亮
            HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET);       //红灯灭
        }
    }
}

5.6 运行效果

拍拍面包板,戳戳震动模块都可以让震动模块感受到震动。

无震动时,绿灯亮,红灯灭。(我的小绿灯不是很亮,用旧了,嘻嘻)

有震动时,绿灯灭,红灯亮。

6. 总结

随着技术的不断进步和创新,我们可以期待未来震动模块的进一步发展,以满足不断变化的需求和应用场景。无论是改善生活质量、提升工作效率,还是增强安全性,震动模块将继续为我们的日常生活和工作带来更多的创新和便利。

希望本文对您对于震动模块的理解和应用有所帮助。感谢各位看官,love and peace!

另外,想进大厂的同学,一定要好好学算法,这是面试必备的。这里准备了一份 BAT 大佬总结的 LeetCode 刷题宝典,很多人靠它们进了大厂。

刷题 | LeetCode算法刷题神器,看完 BAT 随你挑!

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

推荐阅读:

  • 程序员必备编程资料大全
  • 程序员必备软件资源

欢迎关注我的博客:良许嵌入式教程网,满满都是干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chromedriver安装和环境变量配置

chromedriver 1、安装2、【重点】环境变量配置(1)包的复制:(2)系统环境变量配置 3、验证 1、安装 网上随便搜一篇chromedriver的安装文档即可。这里是一个快速链接 特别提醒:截止2024.1.30,chr…

Springboot+vue的健身房管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的健身房管理系统(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的健身房管理系统,采用M(model&#xf…

老师和老师的区别在哪里

“老师和老师的区别在哪里?”这真是个好问题。有时我会想,是不是因为自己多读了几本书,或者多经历了一些世事,就能更好地胜任教育工作。但实际上,老师和老师的区别,并不仅仅在于经验和知识,更在…

语言革命:NLP与GPT-3.5如何改变我们的世界

文章目录 📑前言一、技术进步与应用场景1.1 技术进步1.2 应用场景 二、挑战与前景三、伦理和社会影响四、实践经验五、总结与展望 📑前言 自然语言处理(Natural Language Processing,NLP)是人工智能领域的一个重要分支…

【Linux】线程池的简易实现(懒汉模式)

文章目录 前言一、懒汉方式1.普通模式1.线程安全模式 二、源代码1.Task.hpp(要执行的任务)2.ThreadPool.hpp(线程池)3.Main.cpp 前言 线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监…

生产问题排查系列——redis告警连接异常问题排查

项目背景 我们的项目使用redis的场景主要是有两种,一是使用redis缓存各种业务信息,二是使用redis做分布式锁。主要是引用了两个框架jedis和redisson。 Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持; …

【linux】文本处理命令-grep、awk、sed使用(1)

作用: grep数据查找定位awk数据切片sed数据修改 类比SQL: grepselect *from tableawkselect field from tablesedupdate table set fieldnew where fieldold 一、grep 1.1 grep* Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟g…

房屋租赁系统-java

思维导图:业务逻辑 类的存放: 工具类 Utility package study.houserent.util; import java.util.*; /***/ public class Utility {//静态属性。。。private static Scanner scanner new Scanner(System.in);/*** 功能:读取键盘输入的一个菜单…

STM32 RTC中断处理和低功耗模式优化技巧

在基于STM32的RTC应用中,中断处理和低功耗模式优化是非常重要的,可以提高系统的效率和节能。下面,我将介绍STM32 RTC中断处理和低功耗模式优化的技巧。 ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进 ❤欢迎关…

【蓝桥杯冲冲冲】进阶搜索 Anya and Cubes

蓝桥杯备赛 | 洛谷做题打卡day22 文章目录 蓝桥杯备赛 | 洛谷做题打卡day22Anya and Cubes题面翻译输入格式输出题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示题解代码我的一些话 Anya and Cubes …

yolov8训练自己的关键点检测模型

参考: https://blog.csdn.net/weixin_38807927/article/details/135036450 标注数据集 安装labelme pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple如果报错 $ labelme 2024-01-31 03:16:20,636 [INFO ] __init__:get_config:67- Loading …

Roxlabs全球IP代理服务:解锁高效数据采集与网络应用新境界

引言 在这个数字化迅速发展的时代,数据采集和网络应用的重要性显得愈发突出。江苏阿克索网络科技有限公司旗下的Roxlabs,以其卓越的全球IP代理服务,正引领着这一领域的创新和发展。Roxlabs不仅提供遍及200多个国家和地区的高质量动态住宅IP资…

第26讲:顺序表的应用(通讯录)

好&#xff0c;现在我们来做通讯录 上代码 文件1&#xff1a;SeqList.h #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h> typedef struct SLcdatatype {char name[10];int age;ch…

过去AIGC赋能教育有了哪些成果?未来教育又会出现哪些新趋势?

随着科技的飞速发展&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术已经在教育领域取得了显著的成果&#xff0c;AIGC技术正在以前所未有的速度推动教育领域的变革。 然而&#xff0c;这只是开始&#xff0c;未来AIGC技术将继续深入教育领域&#xff0c;带来更…

AI工具POE两个月付费体验

2023年12月1号,在半年前付费100美金购买了GitHub Copilot之后,我又付费200美金购买了一年的POE。 下一次续费的日期是今年的12月2日。 我是被洗脑了吗?为啥不断的掏钱买AI服务呢? 今天来说说,我都用poe来做了什么?有什么感受和收获。 依旧是这个流程,我会按照以下的问…

PCB设计10条重要布线原则(学习笔记)

文章目录 一、连线精简二、避免走直角线三、差分走线四、蛇形走线五、圆滑走线六、数字与模拟分开七、3W原则八、20H原则九、铜箔承载电流十、过孔承载电流 一、连线精简 尽量用最短的路径去布线 1、可以省资源 2、信号差损少 3、线能不拐弯就不拐弯 4、能不换层就不换层 二…

Java项目:基于SSM框架实现的家纺用品销售管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm814基于SSM框架实现的家纺用品销售管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试…

农业植保无人机行业研究:预计2025年市场规模可达115亿元

农业植保无人机行业市场投资前景现状如何?农业植保无人机市场&#xff0c;包括无人机自身技术、性能标准和植保标准。农业植保无人机应用植保机喷洒农药对我国而言&#xff0c;不仅具有很大的经济价值&#xff0c;还具有社会价值&#xff1a;农业植保机作业不仅有超高的工作效…

Python中的递归函数是什么

Python 递归函数 递归的特性&#xff1a; 1.调用自身函数 2.有一个结束条件 3.递归效率不高&#xff0c;可能会导致栈溢出(函数调用是通过栈这种数据结构实现的&#xff0c;每进入一个函数调用&#xff0c;栈就会增加一层栈帧&#xff0c;函数每返回&#xff0c;栈就会减少…

单例模式有几种写法?请谈谈你的理解?

为什么有单例模式&#xff1f; 单例模式&#xff08;Singleton&#xff09;&#xff0c;也叫单子模式&#xff0c;是一种常用的软件设计模式。在应用这个模式时&#xff0c;单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象&#xff0c;这样有利…