2016年10月23日 星期日

震動感測模塊 SW-18010P

一般市面上常見用來偵測震動的感測裝置大概有下列幾種:

1. 滾珠元件
2. 彈簧震動元件
3. Piezo
4. 加速度計

在這兒我們只針對彈簧震動感測模塊來做介紹。


 模塊採用一只 SW-18010P 彈簧震動元件,SW 表它是一個開關,在輸出腳位只輸出 0 或 1;18010 表外觀尺寸;P 表密封式封裝。詳細規格表如下:


如果剝除外包裝,就可以看到裡面有一個捲了非常多圈的細銅絲圍繞著主軸,



當它被晃動時細銅絲會接觸到主軸形成短路,這個信號經過 LM393 比較器處理之後,在 D0 腳位會輸出 LOW,此時指示燈會亮起。當然,在沒有震動時指示燈是熄滅的,在 D0 腳位會輸出 HIGH。

模塊板子上面有一個半固定可變電組,可以用來調節感測的靈敏度,逆時針旋轉時靈敏度會降低,順時針旋轉時靈敏度會升高。

這個模塊 A0 腳位是沒有作用的。


下面是模塊的電路圖



電路接線

Arduino    KY-002
5V             VCC
GND         GND
(詳程式)   D0


程式碼

這是一個最簡單的程式碼,只要有震動信號就會在序列視窗印出 "Shock Alarm"。
//sketch01.ino
int shockPin = 12;
int shockVal;

void setup ()
{
  Serial.begin(9600);
  pinMode (shockPin, INPUT);
}

void loop ()
{
  shockVal = digitalRead (shockPin);
  if (shockVal == LOW) Serial.println("Shock Alarm");
}

第 2 個程式碼我們要用外部中斷來接收震動信號,由於我們是用到第 0 個外部中斷,因此震動模塊的 D0 腳位要接到 Arduino 的 D2 腳位。

如果有震動信號 Arduino 板子 D13 腳位上面的 LED 就會亮 0.5 秒,然後熄滅。

#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++;
}

上面兩個程式雖然可以隨時接收到震動信號,但如果不是要量測震動頻率,那麼在極短時間之內有太多的信號對我們來說是沒有助益的,例如 1 秒內接收到數十甚至數百次的信號。

針對上述問題改良,以下是第 3 個程式,在 0.25 秒內即使有多次震動信號,也只視為一次震動。

您可以嘗試變更 shockAlarmTime 的值,看看效果如何。

int shockPin = 12; // Use Pin 12 as our Input
int shockVal = HIGH; // This is where we record our shock measurement
boolean bAlarm = false;
unsigned long lastShockTime; // Record the time that we measured a shock
int shockAlarmTime = 250; // Number of milli seconds to keep the shock alarm high

void setup ()
{
  Serial.begin(9600); 
  pinMode (shockPin, INPUT) ; // input from the KY-002
}
void loop ()
{
  shockVal = digitalRead (shockPin) ; // read the value from our sensor 
  if (shockVal == LOW) // If we're in an alarm state
  {
    lastShockTime = millis(); // record the time of the shock
    // The following is so you don't scroll on the output screen
    if (!bAlarm){
      Serial.println("Shock Alarm");
      bAlarm = true;
    }
  }
  else
  {
    if( (millis()-lastShockTime) > shockAlarmTime  &&  bAlarm){
      Serial.println("no alarm");
      bAlarm = false;
    }
  }
}

結論

如果模塊在靜止狀態下持續有震動信號輸出,也就是指示燈持續亮著,此時要適度地調整半固定式可變電阻,將它慢慢往逆時針方向旋轉,一直到指示燈熄滅為止。然後再稍微晃動模塊,觀察是否有震動信號輸出,如果有表示 OK。

SW-18010P 元件在感測震動時沒有方向性,因此您可以將它隨便擺置。但根據個人經驗,還是建議您將此元件豎起來垂直地面,因為 SW-18010P 元件在製造時品質如果不是非常精良,或是裡面捲曲的細銅絲時間久了之後會因為重力下垂與主軸接觸而誤傳錯誤信號。

這個模塊雖然價格低廉,但它操作簡單易於使用,而且靈敏度也不錯,是個不錯的模塊。


相關連結

LM393 Datasheet http://www.onsemi.cn/pub_link/Collateral/LM393-D.PDF


採購資訊

震動傳感器模塊 http://goods.ruten.com.tw/item/show?21642006573589


沒有留言:

張貼留言