Edited at

Wio LTE君とSORACOM Beamで「だっしゅぼたん」を作る

More than 1 year has passed since last update.


作ったもの

これだよ

IMG_0181.JPG

このエントリーでは、このボタンを作るにあたって解説します。SORACOM Beam とか ifttt については解説しません(!?)


構成図

SORACOM Beam と ifttt と MicroBot Push を組み合わせて、ガレージの「開」ボタンを押す、壮大な仕組みを実現しています

Handmade Dash Button

興味のある方はコメントください。


ハードウェア編

プラボックスの中身はこんな感じです。

IMG_0183.JPG

※2/13: コメントにもいただきましたが、このままだとWio LTEとGrove端子台が触れ合ってしまうかもしれませんので、Grove端子台を固定するなりビニール袋等で絶縁するようにしましょう


買ったもののまとめ

計 3380円 (Wio LTE本体は含まれてないよ)

あと10KΩ抵抗とかは一般のご家庭にもあるかと思いますので、そちらをお使いください。


プラボックス

日東工業 / PCS形プラボックス Φ30穴加工タイプ (約1200円) を使いました。

その他「コントロールボックス」や「コマンドボックス」というキーワードで探せば見つかるでしょう

注意: 材質はプラスチックなモノを選びましょう。金属製なボックスでアンテナを中に格納してしまうと、電波が(すごく)弱くなります。


プラボックスへの Wio LTE 取り付けTIPS

Wio LTE のネジ穴サイズはM3です。通常はプラボックスに穴をあけるなどしてM3の受けを作る必要がありましたが、貼りつけタイプのボスがあるんですね、便利です。

タカチ電機工業 / T-600型貼り付けボス (約650円)

Mbed Cloudの話とWio LTEの話で紹介されてた。

IMG_0221.JPG

こんな感じで取り付けることができます。あとは裏面に粘着面があるので、それでプラボックスに貼りつければOK!

IMG_0222.JPG

ちなみにWio LTEのネジ穴周辺にも実装がされているため、金属製のネジだとショートしたりするかも。ということで、ポリカーボネートなネジを使うのがいいかもしれません。

※ただし締めすぎると実装が剥げてしまうかもしれないので注意!!

エスコ / M 3 x10mm 鍋頭小ねじ(ポリカーボネート/50本) (約400円)


押しボタンスイッチと回路

押しボタンスイッチはA接点で、直径30mmの穴にピッタリとハマり、しかも乱暴に扱っても壊れない感があるのが IDEC(和泉電気) / Φ30 押ボタンスイッチ(大形) (約770円) です。

※ちなみに直径30mmのほか、22mmってのが規格であるみたい。そっちの方が小さく済むかも。

使い方はタクトスイッチと全く同じです。同じなので、プルアップ抵抗も必要になります。(Wio LTE は Arduino のように内部にプルアップ抵抗の仕組みがありません)

10KΩの抵抗を、ブレッドボードなど使わず直接接続しています。

接続先はWio LTEに直接ではなく Grove Screw Terminal (端子台モジュール) に接続しました

IMG_0219.JPG

IMG_0220.JPG


ファームウェア編

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;
}
}


あとがき

壮大なピタゴラスイッチ。

電源をなんとかしたい!