David Lin

David Lin

一個軟體工程師的隨意筆記

30 May 2021

37 Sensors Kit - 002 震動開關

這個感測器是用來偵測是否有震動,可以用來偵測超自然震動(?)

shock sensor

它的基本原理是裡面有金屬彈簧與一個電阻,如果遇到震動就會形成導通電路,導致訊號變化。

電路

現在市面上有兩種不同的內部電路設計,差別在於 10K 電阻的接法不同:

circuits

目前手上的模組是 (A) 接法的,1 代表 S (Signal),2 代表 VCC,而 3 代表 GND。

我覺得這樣的設計不太合理,因為沒有震動時候會造成訊號開路, 對於數位邏輯來說是 undefined。 所以為了得到合理的結果,我必須修改一下接法,讓訊號都是 defined:

connect

這個手法叫做 pull up resistor,常常用在數位電路上的開關電路(switch or gates),用來確保訊號是 defined。如果 switch 是開路狀態,VCC 到 signal pin 的電流會趨近於 0,因為 signal input 端是高阻抗 (high impedance),所以電位是 high state。 當震動時候 switch 會形成閉路,導致 VCC 會透過 pull up resistor 流向 GND,從而讓 signal pin 的電位趨近於 GND,形成 low state。

連接 Arduino

因為電路設計問題,所以我必須照著自己的方法去接:

  1. SIGNAL (S) 接到 Arduino 的 GND pin
  2. VCC (中間) 接上 Arduino 的 5V pin
  3. GND (-) 接到 Arduino 的 D3 pin

範例程式

因為原本教材提供的範例程式碼中 LED 只有依照訊號的瞬間開滅,所以看不太出來結果。 所以我把程式碼改成如下,讓 LED 可以維持閃爍一陣子去凸顯偵測結果。

#define SIGNAL_PIN 3

void setup ()
{
    pinMode(LED_BUILTIN, OUTPUT);
    pinMode(SIGNAL_PIN, INPUT);
}

void loop ()
{
    // 讀取震動開關的狀態
    int value = digitalRead(SIGNAL_PIN);

    // 如果有偵測到震動,就讓 LED 閃爍
    // 因為使用 pull up resistor 接法,所以 state 是反轉的
    if (value == LOW) {
        for (int i = 0; i < 5; ++i) {
            digitalWrite(LED_BUILTIN, HIGH);
            delay(200);
            digitalWrite(LED_BUILTIN, LOW);
            delay(200);
        }
    }
}

執行結果

靜止不動時候 LED 不亮,一旦震動就會讓 LED 持續閃爍幾秒。 老實說這個 sensor 偶爾不太靈敏…

References

comments powered by Disqus