先日行われたテクノロジー・カンファレンス “if-up 2017”では、IoTを体験いただくためのIoTお楽しみ袋という名のデバイスプレゼントがありました。本ブログでは Nucleo というマイコンボードの利用方法を解説します。
IoT でも利用できるマイコンボード Nucleo
ArduinoやRaspberry Piといったよく知られているデバイスの中に、STマイクロエレクトロニクス社の Nucleoシリーズのマイコンボード F411RE が入っていたのはご存知でしょうか?
こちらは ARM Cortex-M4 を搭載したマイコン(MCU)評価ボードです。

mbedが動いており、豊富にライブラリが揃っているので、実はArduino並みに使うことができるMCUなのですが、残念なことに日本語の情報が少ないこともあるため、開発方法からセンサー接続までをご案内します。
mbed(エムベッド) とは?
Arm 社が提供しているシングルボードマイコン、および、そのマイコンの開発環境を含めた全体を指します。
mbedの開発フロー
mbedが動くボードの開発フローは下記のとおりです。
必要なもの: モダンなブラウザと、それが動くPC
- mbed Compiler 上の「オンラインIDE」でコードを書き、オンラインでコンパイル、
.bin
ファイルをダウンロードする - mbedが動くボードをPCやmacにUSBで接続すると、USBドライブとして見えるので、そこに
.bin
ファイルをコピー
これだけです。なんということでしょう!
従来のマイコン開発を知っている方からすると、何が起こっているのかわからないくらいに環境が変わっています。開発環境のインストールとか不要です。もう一度言います、開発環境はブラウザだけです!
.bin
ファイルのデプロイ方法と仕様
オンラインIDE上で コンパイル ボタンを押すと .bin
ファイルがダウンロードできます

これを mbedが動くボードにコピーしますが、下記の通りUSBドライブとして見えるので、そこにコピーするだけでデプロイ完了です
コピーが終わり次第mbedボードのリセットが行われ、新しい .bin
の内容で動き始めます

複数の .bin
ファイル をデプロイした場合
最後にコピーが完了したファイルが動作対象になります。同じファイル名である必要はありません。ともかく最後にコピーが完了したファイルで動きます
オンラインIDEで、新規から開発する
それでは開発をしてみましょう。
オンラインIDEから新規開発をしようとすると、いくつかテンプレートが存在します。テンプレートを使った作業はいくつか紹介されているので、ここでは全くの新規から作る方法を紹介します
新規作成
オンラインIDEから 新規 を選びます

ダイアログは下記のとおりです。
- プラットフォーム: NUCLEO-F411RE (画面は F446RE となっていますが同じ手順で進められます)
- テンプレート: 空のプログラム
- プログラム名: 任意 (今回は my_first_mbed としました)

下記の通りになります。

ライブラリをインポートする
次に mbedライブラリを読み込むようにします。このライブラリを読み込むことで mbed.h
を通じて mbed の機能が利用できるようになります。
オンラインIDEから 右クリック > ライブラリのインポート… > ウィザードからインポート… を選びます。

検索画面から mbed で探します。するとリストに mbed がでてくるので、選択した状態で インポート! をクリックします。

ライブラリのインポートダイアログは、特に変更することなく Import をクリックしてください。

下記の通りになります。

この手順はほかのライブラリ追加の時にも同じように使える方法です。ぜひとも覚えてください。
main.cpp
を追加する
プログラムの起点となる main.cpp
を追加すれば、mbed開発の最小構成になります。
オンラインIDEから 右クリック > 新しいファイル… を選びます。

ダイアログは下記のとおりです
- ファイル名: main.cpp

ここまでの作業で、mbed開発における最小構成が揃いました。
実際は mbed.h
をinclude(取り込む)したり、main()
関数の実装をしていくこととなります。

LED の点滅と Uptime カウントを行うプログラム
1秒毎に LED の点灯/消灯を行いつつ、PCのシリアルコンソールに起動してからの時間(Uptime)をカウントするプログラムです。
main.cpp
#include "mbed.h"
Serial pc(USBTX, USBRX);
DigitalOut myled(LED1);
int main()
{
int i = 1;
pc.baud(115200);
pc.printf("Hello World !\r\n");
while(1) {
wait(1);
pc.printf("This program runs since %d seconds.\r\n", i++);
myled = !myled;
}
}
成功すれば、オンボードのLEDが点滅し始め、PCに接続したシリアルポートにはカウントが表示されます。
※ PCとのシリアルスピードは 115200 となります。 pc.baud(115200);
で指定しなかった場合(標準)は 9600 です。


超音波測距センサー HC-SR04 を使う
超音波測距センサー HC-SR04 と mbedボードを接続してみましょう。

回路

※F466RE となってますが、F411REでも同じです
コード
豊富なライブラリの中にHC-SR04のライブラリがありますので、それを利用します。
利用ライブラリ
Prabhu DesaiさんのHCSR04 を使います
検索のときにはこんな感じで表示され、2番目でした。

main.cpp
#include "mbed.h"
#include "hcsr04.h"
Serial pc(USBTX, USBRX);
DigitalOut myled(LED1);
HCSR04 usensor(D4, D6); // Trigger(DO), Echo(PWMIN)
int main()
{
pc.baud(115200);
pc.printf("Start!\r\n");
while(1) {
usensor.start();
wait_ms(500);
unsigned int dist = usensor.get_dist_cm();
pc.printf("cm:%ld\r\n", dist );
myled = !myled;
wait(1);
}
}
- LEDは動作の確認のために点滅させています。
- 変数
dist
に距離が格納されます。
実行結果
シリアルポートに下記のように表示されます
Start!
cm:28
cm:29
cm:28
cm:29
cm:37
cm:37
cm:37
cm:37
cm:24
cm:24
あとがき
Nucleo(mbed)ボードはいろいろなサイズ・スペックで種類が多いです。基本的には同じコードが動くので、消費電力やI/Fのといった用途に合わせたボードが選べるのが魅力です。また、Arduinoで使えるセンサーは、Nucleoボードでも使うことができるため、今回のように通信機能を持たせて IoT 開発にも利用できます。
日本語情報が少ないmbedではありますが、とても素直なC++のコードで書くことができるため、敷居はかなり下がるかと思います。私のように、いまだにポインタを理解していないような人でもライブラリを駆使すればセンサーの制御ができるようになりますので、せっかくのmbedボード、ぜひトライしてみてください!
― ソラコム “Max” 松下 (2020年9月 更新)