つくるの大好き。

つくるのが大好きな人の記録。

うんこボタンとHoloLensを繋げてみた <前編>

うんこボタンとは

うんこボタン。なんというパワー感あふれるネーミング!
うんこボタンはこの度Makuakeでのクラウドファンディングに成功したインターネットボタンです。
赤ちゃんの排泄情報をボタンを押すだけで記録してくれるデバイス&サービス。
我が家もこの前まで排泄のたびに手帳に手書きで記録をしていて、地味ながら結構大変な作業でした。
でもあとで見返してみるととても良い思い出なんですよね。

www.makuake.com

そして今回ぼくは「ハッカーコース」を支援し、無事にキットが到着しました!
このキットにはうんこボタン自体の機能は入っていません。
でも普通にESP8266+物理2ボタンのデバイスとしてArduino IDEで自在にプログラミングを行うことができるのです!
なんでもつくれるのはワクワクしますね!

f:id:peugeot-106-s16:20180415094718j:plain f:id:peugeot-106-s16:20180415094756j:plain

今回作るもの

うんこボタンなので押すとうんこがでるものを作ってみます。
リアルに出ては大変なので、ホログラムのうんこをHoloLensから発射するのがゴールです。


Unko button feat HoloLens

うんちの3Dモデルはうんちマンさんから別プロジェクトでご提供いただいたものを使わせて頂いています。

www.unchiman.net

システム構成はこんな感じ。

f:id:peugeot-106-s16:20180415100423p:plain

  • Azure上に中継用のうんこサービスを構築する
  • うんこサービスにはうんこボタンからのリクエストを受け付けるRESTインターフェイス、HoloLensに通知を送るためのWebSocketインターフェイスを設ける
  • HoloLensはうんこサービスとWebSocketのコネクションを張る
  • うんこボタンはボタン押下時にうんこサービスのPOSTを呼び出す(PUTにするか悩んだ)
  • うんこサービスは接続中のすべてのWebSocketクライアントにdidUnko命令を通知する
  • HoloLensはうんこのホログラムを生成する

ソースコードはこちらに(HoloLens側は全Assetを公開できないため、WebSocketのクライアントスクリプトのみ)

github.com

うんこボタン側スケッチ

UnkoButton/unko_btn_trigger.ino at master · satoshi-maemoto/UnkoButton · GitHub

#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

// Wi-Fi接続パラメータ
const char* ssid = "xxxx";
const char* password = "xxxx";

const char* uri = "http://xxxx.azurewebsites.net/api/unkos";
    
// IOピン宣言
#define LEFT_BTN 14
#define RIGHT_BTN 12
#define ACTIVE 16
#define RBOOTED 13
#define LBOOTED 5
#define LEFT_RED_LED 15
#define RIGHT_RED_LED 4
#define LEFT_GREEN_LED 2
#define RIGHT_GREEN_LED 0

bool lBooted;
bool rBooted;
int batteryLevel;
HTTPClient http;
ESP8266WiFiMulti wifiMulti;
DynamicJsonBuffer jsonBuffer;

// 定形初期化処理(理解するまでは変更しないで)
void boot() {
  Serial.begin(74800);
  // pin setup
  pinMode(LBOOTED, INPUT_PULLUP);
  pinMode(RBOOTED, INPUT_PULLUP);
  pinMode(LEFT_RED_LED, OUTPUT);
  pinMode(RIGHT_RED_LED, OUTPUT);
  pinMode(LEFT_BTN, INPUT);
  pinMode(RIGHT_BTN, INPUT);

  // スリープから復帰するのに押されてたボタン状態を取得
  lBooted = digitalRead(LBOOTED) == LOW;
  rBooted = digitalRead(RBOOTED) == LOW;

  // アクティブモードへ移行
  digitalWrite(ACTIVE, LOW);
  pinMode(ACTIVE, OUTPUT);

  // ACTIVE==LOWのあとでしか緑LEDを使えない
  pinMode(LEFT_GREEN_LED, OUTPUT);
  pinMode(RIGHT_GREEN_LED, OUTPUT);

  // バッテリーレベル取得(アクティブモードでないとダメ)
  batteryLevel = analogRead(A0) * 3000 / 1024;  // [mV]

  // 電池が消耗していたり、通電のみだった場合はすぐにスリープする
  if (batteryLevel < 2300 || !lBooted && !rBooted) {
    ESP.deepSleep(0);
    delay(500);
  }
}

void setup() {
  boot();  // 必ずsetup関数の最初に実行

  if (lBooted) {
    digitalWrite(LEFT_GREEN_LED, HIGH);  // left green on
  }
  if (rBooted) {
    digitalWrite(RIGHT_GREEN_LED, HIGH);  // right green on
  }

  Serial.println();
  Serial.println("left: " + String(lBooted) + " right: " + String(rBooted));

  // Wi-Fi connect
  WiFi.mode(WIFI_STA);
  wifiMulti.addAP(ssid, password);
}

void loop() {
  if (wifiMulti.run() != WL_CONNECTED) {
    delay(500);
    return;
  }
  String message;
  if (lBooted && !rBooted) {
    message = "{ \"message\":\"うんこボタンの左を押した\" }";
  } else if (!lBooted && rBooted) {
    message = "{ \"message\":\"うんこボタンの右を押した\" }";
  } else if (lBooted && rBooted) {
    message = "{ \"message\":\"うんこボタンの両方を押した\" }";
  }
  if (message.length() == 0) {
    return;
  }

  Serial.println(uri);
  http.begin(uri);
  http.addHeader("Content-Type", "application/json");

  int code = http.POST(message);
  String content = http.getString();
  http.end();
  Serial.println(String(code));
  Serial.println(content);

  JsonObject& resp = jsonBuffer.parseObject(content);
  // タスクが終了したら必ずディープスリープすること。
  ESP.deepSleep(0);
  delay(500);
}
  • ボタンを押すとデバイスはスリープ復帰する
  • 押されたボタン側のLEDを点灯する
  • Wi-Fiへ接続する
  • うんこサービスへメッセージをPOSTする  一応どのボタンを押したかを通知している
  • POSTが終了したらデバイスはスリープする

ボタン押下ごとにWi-Fi接続し、スリープするシンプルな処理なので通知に時間がかかります。
一定時間スリープせずにWi-Fi接続を保持し、押下待ち受けするつくりにすれば応答性が上がりますが、今回はふんばる感があるのでこれでいいかなと思っています(笑)

うんこボタンへのデプロイ

ボードのピンの解説、PCとの接続について書かれているこちらをよく読んで進めれば問題なくできると思います。

https://unkobtn.com/news/press/article/5/

PCのUSBと接続するにはUSB->シリアル変換アダプタが必要なので用意しましょう。

www.switch-science.com

そして規定通りに結線します。
ファームの書き換えモードに入るにはJP2をショートさせ、電池の抜き差しをしてリセットすればOKです。 f:id:peugeot-106-s16:20180415103941j:plain f:id:peugeot-106-s16:20180415104631j:plain f:id:peugeot-106-s16:20180415104312j:plain

Arduino IDEWindowsストアから最新版をインストールしました。

www.microsoft.com

あとはボードに書き込むだけです。 f:id:peugeot-106-s16:20180415105126p:plain

前編まとめ

うんこボタンの紹介とうんこボタン側スケッチの用意についてお伝えしました。
次回、うんこサーバー側とHoloLens側の実装についてお伝えします。