SORACOM LTE-M Button Plusに外付けでArduinoを繋いでリレーを動かしてボタン入力をするのを試してみた。(前回の話の続きだ)
Arduino Leonardoというちょっと安いArduinoマイコンボードとリレーシールドという拡張基板を組み合わせて使う。
傾斜スイッチは、ArduinoのGPIOのD0に接続した。もう片側はGNDに接続。
(傾斜スイッチは新聞受けやポストのフタ部分に取り付けて、郵便物などの到着を遠隔で調べるのに使う)
リレーボードのリレー1~リレー4は、ArduinoのD4~D7に繋がっている。
まず、単純にGPIOで傾斜スイッチが入ると、それに連動してリレーがOnになるという簡単な制御ソフトを作った。リレー1を制御している。
そして、それを拡張して、傾斜スイッチが長押しされたり押されたままになった場合に、1回だけ2秒の長押しの分だけLTE-M Buttonを繋いだリレーをOnにするというHold時の処理を追加した。あと、Hold時の処理とうまく連携するように単発の傾斜スイッチが入った場合の処理も追加した。こちらはリレー4を制御している。
リレー4の接点にSORACOM LTE-M Button Plusの電線を接続する。
Arduinoで書いてみたコードは次のようになっている。
void setup() {
// put your setup code here, to run once:
// relay board gpio pin mode init
pinMode(4, OUTPUT); // relay 4 = pin 4
pinMode(5, OUTPUT); // relay 3 = pin 5
pinMode(6, OUTPUT); // relay 2 = pin 6
pinMode(7, OUTPUT); // relay 1 = pin 7
pinMode(0, INPUT);
digitalWrite(0, HIGH); // pull-up
}
void loop() {
// put your main code here, to run repeatedly:
int sw,st;
static int prev_st = -1;
static int hold_count = 0;
static int single_count = 0;
static int hold_flag = 0;
// check switch (on or off?)
sw = digitalRead(0);
if (sw) {
// Tilt Switch == OFF
digitalWrite(7, LOW); // turn off relay
st=0;
} else {
// Tilt Switch == ON
digitalWrite(7, HIGH); // turn on relay
st=1;
}
// detecct switch hold
if (st==0) {
hold_count=0;
} else if (st==1) {
hold_count++;
if (hold_count==20) {
digitalWrite(4, HIGH); // turn on relay
delay(2000);
digitalWrite(4, LOW); // turn onf relay
hold_flag=1;
}
if (hold_count>100) { hold_count=100; hold_flag=2; }
}
// detect switch single on
if ((st==0)&&(prev_st==1)) { single_count=0; }
if (st==0) {
single_count++;
if (single_count==5) {
if ((hold_flag==0)||(hold_flag==2)) {
digitalWrite(4, HIGH); // turn on relay
delay(100);
digitalWrite(4, LOW); // turn onf relay
} else {
hold_flag=0;
}
}
if (single_count>100) { single_count=100; }
}
// previous state
prev_st=st;
delay(100);
}
(上記のプログラムの51行目の &&が文字化けしてしまっているみたいだ、シンタックスハイライト用のWordPressプラグインの不具合っぽい。編集元のデータは合っているので、プラグインのアップデートで表示がそのうち直ると思われる。)
テストしてみたところ、うまく動いているようだ。
応用としては、Arduinoのアナログ入力にセンサーを繋いでAD変換でセンサーの値をチェックして、しきい値を越えたらリレーをOnにしてSORACOM LTE-M Button Plusで通知を発生させるというのが考えられる。
—
追記
テストを終えて、本番で離れた場所に設置してみた。
Arduinoにリレー基板を付けてLTE-M Buttonの制御を途中で受けて余計なOn/Offを減らそうとしたのだけど、うまくいっていない。
傾斜スイッチの取り付けが不安定だったみたいでスイッチが不規則にOnになるため、リレーが誤作動してしまっている。水平からはずれて傾斜スイッチがぎりぎりOnになる角度になってしまっているみたいで、おそらく風とかの微妙な振動を受けて反応してしまっていると思われる。
ただし、スイッチ押しっぱなし除外は成功しているので、LTE-M Buttonが通信をし続ける状態は回避できている。
目的である郵便物などの到着の検出は、この状態だと風とかに反応したのか郵便物なのは判別できない。
またあとで設置した場所に出掛けて傾斜スイッチの角度を調整しなおしてこなければならない。