4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

IoTLTAdvent Calendar 2019

Day 17

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

Last updated at Posted at 2021-01-25

この記事はIoTLT Advent Calendar 2019の17日目です。昨日は@MuraMasa2764さんの[積みキット発掘]Seeedっぽい開発キット FaBo を使ってみたでした。


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

なに作ってるの?

こんなの。

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

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

image.png

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

構成要素

image.png

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

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

コード

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

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

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で本記事の内容について発表する予定です。現状ソフトウェア側は手軽にAmbientを使ったグラフ化までしかしていませんが、もう少し作り込んで面白くしていきたいと思います。


明日は@hrs_sano645さんの超音波センサーで見守りシステムを作ってみるです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?