Mbedオンラインコンパイラでmicro:bitを使う(温度計編)

この記事はMbed Advent Calendar 2017の4日目の記事です。

Mbedオンラインコンパイラでmicro:bitの開発をやってみます。 初めての開発なので、作るのは単純な温度計です。

micro:bitにはLEDアレイが搭載されていて、そこに文字を表示できるようになっています。 なので、温度をLEDアレイに表示するようにしてみました。

f:id:mia_0032:20171205023045g:plain

用意したもの

f:id:mia_0032:20171205020943p:plain

micro:bit本体とベースボード、温度センサーです。これらを使って作成します。

Grove ShieldとTemperature SensorはP0/P14のポートに接続しました。

コード

#include "MicroBit.h"

MicroBit uBit;

const int B = 4275;               // B value of the thermistor
const int R0 = 100000;            // R0 = 100k

MicroBitPin P0(MICROBIT_ID_IO_P0, MICROBIT_PIN_P0, PIN_CAPABILITY_ANALOG); 

int main()
{
    uBit.init();
    
    while (1) {
        wait(1.0);

        float R = 1024.0 / P0.getAnalogValue() - 1.0; 
        R = R0*R;
        float temperature = 1.0/(log(R/R0)/B + 1.0/298.15) - 273.15;
        
        char fmt[6];
        sprintf(fmt, "%02.2fC", temperature);
        uBit.display.scroll(fmt);
    }
}

通常のMbedのコードと異なる点があるので説明していきます。

以上の2つの点が大きな違いです。

MicroBitPinは DigitalInAnalogIn とメソッドが異なるので注意が必要です。だいぶシンプルなメソッドになっている印象を受けました。

PIN_CAPABILITY_ANALOGhttps://lancaster-university.github.io/microbit-docs/ubit/io/#microbitpin-int-id-pinname-name-pincapability-capabilityに記載されている定数で、アナログピンとして使用する設定です。

        float R = 1024.0 / P0.getAnalogValue() - 1.0; 
        R = R0*R;
        float temperature = 1.0/(log(R/R0)/B + 1.0/298.15) - 273.15;

のあたりの計算式は Grove - Temperature Sensor V1.2 - Seeed Wiki からのコピペです。

最初コードを書いたときに 1024.0 / P0.getAnalogValue()の部分を1024 / P0.getAnalogValue()と書いてしまったがために、割り算の結果がintで丸められてしまい、出力される値が変化しなくなってしまっていました。

そのデバッグに結構時間を使ってしまったので、型には気をつけないといけないですね・・・

感想

コードのデバッグではまってしまったところはあったものの、電子回路の部分は挿すだけで良いので楽に作れます。 ピン定義の部分さえ理解すれば、それ以外のところは理解しやすいAPIになっているように感じました。

明日の記事は toyowataさんの「MAと私」です。

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)を実行し、動作確認できます。

AWS Batchの使用感

AWS Batch を試しに使ってみた感想です。 少ないサンプルでの結果なので間違ってる部分はあるかもしれません。あらかじめご了承ください。

良いところ

管理しなければならない部分が減る

オートスケールやインスタンスサイズなどをAWS側でよしなに調整してくれる。

  • ジョブのコンテナ定義のvcpumemoryに合わせてAutoScalingGroupを作ってくれる。
  • インスタンスサイズは optimal が設定できる。 optimalではジョブの条件を満たすインスタンスを自動的に選んでくれる。

試してないがスポットインスタンスの入札も行ってくれるらしい。

使いにくいところ

ジョブをsubmitしてから実行されるまで数分以上待たされることがある

ComputeEnvironment上にインスタンスが起動していない状態だと、結構待たされる。

  • AutoScalingGroupの設定とインスタンス起動が行われるので、そこに時間がかかっていそう。

インスタンスタイプにoptimalを設定した場合の挙動

起動中のインスタンスタイプでは満たせないジョブをsubmitすると実行まで時間がかかる。

public subnetでしか起動しない

private subnetでNAT通るようにした状態でもいつまでもジョブが実行されず。

  • セキュリティグループは設定できるので実害はないかなとは思う。

インスタンスがTerminateされる時間がまちまち

ジョブがなくなってからインスタンスがTerminateされる時間はまちまち。 ジョブがなくなってから5分程度でTerminateされることもあれば1時間程度かかることもある。

ジョブ定義のパラメータはcommand内でしか使えない

ジョブ定義のパラメータcommand にしか使えない。environment にも使えるようになればさらに便利そう。

  • ジョブ定義のパラメータはジョブをsubmitした時点で置換されるので、JobDetailの中では置換された状態で表示される。
    • 確認しやすいが、秘匿情報を渡したい場合には使えない。

まとめ

  • インスタンスが起動した状態であればジョブキューは迅速に消化されるので最低1台は起動しておくのが良いかなと感じた。
  • インスタンスサイズが変わるときの挙動に不安を感じたので、インスタンスサイズは固定したほうが良さそう。