Seeed Wio 3GからSORACOM Harvestに加速度データを送信して可視化

この記事はSeeed UG Advent Calendar 2018の14日目の記事です。

f:id:mia_0032:20181213135521j:plain
Seeed Wio 3G

概要

Seeed Wio 3GからSORACOM Harvestにデータを送って可視化してみます。

Seeed Wio 3GはSIMを挿すことで3G回線でインターネットに接続できるマイコンボードです。Arduino IDEで開発できるので手軽にIoTデバイスを作成することができます。 またGroveというセンサーなどが簡単に接続できるモジュールに対応しており、はんだ付け無しでいろいろな機能を実現できます。

SORACOM Harvestはデータの蓄積・可視化を行えるサービスです。デバイスにSORACOMのSIMを組み合わせることで利用できます。

今回はマイコンボードSeeed Wio 3GにSORACOMのSIMカードを挿し、Groveの加速度センサーの値をSORACOM Harvestに送ってみます。

Arduino IDEの設定

Wiki/setup-ja.md at master · SeeedJP/Wiki · GitHub を参照してWio 3Gの開発環境を構築します。

Harvestの利用設定

SORACOM Harvest でデバイスのデータをクラウドで収集・取得・可視化する | Getting Started | SORACOM Developers を参照してSIMグループおよびHarvestの開始手続きを行います。

Groveモジュールの接続とライブラリの読み込み

Wio 3GのI2CコネクタにGrove 3-Axis Digital Accelerometer(±1.5g)を接続します。

f:id:mia_0032:20181213151436j:plain
Wio 3GにGrove加速度センサーを取り付け

加速度センサーのライブラリとして GitHub - Seeed-Studio/Accelerometer_MMA7660: Seeed 3-Axis Digital Accelerometer(±1.5g) library を使いたいのですが、Wio 3GではWireクラスがWireI2Cになっていたりして、そのままでは使えません。

forkしてWio 3Gに対応したものを GitHub - mia-0032/Accelerometer_MMA7660_Wio_3G: Seeed 3-Axis Digital Accelerometer(±1.5g) library に置いていますのでZipでダウンロードして、ArduinoIDEにライブラリをインクルードしてください。

コードの書き込み

以下のコードをWio 3Gに書き込みます。Harvestのサンプルコードに加速度センサーの読み込み処理をつけたコードになってます。

可視化されたデータを見る

Wio 3Gを起動してしばらく立つとHarvestにデータが貯まっていきます。Harvestに送信されたデータは SORACOMのコンソール→SIM管理→SIMを選択→データを確認 という手順で見れます。

f:id:mia_0032:20181213172241p:plain
harvest

センサーを動かすと出力される値が動けば成功です。定期的に振ると上のようなグラフになります。

製作上でハマったところ

  • 通常のArduinoのクラス名とは異なるクラスが使われているのでそのままでは動かないライブラリもある。
  • しばらく経つとHarvestへの書き込みが止まってしまう。
    • これは原因がわかっていない。

まとめ

SORACOMのマネージドサービスのHarvestを使ってお手軽にセンサーデータの可視化ができました。

Wio 3Gは3G回線が使えるので、SIMだけ挿せばネットワークにつながる*1のが楽で良いですね。

*1:SIMが挿せるボードは未発売です。今回は販売前の製品をお借りすることができました。

fluent-plugin-gcloud-pubsub-customをplaceholder対応しました

Google Cloud Pub/Sub用のFluentdプラグインfluent-plugin-gcloud-pubsub-customをFluentd v0.14から使えるplaceholderに対応しました。

v1.1.0からtopicパラメータにplaceholderが指定できるようになっています。

例えば、以下のようなfluent.confを書くことでタグの一部をtopicに指定することができます。

<match example.*>
  @type gcloud_pubsub
  project your_project_id
  key /path/to/keyfile.json
  topic ${tag[1]}

  <buffer tag>
    @type memory
    flush_interval 1s
  </buffer>
  <format>
    @type json
  </format>
</match>

タグごとに送るtopicを変更したいことは多いと思うので、便利になる機能かなと思います。 従来は同じことをやるのにforestプラグインを使う必要がありましたが、これからはプラグイン単体でできます。

また https://docs.fluentd.org/v1.0/articles/buffer-section に記載がある通り、時間やレコードの値を指定することも可能です。 autocreate_topicを設定することで自動的にtopicが存在しなければ作成することもできるので、より柔軟な設定が可能になりました。

ぜひ使ってみてください。

Athenaをbqコマンドライクに操作できるgem aqを作った

この記事はAmazon Web Services Advent Calendar 2017の16日目の記事です。

AWS AthenaをBigQueryのbqコマンドライクに使えるaq というコマンドラインツールを作りました。

github.com

AthenaをCLIで操作しようとすると踏まないといけない手順*1が多かったので、もっとシンプルに使えるようにするためです。

サブコマンドは、BigQueryのbqに慣れているので、それと同じ感覚で使えるようにしました。

またBigQueryのスキーマファイルをそのままAthenaでも使えるようにしているので、スキーマの2重管理を避けることもできます。

まだ必要最小限な機能しかないので、Issueでリクエストしてもらった機能には順次対応していこうかなと思っています。もちろんPullRequestも歓迎です。

インストール

gemでインストールできます。

$ gem install aq

コマンド

Athenaの仕様としてクエリの実行にはクエリの結果を保存するバケットの指定が必要です。 バケットは --bucket オプションで指定するか、環境変数 AQ_DEFAULT_BUCKET で指定してください。

Webコンソールから実行したときは aws-athena-query-results-<アカウントID>-<リージョン名> となるようなので、それに合わせるのが良いかもしれません。

help

コマンド一覧やコマンドの引数・オプション等を表示します。

$ aq help
$ aq help [COMMAND]

ls

データベースまたはテーブルの一覧を取得します。

# データベースの一覧
$ aq ls
# テーブルの一覧
$ aq ls [my_database_name]

head

テーブルの先頭100レコードを表示します。

$ aq head [my_db.my_table]

-n オプションで件数を変更できます。

mk

データベースを作成します。

bqコマンドではスキーマを指定しないテーブルの作成もできますが、Athenaはスキーマを指定しないテーブルは作成できないようだったので、テーブル作成はloadで行うようにしています。

$ aq mk [my_database_name]

load

テーブルの作成とデータのロードを行います。

今のところjsonl形式のファイルにしか対応していません。

schema.jsonは BigQueryのLegacySQLのスキーマファイルと同じ形式です。

$ aq load [my_db.my_table] s3://[my_bucket]/[my_object_key]/ [test/resource/schema.json] --partitioning [dt:string]

rm

データベースまたはテーブルを削除します。

# データベースの削除
$ aq rm [my_db]
# テーブルの削除
$ aq rm [my_db.my_table]

--force オプションをつけると確認が省略されます。

query

指定したクエリを実行します。

$ aq query 'SELECT * FROM "test"."test_logs" limit 10;'

*1:クラスメソッドさんのブログ記事 新機能 AWSCLIから Amazon Athena のクエリを実行する | Developers.IO を参照

Digdag pluginのローカルでの動作確認方法

digdag-slack pluginにPullRequestを送ったときに、ローカルで動作確認する方法が最初わからなかったのでメモしておきます。

1. ビルドする

$ ./gradlew publish

2. digファイルのプラグインの読み込み設定を書き換える

_export:
  plugin:
    repositories:
      - file://${repos}
    dependencies:
      - io.digdag.plugin:digdag-slack:0.1.4-SNAPSHOT

repositoriesにローカルのファイルパスを指定し、dependenciesにpackageのclass pathを指定します。 上記の設定だと、reposが変数になっているので -p repos=`pwd`/build/repo と指定することが可能です。

3. pluginのキャッシュファイルを削除する

$ rm -rf .digdag/plugins

Digdagは実行時にプラグインをローカルディレクトリにキャッシュしているようで、プラグインのバージョンアップを行わない限り、そちらのファイルが使われてしまいます。 通常時は問題ないですが、動作確認をするときは古いファイルのままになってしまうことがあるため、キャッシュファイルを削除します。

4. digdag runする

$ digdag run sample.dig -p repos=`pwd`/build/repo

上記のコマンドでワークフロー(sample.dig)を実行し、動作確認できます。

mbed Device Connectorへデータを送ってみる

mbed FRDM-K64Fを使ってmbed Device Connectorを試しました。

f:id:mia_0032:20170221111232p:plain

今回は公式で公開されているサンプルを動かしてみました。

github.com

ビルド手順

1. import します。

$ mbed import mbed-os-example-client
$ cd mbed-os-example-client

2. Ethernetをつかってネットワークに接続するように設定します。

$ cat << EOS > configs/mbed_app.json
"network-interface": {
    "help": "options are ETHERNET,WIFI,MESH_LOWPAN_ND,MESH_THREAD.",
    "value": "ETHERNET"
}
EOS

3. 認証情報の設定

https://connector.mbed.com/#credentials から取得した認証情報で security.h を上書きします。

4. mbedへ書き込み

$ mbed compile --toolchain GCC_ARM --target K64F
$ cp .build/K64F/GCC_ARM/mbed-os-example-client.bin /Volumes/MBED

書き込みが終わったらresetボタンを押して、プログラムを実行します。

動作の確認

バイスが認識されているかの確認

https://connector.mbed.com/#homeで確認すると、デバイスが1つぶら下がっていることとデータが送られていることがわかります。

f:id:mia_0032:20170221105728p:plain

https://connector.mbed.com/#endpointsからはデバイスのendpointに使われる名前(secure.hに記載されているMBED_ENDPOINT_NAMEの値)を確認することができます。

f:id:mia_0032:20170221105350p:plain

データの確認

https://connector.mbed.com/#consoleから送られているデータのサンプルを見ることができます。

SW2を押した回数が3200/0/5501へ送られているようなので以下のように設定します。

f:id:mia_0032:20170221111944p:plain

TEST API ボタンを押すと以下のような結果が返ってきます。

f:id:mia_0032:20170221112238p:plain

payloadというキーに送信されたデータがBase64エンコードされた状態で入っています。 その下にBase64 decoded payloadというのが表示されており、これがデコードされた結果です。 ここでは35という値がスイッチを押した回数になります。

mbed CLIでのコンパイルを楽にするシェルスクリプト

はじめに

この記事はmbed Advent Calendar 2016の6日目の記事です。

mbed CLIがリリースされ、ローカル環境でのコンパイルが楽になりました。 しかし、コンパイルするときにボードを設定したり、コンパイルされたファイルが結構深い階層にあったりと、何度も手作業で繰り返すのは結構面倒です。 そこで一発でボードを自動的に判定し、mbedへのコピーまでやってくれるスクリプトを作ったので紹介します。

mbed CLI自体のインストールについては、既に日本語の記事がまとまっていますので、以下をご覧ください。

mbed CLI (コマンドライン・インタフェース)を Mac OS X で使ってみる | mbed

作ったスクリプト

#!/bin/bash

set -eu

PROGRAM_NAME=$(basename `pwd`)
MBED_DETECT=$(mbed detect | grep Detected | sed 's/,//g' | head -n 1)

if [ -z "${MBED_DETECT}" ];then
    echo "[info] No mbed boards are found."
    exit 1;
fi

TARGET=$(echo ${MBED_DETECT} | cut -d' ' -f3)
MBED_VOLUME=$(echo ${MBED_DETECT} | cut -d' ' -f7)

echo "[info] Target:"${TARGET}", Volume:"${MBED_VOLUME}

TOOL_CHAIN="GCC_ARM"

mbed compile --toolchain ${TOOL_CHAIN} --target ${TARGET}

BUILD_PATH=$(echo "BUILD/"${TARGET}"/"${TOOL_CHAIN}"/"${PROGRAM_NAME}".bin")
cp ${BUILD_PATH} ${MBED_VOLUME}/
echo "[info] Success to copy from "${BUILD_PATH}" to "${MBED_VOLUME}

適当な名前(compile.shなど)で保存し、$ bash compile.shとするか実行権限をつけて直接スクリプトを叩けば実行されます。

手元のLPC1768で試して動くことを確認しましたが、それ以外のボードでは未検証です。動かない場合は教えてください。

なおMacでしか動かないと思います(Linuxは動くかもですが)。

やっていること

mbed detectでターゲットとコピー先のボリュームを取得し、mbed compileで生成されたbinファイルをコピーしています。

mbed newmbed importするとディレクトリ名がbinファイルのファイル名となるので、それも利用しています。

複数のmbedがPCに接続されている場合はmbed detectで先頭になる1台に対してコピーが行われます。

mbed OS 5でのイベント処理(mbed events libraryの使い方)

はじめに

この記事はmbed Advent Calendar 2016の4日目の記事です。

mbed OS 5でイベント駆動なプログラムを書くためのライブラリ mbed-events-library の使い方を紹介します。 なお、ドキュメントに書いてあるコードは古いのか正常に動かないところがあったので、GithubのREADMEを参照して検証しました。

mbed-events-libraryが追加されたことで、従来の RtosTimer はdeprecated*1となったようです。

動かしてみる

青mbed(LPC1768)を使って実験しました。 p18 にPullUpでタクトスイッチをつけています。

1. 即実行されるイベント

EventQueueインスタンスを作成し、callメソッドを呼び出すことで即実行されるイベントを追加することができます。

dispatch メソッドを実行するとイベントループが廻り続けるため、最後に while(true) といった記述は必要ありません。

サンプルコードと実際の動作

#include "mbed.h"

DigitalOut led1(LED1);
InterruptIn sw1(p18);

// イベントキューを作成する
EventQueue queue;

// LEDのON/OFFを切り替える関数
void toggle_led() {
    led1 = !led1;
}

// タクトスイッチが押されたときに実行される関数
void pushed() {
    // 即実行されるイベント
    queue.call(&toggle_led);
}

int main() {
    // スイッチピンをPullUpにする
    sw1.mode(PullUp);

    // タクトスイッチが押されたときの割り込み処理
    sw1.fall(&pushed);

    // イベントループが廻り続ける
    queue.dispatch();
}

動作させたのが以下の動画です。スイッチを押すとLEDがON/OFFします。

f:id:mia_0032:20161203210614g:plain

2. 指定時間後に実行されるイベント

EventQueueインスタンスに対して call_in メソッドを呼び出すことで 指定ミリ秒後に実行されるイベントを作成することができます。

サンプルコードと実際の動作

先ほどのコードに queue.call_in(2000, &toggle_led); を追加し、ボタンを押してから2000ミリ秒(2秒)後に消える処理を追加しました。

#include "mbed.h"

DigitalOut led1(LED1);
InterruptIn sw1(p18);

// イベントキューを作成する
EventQueue queue;

// LEDのON/OFFを切り替える関数
void toggle_led() {
    led1 = !led1;
}

// タクトスイッチが押されたときに実行される関数
void pushed() {
    // 即実行されるイベント
    queue.call(&toggle_led);
    // 2000ms後に実行されるイベント
    queue.call_in(2000, &toggle_led);
}

int main() {
    // スイッチピンをPullUpにする
    sw1.mode(PullUp);

    // タクトスイッチが押されたときの割り込み処理
    sw1.fall(&pushed);

    // イベントループが廻り続ける
    queue.dispatch();
}

動作させたのが以下のようになります。スイッチを押すとLEDがONし、2秒後にOFFになります。

f:id:mia_0032:20161203210632g:plain

なお、ON/OFFするイベントをひたすらキューに積んでいる形になるため、連打するとON/OFFの順番は崩れます・・・

3. 指定時間ごとに定期実行されるイベント

EventQueueインスタンスに対して call_every メソッドを呼び出すことで 指定ミリ秒ごとに実行されるイベントを作成することができます。

サンプルコードと実際の動作

先ほどのコードからスイッチの処理を取り除き、call_every で1秒ごとに実行されるイベントを追加したものになります。

#include "mbed.h"

DigitalOut led1(LED1);

// イベントキューを作成する
EventQueue queue;

// LEDのON/OFFを切り替える関数
void toggle_led() {
    led1 = !led1;
}

int main() {
    // 1000msごとに定期実行するイベント
    queue.call_every(1000, &toggle_led);

    // イベントループが廻り続ける
    queue.dispatch();
}

動作させると以下のように、1秒ごとにLEDのON/OFFを繰り返します。

f:id:mia_0032:20161203210643g:plain

おわりに

今回のコードは以下のリポジトリに公開しています。 mbed import してお使いください。

github.com

以前、mbed OSのTechnical Preview版のときはMINARと呼ばれるイベントスケジューラーがあり、それを検証したことがありました。

そのときは結構な行数のコードが必要だったのですが、mbed-events-library は非常に簡潔なで直感的なコードで同様のことが実現できるようになったようです。

どんどん進化していますね。

GoogleCloudPub/Subのfluentdプラグイン fluent-plugin-gcloud-pubsub-customを作った

マネージド・メッセージ・キューのGoogle Cloud Pub/Subを利用するためのfluentdプラグインとしてfluent-plugin-gcloud-pubsub-customを作りました。

リポジトリは以下です。 github.com

もともと GitHub - mdoi/fluent-plugin-gcloud-pubsub というプラグインがあったものの、最近更新されていなさそうでしたのでforkして新しいプラグインとして公開しました。

元になったfluent-plugin-gcloud-pubsubから大きな変更点として以下があります。

  • google-cloud-rubyのバージョンアップに追随
  • Pub/Subの各種クォータの制限に対応
    • file bufferも使えるように lightening buffer への依存を排除しています。
  • formatter, parserプラグインに対応してjson形式以外も指定できるようにした
  • エラーハンドリングを改善
  • inputプラグインにHTTP RPCでメッセージのpullをstop, startできる機能を追加
    • デプロイ時や流量のコントロールなどに使えると思います。

使い方はREADMEを参照してください。

Pub/SubにはAttributeを付与できる機能があるので、Attributeにtagを入れて、pullするときはそれを使ってtagを付与できる機能を、そのうち実装したいと思っています。 forestプラグイン等でtopicをたくさん増やす必要がなくなって便利かなと。

しばらく自分でも使ってみて特に問題は発生していないですが、もし使ってみてバグや欲しい機能とかありましたら、何かでご連絡ください。

【10/30追記】

マルチスレッドでメッセージをpullできる機能をinput pluginに追加しました。

MicroPythonでmicro:bit互換のchibi:bitを動かす

f:id:mia_0032:20160820155544p:plain

chibi:bitはスイッチサイエンスから発売されているmicro:bit互換のマイコンボードです。

micro:bitはmbed enableなのでC++(mbed)でも開発できますし、JavaScriptやBlockEditor, MicroPythonでも開発することができます。

WebIDEを使うと、非常に簡単にコードを動かすことができます。 コンパイルされたhexファイルをダウンロードできるので、hexファイルを通常のmbedと同じようにディスクへ書き込めば動きます。

しかしWebIDEではなくローカルPCで開発したいという人もいると思います。 そこで、この記事ではローカルPCでMicroPythonのコードをビルドしてchibi:bitで動かす手順を紹介します。

1. ローカルで開発できる環境を作る

Pythonのバージョンは 2.7.12 でやりました。OSXでの手順になります。

$ python --version
Python 2.7.12

Pythonで書かれたコードをhexファイルにコンパイルして書き込んでくれるuFlashというパッケージをインストールします。

$ pip install uflash

ビルドにはyottaも必要そうなのでインストールします*1

$ brew install cmake ninja arm-none-eabi-gcc
$ pip install yotta

2. HelloWorld.py

以下のコードを HelloWorld.py として保存します。

from microbit import *
display.scroll("Hello, Python World!")

chibi:bitへ書き込みます。

$ uflash HelloWorld.py /Volumes/MBED

3. 動作確認

MBEDデバイスが取り外されれば書き込みが完了した合図なので、あとはリセットボタンを押すだけです。

f:id:mia_0032:20160820155043g:plain

ちゃんと表示されました!

*1:特に依存しているようには見えないものの、インストールされていない状態だとhexファイルが書き込まれませんでした

Intel Edison + Eagletを使った工作4部作をQiitaに書いた

Edisonのセットアップから、Kinesisへデータを送るコード、さらにそのKinesisから送られてきたデータを機械学習するところまで、一通りやった工作記事をQiitaに書きました。

最終形はこんな感じになりました。

全部でだいたい丸々3日間かかっています。 興味あれば各記事をぜひご覧ください。

反響次第では、もうちょっと進めてみるのもありかなと思っています。アイデアとかあればぜひ。

多段Norikraが楽になるNorikra-listener-plugin-Norikraを作った

1ヶ月ほど前になりますが、多段Norikraを簡単に試せるようにするNorikra Listenerプラグインを作りました。

norikra-listener-norikra | RubyGems.org | your community gem host

github.com

なぜ作ったか?

ログ量が増えてくると1台のNorikraではさばくことができなくなります。

そうした場合には数台のサーバーごとにNorikraを1つ立てて、その後段に各Norikraの実行結果をまとめるNorikraを立てることで、スケールさせることができます。

例: Norikra in Gunosy Network Ads@Norikra meetup #2 // Speaker Deck

その際に前段と後段のNorikraをつなげるために、従来は下図のbeforeように間にfluentdを挟む必要がありました。

f:id:mia_0032:20151112083941j:plain

多段Norikraを試そうにも、fluentdのconf書き換えが必要になってしまうのがネックだなと思い、NorikraのWebUIから送り先を指定できれば楽になると思って作ったのが、このプラグインです。

結果的には図のafterのように間にfluendを挟まなくても多段化できるようになりました。

このプラグインを入れておけば、多段にしたくなったときに、後段のNorikraを立てて、WebUIからクエリを登録するだけで、多段化することができます。

なお、クエリ単位で変更できるので、このクエリ結果はこのNorikraへ、別のクエリ結果は別のNorikraへ、という指定もできます。

本格的に多段Norikraを運用する場合は、間にfluentdを挟みバッファリングした方が良いと思いますが、ちょっとした実験にはオススメのプラグインです。

どういう場面で使う?

例えば前段のNorikraで、1秒間のアクセス数をとり、後段のNorikraでそれらをまとめてSUMすることで1分間のアクセス数を得るといった使い方ができます。

前段のNorikraは流れてくるログを直接受けるため、マシンリソースがシビアになりがちで、あまりWindowの長い集計をするのは難しいです。

後段には前段の集計値しか流れてこないため、マシンリソースには余裕があり、そのため、後段で長いWindowの集計を行えば、目的としている集計値を安定して取得することができます。

他にも1段目のNorikraで単純なログの加工や必要なカラムにのみに絞る処理を行い、後段でそれを集計するといった使い方も考えられます。

UUであれば、前段で短いWindowでuser_idをDISTINCTし、後段でさらにDISTINCTしてCOUNTすれば、1台で行うよりはメモリを食わなくなるかなと思います。

使い方

クエリグループに NORIKRA(<送信先Norikraのhost>:<送信先Norikraのport>,<送信先のtarget>) と記述するだけです。

クエリの実行結果が指定したNorikraに送信され、指定したtarget名で登録されます。

あとは通常の流し込まれたデータと同じように扱うことができます。

最後に

使ってみて、この機能欲しいとか、不具合あれば遠慮なくIssueかプルリクしてください。

関連エントリ

fluent-plugin-formatter_pretty_json を作った

github.com

fluentdのFormatterプラグインを書きました。

gemは以下で公開しています。

fluent-plugin-formatter_pretty_json | RubyGems.org | your community gem host

概要

out_fileやout_s3のプラグインには出力フォーマットをformatで指定できます。 その出力フォーマットをプラグイン化して増やすことができるのがFormatterプラグインです。

fluent-plugin-formatter_pretty_jsonは、出力を読みやすく整形されたJSON形式にすることができます。

使い方

gemをインストールし、formatpretty_jsonと指定することで利用できるようになります。

出力は以下のようになります。

{
  "foo": "bar",
  "test": "hoge"
}
{
  "foo": "bar",
  "test": "hoge"
}

複数行に渡る出力になるので、通常の使い方ではあまり使わないかもしれませんが、Formatter対応プラグインが増えると使える場面がでてくるかもしれません。

開発面

プラグインの開発は Fluentd Formatter プラグイン入門 - Qiita を見ればさくっと作れました。 ただ、テストが公開されているコードでは動かず、以下のようなエラーが出ていました。

Error: test_format(PrettyJsonFormatterTest): NoMethodError: undefined method `corresponding_proxies' for {"utc"=>true}:Hash

上記のエラーは既にIssueで報告されており( https://github.com/fluent/fluentd/issues/652 )、記載のあった Fluent::Config::Element.new を使うことでテストも通るようになりました。

感想

  • Formatterプラグインはわりと簡単に作れる。
  • まだまだFormatterプラグインは数が少ないので、作るとfluentdでできることの幅が広がりそう。

関連エントリ

mia-0032.hatenablog.jp

シカケコンテスト2015で作品発表して受賞しました

f:id:mia_0032:20150704104251j:plain

2015/07/04に天王寺動物園において行われたシカケコンテスト2015で作品を発表してきました。

発表した作品は、熱中症を防止することを目的にした「水分補給お知らせペットボトルホルダー」です。

水分補給を楽しくするシカケと水分補給をお知らせするシカケを組み込んでおり、水分補給を全力で促す作品になっています。

ただコンテストでは他の発表と、ペットボトルホルダーというネタまでかぶってしまい、だいぶつらい感じになってしまいました。

熱中症は被るかもしれないとは思っていましたが、ペットボトルホルダーまでネタがかぶるという状況は想定していなかったです。

司会の方のフォローもあって何となく技術っぽさを伝えることができたのか、大変うれしいことに技能賞をいただきました。

スライド

デモ動画

水分補給お知らせペットボトルホルダー from mia_0032 on Vimeo.

解説

今回は、使用したい部品のライブラリがすべて揃っていたので、mbedを使って作りました。

音声再生のライブラリがアナログ出力を使うので、LPC1768で製作しました。

mbedに書き込んだプログラムは以下に公開しています。

mbed_petbottle_holder_shikake - a mercurial repository | mbed

使用した部品は以下の通りです。

組んだときの状態はこんな感じでした。

f:id:mia_0032:20150703160822j:plain

思った以上に複雑になってしまったので、もうちょっと簡単な構成にしたいところです。

「飲む」という動作をとる仕組み

以下の2点を両方満たすときに「飲んでいる」と判定しています。

  • 加速度センサーのZ軸方向にかかっている加速度(この場合はほぼ重力加速度)が一定の数値を下回るとき
    • つまり傾いているとき
  • タッチセンサーが反応しているとき
音声出力と画像出力について

扱いやすいように、事前に音声はwaveファイル、画像はビットマップファイルに変換しておいて、SDカードに保存しています。

それを必要なタイミングで読み込んで、鳴らしたり表示したりしています。

音源と画像は以下のものを利用させていただきました。ありがとうございます。

改善点

今年はMakerFaireに出展したりしないので、展示する機会はなさそうなのですが、今後どこかで展示する機会があれば、以下の点は改良したいと思っています。

  • 小型化・軽量化
    • 電源が用途に対して大きすぎると思うので、減らしたい。
    • 積み重ね式になっていて無駄なスペースが多いので修正したい。
  • 簡素化
    • 画像表示は不要なのでは?
    • タッチセンサーなしでも、加速度センサーだけでもうまくいく気がする。
  • 筐体
    • ちゃんとしたケースに入れたい。
  • 割り込み
    • 鳴き声が鳴っているときに傾けても、再生が終了するまで次の処理に入らないので、その点は修正したい。

コンテストの感想

まず、どの作品も発想力は本当に見習いたいと感じました。

どうも技術的な方向に発想が偏ってしまうので、その点は直していきたいと思います。

コンテストの作品の技術的な面では、RFIDなどで人の行動を検知して「○○すると○○が起こる、それが楽しいので学びや気づきになる」という物が多かった印象があります。

個人的には、動物の顔との合成写真が作れるものや、水で色が変わる紙を使った作品が印象深かったです。

イデア部門の発表は、実際に使用するとなると耐久性などは考えないといけないですが、動くものを作る程度であれば個人でも作れる物が多かったので、実装部門で発表してもよかったのではと思いました。

実際に作ってみると、うまく動かない、思ったよりも効果がなさそう、というのはよくあることなので・・・

自分の作品は拍手で「飲む」のを楽しくする部分はともかく、「お知らせ」部分はシカケと言って良いのかが微妙な感じでした。

「動物園」というテーマにも直接関係しているものではなかったので、アイデアを考えるのは難しいです。

次回のコンテストがあるなら、その点を解消して作りたいところですが、なかなか骨の折れることだなとは感じています。

ともあれ、いろいろなアイデアを聞けるのは楽しいので、また何らかの形で参加できればいいなと思います。

関連エントリ

IoT縛りの勉強会! IoTLT vol.3 でLTしてきた

2015/05/13 に開催されたIoT縛りの勉強会! IoTLT vol.3で「Tesselで作るコメントお知らせはちゅね」について話してきました。

スライドは以下です。

機能や仕組みは 以下の記事の「コメント新着お知らせ はちゅね」と同じです。

前のときはブレッドボードで組んだ状態で、ほんとにざっと組んだ感じでした。

今回はケースにいれて、基板もちゃんと配線しています。

手直しするだけで、GWが終わってしまい、新機能は追加できませんでした。

その分、スライドの方に、時間をかけたのでわかりやすくなっていると思います。

勉強会の感想

事例紹介がいくつかあり、どれも興味深いものでした。 個人的には、ねろさんの「IoTでいうところのIよりの知識でTする」の本棚の事例が楽しそうでした。

どちらかというとソフトウェアよりな発表が多かったです。 ハードウェア系の人の話ももっと聞きたかった感じがありました。

自分の発表については、何人か懇親会でTesselについて質問をもらったり、話せたりしたので、興味はもってもらえたかなと。

懇親会で、Web系の人にハードウェアに興味をもってもらうには、どうすればよいかといった話題まで話せたので、個人的にはすごく楽しい時間でした。

第4回は渋谷の21cafeで開催されるそう(http://iotlt.connpass.com/event/15005/)です。ぜひともまた行こうと思います。

関連エントリ

Tessel で作るコメント新着お知らせ はちゅね

社内でLTしたときに、作ったものです。

指定した動画を定期的にポーリングして、コメントがついていたら、前回チェックした時からの差分値だけネギを振る はちゅねミクです。

ニコニコ大百科に書いてあったAPIを使っています。

動画

Tesselで作るコメントお知らせ はちゅね from mia_0032 on Vimeo.

解説スライド

コード

GitHub - mia-0032/tessel-nicovideo-negifuri-counter: check my uploaded videos in niconico and notice to me by negifuri if my video commented

©2023 みや All rights reserved.