温度センサーとBluetooh

 マイクロビットには温度センサーがあります。ただし、この温度はCPUの温度で外気温ではありません。実際の外気温よりもかなり高くなります。値を調整することもできますが、ここでは補正せずにそのまま使うことにします。最初に単純な温度を表示するプログラムを作成したら、次にリモートで温度を計測するプログラムを作成します。

 リモートでの計測方法ですが、マイクロビットはBluetooth (BLE)を使うことができますので、これを利用します。ちなみにシリアル通信もできるので、線を接続することで計測データをパソコンなどに保存しておくこともできます。

 なお、ここではパソコンを使って開発しますが、スマートフォンの場合はブラウザの代わりにアプリを使って開発できます。

LEDに温度を表示する

 最初に温度をLEDに表示するプログラムを作成します。開発のためのページを開きます。新規プロジェクトを作成して下さい。

・JavaScript用のブロックエディタ
https://makecode.microbit.org/

新規プロジェクトを作成すると図のような状態になります。

  • 新規プロジェクトの作成

    新規プロジェクトの作成

温度データは入力のカテゴリにあります。「入力」のカテゴリをクリックして表示される「温度」のブロックをクリックします。ブロックをクリックすると、ブロックが追加されます。ただし、温度ブロックは単体では使用できないためグレーで表示されます。

  • 入力カテゴリの「温度」をクリック

    入力カテゴリの「温度」をクリック

  • 「温度」のブロックが表示される

    「温度」のブロックが表示される

温度データを表示するにはLEDに数値として出力する必要があります。「基本」カテゴリにある「数を表示」ブロックを使えば数値をLEDに表示させることができます。ブロックを配置したら、図のように組み合わせていきます。

  • 基本カテゴリをクリックし、「数を表示」をクリックする
  • 基本カテゴリをクリックし、「数を表示」をクリックする
  • 基本カテゴリをクリックし、「数を表示」をクリックする

  • 表示された「数を表示ブロック」を、「ずっとブロック」に連結する
  • 表示された「数を表示ブロック」を、「ずっとブロック」に連結する
  • 表示された「数を表示ブロック」を、「ずっとブロック」に連結する

  • 「温度ブロック」をクリックし、「数を表示」ブロックに当てはめる
  • 「温度ブロック」をクリックし、「数を表示」ブロックに当てはめる
  • 「温度ブロック」をクリックし、「数を表示」ブロックに当てはめる

ブロックよりJavaScriptコードを書いた方が早い、という人はJavaScriptエディタに切り替えて以下のように入力しても構いません。

 basic.forever(() => {
     basic.showNumber(input.temperature())
 })

ブロック(もしくはコード)ができあがったら「ダウンロード」ボタンをクリックします。HEXファイルができるのでマイクロビットに転送します(参照:第1回 マイクロビットを使ってみよう micro:bit編)。プログラムが正しく動作すれば写真のように温度がLEDに表示されます。

  • 温度を表す数字が流れるようにLEDに表示されます

    温度を表す数字が流れるようにLEDに表示されます

無線通信機能を追加する

 無事に温度が表示されたら次は無線通信(Bluetooth)を使って離れた所にあるマイクロビットの温度を受信してみます。送信側と受信側にマイクロビットが必要なので最低2台必要になります。送信側1台で受信側が5台という組み合わせも可能です。

送信側マイクロビットプログラムの作成

 まず、送信側のプログラムから作成します。無線通信の場合、通信するためのグループ番号を決める必要があります。ここでは1番としました。このグループ番号の設定は「無線」のカテゴリにある「無線のグループを設定」ブロックになります。このブロックを最初だけのブロックの中に入れます。これで準備完了です。

  • 「無線カテゴリ」をクリック

    「無線カテゴリ」をクリック

  • 「無線のグループを設定」をクリック

    「無線のグループを設定」をクリック

  • 「最初だけ」ブロックに当てはめる

    「最初だけ」ブロックに当てはめる

次に温度を無線で送信します。数値を送信するには「無線」のカテゴリにある「無線で数値を送信」ブロックを配置します。温度は定期的にずっと送信する必要があるので「ずっと」のブロック内に「無線で数値を送信」ブロックを入れます。

  • 「無線で数値を送信」をクリック

    「無線で数値を送信」をクリック

  • 「ずっとブロック」に当てはめる

    「ずっとブロック」に当てはめる

次に送信するデータが0になっているので、これを温度に変えます。「入力」のカテゴリから「温度」のブロックを配置します。「温度」のブロックを「無線で数値を送信」の右側にある「0」の部分に入れます。

  • 「入力カテゴリ」の「温度」をクリック

    「入力カテゴリ」の「温度」をクリック

  • 入力カテゴリ」の「温度」をクリック

    「無線で数値を送信」ブロックに当てはめる

このままでも温度は送信されますが、送信データを見ることができません。そこでLEDにも温度データを表示します。さきほど作成した温度データの表示プログラムと同じように作ります。

  • 「基本カテゴリー」の「数を表示」をクリック

    「基本カテゴリー」の「数を表示」をクリック

  • 「ずっとブロック」に当てはめる

    「ずっとブロック」に当てはめる

  • 入力カテゴリ」から「温度」をクリック

    「入力カテゴリ」から「温度」をクリック

  • 「数を表示」に当てはめる

    「数を表示」に当てはめる

温度データは頻繁に送る必要はありません。ここでは5秒間隔で送信することにします。一定時間待つには「基本」のカテゴリにある「一時停止(ミリ秒)」ブロックを使います。図のようにブロックを配置します。

  • 「基本カテゴリ」の「一時停止(ミリ秒)」をクリック

    「基本カテゴリ」の「一時停止(ミリ秒)」をクリック

  • 「ずっとブロック」に当てはめる

    「ずっとブロック」に当てはめる

ブロックでなくJavaScriptコードの場合、以下のようになります。

 radio.setGroup(1)
 basic.forever(() => {
     radio.sendNumber(input.temperature())
     basic.showNumber(input.temperature())
     basic.pause(5000)
 })

さて、できあがったプログラムをマイクロビットに転送して動作を確認します。LEDに温度が表示されていれば、とりあえず動作はしています。受信側で正常に温度が受信できるまでは本当に動作しているかどうかは定かではありません。

受信側のマイクロビットのプログラムの作成

次に受信側のプログラムを作成します。受信側も送信側と同じグループ番号を設定します。なお、すでに他のマイクロビットが稼働しグループ番号が重複している場合はうまく動作しません。この場合、異なる番号を割り当ててください。

  • 新規作成画面

    新規作成画面

  • 「無線カテゴリ」から「無線のグループ設定」をクリック

    「無線カテゴリ」から「無線のグループ設定」をクリック

  • 送信側で作成したプログラムと同じ番号に設定する。ここでは「1」のまま

    送信側で作成したプログラムと同じ番号に設定する。ここでは「1」のまま

次に無線で温度データを潤したらLEDに温度を表示する部分を作成します。「無線」カテゴリから「無線で受信したとき receivedNumber」ブロックを配置します。

  • 「無線で受信したとき receiveNumber」をクリックすると

    「無線で受信したとき receiveNumber」をクリックすると

  • 「無線で受信したとき receiveNumber」ブロックが表示される

    「無線で受信したとき receiveNumber」ブロックが表示される

次に受信した温度をLEDに表示します。「基本」ブロックから「数を表示」ブロックを配置します。このブロックを「無線で受信したとき receivedNumber」ブロックの中に入れます。

  • 「数を表示ブロック」をクリックし、

    「数を表示ブロック」をクリックし、

  • 「無線で受信したとき receiveNumber」に当てはめる

    「無線で受信したとき receiveNumber」に当てはめる

あとは受信した温度データを「数を表示」ブロックに渡します。「変数」のカテゴリにある「receivedNumber」ブロックを配置します。このブロックを「数を表示」ブロックに入れ込みます。

  • 「変数カテゴリ」の「receiveNumber」をクリック

    「変数カテゴリ」の「receiveNumber」をクリック

  • 「数を表示ブロック」の数値と入れ替える

    「数を表示ブロック」の数値と入れ替える

 これで受信側はできあがりです。JavaScriptプログラムで示すと以下のようになります。プログラマの場合、ブロックエディタを使うよりもJavaScriptエディタで入力した方が早いかもしれません。

 radio.onDataPacketReceived( ({ receivedNumber }) =>  {
     basic.showNumber(receivedNumber)
 })
 radio.setGroup(1)
 basic.forever(() => {

 })

あとは、受信側のマイクロビットにプログラムを転送します。温度を受信できればLEDに値が表示されます。

  • 左側が受信側で右側が送信側

    左側が受信側で右側が送信側

無線通信はBluetooth (BLE) なので、あまり遠くまで電波は届きませんが、離れたところの情報を手軽に送信できるのは便利でしょう。

著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。
著者サイト:http://www.openspc2.org/