impExplorer Developer Kitを使ってみました! ~ その2 ~

投稿者:

こんにちは、岸田です。今回は前回の記事「impExplorer Developer Kitを使ってみました! ~ その1~」の続きをやろうと思います。

この基板には加速度、温度、湿度センサが乗っているので、これを使ってみようと思います。そして、インターネットにつながるという特徴を利用して、Twitterとの連携までやってみましょう。前回はIDEのセットアップとかんたんなコードのみを試しましたが、いよいよimpExplorerの本領であるDeviceとAgentの連携を行います。

Deviceとは、基板自体のことでした。Agentとはなんぞや、ということについてかんたんに説明すると、Deviceと他のインターネット上のサービスとの連携の中継を行う小さなサーバーのようなものです。データを他のサービスへ転用する場合、「センサからのデータの取得」「サービスのAPIを利用してデータを送信」というふたつのステップを踏まなければなりません。このような「ハードウエア周りの処理」と「インターネット周りの処理」の担当を分離することで、柔軟な設計ができるようになっています。詳しくは、Getting Started with the Electric Imp Platform(日本語)- エージェントと IoT アプリをご覧ください。

さて、Twitterと連携するにあたって、ちょうどGetting Started with the Electric Imp Platform(日本語版) - コードライブラリの実行準備に温度湿度気圧のやり取りができるサンプルコードがあります。なので、まずはこれをセットアップしてみましょう。これに関しては、上記セットアップを見ながら進めてください。

正しくセットアップができると、以下のようにツイートが投稿されます。

いかがでしょうか。ここまでセットアップが済めば、あとはもうすぐです。以下のコードをDeviceとAgentに転送してみましょう。もちろん、Twitterクライアントのトークンは自分のものに変更してください。

DeviceのコードはIDEの右側です。

#require "LIS3DH.class.nut:1.3.0"

function interruptHandler() {
    if (wakePin.read() == 0) return;
    
    // Get + clear the interrupt + clear
    local data = accel.getInterruptTable();

    // Check what kind of interrupt it was
    if (data.singleClick) {
        server.log("Single Click");
    }
    
    agent.send("interrpt.hande", data);
    server.sleepfor(1);
}

i2c <- hardware.i2cNM;
i2c.configure(CLOCK_SPEED_400_KHZ);
accel <- LIS3DH(i2c, 0x32);

// 割り込みピンの設定
wakePin <- hardware.pinR;
wakePin.configure(DIGITAL_IN_PULLDOWN, interruptHandler);

accel.init();
accel.setDataRate(100);

// 割り込みの有効化
accel.configureInterruptLatching(true);
accel.configureClickInterrupt(true, LIS3DH.SINGLE_CLICK);

AgentのコードはIDEの左側です。

// Import libraries
#require "Twitter.class.nut:1.2.1"

// Declare global variables
tweeter <- null;

// Define functions
function tweetback(data) {
    // This function is called after a Tweet is successfully posted
    server.log("Tweet tweeted");
    server.log(data.body);
}

function handle(data) {
    local random = math.rand();
    local message = format("interrupt from my Explorer Kit! %.2f", random);
    tweeter.tweet(message, tweetback);
    server.log(message);
}

// Instantiate the Twitter class - you'll need your own access credentials


// Register a function to receive sensor data from the device
device.on("interrpt.hande", handle);

IDEの画面はこのようになるはずです。

転送できたら、基板をちょいと叩いてあげましょう。以下のようなTweetが送られるはずです。

正しくTweetが送られることが確認できたでしょうか。

このコードは、基板上の加速度センサのタップ判定を利用して、タップが行われたときにAgentにそれを知らせ、AgentがTweetの文面を作成して実際に送信するという流れになっています。Twitterの仕様として、同じ文面は連続して投稿できないため文末に乱数を加えています。今回はTwitterライブラリを利用しましたが、利用できるライブラリは非常に多く、AmazonWebServiceやIFTTT、Azure IoT Hubなどのウェブサービスも利用できそうです。タップされたかどうかをTwitterに投稿するというシンプルな内容ですが、実際にArduinoなどを使って自分でゼロから組むのは結構大変ですので、impExplorerのプラットフォームとライブラリを利用すると色々ささっと作れそうだな、という雰囲気が伝わればと思います。

次回は、基板上にあるGroveコネクタに部品を接続して、基板上にないセンサの値を利用するなどをやってみようと思います。たのしみにしていてください。