どこが「IoTデバイス開発プラットフォーム」なのか

今回は、MbedがIoTデバイス開発プラットフォームとして使えることを記して行きたいと思います。皆さんご存じのようにIoTは、「Internet of Things」ということで「モノのインターネット」等と訳されています。これは単に「モノがインターネットに繋がる」ということを指すのではなく、「モノがインターネットのように繋がる」つまり相互に繋がることを意味していると言えるでしょう。

さておき、「IoTデバイス開発プラットフォーム」と述べるからには、まずはIP(Internet Protocol)を扱えることが前提と言えるでしょう。

筆者がMbedを使い始めた理由は、インターネットにネイティブに接続できるマイコンボードが欲しかったからです。その頃の筆者は、中学生の頃にZ80を触って以来15年以上のブランクを経て、Arduinoを使い始めたところでした。

その頃、ArduinoをIPネットワークに接続するには、IPスタックをハードウェアで実装したW5100というチップを使う事が一般的でした。つまり、IPの処理は開発ターゲットのマイコンで行われるのではなく、W5100にオフロードしています。専用チップにオフロードすることによってATmega328Pのようにメモリが1KBの8ビットマイコンでもIPのハンドリングができますが、この方法には一定の問題も存在します。

ハードウェア実装されている場合プロトコルスタックのアップデートができないといった問題がまず思い当たります。必要なプロトコルや処理の実装が無ければ、やはり開発ターゲットのマイコンに実装を行わなければなりません。また、実装があったとしても、オフロードしている処理を確認するようなデバッグは非常に難しくなります。こういったことから、マイコンでプロトコルスタックを実行する設計で、イーサネットインターフェースが付いていたmbed LPC1768を筆者は使い始めました。

図mbed LPC1768をイーサネットに接続してみたところ

写真は、筆者が2010年にmbed LPC1768をイーサネットに接続してHTTPでテキストファイルを読み取り、テキストファイルの内容を表示してみたところです。イーサネットの信号線をジャンパワイヤでRJ-45コネクタに繋いでいますが、このように雑に接続をしても通信できるということに驚いた記憶があります。

IPスタック

前回も紹介をしましたが、Mbed OSにはIPスタックが組み込まれています。組み込まれているIPスタックは、組み込み用途のIPスタックとして有名なlwIPと、Nanostackです。Mbed OSにはNetwork socket APIがあり、このAPIがIPコネクティビティを抽象化しています。

図【出典:IP networking

Network socket API(NSAPI)は比較的近年追加されたインターフェースですので、アプリケーションレイヤのライブラリの対応状況は限定的です。しかし例えばIoTで頻繁に用いられるMQTT(Message Queuing Telemetry Transport)のライブラリとサンプルプログラムであるHelloMQTTや、Mbed CloudのクライアントであるMbed Cloud Clientとサンプルプログラムであるmbed-cloud-client-exampleなどはNSAPIに対応しています。

また、ネットワーク接続のセキュリティとして、TLS(Transport Layer Security)が暗号化だけでなくデバイスの認証手段としてよく使われています。TLSもプロトコルスタックをオフロードせずにマイコンで実行することで、より柔軟な運用が可能なプロトコルです。MbedのTLS実装として、mbed TLSがあります。mbed TLSについては、次回、詳しく記したいと思います。

Driver API

ネットワークに接続するモノ(センサーやアクチュエーター)はMbedでどのように取り扱うのでしょう。こういったI/Oは、Driver APIとして提供されています。Driver APIはデジタルやアナログ入出力に対応していて、これによる抽象化によってMbed対応マイコン非依存のコードが書けるようになっています(もちろん、開発ターゲットのマイコンにアナログ入出力ペリフェラルが無かったりすると実装できませんが…)。

このDriver APIの存在により、マイコンのデータシートやサンプルコードを読んでI²Cの操作方法を学習することなく、次の様なコードを書くだけでI²Cで接続したLM75Bの値を読むことができます。

#include "mbed.h"

I2C i2c(I2C_SDA , I2C_SCL); 

const int addr7bit = 0x48;      // 7 bit I2C address
const int addr8bit = 0x48 << 1; // 8bit I2C address, 0x90

int main()
{
    char cmd[2];
    while (1) {
        cmd[0] = 0x01;
        cmd[1] = 0x00;
        i2c.write(addr8bit, cmd, 2);
 
        wait(0.5);
 
        cmd[0] = 0x00;
        i2c.write(addr8bit, cmd, 1);
        i2c.read( addr8bit, cmd, 2);
 
        float tmp = (float((cmd[0]<<8)|cmd[1]) / 256.0);
        printf("Temp = %.2f\n", tmp);
    }
}
					

このようなHAL (Hardware Abstract Layer)の実装がある点が、Mbed OSが他のRTOSよりも便利である点の一つです。このコードを他のMbed OSがサポートするマイコンに移植するときに必要になる書き換えは、ほとんどの場合、3行目のピン名を記述しているところくらいでしょう。なお、このピン名は多くのMbed enabledなボードに存在する定義ですので、書き換える必要すらないかもしれません。

Components

Driver APIでは入出力を直接扱いましたが、センサーなど部品(Components)ごとに、ライブラリ(ドライバ)が存在しています。例えば上記のLM75Bのライブラリは、LM75B Temperature Sensorというページに登録されており、同じくここで公開されている次のようなコードを書くことで値を読み取ることができます。

#include "mbed.h"
#include "LM75B.h"
 
LM75B sensor(I2C_SDA , I2C_SCL);
 
int main()
{
    if (sensor.open()) {
        printf("Device detected!\n");
 
        while (1) {
            printf("Temp = %.3f\n", (float)sensor);
 
            wait(0.5);
        }
    } else {
        error("Device not detected!\n");
    }
}
					

ライブラリを使うコードでは、Driver APIの項のコードのようにI²Cのデータ転送が直接記述されていないことが確認できます。このようにライブラリを使えば、センサのデータシートを熟読することなく、簡単にセンサを動かしてみることができます。

ただし、ライブラリの多くは他のMbedユーザーが作ったものを公開してコントリビュート(貢献)しているものです。ですので、意図されたように動かないなど品質に問題があることもあります。そういったコードを見つけたら、ぜひ修正したコードをPull Requestして、品質の向上で貢献して貰えればと思います。もし、元著者がアクティブに活動していないなどの理由でPull Requestが処理されない場合は、Componentsのページを編集して、修正コードのほうを紹介するように変更するのも手でしょう。

使いたい部品のライブラリが無い場合は、Tedd OKANOさんが書いた「ライブラリ・コンポーネントの作りかた」というページが参考になります。これを公開するときには、同氏の書いた「より使ってもらいやすいコンポーネント・ライブラリにするためには」という記事も参考になります。

RTOS

意見が分かれるところでしょうが、IoTのエンドノードのように通信をするアプリケーションは非同期処理、つまりマルチスレッドプログラミングをすることも多いでしょう。スレッドはMbed OSの中心コンポーネントで、RTOS APIはスレッドの生成やデストラクションをハンドルします。Mbed OSのRTOSはCMSIS-RTOS RTXで、商用コンパイラのKeil MDK-ARMにも標準搭載されているなど実績も十分です。

デバイス管理

数台の試作ならともかく、IoTを実際に展開しようとすると必要になってくるのはデバイス管理です。センサノードそれぞれのプロビジョニングや展開後のアップデートといったデバイスのライフサイクル管理はPelion Device Managementで提供されています。Pelion Device Managementは、以前まではMbed Cloudという名前でしたが、つい先日発表されたArm Pelion IoT Platformの一部という位置づけになりました。Pelionやデバイス管理については、次々回で詳しく述べたいと思います。

まとめ

このように、Mbed OSはIPスタック、規格化されたI/O、マルチスレッドプログラミング、またデバイス管理とIoTのエンドノードを開発するのに必要な機能全てが揃っています。また、オープンソースソフトウェアであり、多くはApach 2.0ライセンスと商用プロジェクトに使用するのに都合のよいライセンスで配布されています。

さらには、コンパイラとしてGCCだけでなく、armccとIARのEWARMといったArm向けの主要な商用コンパイラにも対応しており、デバッグも行えるとビジネスに必要な機能が揃っていると言えるでしょう。