電動健康器具の無改造スマート化プラグを試作してみた

この記事は[IoTLT Advent Calendar 2019](https://qiita.com/advent-calendar/2019/iotlt)の17日目です。昨日は@MuraMasa2764さんの[[積みキット発掘]Seeedっぽい開発キット FaBo を使ってみた](https://qiita.com/MuraMasa2764/items/0cd78061e80fe989226b)でした。

---

遡ること10月21日に開催された[LOVE × IoTLT ~sponsored by TENGA~](https://iotlt.connpass.com/event/147185/)というイベントに向けて制作していた電動健康器具のスマート化プラグの話です。ちなみにイベントには制作が間に合わずvol.2の開催を待ち望んでいます。

## なに作ってるの？

こんなの。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">電動健康器具のスマート化プラグの試作品を開発した。無改造で取り付けられて強弱信号をクラウド上に記録することができます。 <a href="https://t.co/1PATlGAiZZ">pic.twitter.com/1PATlGAiZZ</a></p>&mdash; 写真屋？＠技術書典8落選orz (@moomooya) <a href="https://twitter.com/moomooya/status/1206972569921843200?ref_src=twsrc%5Etfw">December 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

某電動健康器具を曲げセンサーで強弱調整可能にして、強弱信号をWeb上に送信・記録するスマート化プラグです。
最終的には曲げセンサーを手袋の指の部分に仕込むようなイメージ。

Web上では強弱情報がこのように記録されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31037/d42ff7ed-328b-1700-40d8-3353245cb48a.png)

後半に盛り上がっていく感じです。

## 構成要素

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31037/ae8fda1c-d080-f209-7d40-4acd38ac4510.png)

曲げセンサーからの曲がり具合情報をESP32でAD変換して、適当に正規化し、SSRを使ってAC電流をPWM制御しています。またPWM制御用の信号を強弱信号としてWiFi経由でグラフ化サービスの[Ambient](https://ambidata.io/)に送信してグラフ化しています。

Ambientは初めて使いましたがプロトタイピング用途には使いやすいですね。データ記録周期が4〜5秒くらいなので今回みたいな用途だとちょっと物足りないですが悪くないと思いました。

## コード

型の使い方の法則性がぐちゃぐちゃですが、試行錯誤しながら作ったということでお目こぼしください。気が向いたら直します。

コード中にも記述していますが、ADC18ピンはWiFiと共存できないようでハマりました。WiFi接続処理を実装したら突然センサー入力がHighで固定されるとかあせりました……。

```cpp:massager_smartize.ino
// 電動健康器具の無改造スマート化プラグ

#include <WiFi.h>
#include "Ambient.h"

#define ALED A14
#define ABEND A6  // ADC18使ってたらWiFiと共存できなくてハマった
#define FILTER 0.8

const char* ssid = "・・・ssid・・・";
const char* password = "・・・パスワード・・・";

unsigned int channelId = 100;
const char* writeKey = "Ambientライトキー";

WiFiClient client;
Ambient ambient;

uint8_t sensorValue = 0;
double bendingValue = 0;

void setup() {
  Serial.begin(115200);

  // PWM準備
  double pulse = ledcSetup(0, 30, 8);
  ledcAttachPin(ALED, 0);

  // WiFi接続処理
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
  }
  Serial.println("WiFi connected.");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // Ambient接続処理
  ambient.begin(channelId, writeKey, &client);
}

void loop() {

  // 曲がり具合を取得
  sensorValue = analogRead(ABEND);
  // 変化を均すためにいい感じに処理してRCローパスフィルターを通す
  bendingValue = FILTER * bendingValue + (1 - FILTER) * map(constrain(log(sensorValue) * 30, 130, 170), 130, 170, 0, 255);

  // PWM制御
  ledcWrite(0, bendingValue);

  // Ambientに送信
  ambient.set(1, bendingValue);
  ambient.send();
  
  delay(100);
}
```

## 今後の予定

せっかく強弱信号を時系列順に取得できるようにしたので強弱信号のデータセットを再生出来るようにしたいと思っています。
そして他人の強弱信号データと受渡が出来るようになると面白いなぁ、と。

いろいろ伏せながらの記事ですが年明けに予定されている[IoTLT vol59 - モノづくりコミュニティ新年会 2020](https://iotlt.connpass.com/event/156736/)で本記事の内容について発表する予定です。現状ソフトウェア側は手軽にAmbientを使ったグラフ化までしかしていませんが、もう少し作り込んで面白くしていきたいと思います。

---

明日は@hrs_sano645さんの[超音波センサーで見守りシステムを作ってみる](https://hr-sano.net/blog/2019/12/18/ultrasonic-mimamori/)です。