投稿日

Nucleo(mbedマイコンボード)で開発を始める (HC-SR04 超音波 測距センサーを動かす)

先日行われたテクノロジー・カンファレンス “if-up 2017”では、IoTを体験いただくためのIoTお楽しみ袋という名のデバイスプレゼントがありました。本ブログでは Nucleo というマイコンボードの利用方法を解説します。

IoT でも利用できるマイコンボード Nucleo

ArduinoやRaspberry Piといったよく知られているデバイスの中に、STマイクロエレクトロニクス社の Nucleoシリーズのマイコンボード F411RE が入っていたのはご存知でしょうか?

こちらは ARM Cortex-M4 を搭載したマイコン(MCU)評価ボードです。

Nucleo F411RE

mbedが動いており、豊富にライブラリが揃っているので、実はArduino並みに使うことができるMCUなのですが、残念なことに日本語の情報が少ないこともあるため、開発方法からセンサー接続までをご案内します。

mbed(エムベッド) とは?

Arm 社が提供しているシングルボードマイコン、および、そのマイコンの開発環境を含めた全体を指します。

mbedの開発フロー

mbedが動くボードの開発フローは下記のとおりです。

必要なもの: モダンなブラウザと、それが動くPC

  1. mbed Compiler 上の「オンラインIDE」でコードを書き、オンラインでコンパイル、 .bin ファイルをダウンロードする
  2. mbedが動くボードをPCやmacにUSBで接続すると、USBドライブとして見えるので、そこに .bin ファイルをコピー

これだけです。なんということでしょう!

従来のマイコン開発を知っている方からすると、何が起こっているのかわからないくらいに環境が変わっています。開発環境のインストールとか不要です。もう一度言います、開発環境はブラウザだけです!

.bin ファイルのデプロイ方法と仕様

オンラインIDE上で コンパイル ボタンを押すと .bin ファイルがダウンロードできます

オンラインIDE > コンパイル

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

オンラインIDE > 新規

複数の .binファイル をデプロイした場合

最後にコピーが完了したファイルが動作対象になります。同じファイル名である必要はありません。ともかく最後にコピーが完了したファイルで動きます

オンラインIDEで、新規から開発する

それでは開発をしてみましょう。

オンラインIDEから新規開発をしようとすると、いくつかテンプレートが存在します。テンプレートを使った作業はいくつか紹介されているので、ここでは全くの新規から作る方法を紹介します

新規作成

オンラインIDEから 新規 を選びます

オンラインIDE > 新規

ダイアログは下記のとおりです。

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

下記の通りになります。

オンラインIDE

ライブラリをインポートする

次に mbedライブラリを読み込むようにします。このライブラリを読み込むことで mbed.h を通じて mbed の機能が利用できるようになります。

オンラインIDEから 右クリック > ライブラリのインポート… > ウィザードからインポート… を選びます。

オンラインIDE > 右クリック > ライブラリのインポート... > ウィザードからインポート...

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

オンラインIDE > 選択してインポート!

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

オンラインIDE > ライブラリ インポートダイアログ

下記の通りになります。

この手順はほかのライブラリ追加の時にも同じように使える方法です。ぜひとも覚えてください。

main.cpp を追加する

プログラムの起点となる main.cpp を追加すれば、mbed開発の最小構成になります。

オンラインIDEから 右クリック > 新しいファイル… を選びます。

オンラインIDE > 右クリック > 新しいファイル...

ダイアログは下記のとおりです

  • ファイル名: main.cpp
オンラインIDE > 右クリック > 新しいファイル... : ダイアログ

ここまでの作業で、mbed開発における最小構成が揃いました。

実際は mbed.h をinclude(取り込む)したり、main() 関数の実装をしていくこととなります。

オンラインIDE > 右クリック > 新しいファイル... : ダイアログ

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 です。

LED
Terminal

超音波測距センサー HC-SR04 を使う

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

完成図

回路

※F466RE となってますが、F411REでも同じです

コード

豊富なライブラリの中にHC-SR04のライブラリがありますので、それを利用します。

利用ライブラリ

Prabhu DesaiさんHCSR04 を使います

検索のときにはこんな感じで表示され、2番目でした。

Prabhu DesaiさんのHCSR04

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月 更新)