2019年4月1日月曜日

M5StackとAmbientで子供の寝かしつけタイミングを可視化してみた

奥さんが子供を寝かしつけしているタイミングで帰宅しないようにするためにM5Stackと光センサー、Ambientを使ってIoTソリューション(寝かしつけタイミング帰宅回避システム、以下NTKS)っぽいことをしてみました。

NTKSの要件

    1. 自宅(奥さん側)から能動的なアクションは不要にしたい、寝かしつけを開始するときに毎回メールやLINEを送るのは面倒
      →何かしらのセンシングで寝かしつけの開始を自動判定したい
    2. もし子供が触ることがあっても危険でないこと
      →感電しにくい、怪我をしにくいこと
    3. 自分が開発しやすい環境であること
      →Mac OS、Arduino IDEの環境で開発できると嬉しい

    左から右へ、我が家の寝かしつけへ至る流れ

    NTKSを開発運用する上でどんなことを大事にするかリストアップしてみました。前作の光る帽子のときと違って、どこかで展示をするというものでもないので比較的条件は軽めです。とはいえ子供が触る可能性があるので基板むき出しはできるだけ避けたいところです。

    システム構成の検討

    続いてシステム構成を考えます。システムは大きく分けて自宅のセンシングをするためのシステムと、クラウド上での寝かしつけ状態を表示するためのシステムの2つに別れます。

    システム概要(という名のイメージ図)
    寝かしつけをしているかどうかの判別するためにどのような情報を送ればよいかについては、光センサーを部屋に置いてその計測データを分析すればわかるのではないかという仮設を立てました。これは我が家では寝かしつけの開始時に部屋を暗くして、寝かしつけが終われば部屋を明るくしている為です(正確には寝かしつけをしている隣の部屋に光センサーを置いています)。
    そして、光センサーの計測データを分析、表示するにはAmbientというサービスを利用することにしました。


    Ambientは各種センサーの計測データなどIoTデータをグラフィカルに表示してくれるサービスなのですが、Arduino、mbed、Raspberry Piなど様々なプラットフォームで利用できるライブラリやサンプルファイルを提供していて、もちろんM5Stackの開発環境(Arduino IDE)にも対応していることが大きな要因でした。

    下記URLを参考に、Ambientのアカウントとグラフを表示するためのチャネルを開設してライトキーを取得します。

    Ambientを使ってみる

    M5Stask Basic とデジタル光センサーの購入

    M5Stask Basic とデジタル光センサーの購入にはスイッチサイエンスさんを利用しました。下記URLから同じ製品を購入することができます。

    M5Stack Basic

    GROVE - I2C デジタル光センサー

    前作の光る帽子では9軸センサの値を使ってNeoPixelを制御していたのでM5Stack Grayを購入しましたが、今回はデジタル光センサーのみを利用するので、一番構成がシンプルで安価なM5Stack Basicを選びました。

    M5Staskを使ったデジタル光センサーの制御

    それではM5Stackを使って、デジタル光センサーの値を取得します。購入したデジタル光センサーはGROVEでの接続なので、デジタル光センサーに付属しているケーブルでデジタル光センサーとM5Stackを接続するのみでハードウェアの準備は完了です。
    次にソフトウェア側の設定をおこないます。

    Grove - Digital Light Sensor
    http://wiki.seeedstudio.com/Grove-Digital_Light_Sensor/

    上記URLを参考に、

    1. デジタル光センサーのライブラリファイルをダウンロードする
      https://github.com/Seeed-Studio/Grove_Digital_Light_Sensor/archive/master.zip
    2. ダウンロードしたファイルをArduino IDE に取り込む
      手順:Sketch > Include Library > Add .ZIP Library.
      を選択し、ダウンロードしたファイルを選択する
      http://wiki.seeedstudio.com/How_to_install_Arduino_Library/
    3. 下記手順でサンプルファイルを開く
      手順:File -> Example ->Digital_Light_Sensor->Digital_Light_Sensor.
      を選択する

    を実行します。
    サンプルファイルをコンパイルして実行すると、デジタル光センサーから読み取った値を確認することができます(サンプルファイルはArduino用なので、M5Stackのディスプレイ上には表示されません、Arduino IDEからシリアルモニタを起動して値を確認してください)。

    M5StaskからAmbientへのデータ送信

    次に取得したデジタル光センサーの値をAmbientへ送信します。

    M5StackでセンサーデーターをAmbientに送る (Arduino編)

    上記URLを参考に、

    1. Ambientのライブラリファイルをダウンロードする
      https://github.com/AmbientDataInc/Ambient_ESP8266_lib/archive/master.zip
    2. ダウンロードしたファイルをArduino IDE に取り込む
      手順:Sketch > Include Library > Add .ZIP Library.
      を選択し、ダウンロードしたファイルを選択する
    3. 下記手順でサンプルファイルを開く
      手順:File -> Example ->Ambient ESP8266 lib->Ambient_BME280.
      を選択する

    を実行します。
    そしてサンプルファイルをベースに、Wi-Fiの設定、Ambientの設定、デジタル光センサーの設定を追加します。

    Wi-Fiの設定(サンプルファイルの16-17行目)
    const char* ssid = "your ssid"; ←接続するアクセスポイント名を記載
    const char* password = "your password"; ←接続するアクセスポイントのパスワードを記載
    Ambientの設定(サンプルファイルの19-20行目)
    unsigned int channelId = 100; // Ambient上で開設したチャネルのIDを記載
    const char* writeKey = "writeKey"; // チャネルのライトキーを記載
    デジタル光センサーの設定として、サンプルファイルの最初に
    #include
    を追記、void setup()内に
    TSL2561.init();
    を追記、void loop()内に
    int light;
    light = TSL2561.readVisibleLux(); 
    ambient.set(1, String(light).c_str());
    ambient.send(); 
    を追記します。 BME280に関係する部分は利用しないので削除してください。
    これでサンプルファイルをベースにデジタル光センサーの値をAmbientへ送る準備が整いました。

    Ambientでのデータ確認

    実際にプログラムを実行して、一日計測をしてみた結果がこちらです。
    とある一日の照度データ
    こちらを見ると、18時すぎに帰宅して(点灯)、21時くらいから寝かしつけが始まって(消灯)、22時すぎに終わった(再度点灯)ことがわかります。照度データだけでこれだけわかってしまうのはちょっと怖い気もしますが、帰宅前にAmbientのグラフを確認することで寝かしつけ中に帰宅してしまう悲劇は回避できそうです。

    今後の予定

    無事寝かしつけ中の帰宅は回避できそうですが、毎回Ambientのグラフを見に行くのは面倒なので、寝かしつけの開始と終了を教えてくれるBotを作りたいと考えています。また、他のセンサーと組み合わせてより寝かしつけ 判定の精度を上げたいところです。

    2018年12月31日月曜日

    2018年に参加したイベントまとめ

    毎年恒例の2018年に参加したイベントのまとめ。(2017年版2016年版2015年版2014年版

    参加したハッカソン (6→5→2→0→0)
    今年もハッカソンには参加せず。土日を連続で使うならどこか遠くのイベントへ参加することの方が優先度が高くなりました。イベントに出て出展する作品を作る時間をそれほど取れているわけではないところが課題ですね。。

    参加したアイデアソン (15→14→3→1→1)
    ・09/12 WHILLモビリティアイデアソン

    アイデアソンも去年と同じく一つ、TMCN運営のアイデアソンというレアなイベントでした。短時間で自分が面白いネタを考えることができなくなっていたので頭を使う方もリハビリがいるなと思ったイベントでした。


    参加したコンペ (3→6→1→0→1)
    ・MA2018
     作品名:パーティーハット(光る帽子) by ajimitei labo
     作品名:寝かしつけ時に帰宅回避Bot by ajimitei labo

    去年はMAに何も出さなくて非常に消化不良だったので、できる限りの内容で勝負となりました。楽しかったからいいっちゃいいんだけど、開発系のスキル全般が落ちていることを認識したので各方面に応募や出展する機会を増やしてイベントドリブンに自分を追い込んでいきたいところ。

    参加した技術系イベント一覧 (22→48→38→2857)
    ・01/16 IoTLT新年会2018
    ・02/15-16 Developers Summit 2018
    ・02/20 MAT Talk「超ファッションテック進化論~ファッションテックはテロか救世主か~」 ・02/22 「中国のものづくりはホンモノなのか?」 ・02/26 Actions on Googleハンズオン
    ・03/02 「一般社団法人MA」生誕会(LT)
    ・03/05 なるほど!スマートスピーカー&スマートホームナイト
    ・03/07 CMC_Meetup Tokyo Vol.8: ファーストピンの見つけ方、育て方
    ・03/14 Voice UI Designer Meetup Tokyo
    ・03/22 『予定通り進まないプロジェクトの進め方』刊行記念勉強会
    ・03/25 NT京都
    ・04/06 コンテンツ東京
    ・04/13 アイデア合同葬儀(MAと共催、LT)
    ・04/24 メディアミートアップ vol.6:一人のメディアはどこまで行けるのか
    ・04/26 おうちハックLT会(LT)
    ・04/29 ニコニコ超会議
    ・05/14 M5Stackユーザーミーティング vol.1
    ・05/18 Tokyo HoloLens Meetup特別編
    ・05/31 AWS Summit Tokyo 2018
    ・06/02 おうちハックもくもく会(運営)
    ・06/04 Maker Faire Bay Area 2018 報告会
    ・06/11 Think Japan - Developer Day
    ・06/15 Maker Faire Tokyo 2018 キックオフミーティング
    ・06/24 文化庁メディア芸術祭 受賞作品展
    ・06/29 IoT縛りの勉強会 ! IoTLT vol.40
    ・07/03 M5Stackユーザーミーティング vol.2
    ・07/06 技術書典 サークル連絡会
    ・07/08 NT金沢(出展)
    ・07/12 デンソー東京支社 creative night#5
    ・07/23 BlockChain x IoT縛りの勉強会! BIoTLT
    ・07/24 「LINE BOOT AWARDS 2018 」キックオフパーティー
    ・08/04-05 Maker Faire Tokyo 2018(出展)
    ・08/04 Akiparty Tokyo 2018
    ・08/06 M5Stackユーザーミーティング vol.3 ・08/22 プロトタイピング情報交換会 (LT) ・09/03 アイデア供養会 名古屋の陣(LT) ・09/05 イノベーションの始め方・作り方・進め方
    ・09/08 ABPro 2018
    ・09/10 BIT VALLEY 2018
    ・09/11 Mashup Awards 2018 キックオフ ・09/18 IoT縛りの勉強会! IoTLT vol.43 ・09/25 BOOT AWARDS直前!秋のBot開発者大LT祭り! ・10/01 Loft Tokyo Night ・10/08 技術書典5(出展) ・10/17 CEATEC ・10/23 Innovation Leaders Summit
    ・11/03-04 Maker Faire Taipei
    ・11/06 trialog 「オルタナティブな経済をめぐって」
    ・11/12 Mashup Battle 1stSTAGE in 東京一部(LT)
    ・11/21 LINE DEVELOPER DAY 2018
    ・11/30 LINE Thingsハンズオン
    ・12/01 Ogaki Mini Maker Faire 2018
    ・12/02 FESTA 2018(出展、スタッフ)
    ・12/03  ハードウェアハッカーの世界と中国~エンジニアが手を動かして見出した深圳~
    ・12/11 子育Tech Meetup
    ・12/19 IoTデバイス忘年もくもく会
    ・12/30 冬コミ(出展)

    LT 6回、出展5回、主催イベント2回と去年とは打って変わっていろんなところに顔を出せるようになりました。特に金沢や台北、大垣など関東圏以外でのイベントに出られる回数が増えたのは自分のモチベーションとしては大きくて、来年はイベント参加に見合った(もっと見せびらかしたいと思うような)作品を作っていきます。


    その他関連してやっていたこと
    ・M5Stack同人サークル M5Staff 立ち上げとM5Stack同人誌の制作
    品モノラジオ配信
    メイカー向け国内展示イベント一覧の更新
    VTuber活動

    技術書典のサークル連絡会で偶然小菅さんと出会った勢いでM5Stack同人誌を作ることになったのですが、強気で刷った200部を昨日完売することができました。自分一人では同人誌を売るどころか書き上げることも到底できなかったと思うので、同好の士が集まって何かをやるというのは素晴らしいことだなと改めて感じています。ハッカソンに出なくなってチームで活動するということ自体から遠ざかっていたこともあって、尚更そう感じているのかもしれません。同人誌作りはこれからもやっていきたいなー。



    そんなこんなで毎年言ってますが、言葉にして表すのが難しい肌感覚やアンテナ感度は現地に行ってこそわかるようになると思っているのでイベント参加や出展は来年も積極的にやっていきます!!

    2018年9月18日火曜日

    M5StackとNeoPixelで光る帽子を作ってみた


    Maker Faire Tokyo 2018 に出展する作品として、M5Stack Gray と NeoPixel を使って光る帽子を作ってみました。

    光る帽子の要件

    1. 帽子全体がフルカラーで光るようにLEDを配置した上で制御ができること
    2. 帽子を雑に扱っても怪我をしにくいこと
    3. 帽子は子供が被れるくらいの重さであること
    4. 帽子を落としてもなるべく壊れにくいこと、もしくはすぐに修復できること
    5. 自分がなるべく開発しやすい環境であること

    光る帽子を作る上でどんなことを大事にするかリストアップしてみました。Maker Faire の展示ということで故障しにくいことや故障しても復旧が容易であることを重視しています(過去にイベント開始数時間で故障してそのまま終了を迎えるという痛い目にあっているので…)。他にも光る帽子は来場者が被って写真を撮ってもらうことをイメージしていたので帽子の重さや触るときに怪我をしないといったことも重要なポイントでした。

    M5Stack を選んだポイント

    • 基板がむき出しではないこと
      • 落としたときでも壊れにくそう
      • 来場者が作品を触ったときに怪我をしにくそう
    • 外部ピンがケースの開け締めなく接続できる
      • 帽子に無理な力がかかったときもケーブルが抜けるだけで基板本体へのダメージが少なくてすみそう
    • バッテリーを内蔵していること
      • NeoPixel用の電源を別途用意する必要がない
    • ESP32を搭載していて、Arduinoの開発環境が使えること
      • 自分が慣れている環境で開発できる
    • (M5Stack Grayのみ)9軸センサを備えていて、帽子の動きにあわせてNeoPixelを制御できること
    要件に挙げた内容からM5Stackを選んだ理由がこちらです。M5Stackの特徴から、上記のような効果が見込まれると想定した結果、M5Stackを利用することに決めました。開発環境は人それぞれだと思うので、Arduino IDE 以外に Micro Pythonでも開発できるのはM5Stackの大きな利点かもしれません。また、今回は帽子の動きにあわせてNeoPixelを制御しようと考えたので9軸センサ付きのM5Stack Grayにしましたが、こちらが不要であれば M5Stack Basic でも NeoPixel の制御は可能です。
    NeoPixelを選んだ理由は多数のフルカラーLEDを同時に制御する場合のディファクトスタンダードだからでしょうか、ライブラリも用意されていて先行事例も豊富にあるのは非常に心強いです。

    M5StaskとNeoPixelの購入

    M5StaskとNeoPixelの購入にはスイッチサイエンスさんと秋月電子さんを利用しました。下記URLから同じ製品を購入することができます。

    M5Stack Gray(9軸IMU搭載)
    https://www.switch-science.com/catalog/3648/

    SK6812使用マイコン内蔵フルカラーテープLED 1m 60LED IP20
    http://akizukidenshi.com/catalog/g/gM-12982/

    LEDが60個では帽子全体を光らせるには光量不足だったのでM5Stack GrayとNeoPixelを3個ずつ購入しています。1個のM5Stackで180個のNeoPixelを制御することも可能ではあると思いますが、電流や電力消費を考えると危険だと判断して1個のM5Stackで60個のNeoPixelを制御する構成を3セット用意することにしました。

    M5Staskを使ったNeoPixelの制御方法

    まずはハード側、M5StackとNeoPixelを接続してみます。NeoPixelの3pin(緑・赤・黒)をそれぞれ5番、3.3V、Gに接続します。配線はこれだけです。

    NeoPixel にある電源用の出線は使いません

    次にソフト側を設定します。M5Stackの中身はESP32なので、AdafruitのNeopixel Libraryを使うことができます(参照元:https://qiita.com/tomorrow56/items/fcf5ea7bfd2056e8f88f)。

    https://github.com/adafruit/Adafruit_NeoPixel
    上記のライブラリのページからZipファイルをダウンロードして解凍、Arduino IDE でライブラリをインポートすると、スケッチ例を読み込むことができるようになります。試しに使うならスケッチ例の Adafruit Neopixel -> simple が理解しやすいと思います。以下、simple を参照しながら開発を進めます。

    M5Stackはピン配置がArduinoとは異なるので、simple をそのままM5Stackで実行してもNeoPixelを光らせることはできません。スケッチ例11行目の
    #define PIN            6

    #define PIN            5 
    に修正することで制御が可能になります。また、NeoPixel を制御する個数はスケッチ例16行目の
    #define NUMPIXELS      16
     を編集することで変更することができます。上記例では16個までのNeoPixel を制御しています。

    インタラクティブにLEDを制御する

    決まった光り方を繰り返すだけでは面白くないと思ったので、M5Stackのセンサの値を使ってNeoPixelの色や明るさを制御することにしました。M5Stack Gray は加速度、ジャイロ、磁気を計測できるMPU9250を搭載しているので、ジャイロのX軸, Y軸, Z軸の各値をNeoPixelのR, G, B に対応させて制御することにしました(ジャイロの値そのままではNeoPixelの設定値には大きすぎるので1/10にして設定しています)。
    スケッチ例の M5Stack -> module -> MPU9250 -> MPU9250BasicAHRS に加速度、ジャイロ、磁気の各値を取得するプログラムがあるので参照。

    帽子にM5StackとNeoPixelを装着する

    動作確認ができたら帽子にM5StackとNeoPixelを装着します。最初にNeoPixelを巻き付けてイメージ通りに巻くことができたら結束バンドで固定していきます。最初はNeoPixelの固定にグルーガンを使う予定でしたが、展示後にNeoPixelを再利用することを考えて部品を傷つけない結束バンドを使うことにしました。

    結束バンドで固定するためにメッシュ素材の帽子を探しました

    NeoPixelを固定した後は帽子の真ん中にM5Stackを設置して、NeoPixelと同じく結束バンドで固定します。M5Stackをどこに固定するかは非常に迷いましたが帽子を被る上で一番邪魔にならなさそうな頭上の溝の部分に配置することにしました。

    帽子の溝にピタリとハマるM5Stack


    光る帽子完成

    無事光る帽子を完成させることができました。ジャイロの値でNeoPixel を制御しているので、帽子を置いているときはNeoPixelが消灯していて、帽子を被っているときはカラフルに光るようになりました。

    暗闇に光る180個のLED

    所感と今後の展望

    Maker Faire Tokyo 2018 に出展するにあたり、自分で展示物を身に着けてモバイル展示をしたいと思い立ったところから光る帽子の製作が始まりました。途中、帽子が光っている様子を自分自身では確認できないことに気が付いて心が折れかけたりしましたが、簡易にプロトタイピングができるM5StackやNeoPixelを使うことで無事完成させることができました。また、Web上に記載されている数多くの先人たちの知恵を借りることでトライアンドエラーの回数を大幅に減らすことができました。
    今回の製作では動きに合わせて帽子を光らせるというところまでだったので、次の試作では

    • NeoPixelの数をさらに増やして帽子全面が光るようにする
    • NeoPixelの光るパターンを増やす
    • NeoPixelの電源を外部から取得して、M5Stack1台でNeoPixelを制御する
    • 8pinoなど小型Arduino互換機を使って軽量化する

    といったことに挑戦してみようと考えています。

    2018年9月5日水曜日

    「素敵」を「素数」に変換する Chrome Extension 「素数は素敵」を公開しました

    なんでこんなことをしたのか自分でもよくわかりませんが、「素敵」を「素数」に変換するChrome Extension を作りました。

    素数は素敵
    https://chrome.google.com/webstore/detail/%E7%B4%A0%E6%95%B0%E3%81%AF%E7%B4%A0%E6%95%B5/kpdjnehaegbaneklaigbfjfopgakhfcj


    日常を素数と共に過ごしたい方におすすめです。

    2018年5月23日水曜日

    VRChat を始めるにあたっての備忘録(アバターのアップロード)

    無事VRChatを始めることができたものの、標準で用意されているアバターしか選べないというのは面白くないのでオリジナルのアバターをアップロードする。
    もちろん一般に公開されている3Dモデルをアバターとしてアップロードすることも可能だが、ライセンスがどのように設定されているかを確認してそのライセンスに沿った利用をする必要がある。
    利用が許可されているモデルについての情報はこちらにまとめられているので参照、またアップロードできるのは2万ポリゴンまでのモデルとのこと。

    アバターのアップロードについては下記を見ながら進めた。
    全くの3DCG初心者が1日でVRChatアバターをBlenderで作ってログインする話-1-
    http://vr-san-o.hatenablog.com/entry/2018/01/10/040039
    全くの3DCG初心者が1日でVRChatアバターをBlenderで作ってログインする話-2-
    http://vr-san-o.hatenablog.com/entry/2018/01/12/041349
    全くの3DCG初心者が1日でVRChatアバターをBlenderで作ってログインする話-3-
    http://vr-san-o.hatenablog.com/entry/2018/01/25/055756

    環境構築

    ソフトウェアの入手

    VRChatのWebサイトにログインする。
    https://www.vrchat.net/home

    CONTENT CREATIONの項に
    ・DOWNLOAD UNITY
    ・DOWNLOAD SDK
    のリンクがあるので、2つともクリックして、特定バージョンのUnityとSDKをダウンロードする。
    Unityはインストール&ログインも実施、Unityのアカウントを作っていなければSteamやVRChatと同じメールアドレスを使ってアカウントを作成すると良いらしい。

    SDKの取り込み

    Unityを起動、ログインし、空のプロジェクトを作成してからVRChat SDK をインポートする。

    3Dモデルの取り込み

    アップロードするFBXファイルをUnityのAssetsへD&Dして取り込む。Assetsへ取り込んだFBXファイルをクリックするとInspector画面にAnimation Type が表示されるので、
    ・Generic
    ・Humanoid
    のどちらかを選択しておく(アップロードするアバターが人型であればHumanoidを選択する)。
    一旦環境をセーブしてからAssetsにあるFBXファイルをHierarchyの画面にD&Dし、画面に3D モデルが表示されるのを確認する。

    3Dモデルへの情報付加

    Hierarchy画面で取り込んだ3D モデルを選択し、Inspector画面でAdd Componentのボタンをクリック。検索窓でVRC_Avatar Descriptorを検索して選択。
    新しく追加されたメニューの中で、View Position(球)をアバターの目の少し先に設定されるように変更する。

    3D モデルのアップロード

    Unityのメニュー→VRChat SDK→Settingsを選択、VRChatのアカウントを入力する箇所があるので入力しログインする。
    さらに、Unityのメニュー→VRChat SDK→Show Build Control Panelを選択すると、VRChatウィンドウが起動、VRChatウィンドウのBuild&Publishボタンをクリックすると3D モデルのアバターがアップロードされる。
    アップロード時に3D モデルの説明を記載する箇所があるので適時記入。