作ったもの
これだよ
このエントリーでは、このボタンを作るにあたって解説します。SORACOM Beam とか ifttt については解説しません(!?)
構成図
SORACOM Beam と ifttt と MicroBot Push を組み合わせて、ガレージの「開」ボタンを押す、壮大な仕組みを実現しています
興味のある方はコメントください。
ハードウェア編
プラボックスの中身はこんな感じです。
※2/13: コメントにもいただきましたが、このままだとWio LTEとGrove端子台が触れ合ってしまうかもしれませんので、Grove端子台を固定するなりビニール袋等で絶縁するようにしましょう
買ったもののまとめ
- 日東工業 / PCS形プラボックス Φ30穴加工タイプ (約1200円)
- タカチ電機工業 / T-600型貼り付けボス (約650円)
- エスコ / M 3 x10mm 鍋頭小ねじ(ポリカーボネート/50本) (約400円)
- IDEC(和泉電気) / Φ30 押ボタンスイッチ(大形) (約770円)
- Grove Screw Terminal (端子台モジュール) (約360円)
計 3380円 (Wio LTE本体は含まれてないよ)
あと10KΩ抵抗とかは一般のご家庭にもあるかと思いますので、そちらをお使いください。
プラボックス
日東工業 / PCS形プラボックス Φ30穴加工タイプ (約1200円) を使いました。
その他「コントロールボックス」や「コマンドボックス」というキーワードで探せば見つかるでしょう
注意: 材質はプラスチックなモノを選びましょう。金属製なボックスでアンテナを中に格納してしまうと、電波が(すごく)弱くなります。
プラボックスへの Wio LTE 取り付けTIPS
Wio LTE のネジ穴サイズはM3です。通常はプラボックスに穴をあけるなどしてM3の受けを作る必要がありましたが、貼りつけタイプのボスがあるんですね、便利です。
タカチ電機工業 / T-600型貼り付けボス (約650円)
※Mbed Cloudの話とWio LTEの話で紹介されてた。
こんな感じで取り付けることができます。あとは裏面に粘着面があるので、それでプラボックスに貼りつければOK!
ちなみにWio LTEのネジ穴周辺にも実装がされているため、金属製のネジだとショートしたりするかも。ということで、ポリカーボネートなネジを使うのがいいかもしれません。
※ただし締めすぎると実装が剥げてしまうかもしれないので注意!!
エスコ / M 3 x10mm 鍋頭小ねじ(ポリカーボネート/50本) (約400円)
押しボタンスイッチと回路
押しボタンスイッチはA接点で、直径30mmの穴にピッタリとハマり、しかも乱暴に扱っても壊れない感があるのが IDEC(和泉電気) / Φ30 押ボタンスイッチ(大形) (約770円) です。
※ちなみに直径30mmのほか、22mmってのが規格であるみたい。そっちの方が小さく済むかも。
使い方はタクトスイッチと全く同じです。同じなので、プルアップ抵抗も必要になります。(Wio LTE は Arduino のように内部にプルアップ抵抗の仕組みがありません)
10KΩの抵抗を、ブレッドボードなど使わず直接接続しています。
接続先はWio LTEに直接ではなく Grove Screw Terminal (端子台モジュール) に接続しました
ファームウェア編
attachInterrupt()
を使ってボタンが押された時のピン状態変化に応じて change_state()
でステートを変化させ、loop()
内でそのステートに応じた処理を行うようにしています
-
change_state()
内のdelayはチャタリング回避です (雑実装) -
send_to_soracom()
内では毎度 "モデムON → 接続 → 送信 → 切断 → モデムOFF" をしています。消費電力削減と再接続実装の回避です (雑実装)- 送信が完了するまで15~20秒/回かかります
- 送信時の最大消費電力は300mA程度、それ以外の通常時は15mA~20mA程度です
:WioLTE_dashbutton.ino
#include <WioLTEforArduino.h>
#include <stdio.h>
#define BUTTON_PIN (WIOLTE_D38)
WioLTE Wio;
volatile bool StateChanged = false;
volatile bool State = false;
void change_state()
{
State = !State;
StateChanged = true;
delay(150);
}
void send_to_soracom()
{
Wio.PowerSupplyLTE(true);
delay(500);
if (!Wio.TurnOnOrReset()) { SerialUSB.println("TurnOnOrReset Error"); return; }
if (!Wio.Activate("soracom.io", "sora", "sora")) { SerialUSB.println("Activate Error"); return; }
int connectId;
connectId = Wio.SocketOpen("beam.soracom.io", 23080, WIOLTE_UDP);
if (connectId < 0) { SerialUSB.println("SocketOpen Error"); return; }
char data[100];
sprintf(data, "{\"uptime\":%lu}", millis() / 1000);
if (!Wio.SocketSend(connectId, data)) { SerialUSB.println("SocketSend Error"); return; }
char res[128];
int len;
len = Wio.SocketReceive(connectId, res, sizeof (res), 3000);
if (len < 0) { SerialUSB.println("Error len < 0"); return; }
if (len == 0) { SerialUSB.println("Error len == 0"); return; }
if (!Wio.SocketClose(connectId)) { SerialUSB.println("SocketClose Error"); return; }
if (!Wio.Deactivate()) { SerialUSB.println("Deactivate Error"); return; }
Wio.PowerSupplyLTE(false);
}
void setup()
{
Wio.Init();
pinMode(BUTTON_PIN, INPUT);
attachInterrupt(BUTTON_PIN, change_state, CHANGE);
}
void loop()
{
if (StateChanged) {
if (State) {
send_to_soracom();
}
StateChanged = false;
}
}
あとがき
壮大なピタゴラスイッチ。
電源をなんとかしたい!