SORACOM Blog

ソラコムの最新情報をお届けします

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

先日行われたテクノロジー・カンファレンス “if-up 2017”では、IoTを体験いただくためのIoTお楽しみ袋という名のデバイスプレゼントがありました

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

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

Nucleo F411RE

mbedが動いており、豊富にライブラリが揃っているので、実はArduino並みに使うことができるMCUなのですが、、、残念なことに日本語の情報が少ない!!

ということで、こちらではゴールデンウィークの宿題時間つぶしとして、Nucleoボードの使い方を学んでみませんか?

mbed開発フローのおさらい

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

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

  1. https://developer.mbed.org/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 のライブラリが読み込まれておらず、何もできないので、次の作業でそれを行います

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

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

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

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

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

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

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

若干待たされますが、下記の通りになります

オンラインIDE

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

最後に main.cpp を追加すれば、mbed開発の最小構成になります。 main.cpp を追加しましょう

main.cpp を追加する

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

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

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

  • ファイル名: main.cpp

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

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

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

テンプレート = “Display a message on PC using UART” と同等にしてみる

テンプレート “Display a message on PC using UART” と同じコードを使って、コンパイルしてみましょう

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "mbed.h"

Serial pc(SERIAL_TX, SERIAL_RX);

DigitalOut myled(LED1);

int main()
{
    int i = 1;
    pc.printf("Hello World !\r\n");
    while(1) {
        wait(1);
        pc.printf("This program runs since %d seconds.\r\n", i++);
        myled = !myled;
    }
}

※オリジナルからの変更点:改行コードが \n だけだと、表示が崩れる可能性があるので \r\n としました

成功すれば、オンボードのLEDが点滅し始め、PCに接続したシリアルポートにはカウントが表示されます

LED

Terminal

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

超音波測距センサー HC-SR04 と mbedボードを接続してみましょう! こんな感じになります

完成図

回路

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

コード

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

利用ライブラリ

Prabhu DesaiさんHCSR04 を使います

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

Prabhu DesaiさんのHCSR04

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "mbed.h"
#include "hcsr04.h"

Serial pc(SERIAL_TX, SERIAL_RX);
HCSR04 usensor(D4, D6); // Trigger(DO), Echo(PWMIN)

DigitalOut myled(LED1);

int main()
{
    pc.printf("Start!\n\r");
    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 に距離が格納されます

実行結果

シリアルポートに下記のように表示されます

1
2
3
4
5
6
7
8
9
10
11
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のといった用途に合わせたボードが選べるのが魅力です

http://akizukidenshi.com/catalog/goods/search.aspx?search=x&keyword=nucleo&image=%8C%9F%8D%F5

また、Arduinoで使えるセンサーは、Nucleoボードでも使うことができます 日本語情報が少ないmbedではありますが、とても素直なC++のコードで書くことができるため、敷居はかなり下がるかと思います 私のように、いまだにポインタを理解していないような人でもライブラリを駆使すればセンサーの制御ができるようになりますので、せっかくのmbedボード、ぜひトライしてみていただきたいと思います!

ソラコム 松下