tag 标签: 振动感知

相关博文
  • 热度 12
    2022-8-23 09:22
    1573 次阅读|
    0 个评论
    通常,振动传感器基于机械或光学原理检测振动,可用来测量、显示和分析线速度、位移和加速度。虽然人类对振动的感知能力非常弱,传感器却能提供这种振动的状态数据。这就为设备维护提供了关键数据,在设备损坏之前及时进行维修和保养。由于某些失效成本高昂且耗时,用振动传感器检测和锁定缺陷,是实现降本增效的一种好方法。 振动传感器产生的弱小的模拟电压,可通过Arduino的模拟输入引脚转换为数字输出。本项目通过三种不同的程序实现振动检测: 示例一先检测振动,再通过Serial monitor显示振动值; 示例二包含了简单的模拟引脚读数技巧,以及Pulse-in技术; 示例三是控制3个不同的LED,如果某个LED引脚的振动值超过预定义的振动值,这个LED就点亮。 项目BOM如下: 12v适配器 x1 Arduino Uno x1 Arduino Nano x1 51-000923振动传感器 x1 SW-420振动传感器 x1 交通LED模块 x1 面板板 x1 杜邦线 若干 其中,AAC 51-000923振动传感器由长方形压电陶瓷板制成,能够将收集的振动转换为电压输出;或者,将施加其上的电压信号转换为振动,即加上电压就振动。AAC 51-000923长度43mm,带有红、黑两根引线和连接器。创作项目一般使用Arduino,如果不需要连接器可将其剪掉,仅仅通过两根引线连接Arduino和其他MCU板子。 将振动传感器的黑线连接到Arduino的引脚GND,红线连接到Pin A0,接线就完成了。 下面,我们先看示例代码1: int vib_sensor = A0; int vib_data = 0; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(vib_sensor, INPUT); } void loop() { // put your main code here, to run repeatedly: vib_data = analogRead(vib_sensor); Serial.println(vib_data); delay(100); } int vib_sensor = A0; int vib_data = 0; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(vib_sensor, INPUT); } void loop() { // put your main code here, to run repeatedly: vib_data = analogRead(vib_sensor); Serial.println(vib_data); delay(100); } 其中,int vib_sensor = A0; 表示振动传感器连接在Arduino的模拟引脚A0上。void setup() 函数激活串口,数据率为 9600。void loop() 函数读、存传感器数据,并通过Serial monitor进行显示。 我们将Arduino连接到笔记本电脑,上传以上代码,上传完成后打开Serial Monitor,确定数据率为9600。尝试拍打振动传感器,可看到Serial Monitor的读数在变化。 接下来,我们看看示例代码2: int vs = A0; // vibration sensor void setup(){ pinMode(led, OUTPUT); pinMode(vs, INPUT); Serial.begin(9600); } void loop(){ long measurement =vibration(); delay(50); Serial.println(measurement); 50){ digitalWrite(led, HIGH); } else{ digitalWrite(led, LOW); } } long vibration(){ long measurement=pulseIn (vs, HIGH); //wait for the pin to get HIGH and returns measurement return measurement; } 这里同样使用pin A0,pulseIn()函数用来测量振动期间输入信号的高、低,如果检测到相关震动就点亮LED。 上传代码后打开Serial monitor,确定数据率为9600。拍打传感器,Serial Monitor读数开始变化,停止后就归零。不过,这个示例只能检测中、强级别的振动。 最后,我们看看示例代码3: 示例3可以检测出振动强度,绿、黄、红三色LED分别指示振动的程度为低、中、强。这三个LED的工作电压为5v,无需限流电阻。具体连接如下: _ Traffic LED模块的GND引脚连接到Arduinoui引脚; _ 红色LED连接到Arduino板子的13引脚; _ 黄色LED连接到Arduino板子的12引脚; _ 绿色LED连接到Arduino板子的11引脚。 int yellow_led = 12; int green_led = 11; int vs = A0; // vibration sensor void setup(){ pinMode(red_led, OUTPUT); pinMode(yellow_led, OUTPUT); pinMode(green_led, OUTPUT); digitalWrite(red_led, LOW); digitalWrite(yellow_led, LOW); digitalWrite(green_led, LOW); pinMode(vs, INPUT); Serial.begin(9600); } void loop(){ long measurement =vibration(); delay(50); Serial.println(measurement); 50)&&(measurement < 1000)){ digitalWrite(green_led, HIGH); digitalWrite(red_led, LOW); digitalWrite(yellow_led, LOW); delay(100); } 1000)&&(measurement < 4000)){ digitalWrite(green_led, LOW); digitalWrite(yellow_led, HIGH); digitalWrite(red_led, LOW); delay(100); } 4000){ digitalWrite(red_led, HIGH); digitalWrite(green_led, LOW); digitalWrite(yellow_led, LOW); } else{ digitalWrite(red_led, LOW); digitalWrite(yellow_led, LOW); digitalWrite(green_led, LOW); } } long vibration(){ long measurement=pulseIn (vs, HIGH); //wait for the pin to get HIGH and returns measurement return measurement; } 这是示例2的升级版,void loop() 函数定义了三个LED的及其点亮的振动值。