モダンOSのお砂場(23) Arm MbedでBBC micro:bitプログラミング

Joseph Halfmoon

今までJavaScript(実際にはTypeScript)環境にてプログラムしていたBBC micro:bitですが、C/C++環境への移行を考えております。移行先として、Arduino環境(別シリーズ)、Arm Mbed環境、Zephyrの3候補のうち、本シリーズではMbedとZephyrの2つをやってみる所存。まずはArm Mbed環境を調べてみました。

※「モダンOSのお砂場」投稿順Indexはこちら

BBC micro:bitのプログラミングのために Arm Mbed環境を使わせていただく最大のモチベーションは、英Lancaster大が作成しているらしい micro:bit用ライブラリがMbed向けだから、ということに他なりません。いままでMicrosoft MakeCode「ブロック」エディタの裏で動いていた micro:bit用のJavaScript(実際はTypeScript)処理系のランタイムも同じライブラリを元にしているみたい。そうであれば、

MakeCodeで書いたソフトをそのままC++化しやすい筈

という期待が大であります。

さて、Mbed環境ですが、まずは純正 Web上のIDEを使わせていただくことにいたしました。ローカルなIDEでもMbedのオブジェクトをビルドできますが、Web環境には以下の利点があります。

  • 開発環境のセットアップの手間がかからない
  • ビルドが速い
  • Arm社純正のコンパイラが使える

ブラウザでMbedコンパイラへアクセスすれば(要登録、無料)、MbedOSに対応している各種ボード向けのライブラリとツールチェーンが即座に使用できるようになります。ローカル環境でもPlatformIOのように必要なツールチェーンやライブラリを自動でダウンロードしてインストールしてくれるような便利なものがありますが、Web環境ではサーバ側に既に存在するものを使わせていただくだけなので即戦力。また、ビルドもユーザコードのコンパイル後は、既存のオブジェクトと即リンクのようです。ライブラリ等のコンパイルに時間のかかるローカル環境よりはるかに速いと思います(私の遅いロカールマシンとの比較ですが。)そして、Arm社純正のコンパイラ(多分昔のKeil)でのコンパイルです。比較対象になるのは無償の開発環境の場合、通常はGCCでしょうが、ことArmのコンパイルに関してはArm社純正コンパイラの方がコード効率が良いように思われます。ビルドサイズに制限のないArm純正コンパイラが無料で使えるのは魅力です。特にBBC micro:bitのようにメモリが比較的小さいマイコン向けには有効ではないかと思います。

欠点としてはローカルなIDEのようにデバッガと統合されていない点があります。が、デバッガ使いたくなったときには、Web IDEからローカル環境にユーザコードだけでなくOSやライブラリなどソース一式ダウンロードするパスがあるので、それを使って移行すれば良い、と。ただしその時には無償だとGNUのツールチェーンになると思います。

さて、久しぶり(何か月いや1年以上ぶり?)に Web上のArm Mbed Compiler のページを開いてみました。アカウント消えてないか心配しましたが、大丈夫でした。Arm社ありがとう。以下はすでにサンプルコードをビルドした後の画面ですが、Mbed CompilerのWeb画面を貼り付けておきます。

Mbed MicroBitMbedのWeb IDEにログインした後、最初にすべきなのは BBC micro:bit 「プラットフォーム」をプロジェクトに登録することです。

Development boards

のページから BBC micro:bitを選択して Select Boardしておかないとなりません。大量のボードがリストされますが、以下のようにフィルタをかければ BBC micro:bit が現れます。

Select Board BBC micro:bitここでお気づきでしょうが、上記で選択できるのは、

BBC:micro:bit v1.x系、Nordic nRF51搭載

です。残念ながら v2、Nordic nRF52搭載は選択肢にありません。また、上記の選択画面から入れるBBC micro:bitのページをみると “Mbed OS support”にリストされているのは

Mbed OS 2

のみです。現在 Mbed OSは 6 が最新版です。2はメモリに制限のある小さなデバイスに適するためか未だに使用可能ですが、現在主流と思われる 5/6 の機能からすると使えない機能が多いじゃないかと思います。 v2ボードがサポートされてない点、OS2しか使えない点は心にとめておく必要があります。

以下はBBC micro:bitの Select a Platform画面です。右上のSelect Platformボタンを押せば、既存のプロジェクトのターゲットをmicro:bitに向けることができます。BBC microbit Platform

「新規>新しいプログラムを作成」でプラットフォームに BBC micro:bitを指定すれば新たなプログラム開発に着手できます。その際、完全に空の状態から始めることもできますが、以下のような3つのテンプレート(サンプルプログラム、雛形)を選択することもできます。テンプレート選択すると必要なライブラリもビルドツーリー内に自動で準備してくれるのでとても楽です。SelectTemplate

A blinkly for the BBC micro:bit は、素のMbed環境向け

テンプレートの一番上に表示されている “A blinkly for the BBC micro:bit、”は、Mbed「標準の」ライブラリを使用するための、以下のヘッダをインクルードするミニマムのLチカ(micro:bitの5x5LEDマトリックスの左上隅をブリンク)のサンプルコードです。

#include "mbed.h"

Mbed OSの上に重なるレイヤが無いので、3つのテンプレートの中ではサイズ的にもっともコンパクトなオブジェクトが得られるのではないかと期待できます(実際には3番目のサンプルの方が微妙にコンパクトだった。)しかし、”mbed.h”ヘッダには micro:bit特有のライブラリ(英Lancaster大起源の「あれ」)は含まれないと思われます。また micro:bit特有のエッジコネクタのPIN名ではなく、”P0_13″のように直接nRF51の端子番号でプログラムする必要があります。

An example of how to ~は、micro:bit特有のレイヤ含む

2番目のテンプレートこそ、英Lancaster大のライブラリを含む環境だと思われます。

#include "MicroBit.h"
MicroBit uBit;

これから探っていきたいと思いますが、MicroBit型オブジェクトの中に使い慣れたMakeCodeのブロックと互換性のある関数群が含まれているようです。また、micro:bit特有のPIN名なども以下のような表記でサポートしており、MakeCodeからの移行がやりやすいのではないかと思われます。

MICROBIT_ID_IO_P0

当然ながらMicroBitオブジェクト内には各種のランタイムが含まれるためフットプリント的に大きくなるようです。先ほどの「素の」Mbed上のblinklyとこちらのサンプルではLEDを光らせるといっても単なる点滅と文字表示の違いがあります。それでもblinklyが15.2kBというFlashサイズであるのに比べ、こちらは63.6kBもあります。

3番目のテンプレートは、部分的にLancaster大ライブラリ使用

上記のように、フルのMicroBitオブジェクトが結構な容量を食うので、ライブラリを部分的に使うようにしたものが3番目のテンプレートのようです。サンプルはディスプレイ(マトリックスLED)のみ使用。こちらであると、機能は限定されますが、素のMbedに匹敵するサイズも可能なようです。

Bluetooth LEライブラリ

C/C++環境への移行のきっかけとなったBLEですが、BLE用のAPIライブラリがMbed内のmicro:bitのページから import できるようになっています。こちらもオリジナルはLancaster大ライブラリなんだと思います。ボタンを押せばお好みのビルドツリーに追加可能。

BLE_Lib

micro:bit上でのMbedに少しなれたら、上記のAPIを使ってC/C++環境でのBLEプログラミングに取り組みたいと思います。いつになるかや?

モダンOSのお砂場(22) FreeRTOS、ソフトウエアタイマAPIでワンショット へ戻る

モダンOSのお砂場(24) Mbedでmicro:bit、BLEペアリング成功への道 へ進む