前回とは別のセンサを用いて、異なる通信インターフェースでのセンサの読み取りに取り組みます。また、プロトタイピング用のモジュールを使用して、配線作業をより簡単に行います。
ブレッドボード上でのXBee Explorerモジュールの代わりに、図1に示すような、XBee Grove Development Boardを使用します。この基板はXBeeモジュールを取り付けて使用しますが、基板上に6つのGroveコネクタ、ボタンスイッチやLEDなどが実装されています。この基板についての詳細はDigiインターナショナル社のwebページにある資料をご覧ください。
図1 XBee Grove Development Board
Groveは、Seeed Studio社によって作られたプロトタイピング用のプラットフォームで、4線式のコネクタを使って各デバイスを簡単に接続できるように設計されています。対応する様々な電子部品・デバイスを活用することで、素早く簡単に電子回路が組み立てられます。Groveシステムについて詳細は、Seeed StudioのWikiを参照してください。
ここでは、温度・大気圧センサのBMP280を使用します。Groveモジュールとして発売されていますが、もしも手に入らなければ同じBMP280というセンサを使用したモジュールであれば同じように使用できます。センサそのものは非常に小さいものなので、センサそのものではなくセンサをいくつかの電子部品とともに小さな基板に取り付けた「モジュール」を使用します。
詳しくは文末の「使用したパーツのリスト」欄にまとめておきました。
図2 BMP280モジュールの例(Groveではありません)
このセンサは、7ビットのアドレス指定が可能なI2C(Inter-Integrated Circuit)インターフェースを使用しています。電源、GND、クロック信号線(SCL)、データ信号線(SDA)の4本の電線を接続することでセンサが動作します。
I2Cインターフェースはそれぞれのパーツがアドレスを持っているため、1組のバス(信号線のまとまり)に複数のデバイスを接続して、個別に制御する、データを読み書きするといった使い方ができます。ただし、同じI2Cインターフェースで動作するとはいえ、各デバイスはそれぞれの通信プロトコルで動作するため、デバイスを動作させるためには専用のライブラリ(ドライバとも呼ばれる)が必要になります。
温度・大気圧センサBMP280については、MicroPythonで動作させるために必要なライブラリが公開されているため、ダウンロードしてXBeeモジュールに書き込んで使用します。
ハードウェアの設定
この例でのハードウェアのセットアップは、これまでよりも簡単です。
XBee Grove Development Board、BMP280センサモジュール、Groveのジャンパーケーブルを用意します。
用意したBMP280モジュールにピンヘッダがはんだ付けされていない場合、はんだ付けしておいてください。
センサのXBeeモジュールへの接続は、先述の通りI2Cインターフェースで行います。BMP280 自体はSPIインターフェースにも対応していることから、モジュールによってはSPI用のピンヘッダが付いているものもありますので注意してください。
また、XBee Grove Development Boardの基板が斜めにカットされた側を上に置いて表から見たとき、一番右上のGroveコネクタを使用します。
以下、接続例をいくつか示します 。まだ、XBeeモジュールを取り付けたり、PCに接続したりはしないでください。
Grove BMP280モジュール
BMP280 Groveモジュールを使用する場合、図3のようにGroveケーブルを使用して接続するだけで準備が完了します。
図3 BMP280 Groveモジュールを使用する場合
BMP280モジュール+Groveブレイクアウトケーブル
GroveモジュールではないBMP280モジュールを使用する場合、Groveブレイクアウトケーブルを使用すると作業が簡単になります。これは、ケーブルの一方がGroveコネクタ、もう一方がジャンプワイヤーのメス端子になったケーブルです。(Groveコネクタとジャンプワイヤーのオス端子になったものもあります。)
Groveコネクタ側をXBee Grove Development BoardのGroveコネクタに、反対側をBMP280モジュールに接続します。図4に一例を示しますが、使用するモジュールによってピンの並びは異なります。XBee Grove Development Boardとモジュールそれぞれで信号線が一致するように接続してください。
図4 Groveブレイクアウトケーブルを使用する場合
ジャンプワイヤーを使用する
通常のジャンプワイヤーでも接続できますが、この場合にはGroveコネクタを2つ使用します。Groveコネクタのピン間隔がブレッドボード等よりも狭いため、1つのコネクタに4本分のジャンプワイヤーを接続できないためです。
図5 ジャンプワイヤーを使用する場合
センサノードの設定
センサノードとして使用するXBeeモジュールは、APIファームウェアが書き込まれた、エンドデバイスかルーターで、MicroPythonが実行できるよう設定して使用します。
XBee Grove Development BoardにXBeeモジュールをセットし、USBケーブルでPCに接続すると、XBeeアダプタとしても使用できます。
表1のように設定します。設定値はすべて16進数で入力し、設定値を変更したら、「Write」ボタンをクリックしてXBeeモジュールに設定値を保存するのを忘れないようにしてください。
設定値コード | 設定地の名前 | 説明 | 設定値 |
AP | API Enble | APIモードの設定 | MicroPython REPL [4] |
BD | UART Baud Rate | シリアル通信速度 | 115200 [7] |
D1 | DIO1/AD1 | DIO1ピンの設定 | I2C SCL[4] |
P1 | DIO11 | DIO11ピンの設定 | I2C SDA[6][S92] |
ID | PAN ID | ネットワークのID | 8088 |
NI | ノード識別子 | ノードの名前 | sensor_node |
PS | MicroPython Auto Start | MicroPythonを自動実行 | Enable [1] |
センサノードのプログラミング
XBeeモジュール上でMicroPythonを使用する方法として、スクリプトを対話的に描いてファイルに保存する方法と、ファイルを作成してモジュールにアップロードする方法がありました。先の例で対話型モードを試したので、今度はファイルをアップロードする方法を試してみましょう。
まず、BMP280用のライブラリを入手します。David Wahlund氏によってインターネット上に公開されていますので、下記リンクからダウンロードします。
https://github.com/dafvid/micropython-bmp280
BMP280以外のI2Cで動作するデバイス用のオリジナルライブラリを制作する場合、このライブラリをテンプレートとして使用しても良いでしょう。
ダウンロードしたらZIPファイルを解凍して、「bmp280.py」ファイルを一部修正の上、XBeeモジュールにコピーします。
122~123行目辺りの
if use_case is None:
self.use_case(use_case)
を、
self.use_case(use_case)
に変更します。「if~」の行を消した後、「Self~」の行のインデントを1つ削除して、前の行と先頭を揃えます。
また、「pressure()」よりも後にあるメソッドのうち、「def use_case(self,uc):」以外のものを削除します。以上修正すると、次のようになります。
ファイルの変更が終わったら、XBeeモジュールにコピーします。
XBee Grove Development BoardとXBeeモジュールをPCに接続し、XCTU上でXBeeモジュールを選択したら、図6のようにToolsメニューから「File System Manager」を開きます。
「Open」ボタンをクリックすることでXBeeモジュールに接続します。
File System Managerの左画面にはPC上のフォルダが、右画面にはXBeeモジュール上のフォルダが表示されます。
右画面で「lib」というフォルダに移動しておき、左画面で「bmp280.py」を探して右画面にドラッグ&ドロップしてください。これでbmp280.pyがXBeeモジュール上にコピーされました。図7がコピー後の状態です。
ライブラリがコピーできたら、File System Managerを閉じてライブラリのテストを行いましょう。
Toolsメニューから「MicroPython Terminal」を開き、「Open」ボタンをクリックしてXBeeモジュールに接続します。
ENTERキーを押すかCtrl+Cを入力すると>>>(プロンプト)が表示されてスクリプトが入力できるようになります。次のように入力します。
from machine import I2C from bmp280 import BMP280 bmp280 = BMP280(I2C(1, freq=100000), 0x77) print(bmp280.temperature) print(bmp280.pressure)
MicroPythonに標準で入っているI2C通信を行うライブラリと、先ほどコピーしたbmp280用のライブラリを読み込み、I2C通信を開始、温度と気圧を表示するスクリプトです。
このように表示されればOKです。温度や気圧の数値はその時々で異なることでしょう。
>>> from machine import I2C >>> from bmp280 import BMP280 >>> bmp280 = BMP280(I2C(1, freq=100000), 0x77) >>> print(bmp280.temperature) 21.71 >>> print(bmp280.pressure) 102357.4
アドレスエラーやNOENVエラーなど、エラーが表示された場合は配線を再確認してください。ジャンプワイヤーやコネクタを挿しなおすと直ることもあります。
これでbmp280ドライバーの動作が確認できました。センサを読み取るためのスクリプトを作成していきましょう。次のようになります。
MicroPythonスクリプトによる温度・大気圧センサbmp280の読み取り
from machine import I2C from bmp280 import BMP280 from time import sleep import xbee # BMP280アドレス BMP_ADDR = 0x77 # データ送信先アドレス TARGET_64BIT_ADDR = b'\x00\x13\xA2\x00\x41\xC1\x99\xCA' wait_time = 15 #測定間隔 cycle = 10 # 繰り返し回数 bmp280 = BMP280(I2C(1, freq=100000), BMP_ADDR) for x in range(cycle): # 温度と気圧を読み取る temp_c = bmp280.temperature pressure = bmp280.pressure # 温度を適切な単位に変換する print("Temp: %.2f C" % temp_c) temp_f = (temp_c * 9.0 / 5.0) + 32.0 print("Temp: %.2f F" % temp_f) # コーディネーターにデータを送る message = "C: %.2f, F: %.2f, B: %.4f" % (temp_c, temp_f, pressure) print("Sending: %s" % message) try: xbee.transmit(TARGET_64BIT_ADDR, message) print("Data sent Successfully") except Exception as e: print("Data sent Fail: %s" %str(e)) # サイクル間の待ち時間 sleep(wait_time)
このスクリプトを「main.py」という名前で保存し、File System ManagerでXBeeモジュールのルートフォルダにコピーします。(先ほどbmp280のライブラリをコピーした「lib」というフォルダと同じ階層です)
これでセンサノードをテストする準備が整いました。センサノードの電源はいったん切っておきます。
コーディネーターの設定
コーディネーターは先の例題と同じ設定のままで使用できます。
センサノードのテスト
まず、コーディネーターとして設定したXBeeモジュールをPCに接続して電源を入れます。XCTUアプリケーションでXBeeモジュールを検出して接続し、ターミナルを開いておきます。
次に、センサノード側のXBeeモジュールにも電源を入れます。コーディネーター側のモジュールと接続してネットワークに参加するまでには時間がかかることもあります。コーディネーターがデータを受信すると、図8のようにデータを受信していることが分かります。
受信したパケットが表示されたでしょうか?
これまでの例と同様、データの先頭は区切り文字「7E」で始まっているはずです。受信したパケットの中身は次のような、16進数の値の羅列です。
7E 00 2E 90 00 13 A2 00 41 92 DB A4 94 CC 01 43 3A 20 31 39 2E 36 39 2C 20 46 3A 20 36 37 2E 34 34 2C 20 42 3A 20 31 30 32 33 37 38 2E 32 34 39 32 58
この中で、MicroPythonスクリプトで送信したデータはやはりパケットの最後の方に含まれています。この例では、
43 3A 20 31 39 2E 36 39 2C 20 46 3A 20 36 37 2E 34 34 2C 20 42 3A 20 31 30 32 33 37 38 2E 32 34 39 32
これを、ASCIIコードに変換すると、次のようなメッセージが現れます。
C: 19.69, F:61.44, B: 102378.2492
パケットの中身を詳しく見ていきましょう。表2に「受信」パケットのレイアウトを示します。
値(例) | フィールド名 | 説明 | |||
7E | スタートデリミタ | パケットの先頭 | |||
00 | 14 | パケットの長さ | |||
90 | フレームタイプ | 受信パケット | |||
00 | 13 | A2 | 00 | 64ビットアドレス | センサノードのアドレス |
41 | 92 | DB | A4 | ||
94 | CC | 予約 | |||
01 | 受信オプション | ||||
43 | 3A | 20 | … | データ | 受信したデータ |
… | 34 | 39 | 32 | ||
58 | チェックサム |
こちらも同様に、センサノードからのデータが受信できているとわかったら、ある程度動作させて温度の変化を観察してみてください。あるいは、手でセンサを温めてみたり、息を吹きかけてみたりすると温度変化が観察できるはずです。
温度の変化がデータの変化として受信できれば、正常に動作しているとみていいでしょう。
使用したパーツのリスト
TMP36を使用した例を実行するために必要な電子部品を表3に、BMP280を使用した例を実行するために必要な電子部品を表4、5に、それぞれリストアップします。重複しているものはいずれか1セットだけで構いません。
この他、XBee USBアダプタ類に使用するUSBケーブル、ブレッドボード用のジャンプワイヤーなど、必要に応じて用意してください。
表3 TMP36を使用する例で必要な電子パーツ
項目 | 製品例 | 価格 | 必要数 |
XBee-ZBシリーズ2/2.5/3 | https://www.switch-science.com/catalog/5311/ | ¥2,546- | 2 |
XBee Explorer ドングル | https://www.switch-science.com/catalog/1790/ | ¥3,243- | 1 * |
XBee Explorer USB | https://www.switch-science.com/catalog/1791/ | ¥3,243- | 1 * |
ブレッドボード | https://www.switch-science.com/catalog/313/ | \275- | 1 |
温度センサTMP36 | https://www.marutsu.co.jp/pc/i/171271/ | \160- | 1 |
0.1uFコンデンサ | https://www.marutsu.co.jp/pc/i/13850760/ | \104- | 1 |
* これら3種類の組み合わせは何でも構いませんが、合計2つ必要です。
表4 BMP280を使用する例で必要な電子パーツ(Groveモジュール使用)
項目 | 製品例 | 価格 | 必要数 |
XBee-ZBシリーズ2/2.5/3 | https://www.switch-science.com/catalog/5311/ | ¥2,546- | 2 |
XBee Explorer ドングル | https://www.switch-science.com/catalog/1790/ | ¥3,243- | 1 * |
XBee Explorer USB | https://www.switch-science.com/catalog/1791/ | ¥3,243- | 1 * |
Grove XBeeキャリア (XBee Grove Development Boardの代用) | https://www.switch-science.com/catalog/1052/ | \2,310- | 1 |
Grove BMP280モジュール | https://www.switch-science.com/catalog/3373/ | \1,276- | 1 ** |
* いずれか1つ使用します。
** Groveケーブルが1本付属します。
表5 BMP280を使用する例で必要な電子パーツ(Groveモジュール不使用)
項目 | 製品例 | 価格 | 必要数 |
XBee-ZBシリーズ2/2.5/3 | https://www.switch-science.com/catalog/5311/ | ¥2,546- | 2 |
XBee Explorer ドングル | https://www.switch-science.com/catalog/1790/ | ¥3,243- | 1 * |
XBee Explorer USB | https://www.switch-science.com/catalog/1791/ | ¥3,243- | 1 * |
Grove XBeeキャリア (XBee Grove Development Boardの代用) | https://www.switch-science.com/catalog/1052/ | \2,310- | 1 |
BMP280モジュール | https://www.marutsu.co.jp/pc/i/31850209/ https://www.marutsu.co.jp/pc/i/10546192/ など | \1,215- \1,277- | いずれか 1 |
Groveブレイクアウト ケーブル | https://www.marutsu.co.jp/pc/i/829423/ | \590- | 1 |
* いずれか1つ使用します。
まとめ
XBeeモジュールは、デバイス同士でデータの無線転送を行ったり、多くのセンサをホスト(接続)してデータを収集したりといったことを、簡単に安価に実現できる素晴らしい方法です。
このセクションでは実際に実験を行いながら、MicroPythonスクリプトを応用することで様々なインターフェースで通信してデータを得たり、データを送信する前に何らかの計算をしたりできるということを学びました。
Seeed Studio社が展開するプロトタイピングプラットフォーム「Grove」についても少し紹介しました。Groveを活用すると、プリント基板やユニバーサル基板、ブレッドボード上で行っていた回路作製の作業をもっと簡単に行うことができます。
コメントを残す