マイクロビットを使ってみた(その3)

皆さんこんにちは!今回も引き続きマイクロビットを使った実験を行いましょう。前回の記事で書いたように今回はマイクロビットに搭載されたセンサーを使ってみたいと思います。必要な機材や開発環境の使い方は一回目の記事に、スイッチやLEDの使い方は二回目の記事に書いてありますのでそちらも参考にしてください。センサーはIoT機器においては主役と言って良いくらい重要なものです。例えば農業用のIoTでは温度、湿度、水分量など、工業用では振動、加速度、流量計、電圧、電流などを、乗り物ではジャイロセンサーや磁気センサーなどと、センシングの対象は様々です。それらを無線化すれば配線等に煩わされる事無くスマートに出来ます。但し注意しなくてはならない事も当然あります。こちらのページでは気にすべきポイントを紹介しています。

それではマイクロビットに搭載されたセンサーの使い方について説明して行きます。

実験

1.センサーを使う

それではマイクロビットに搭載されたセンサーについて説明します。

(1)温度センサー

温度センサーは独立して部品が有る訳では無く、マイコンチップに内蔵されています。”温度計”と言うほど正確な物ではありません。参考程度の精度です。また、無線モジュール.comで持っているマイクロビットのV1.5と、V2ではマイコンチップが異なるので精度も若干異なっています。保証値としてはV1.5に使われているマイコンで±4℃、V2に使われているマイコンでは±5℃の精度となっているようです。(細かい条件は色々有りますが。)ただ、実際に使ってみた感じでは室温で±1℃程度の感覚です。4℃とか5℃も狂う事は滅多に無いと思います。
で、温度センサーの使い方ですが超簡単です!以下にAボタンを押した時に温度を取得してLEDに(流れる文字で)表示させるプログラムを示します。

Aボタンを押すと温度を表示するプログラム
Aボタンを押すと温度を表示する(クリックで拡大)

左に示したプログラムがAボタンを押す毎に温度をLEDに表示してくれるプログラムです。プログラムがスタートするとハートマークのアイコンを点けてからボタンが押されるのを待つ状態に入ります。

ここでハートマークのアイコンを点けないと、何時からプログラムが始まったか判らないので目印として点けてます。ボタンが押されると直ちに温度が測られLEDに表示されます。単に「数を表示」の部品の中の”数”として”温度(℃)”を選べば良いだけです。この部品は「入力」のリストに有ります。

温度を見るのに「イチイチボタンを押すのは面倒だ」と、言う人には「ずっと」の部品を使って右の様にプログラムを作れば一定間隔毎に温度を知らせてくれます。(ここでは2秒ごと)

一定間隔で温度を表示するプログラム
一定間隔で温度を知らせてくれるプログラム(クリックで拡大)

この「数を表示」と言う部品にはチョット困った”クセ”が有ります。数字が二桁以上だと流れる文字で表示され、最後の桁が表示されるとその文字も流れて行ってLED上は何もなくなります。しかし表示させる数字が一桁だと、ずっとLED上に表示されたままになります。(シミュレーター上で温度を一桁に設定すると表示されたままになる事が確認出来ます。)人がボタンを押して温度を表示させる時は気にならないと思いますが、一定間隔で温度を表示させるようなプログラムの場合は何時更新されたのか、本当に更新されたのかが気になります。(例えば温度が6℃くらいで暫く続いたとすると、LED表示はずっと”6″が表示されたままなので、本当に動いているのか心配になります。)この心配を解消するために温度を表示した後、一定時間経ったら表示を消してしまいましょう。そうすれば同じ温度が続いたとしてもLEDが点いたり消えたりしているので動作している事が確認出来ます。(以下のプログラム)

一定間隔で温度を表示するプログラム(一桁表示対応版)
温度が一桁の時も表示が消えるプログラム(クリックで拡大)

左の様に温度を表示した後に一定時間だけ待ってから表示を消せば、温度が一桁の場合でも再測定の時の区切りが判りやすくなります。

さて、マイクロビットをIoTのセンサー用途に使いたいのであれば外部に温度のデータを出せると嬉しいですよね。マイクロビットはUSB経由でUART通信が出来ますので、TeraTermなどのPC用ターミナルソフトが有れば表示させる事が出来ます。
ターミナルソフトの端末設定、シリアルポート設定を以下の様に設定してください。(TeraTermの場合の設定です)
ちなみに、実験で使っているPCではポート番号がCOM5でしたがお使いの環境では何番になっているのか、(windowsの場合は)デバイスマネージャーを使って調べ、それぞれの環境に合わせて設定してください。

マイクロビット用のターミナルソフトの端末設定
端末設定(クリックで拡大)
マイクロビット用のターミナルソフトのシリアルポート設定
シリアルポート設定(クリックで拡大)

マイクロビット側のプログラムは以下の様に作ります。

ターミナルソフトに温度を表示する
ターミナルソフトに温度を表示する(クリックで拡大)

「最初だけ」の枠内でシリアル通信(UART通信)の設定を行います。シリアル通信の部品は、部品リストの「高度なブロック」の中に有ります。USB経由で通信を行いますので左図のとおりに設定してください。また、「ずっと」の枠内ではLEDへの表示が終わった後にUART経由で温度のデータを送っています。温度に続いて”deg.”と言う文字を送り、改行しています。

右がターミナルソフト(TeraTerm)に表示された結果です。LED上に表示された温度と同じものがターミナルソフト上にも表示されていると思います。

TeraTermに表示された温度
温度表示結果(クリックで拡大)

でもこのプログラムにはチョット落とし穴があります。「ずっと」の枠内で「温度(℃)」の長丸が二か所で使われています。このプログラムの書き方だと、それぞれの場所で温度をセンサーから取得してくる事になります。試しにLEDに温度の表示が出始めた頃に裏面のICを触ってみてください。手の熱でICが温まり、ターミナルソフトに表示される温度はLED上に表示された温度より高くなっていると思います。また、手を離すとICの温度が徐々に下がって来ますのでLED上の表示温度が高く、ターミナルソフトに表示される温度が低くなることもあります。一般的に温度は数秒の間に大きく変化する事は有りませんので滅多な事では違う温度が表示されることは有りませんが、気になる人も居るでしょう。と、言う事で改良したプログラムが以下のとおりです。

表示に温度ズレが生じないプログラム
温度表示がズレないプログラム(クリックで拡大)

そうです!変数を使えば良いですね。ココではまず温度を予め追加しておいた変数”X”に入れます。そしてLED上への表示もUART経由で表示する温度も”X”の値を使います。”X”の値は「ずっと」の最初で取得していますので、2秒後に「ずっと」の先頭に戻って「変数Xを(温度)にする」を実行する迄変わりません。

これでLED上の表示とターミナルソフトに表示される温度に差が出る事は原理的に無くなりました。また、簡単ですが温度データをUART経由でターミナルソフトに表示させる方法についても紹介しました。以上で温度センサーの紹介を終わります。

(2)磁気センサー(コンパス)

次に紹介するのは磁気センサーです。いわゆる方位を示すコンパスですね。マイクロビットには加速度センサーと磁気センサーが一体化したICが搭載されています。これを使って方角を知る事が出来ます。マイクロビットの向きと表示される方向の関係は以下の図のとおりとなっています。普通にマイクロビットを持って北に向くと0°です。南を向けば180°と言った感じです。

マイクロビットの向きと方角の関係
マイクロビットの向きと方角の関係(クリックで拡大)

使用に当たってはチョット注意が必要です。コンパスは地球の磁力(地磁気)を測定して方角を決めていますが、鉄筋/鉄骨コンクリートのビルや磁石を使った製品が近くに有ると正しく方角が表示されません。その点だけ記憶にとどめておいてください。ではAボタンを押したら方角を表示するプログラムを作ってみましょう。

Aボタンを押すと方角を表示するプログラム
Aボタンを押すと方角を表示する

左のプログラムがAボタンを押すと方角を表示するプログラムです。

先ほどのボタンを押すと温度を表示するプログラムの”温度”が”方角”に変わっただけです。方角が一桁の数字だったときにも表示が消える様にするため一定時間が経ったら消すようにする部品を追加しています。(理由は温度を表示するところで説明していますが、表示が更新されたことを明らかにするためです。)

この磁気センサーですが、使用状況によっては校正(正確さを増すために調整すること)が必要になります。基本的にはマイクロビット自身が校正が必要かどうかを判断し、必要な場合はLEDに「TILT TO FILL SCREEN」と言うメッセージを出してきますので、基板を傾けて点滅しているLEDを移動させて全てのLEDが点灯する様にします。すると「にっこり」のアイコンが表示され、校正が終了した事が判ります。また、校正は部品を使って意図的にさせる事も出来ます。電源を入れる度に校正をさせるプログラムを以下に示します。

右のプログラムが電源を入れる度にセンサーの校正を行うプログラムです。「コンパスを調整する」の、部品は「入力」の部品リストを押すと出てくる「・・・その他」のリストの中にあります。

Aボタンを押すと方角を表示するプログラム(CAL付き)
毎回校正を行うプログラム(クリックで拡大)

UARTを使ってPCのターミナルソフトに表示したければ、温度センサーの項目に有ったようにシリアル通信の部品を使って書き出せば同じように出来ます。(温度の代わりに方角を当てはめれば出来ます。)
オマケのプログラムをもう一つ。方位磁石の様に北側に矢印が向く様に作ったプログラムです。測定した方位と表示する矢印は以下の様な関係で作ります。

矢印の境界
測定した方位と表示する矢印の関係(クリックで拡大)

左の図が測定した方位と表示する矢印の関係です。何となく違和感があると思いますが、この様になる理由は以下のとおりです。
方位が90°の時は東側を向いている事になりますので、北は左側になります。よって北を示すには左向きの矢印を表示します。同様に270°が測定された時は西を向いているので、北は右方向になります。同様に考えると他の方向の矢印も絵のとおりの向きになります。

プログラム全体は以下のとおりです。どの向きの矢印を表示するのかを判断する部分で新しい使い方をしている部品があります。条件判断の部品です。二回目の記事では「もし」の後ろに続く条件式の内容に合っている場合の動作だけを書いていましたが今回は条件に合わなかった場合に「でなければもし」の方に動作が移ると言う使い方をしています。今回の場合は測定した方角の数値を条件として表示する矢印を決めています。このプログラムでは表示する方向が8方向有り、判断する文もその数だけ有るので長くなっています。「もし」を使った条件判断は測定した角度の大きい方から順に振り分けています。「もし」の後に続く条件式に当てはまる場合は「なら」の後に続く部品の動作を行い(今回は矢印の表示)、当てはまらない場合は「でなければもし」に動作が移り、再び条件判断を行います。最初の条件判断では方角が338°以上であれば上向き矢印を表示し、そうでない場合は「でなければもし」以下の判断文に動作が移って行きます。一つ目の「でなければもし」にも該当しなければ二つ目の「でなければもし」に、それでも該当しなければ更に下の「でなければもし」の方に移って行きます。
(注:方角の測定結果は1°単位なので判定する数字も1°単位にしています。)

矢印コンパス改良版
矢印で表すコンパスのプログラム(クリックで拡大)

「もし」の使い方を間違えると以下の様な動作になってしまいます。

間違ったプログラム
間違ったプログラム(クリックで拡大)

「もし」を単純に並べると、左の例の様にX=100だった時は全ての「もし」と条件が合ってしまうため、全ての表示が行われてしまいます。

正しいプログラムでは、何処か条件が合った所で指定の動作が行われ、その先の「でなければもし」の方に移行しないので残りの条件判断を通らず、間違った動作をしません。

正しいプログラム
正しいプログラム(クリックで拡大)

以上で磁気センサーの使い方に関する説明を終わります。引き続き、加速度センサーの説明をします。

(3)加速度センサー

先ほどの磁気センサーの中で触れましたが、マイクロビットの加速度センサーは磁気センサーと一体化しています。X,Y,Zの3軸の加速度センサーを持っていて、マイクロビットを水平に置くと、XとYのセンサーはゼロに、Zは(ほぼ)マイナス一杯の値を示します。初期状態では±2G(G:重力加速度)の範囲が測定できるようになっていて、測定値の単位はmG(ミリG)です。基板の右を下に向けるとXの値がプラスに、左を下に向けるとマイナスになります。Yは手前を下に向けるとプラスに、奥方向を下に向けるとマイナスになります。Zは基板を立てるとゼロに、基板を裏返すとプラスになります。図に示すと以下の様になります。

加速度計の計測方向
加速度センサーの計測方向(クリックで拡大)

加速度センサーの検知方向の説明です。上でも説明していますが、左図の様に基板の右を下に向けるとXの値がプラスに、手前を下に向けるとYの値が+になります。Z軸に関しては基板をひっくり返すとプラスの値になります。基板を立てた状態がゼロで、通常の持ちかた(LEDが上面)ではマイナスです。

基板の姿勢と加速度がどの様な関係にあるのか、実際に数値で見てみましょう。以下のプログラムはAボタンを押すとX軸の、Bボタンを押すとY軸の、AとBのボタンを同時に押すとZ軸の加速度を表示するプログラムです。

使っている部品は、もうお馴染みのものばかりですね。

ボタンを押すと加速度を表示
ボタンを押すと各軸の加速度を表示する(クリックで拡大)
加速度の連続表示
加速度の連続表示(クリックで拡大)

基板の姿勢と加速度の関係を連続的に見たい場合は左図のプログラムを使ってください。USB経由でX,Y,Z軸の加速度をPCのターミナルソフトに表示します。

上のプログラムを実行した例です。マイクロビットの基板は机の上に置いた状態ですがUSBケーブルが繋がっており、ある程度引っ張られていて傾いているのでXとYはゼロになっていません。(若干右下に傾いた状態です)Z軸に関しては-920~-930mGとなっていて、妥当な範囲でしょう。

加速度ターミナルソフト表示例
各軸の加速度をターミナルソフトに表示させた例(クリックで拡大)

センサーが有ると、これを使ってLEDを動かしてみたくなりますね。5×5のLEDをテーブルに見立て、点灯しているLEDをボールと見なして基板を傾けるとそちらの方へ転がって行くイメージのプログラムを紹介します。このプログラムでは、端まで行くとLEDはそこで止まりますが、ゲーム性を高める為、テーブルからはみ出したら負けにするとか、動き出す加速度の値を変えて難易度を調整するとか、LEDの更新周期をいじるとか色々なバリエーションが考えられます。変数はLEDの位置を示すXとY、一つ前のLEDの位置を示すX_oldとY_oldの4つを使っています。「予め変数を追加する...」で、作っておいてください。

加速度計ゲーム
加速度センサーを使ったゲーム(クリックで拡大)

マイクロビット購入時に入っているプログラムにも似たようなプログラムが有りますね。あのプログラムではLEDが点滅している所にうまくぶつけると次に進む様になっていました。興味が有れば皆さん自身でカスタマイズしてみてください。

さて、以上でセンサー類の紹介も大体終わりました。部品としては「傾斜」を測定したり「磁界」を測定したりする部品も有りますが、それぞれ加速度センサーと磁気センサーの出力の見方を変更しただけの物ですので似たような使い方が出来ます。その他としては基板の下に並んでいる端子からアナログ電圧を入力したりPWM(パルス幅変調)出力をしたりする事が出来ますが、外部に部品が必要になりますので一連の記事の最後の方で紹介したいと思います。別の機種になりますが、実験コラムの中の「TWELITEを使ってみた」(その1その2その3その4まで有ります)の中でアナログ入力やPWM出力について説明していますので、こちらも参考にしてみてください。

今回もサンプルプログラムを交えながらセンサー類の使い方について解説をしました。次回はチョット息抜きに簡単なゲームを紹介します。お楽しみに。

無線モジュール.comでは無線モジュールを利用した様々な提案・開発を行っております。こちらのページには無線化の際のヒントを載せています。

開発実績はこちらに掲載してあります。是非ご覧になってください。