📐
傾斜センサの使い方
80度ぐらいから傾きを検出する
特徴
- 傾きの精度は低い、というか2択
- 垂直から反転の間かどうかの2つの状態が取れる
- 振動の有無にも適していそう
部品
配線
- GND ← センサ ← A0
- 5V → センサ → A0 ではないので注意
- A0 は INPUT なのにプラス側? (このへんよくわかっていない)
- デジタルの場合は A0 のかわりに D2 に繋ぐ
- 足の向きはどちらでもよい
- 抵抗不要
コード
デジタル入力の場合
void setup() {
pinMode(2, INPUT); // ← 本当は INPUT_PULLUP とするのが正しい
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, digitalRead(2));
delay(1000 / 60);
}
アナログ入力の場合
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
int value = analogRead(A0);
Serial.println(value);
digitalWrite(LED_BUILTIN, value);
delay(1000 / 60);
}
取れる値の違い
デジタル・アナログで様子が異なる。
入力 | 水平状態 | 垂直以降 |
---|---|---|
デジタル | 0 |
|
アナログ | 0〜1 | 160 〜 785 |
- デジタル
- 水平状態は安定している
しかし傾けるとチャタリングのため不安定
- アナログ
- 角度と値は比例しない ← 重要
- 90度も180度も 160 〜 785 内のランダム値が返ってきている
- なので正確に判定するには閾値で判断するのがよさそう
- ただ二択なのでアナログ入力にする意味がない
デジタル入力でチャタリングを起こさない方法 (重要)
勘違いしていた。デジタル入力が不安定になるのはチャタリングではなく浮いているため。なので2番ピンを次のように設定すると直る。
pinMode(2, INPUT);
digitalWrite(2, HIGH);
ドキュメントによると
指定したピンがINPUTに設定されている場合は、HIGHを出力すると20KΩの内部プルアップ抵抗が有効になり、LOWで無効になります。通常は pinMode()で INPUT_PULLUPを指定してください。
とあるのでまとめて書ける。
pinMode(2, INPUT_PULLUP);
Discussion