みなさんこんにちは佐々木です。
さて今回はISP1807搭載BLEマルチセンサーボードで計測した環境データ(温度・湿度・気圧)をRaspberry Piで可視化するシステムの構築手順を解説します。記事前半ではシステムの仕組みと構築済みのイメージファイルを使ってシステムを動かす手順を解説します。記事後半ではシステムの構築手順を一から解説しています。
データ可視化サービスはいろいろありますが自作するメリットは、
- データ保存可能件数に制限なし(容量が許す限り何件でも)
- データ保存周期に制限なし(性能が許す限り最短で)
- グラフの見た目を自由にカスタマイズできる
- 24時間365日自分で運用!
- 楽しい!
です。
仕組み
次の図はシステム構成を表しています。
主な登場人物
- ISP1807搭載BLEマルチセンサーボード
- 加速度・磁力・ジャイロ・温度・湿度・気圧の6つのセンサーを搭載した開発ボードです。
- Raspberry Pi
- スキャナ・InfluxDB・Grafanaを動かすコンピュータです。
- スキャナ
- アドバタイズパケットを解析して温度・湿度・気圧データをInfluxDBに保存するPythonプログラムです。
- InfluxDB
- オープンソースの時系列データベースです。
- Grafana
- オープンソースのデータ可視化ツールです。
全体の動作を解説します。
まずISP1807搭載BLEマルチセンサーボードが計測した温度・湿度・気圧データをアドバタイズパケットにのせて発信します。次にRaspberry Piに搭載されている無線モジュールがアドバタイズパケットを受信します。そしてスキャナがアドバタイズパケットを解析し温度・湿度・気圧データをInfluxDBに保存します。GrafanaはInfluxDBのデータを参照しグラフを作成します。最後にユーザがウェブブラウザでRaspberry Piにアクセスしてグラフを確認します。
アドバタイズパケットの中身
環境データはService Data - 128-bit UUID
としてアドバタイズパケットに格納しています。アドバタイズパケットのデータサイズは最大31バイトという制限があります。長さとタイプで2バイト、128ビットのUUIDで16バイト、残りの13バイトに環境データを格納しています。環境データは2バイトの整数型を最大6個格納できるようになっています。今回はfield0~field2の3つを使っています。
- Length (1byte)
- 全体の長さ
- AdType (1byte)
- 0x21 Service Data - 128-bit UUID
- uuid128 (16bytes)
- f96d0000-1139-4e07-8ccf-d28be904fc0f
- 0000の部分は可変
- f96d0000-1139-4e07-8ccf-d28be904fc0f
- field0~5 (2~6bytes)
- 2バイトの整数型。-32768から+32767まで。
- 小数点以下の値を格納する場合はN倍してください。
InfluxDBの設定
InfluxDBにデータを保存するときの設定です。Grafanaはこれらの情報をもとにデータを参照します。
- データベース名(データベースの名前)
SENSORDATA
- メジャーメント(データを格納するテーブルみたいなもの)
sensordata
- リテンションポリシー(データの保存期間を決める設定)
long_term_strage_policy
- 保存期間2年。
- 期間を過ぎたデータから順次消されます。
- タグ(検索やフィルタリングに使う値)
addr
- デバイスのアドレス。
uuid16
- uuid128のうち先頭から2バイト目と3バイト目の値。
- フィールド(環境データ)
field0
~field5
- int型のみ
とりあえず動かしてみる
必要な機材とセットアップ手順を解説します。
必要なもの
- Raspberry Pi 4 Model B / 4GB
- 8GB以上のマイクロSDカード
- Raspberry Pi 4用ケース
- ラズパイ4に最適なACアダプター
- ISP1807搭載BLEマルチセンサーボード
Raspberry Pi 4のセットアップ
ここ(600MB程)から構築済みのイメージファイルをダウンロード&解凍してRaspberry Pi ImagerでSDカードに書き込みます。
CHOOSE OS > Use Custom > ダウンロードしたイメージファイルを選択
CHOOSE STRAGE > 書き込み先のSDカードを選択
SDカードの書き込みが終わったらRaspberry PiにSDカードを挿入しLANケーブルとACアダプターを接続します。起動するとすぐに周囲のデバイスのスキャンを開始します。
Raspberry Piを無線LANに接続したい場合は無線LANの設定を記述したファイルをSDカードのルートディレクトリに置いてください。
# wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="your SSID"
psk="your Password"
}
BLEマルチセンサーボードのセットアップ
ここからスケッチをダウンロードしBLEマルチセンサーボードに書き込みます。書き込み手順はこちらの記事を参照してください。書き込みが終わったらコイン電池(CR2032)を入れて計測したい場所に設置します。屋外に設置したい場合は角を切り落としたチャック付き袋の中に入れておくと良いでしょう。
ダッシュボードを開く
ウェブブラウザでhttp://raspberrypi.local:3000/
もしくはhttp://<Raspberry PiのIPアドレス>:3000/
を開いてください。ユーザ名(admin
)とパスワード(admin
)を入力しログインします。左のメニューバーからDashboards > Manage > Sample Dashboard
を選択すると計測した温度・湿度・気圧のグラフが表示されます。
よくある質問
グラフに計測値が表示されない
コイン電池の残量がなくなっていないか確認してください。Raspberry Piとの距離が遠すぎるまた間に遮蔽物がないか確認してください。Raspberry PiのすぐそばにBLEマルチセンサーボードを配置しグラフに計測値が表示されたことを確認した後、少しずつ遠ざけていって10m程度を目安にBLEマルチセンサーボードを設置してください。Raspberry Piと同じ高さにBLEマルチセンサーボードを配置すると電波が入りやすいです。
2台以上のBLEマルチセンサーボードのデータを1つのグラフに表示したい
Sample Dashboard
のグラフは複数のBLEマルチセンサーボードの値を区別せず表示しています。ラインを分けるためにはMACアドレスでフィルタリングする必要があります。
グラフのタイトルバーをクリック
> Editを選択しクエリにWHERE address =
を追加しBLEマルチセンサーボードのMACアドレスを選択します。
次に複製ボタンでクエリを複製し先ほどとは異なるMACアドレスを選択します。これを台数分繰り返します。
BLEマルチセンサーボードの設置場所をALIASに入力するとグラフに表示されるのでわかりやすくなります。
BLEマルチセンサーボードのMACアドレスはhwinfo
スケッチ(Arduino IDEを起動しファイル > スケッチ例 > Adafruit Bluefruit nRF52 Libraries > Hardware > hwinfo)を書き込んでシリアルモニタの出力を確認してください。
Bluefruit 52 HW Info
MAC Address: F4:31:37:EB:5D:1E ←MACアドレス
Device ID : B66BD6D7231A7278
MCU Variant: nRF52840 0x41414430
Memory : Flash = 1024 KB, RAM = 256 KB
温度・湿度・気圧以外のデータを追加したい
次のようにBLEマルチセンサーボードのスケッチを変更します。変更が終わったらスケッチをBLEマルチセンサーボードに書き込みます。
// adv_env.ino
typedef struct {
...
// AD_DATA_t構造体のコメントアウトされている変数field3~5のコメントをはずす
int16_t field3;
int16_t field4;
int16_t field5;
} AD_DATA_t;
void loop() {
...
// loop関数でfield3~5に計測したデータを代入
Ad_Data.field3 = (int16_t)something_data1;
Ad_Data.field4 = (int16_t)something_data2;
Ad_Data.field5 = (int16_t)something_data3;
...
}
次にダッシュボードを開いてグラフを追加します。
Add panel > Add new panel
Query >
FROM long_term_storage_policy
sensordata
WHERE address = MACアドレス
SELECT field3
Selectors > last
ALIAS BY something data
Panel > Settings > Panel Title > SomethingData
Panel > Display > Null value > connected
Panel > Axes > Unit > 適切な単位を選択
BLEマルチセンサーボード以外のボードを使いたい
nRF52840ベースのBLEモジュールを搭載したボードがおすすめです。アドバタイズパケットの中身をあわせればesp32などほかのBLEマイコンも使えます。
- Switch Science ISP1807ピッチ変換基板
- ISP1807ピッチ変換基板 USB Type-C版
- SparkFun Pro nRF52840 Mini
- Adafruit Feather nRF52840 Express
システム構築手順
ここからはシステム構築手順を解説します。構築済みのイメージファイルがあれば十分だよという方は読み飛ばしてかまいません。
作業全体の流れは次のとおりです。
- Raspberry Pi OS Liteのインストール
- InfluxDBのインストール
- Grafanaのインストール
- Python環境の構築
- スキャンプログラムのインストール
- ダッシュボードの作成
1.Raspberry Pi OS Liteのインストール
Raspberry Pi ImagerでSDカードにRaspberry Pi OS Lite(32bit)
を書き込みます。sshコマンドでアクセスできるようにSDカードのルートディレクトリにssh
というファイルを作成します。SDカードの書き込みが終わったらRaspberry Piを起動しsshコマンドでログインします。以降、Raspberry Pi上でコマンドを実行していきます。
まずはアップデート。
sudo apt update
sudo apt full-upgrade -y
sudo apt autoremove -y
sudo apt clean
2.InfluxDBのインストール
InfluxDBをインストールし自動起動するように設定します。
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian buster stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt install influxdb
sudo systemctl start influxdb.service
sudo systemctl enable influxdb.service
3.Grafanaのインストール
Grafanaをインストールし自動起動するように設定します。
sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_7.4.3_armhf.deb
sudo dpkg -i grafana_7.4.3_armhf.deb
sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server
sudo systemctl enable grafana-server
4.Python環境の構築
スキャンプログラムを動かすためのPython環境を作成しBLEライブラリとInfluxDBクライアントライブラリをインストールします。またBLEハードウェアにアクセスできるようにpi
ユーザをbluetooth
グループに追加します。
sudo apt-get install python3-venv
cd /home/pi
python3 -m venv env
. env/bin/activate
# BLEライブラリをインストール
pip install bluepy
# piユーザをbluetoothグループに追加
sudo usermod -aG bluetooth pi
sudo setcap 'cap_net_raw,cap_net_admin+eip' env/lib/python3.7/site-packages/bluepy/bluepy-helper
# InfluxDBクライアントライブラリをインストール
pip install influxdb
5.スキャンプログラムのインストール
スキャンプログラムをインストールし自動起動するよう設定します。
sudo apt install git
git clone https://github.com/144lab/Rpi-BLE-devices-scanner.git
sudo ln -s /home/pi/Rpi-BLE-devices-scanner/Rpi-BLE-devices-scanner.service /etc/systemd/system/Rpi-BLE-devices-scanner.service
sudo systemctl start Rpi-BLE-devices-scanner
sudo systemctl enable Rpi-BLE-devices-scanner.service
# ステータス確認
sudo systemctl status Rpi-BLE-devices-scanner
# 動作ログ確認
journalctl -u Rpi-BLE-devices-scanner.service -f
6.ダッシュボードを作成する
ここからはウィブブラウザで作業します。
- ウェブブラウザで
http://raspberrypi.local:3000
にアクセスします - ユーザ
admin
、パスワードadmin
でログインします - データソースを追加します
左のメニューバーからConfigulation > Data Sources > Add data source > InfluxDBをSelect
NameInfluxDB
URLhttp://localhost:8086
DatabaseSENSORDATA
Usernameroot
Passwordroot
Save&Test
Back - ダッシュボードを作成します
左のメニューバーからCreate > Dashboard - 温度のグラフを追加します
Add panel > Add new panel
Query >
FROMlong_term_storage_policy
sensordata
WHEREaddress = xx:xx:xx:xx:xx:xx
SELECTfield1
Selectors >last
Math math >math ( / 100)
ALIAS BY温度
Panel > Settings > Panel Title >温度
Panel > Display > Null value >connected
Panel > Axes > Unit > Temperature >Celsius(℃)
- 湿度のグラフを追加します
Add panel > Add new panel
Query >
FROMlong_term_storage_policy
sensordata
WHEREaddress = xx:xx:xx:xx:xx:xx
SELECTfield2
Selectors >last
Math > math >math ( / 100)
ALIAS BY湿度
Panel > Settings > Panel Title >湿度
Panel > Display > Null value >connected
Panel > Axes > Unit > Misc >Humidity (%H)
- 気圧のグラフを追加します
Add panel > Add new panel
Query >
FROMlong_term_storage_policy
sensordata
WHEREaddress = xx:xx:xx:xx:xx:xx
SELECTfield0
Selectors >last
Math > math >math ( / 100+1013.25)
※気圧データは1013.25を基準に相対値で保存しています
ALIAS BY大気圧
Panel > Settings > Panel Title >大気圧
Panel > Display > Null value >connected
Panel > Axes > Unit > Misc > Pressure >Hectopascals
- 温度のグラフを複製し見た目を変更します
温度のグラフのタイトルをクリック
> More > Duplicate複製した温度のグラフのタイトルをクリック
> Edit
Panel > Visualization > Stat
- 温度と同様に湿度・気圧のグラフを複製し見た目を変更します
- 最後にレイアウト整えれば完成です
まとめ
この記事ではISP1807搭載BLEマルチセンサーボードで計測した環境データ(温度・湿度・気圧)をRaspberry Piで可視化するシステムの構築手順を解説しました。構築済みのイメージファイルを使えばすぐにシステムを動かせます。ぜひご活用ください。
以上です。