37 Sensors Kit - 002 震動開關
這個感測器是用來偵測是否有震動,可以用來偵測超自然震動(?)
它的基本原理是裡面有金屬彈簧與一個電阻,如果遇到震動就會形成導通電路,導致訊號變化。
電路
現在市面上有兩種不同的內部電路設計,差別在於 10K 電阻的接法不同:
目前手上的模組是 (A) 接法的,1 代表 S (Signal),2 代表 VCC,而 3 代表 GND。
我覺得這樣的設計不太合理,因為沒有震動時候會造成訊號開路, 對於數位邏輯來說是 undefined。 所以為了得到合理的結果,我必須修改一下接法,讓訊號都是 defined:
這個手法叫做 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
因為電路設計問題,所以我必須照著自己的方法去接:
- SIGNAL (S) 接到 Arduino 的 GND pin
- VCC (中間) 接上 Arduino 的 5V pin
- 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 偶爾不太靈敏…