おまけ (mbedを始めましょう!("Let's get started!" in Japnaese))

このノートブックページは日本でのmbed普及加速を目的にまとめたものです.

This notebook page has been written in Japanese only.

mbedを始めましょう! * おまけ編 *

このページは本編『mbedを始めましょう!("Let's get started!" in Japnaese)』のオマケです. mbedチームのスタッフによるデモのネタの紹介です.

0. 準備

本編ではpin20に入力したアナログ値でLEDの点灯/消灯を制御してみました.ここではそれをもう一歩進めて入力された値のログを取ってみます.

コード全体

#include "mbed.h"

LocalFileSystem local("local");
AnalogIn myinput(p20);
DigitalOut myled(LED4);

int main() {
    FILE *fp;

    if ( NULL == (fp = fopen( "/local/test.csv", "w" )) )
        error( "" );

    myled   = 1;

    for ( int i = 0; i < 100; i++ ) {
        fprintf( fp, "%f\n", (float)myinput );
        wait( 0.1 );
    }

    fclose( fp );
    myled   = 0;
}
  • LocalFileSystemを使うとPCからアクセスできるmbedのストレージに,mbed自身からアクセスできます.LocalFileSystemのインスタンスを"local"の名前で宣言します.
    LocalFileSystem local("local"); 
  • ファイルは「/local/」の下のファイルとしてをオープンできます.ここではファイルの名前を「test.csv」とするので次のようにオープンします.
    fp = fopen( "/local/test.csv", "w" )
  • オープンできなかった場合はerror()関数を呼んで,LED1と4,LED2と3を交互に点滅させるようにしています.
    error( "" ); 
  • ファイルがオープンできたらLED4を点灯させ記録中であることを示します.記録は100回,0.1秒ごとに行ないます.
    for ( int i = 0; i < 100; i++ ) {
        fprintf( fp, "%f\n", (float)myinput );  pin20の値をファイルに書き出す
        wait( 0.1 );  //  0.1 秒待つ
    }
  • あとはファイルをクローズしてLEDを消灯します.
  • fclose( fp );
    myled   = 0;

1. 実行

コンパイルができたら実行してみましょう.ダウンロードしたファイルをmbedにコピーして,リセットボタンを押します.LED4が点灯して記録中であることをしめします.

mbedでファイルをオープンしている間は,PCからはメディアが排出されたリムーバブル・ドライブとして見えるため,マウントが解除されます.mbedは,自身のローカル・ストレージをオープンするときには,それをPCから切り離すことで排他処理を実現しているためです.ファイルをクローズすると再マウントされます.
ファイルをオープンしたままになってしまったような場合は,mbedのリセットボタンを「押した状態に保つ」ことによりマウントできるようになります.
Mac OS Xでは,mbedがローカルのファイルをオープンしたとき「ディスクを正しく取り出せませんでした」のアラートが出ます.これはリムーバブルディスクとしてマウントされていたmbedが取り出されたように見えてしまうためです.ファイルをクローズすると再マウントされます.

記録中にpin20を触ってみる (^^; など,電圧を変化させてみましょう.

記録が終わるとLED4が消灯し,mbedの中に"TEST.CSV"という名のファイルができています.

2. 結果を見る

"TEST.CSV"ファイルを開いてみましょう.使っているPCに表計算ソフトが入っていれば,"TEST.CSV"のダブルクリックでそれが開くと思います.

表計算ソフトが開くと,記録した値が表として表示されます.この値を全て選択しておいてグラフ化ボタンを押すと,記録した期間のpin20の電圧の変化をグラフとして見ることができます.

表計算ソフトがなくてもgnuplotなどのグラフ描画ソフトを用いて同様のことが可能です.

3. この他

この例では,読んだ値をストレージに記録,表計算ソフトでグラフを書かせてみました.さらにこれより面白いmbedのネット機能を利用した例をShinichiro Nakamuraさんが☆ボード・オレンジの活用事例(Twitterを利用した高機能ロガーの例)として公開しています.こちらもあわせてご覧ください.

mbedローカル・ストレージの他にもSDカードやUSBメモリ上のファイル・アクセスも可能です.より大きな容量が必要な場合は,このような記憶装置が使えます.


5 comments

16 Aug 2010

ようやくmbedの使い道がわかってきました。ありがとうございます。

ところでこのサンプルプログラムの実行中にmbedを強制停止させる方法はあるのでしょうか?

ローカルストレージを使うプログラムでwhile(1){fprint(fp);}のようなループをついうっかり走らせてしまった状態からの復旧方法を探しています。

16 Aug 2010

リセットボタン押下げ以外の方法とことであれば,何らかのコードを書かねばならないでしょう.

たとえばwhileのループ条件をフラグにしておいて割り込みやタイマなどで抜けてくるような方法が必要かもしれません.

17 Aug 2010

ありがとうございます。あらかじめコーディングで対処していない限り、ローカルストレージは誤用で大事なmbedをお釈迦にするリスクがありそうですね。同じくらい簡単にSDを使うことができるのだし、ローカルストレージの容量も考えると、記録はSDなりUSBなりの外部メディアを使うのが本道、ローカルストレージ機能はあくまで裏技程度に考えておくことにします。

「お釈迦にする」というほどでは無いと思います.このページの本文中に追記した通り,ファイルをオープンしたままの状態に陥ったとしても,リセットボタンを押した状態を保つことによってmbedをPCにマウントさせることができます.この状態でLED点滅プログラムをコピーしてやったり,mbed中のファイルを全て消去すれば元に戻ります(MBED.HTM)ファイルは消去しても電源再投入で復帰します).

19 Aug 2010

なるほど。たしかにマウントできました。これで一安心。人の話はよく読まなきゃいけませんね^^;反省。

You need to log in to post a comment