はじめに
本記事は弊社製品の Pi-protect を工場設備のモニタリングに活用するためのレシピとなります。
いま流行りの AI によるデータ分析や設備の予防保全活動などのために設備のデータの収集をしたいという方は多いと思います。しかし、自社のネットワークに新たに計測機器を接続するのはセキュリティ的にもハードルが高いのではないでしょうか。
そこで本記事では、SORACOM のサービスの1つである SORACOM Harvest Data を使用して自社ネットワークに接続しなくてもデータの収集 & 可視化を迅速かつセキュアに行う手順を紹介します。収集するデータは3軸加速度と電流値です。IoT 化や AI 化を進める第一歩になれば幸いです。
用意するもの
-
Pi-protect
Pi-protect の中には以下のものが防塵防水 BOX 内に入っています。- Raspberry Pi 4 model B
- 4GPi (Raspberry Pi 用 LTE 通信モジュール)
- slee-Pi3 (Raspberry Pi 用電源管理/死活監視モジュール)
- micro SD カード (32 GB)
また、以下のものが付属しています。
- 初期ログインカード
- 電源ケーブル
-
標準 SIM カード
-
ADPi Pro (Raspberry Pi 用高精度A/D変換モジュール)
以下のものが付属しています。- 基板固定用六角スペーサ (M2.6) x 4本
-
JoyWarrior56FR1-WP : USB 6軸加速度・角速度センサ (Code Mercenaries 社)
-
CTL-16-CLS : 小型クランプ式交流電流センサ (株式会社ユー・アール・ディー)
-
抵抗 250 Ω
-
PC : Raspberry Pi の設定をするために使用します。
-
USB-シリアル変換ケーブル : PC - Raspberry Pi 間の通信に使用します。
Pi-protect
Pi-protect (パイプロテクト) は、ラズベリーパイを業務用途で使用する際にネックとなる防水・防塵、RTC、電源管理等の機能を備えたIoTゲートウェイです。稼動実績豊富な弊社4G (LTE) 通信モジュール「4GPi」、電源管理/死活監視モジュール「slee-Pi 3」に加え、停電時バックアップキャパシタ他で構成されています。(製品紹介ページ から引用)
Pi-protect の構成物の一式は防塵防水 BOX に入っています。
防塵防水 BOX の蓋は透明になっているので内部の状態 (LED の光り方 など) の確認ができますし、防塵防水 BOX の中にディスプレイを置いて外から映像が見えるようにもできます。
(※ 蓋は不透明ものに変更可能です。蓋の種類は用途に応じて選定してください。)
防塵防水 BOX にはケーブルグランド (画像右下) がついており、ここからセンサのケーブルを外に出すことができます。サイズの異なるケーブルグランドが搭載されているので多様なケーブル径に対応可能です。
Pi-protect にはバックアップキャパシタが搭載されており、電源断時に自動的にシャットダウン処理を行うことが可能です。
上記の内容含め、Pi-protect の技術資料は弊社 GitHub で公開しています。
SORACOM Harvest Data
SORACOM Harvest は、IoT デバイスからのデータやファイルを収集・蓄積するサービスです。
中でも、SORACOM Harvest DATA はテキスト、JSON、バイナリなどのデータを扱うことができます。データのフォーマットに制限はありません。(SORACOM 公式サイト から引用)
活用シーンとしては SORACOM 公式サイトでは以下のようなものが挙げられていました。
- サーバーやストレージ、アプリケーションを構築することなく、IoTデータおよびファイルの送信、保存、可視化までの一連の流れを手軽に確認することができます。
- SORACOMプラットフォームへのデータ送信を前提としてIoTデバイスを実装する場合、IoTデバイスから安全にデータを送信するための暗号化や認証情報の実装を必要とせず、SORACOM IoT SIM (LPWA の場合デバイス固有のID) を認証キーとしたデバイス実装が可能です。
つまり、手軽かつ安全にデータの送信、可視化が可能というわけです。
今回はこのサービスを使ってデータ収集 & 可視化を行っていきます。
SORACOM Harvest Data の設定方法
コンソールから harvest の設定をする
SORACOM のダッシュボードから SORACOM Harvest Data の設定をしていきます。
使用する SIM の登録と名前変更
まずは SORACOM のダッシュボードにログインします。
![1_soracomダッシュボード_モザイク.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3104552%2F55a65d10-9a5e-472a-b7ae-696d9618238b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=0a128d64a88199a612870560988573d0)
左上のメニューから「SIM 管理」を選択します。
![2_ダッシュボードからSIM管理を選ぶ_モザイク.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3104552%2Fc51de9db-a40d-53a0-d666-7e2da6b6b8e6.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a0efec34cb679bd7d4692a791dab4d91)
SIM 管理の画面では登録されている SIM の一覧が表示されます。
その中から、IMSI 等の情報をもとに使いたい SIM を見つけます。
![2_1_SIM管理の画面_モザイク.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3104552%2F683f56fa-a281-8532-170b-75f4691d2cef.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=3d5bc55c73ead457162b7754d2647341)
SIM が登録されていない場合は左上の「+ SIM 登録」ボタンから SIM を登録していきます。
IMSI とパスワードを入力して SIM を登録します。
SIM を登録したら SIM の判別をしやすいように SIM の名前を変更します。
SIM の一覧から、使いたい SIM の名前の横の鉛筆マークをクリックします。
鉛筆マークをクリックするとウィンドウが出るのでここで名前を変更します。
今回は SIM の名前を「SORACOM IoT レシピ (Pi-protect)」としました。
SIM グループの設定
SIM の登録が終わったら SIM グループの設定をしていきます。
左上のメニューから「SIM グループ」を選択します。
すると以下のような画面になるので、左上の「追加」ボタンから新しい SIM グループを作成していきます。
以下のようなウィンドウが出ますので、新しく作成したいグループ名を入力します。
今回は「Pi-protectモニタリング」という名前のグループを作成しました。
これでリストにグループ「Pi-protectモニタリング」が追加されました。
このグループで Harvest Data を使用できるように設定をしていきます。SIM グループのリストから「Pi-protectモニタリング」の行をクリックするとグループの設定画面に移ります。
この中に「SORACOM Harvest Data 設定」というタブがあるのでクリックして開きます。ON/OFF のトグルがあるので ON にして保存をクリックします。
これで SORACOM Harvest Data が有効化されました。
以上で SIM グループの設定は完了です。
SIM グループの割り当て
作成した SIM グループを今回使用する SIM に割り当てます。
左上のメニューから「SIM 管理」を選択します。
SIM 管理画面の SIM 一覧から使用する SIM を見つけ、左のチェックボックスにチェックを入れます。
チェックを入れた状態で上にある「操作ボタン」をクリックします。
すると以下のようなリストが表示されるのでその中から「所属グループ変更」をクリックします。
新しい所属のプルダウンから所属させたいグループを選択します。今回は先ほど作成したグループ「Pi-protectモニタリング」を選択します。
以上で SIM グループの割り当ては完了です。ここまで完了すると SORACOM Harvest Data にデータ送信ができるようになっているはずです。
送信テストはもう少し先の章で行います。
ハードウェアの準備
蓋を開く
各種準備をするために Pi-protect の蓋を開けます。
Pi-protect の蓋は 4か所ねじ止めされています。プラスドライバーで4か所ねじを外すと蓋が開くようになります。
SIM の挿入
4GPi に SIM カードを挿入します。4GPi の SIM スロットのカバーを開きます。
SIM スロットのカバーを動かす方向はカバーに印字されてあります。
SIM カードをセットしたら SIM スロットのカバーを閉じます。
カバーに印字されている「LOCK」の方向にスライドさせて終了です。
ADPi Pro の接続
販売している Pi-protect には ADPi Pro (以下 ADPi) は付属していないので、自分で取り付ける必要があります。取り付け自体は難しいことはありません。まずは六角スペーサを止めているねじを外します。
ねじが外れたら ADPi に付属している六角スペーサを取り付けます。
続いて、ADPi を 40ピンヘッダに接続します。
奥までしっかり入れたら、先ほど外したねじで六角スペーサを固定します。
以上で ADPi の接続は完了です。
センサの接続
Pi-protect にセンサを接続していきます。
Pi-protect の防塵防水 BOX についているケーブルグランドのシールナットを外します。ねじ式になっているので回すと外れます。外した後は中に入っているゴムブッシュも外します。
ゴムブッシュにはツメがついているので外します。
まずはシールナットとツメをケーブルに通します。それぞれの向きに注意してください。
ゴムブッシュには切れ目が入っているのでその切れ目からセンサケーブルを通します。ゴムブッシュの向きには気を付けてください。
ツメをゴムブッシュにはめます。
Pi-protect のケーブルグランドの穴からケーブルを通し、ツメとシールナットをはめます。
センサケーブルを通したら Raspberry Pi にセンサを接続します。
JoyWarrior56FR1-WP を Raspberry Pi の USB ポートに、CTL-16-CLS と抵抗を ADPi のチャンネル2に接続します。
それぞれの接続方法については下記の記事を参考にしてください。
◆ CTL-16-CLS と抵抗の接続方法
◆ JoyWarrior56FR1-WP の接続方法
センサの接続ができたらゴムブッシュをはめて、シールナットを締めて終了です。
※ シールナットの締め込みが甘いと防水性能が低下します。締める際の目安として、ケーブルが動かなくなる程度まで締めこみそこから半回転程度締めてください。
最終形はこのようになりました。
以上でセンサの接続は終了です。
電源の接続
Pi-protect 付属の電源ケーブルを接続します。コネクタに凹凸があるので凹凸に合わせて挿しこみます。
電源ケーブル側のコネクタのナットを締めれば終了です。
ソフトウェアの準備
OS イメージを書き込む
Pi-protect に付属している SD カードにはすでに Pi-protect 用の OS イメージが書き込まれてあります。付属の SD カードをそのまま使用する場合はこのセクションの内容はスキップしてください。
別の OS イメージを使用する場合は以下の手順で OS イメージを書き込みます。
OS イメージをダウンロードします。Pi-protect 用の OS イメージは弊社のサイトで公開しています。これらの OS イメージは Raspberry Pi OS Lite をベースに作成されています。
OS イメージ
※本記事では piprotect-bullseye-lite-armhf-20230511.img.xz を使用しています。
ダウンロードしたイメージファイル (.img.xz) を Raspberry Pi Imager を使用して SD カードに書き込みます。(Raspberry Pi Imager のダウンロードは こちら から)
シリアルコンソールで Raspberry Pi にログイン
下準備
書き込みが終わったら Raspberry Pi にログインしていきます。USB シリアル変換ケーブルを40ピンの6, 8, 10ピンに挿しこみます。
挿入する場所を間違えると故障する可能性があるので注意してください。
シリアル通信を使う方法とそのメリットについては以下の記事にまとめられています。
Pi-protect を立ち上げる
変換ケーブルを挿したら Pi-protect に電源を入れます。電源をコンセントに挿してください。
Tera Term というターミナルソフトを使用して Raspberry Pi にログインします (Tera Term のダウンロードは こちら から)。Tera Term を起動して設定をしていきます。起動すると以下のようなウィンドウが出るので下のシリアルを選択して OK を押します。
シリアル通信の設定を変更します。設定 → シリアルポートを選択します。
ポートを USB シリアル変換ケーブルが使用しているポートに、スピードを 115200 に設定します。
設定が終わったら「現在の接続を再設定」をクリックします。設定画面が閉じるのでここで Enter キーを押すとログイン画面になります。
ここでユーザー名とパスワードを入力します。
Pi-protect の OS イメージを使用する場合、ユーザー名とパスワードは付属の初期ログインカードを参照してください。
ユーザー名を入力して Enter、パスワードを入力して Enter を押します。
(パスワードは画面には表示されません)
正しくユーザー名とパスワードが入力できていたらログインができます。
ログイン後は任意のパスワードに変更してください。
APN 登録
4GPi で LTE 通信を行えるようにするため、 APN の登録をします。
以下のコマンドを入力してください。
$ sudo nmcli con add type gsm con-name <任意の接続名> apn <APN> user <ユーザー> password <パスワード>
<APN>
、 <ユーザー>
、<パスワード>
の部分は使用する SIM のものを入れてください。
今回は SORACOM の SIM を使用するので以下のサイトから対応するAPN
、 ユーザー
、パスワード
を入力します。
コマンドを実行すると LTE 回線に接続されます。
正常に LTE 回線に接続できていたら 4GPi のステータスLED (青色 LED) が点滅します。
SORACOM Harvest Data のテスト送信
ここからは Harvest Data にデータを送信できるかのテストを行います。
SORACOM の公式のドキュメント で用意されている送信コマンドの例を使用してみます。ターミナルで以下のコマンドを入力します。
$ curl -v -X POST http://harvest.soracom.io \
-H "content-type:application/json" \
-d '{
"temperature": 20,
"latitude": 35.677097,
"longitude": 139.732950
}'
このコマンドを実行してステータスコードが 201 Created
と表示されていたら送信成功です。
SORACOM のコンソールからデータを確認してみましょう。
コンソールの左上のメニューから「SORACOM Harvest Data」を選択します。
以下のような画面になるので左上の「リソース」から使用する SIM を選択します。
検索ボックスに SIM の名前、もしくは ISMI を入力します。使用する SIM の登録から名前変更まで で登録した「SORACOM IoT レシピ (Pi-protect)」という SIM を見つけます。
検索ボックスに「Pi-protect」と入力して SIM が見つかったら SIM を選択します。
すると、先ほど送信したデータの値とデータの送信時刻が確認できるかと思います。
以上で SORACOM Harvest Data へのテスト送信は終了です。
パッケージのインストール
加速度や電流を計測できるようにするコードを作成するためにいくつかパッケージをインストールする必要があります。
ADPi のパッケージ
以下のサイトに従って ADPi のパッケージをインストールします。
今回は SPI を使用するので以下のコマンドでパッケージをインストールします。
$ sudo apt update
$ sudo apt install python3-adpi adpi-utils-backend-spidev adpi-utils
インストールが完了したら以下のコマンドで Raspberry Pi を再起動させます。
$ sudo shutdown -r now
以上で ADPi に必要なパッケージのインストールは終了です。
Python 用のモジュール
- パッケージのインストールのために pip をインストールします。
$ sudo apt install python3-pip
- USB デバイスを扱うためのモジュール (PyUSB) をインストールします。
$ sudo pip install pyusb
- データを定期的に送信させるために schedule モジュールをインストールします
$ sudo pip install schedule
【補足】
それぞれのモジュールは以下のバージョンを使用しています。
$ pip3 --version
pip 20.3.4 from /usr/lib/python3/dist-packages/pip (python 3.9)
$ pip show pyusb | grep Version
Version: 1.2.1
$ pip show schedule | grep Version
Version: 1.2.0
ADPi のパッケージと Python 用のモジュールをインストールすると合計で 20 MiB 程度の通信が発生します。LTE 回線を使用してインストールする場合は通信量にお気を付けください。
スクリプトの作成
本章では加速度と電流を計測するスクリプトを作成していきます。
ディレクトリの作成
センサを動かすコードを配置させるディレクトリを作成します。今回は /opt/soracomiot
というディレクトリに配置させます。以下のコマンドでディレクトリを作成します。
sudo mkdir /opt/soracomiot
コードを書く
センサを動かすコードを配置させるディレクトリを作成したらそのディレクトリにスクリプトファイルを作成します。ファイル名は run.py
としました。
$ sudo nano /opt/soracomiot/run.py
エディタが開いたら以下のコードを入力します。
#!/usr/bin/python3
import struct
import time
import requests
import schedule
import smbus
import spidev
import usb.core
import usb.util
from adpi import AD7794, ADPiPro
VID = 0x07c0
PID = 0x111a
ARNG = 0x00
AFILT = 0xC3
MODE = 0x00
RANGE_ACC = 2
ADPI_CHANNEL = 2
ADPI_SAMPLE_HZ = 470
CT_FACTOR = 3000 / (250*0.99) # for CTL-16-CLS
CT_OFFSET = 0
RAW_OFFSET = (1 << 23)
RAW_SCALE = 5 / (1 << 23)
POST_URL = "http://harvest.soracom.io"
def get_voltage(dev, ch):
dev.write_configuration(AD7794.gain["1"], AD7794.channel[str(ch)])
dev.write_mode(AD7794.mode["single"], AD7794.rate[str(ADPI_SAMPLE_HZ)])
while True:
time.sleep(2 * 1.0 / ADPI_SAMPLE_HZ)
if not dev.read_status() & 0x80:
break
raw = dev.read_data()
return RAW_SCALE * (raw - RAW_OFFSET)
def v2i(vol):
current = CT_FACTOR * (vol + CT_OFFSET)
return round(current, 3)
def cal_acceleration(n):
return round((n - 32768) / 32768 * RANGE_ACC * 9.80665, 3)
def regularly_job():
voltage = get_voltage(ad, ADPI_CHANNEL)
value = v2i(voltage)
output_bytes = endpoint.read(endpoint.wMaxPacketSize).tobytes()
acc_bytes = struct.unpack("<HHH", output_bytes[:6])
accx, accy, accz = list(map(cal_acceleration, acc_bytes))
post_data = {"acc_x": accx, "acc_y": accy, "acc_z": accz, "CT": value}
r = requests.post(POST_URL, json=post_data)
r.raise_for_status()
if __name__ == "__main__":
usb_dev = usb.core.find(idVendor=VID, idProduct=PID)
if usb_dev is None:
raise ValueError("Device not found")
try:
usb_dev.detach_kernel_driver(0)
except Exception:
pass
usb_dev.write(2, [0x04, MODE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
usb_dev.write(2, [0x00, ARNG, AFILT, 0x00, 0x00, 0x00, 0x00, 0x00])
usb_dev.write(2, [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
cfg = usb_dev.get_active_configuration()
intf = cfg[(0, 0)]
if usb_dev.is_kernel_driver_active(intf.bInterfaceNumber):
usb_dev.detach_kernel_driver(intf.bInterfaceNumber)
endpoint = usb.util.find_descriptor(
intf,
custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress)
== usb.util.ENDPOINT_IN
)
if endpoint is None:
raise ValueError('Endpoint not found')
spi = spidev.SpiDev()
try:
spi.open(0, 0)
spi.mode = 0b11
spi.max_speed_hz = 1000000
ad = ADPiPro(spi, smbus.SMBus(1))
schedule.every(10).seconds.do(regularly_job)
while True:
schedule.run_pending()
finally:
spi.close()
保存して終了したら試しに実行してみます。
$ sudo python3 /opt/soracomiot/run.py
SORACOM Harvest Data に加速度や電流らしきデータが送信されていたら OK です。プログラムを終了させる場合は ctrl + c で終了させてください。
以下、プログラムに関しての補足です。
-
使用する ADPi のチャンネルを変更する場合はプログラムの変数
ADPI_CHANNEL
を使用するチャンネルの値に変更してください。 -
ADPi の出力電圧から電流に変換する部分については以下の式を使用しています。
E_{0} = K \cdot I_{o} \cdot R_{L} / n
参考 : https://www.u-rd.com/products/CTL-16-CLS_tab1.html#detail_tab
この式から電流 $ I_{o} $ を算出しています。
$K, R_{L}, n$ は使用するCT センサや抵抗器によって変わります。これらを変更する場合は変数 CT_FACTOR
の計算式を変更してください。
-
測定モード (Normal mode / High speed mode) の設定を変数
MODE
で行います。Normal mode の場合は0x00
を、High speed mode の場合は0x01
を入れてください。 -
加速度の測定レンジとフィルタ処理の設定をそれぞれ変数
ARNG
と変数AFILT
で行います。上のサンプルコードでは加速度の測定レンジは ±2g、フィルタは 416.5 Hz のローパスフィルタ、2.08 Hz のハイパスフィルタを設定しています。
ここを変更する場合はデータシートを参考に値を入力してください。また、加速度の測定レンジの設定を変更した場合は変数RANGE_ACC
の値を使用するレンジの値 (2, 4, 8, 16) に変更してください。 -
ここで出力される3軸加速度の値は JoyWarrior56FR1-WP の座標系での値となっています。JoyWarrior56FR1-WP の座標系についてはこちらのサイト をご参照ください。センサ本体にも x座標と y座標が書かれたシールが貼られています。
【補足】
CT センサ (CTL-16-CLS) 単体で電流を測定する記事と加速度センサ (JoyWarrior56FR1-WP) 単体で加速度を測定する記事もございます。
こちらも参考にしていただければ幸いです。
サービスファイルの作成
作成したセンサを動かすコードが起動時に自動的に実行されるよう、サービス化します。
まずはサービスファイルを作成します。ファイル名は equipment-monitor.service
としました。
$ sudo nano equipment-monitor.service
エディタが開いたら以下の内容を入力します。
[Unit]
Description=Upload data
Wants=network-online.target
After=network-online.target
[Service]
User=root
ExecStart=/usr/bin/python3 /opt/soracomiot/run.py
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
保存したら以下のコマンドでサービスを有効化します。
$ sudo systemctl start equipment-monitor
$ sudo systemctl enable equipment-monitor
このサービスが実行する run.py
のパーミッションを変更します。
$ sudo chmod 755 /opt/soracomiot/run.py
以上でソフトウェアの準備は終了です。
試運転
前章の内容が完了したら電源を入れるとセンサを動かすコードが実行されるようになっているはずです。さっそく試してみましょう。
一度シャットダウンします。以下のシャットダウンコマンドを入力するか、Pi-protect の電源を抜いてください。
$ sudo shutdown -h now
シャットダウンしたらUSB-シリアル変換ケーブルを外し、Pi-protect の蓋を閉じます。
再度 Pi-protect に電源を入れて立ち上げます。立ち上がってからしばらくすると SORACOM Harvest Data にデータが送信されているかと思います。
データが定期的に送信されていれば OK です。
これで試運転は完了です。
ここまで終了したら工場の設備など計測したい場所に持っていって計測ができると思います。
次のステップ
SORACOM Harvest Data にデータの送信が確認できたら、このデータを使って異常検知などができると思います。
そんなときに役立つのが SORACOM Lagoon というサービスです。SORACOM Lagoon を使用すれば設定した閾値を超えていたらメールなどで通知を出すことが可能です。
また、今回は3軸加速度と電流値を計測しましたが他のセンサを接続してデータを測定することも可能です。必要に応じてセンサの種類を変えてください。
まとめ
本記事は工場設備の IoT 化を進める第一歩になりうるシステムの紹介をしました。これが何かの役に立てば幸いです。
導入事例
本システムは開発パートナーの株式会社 三松 様で導入していただいています。
工場内のモータの振動と電流値を計測し、SORACOM Harvest Data にデータをアップロードし、アップロードされたデータからどのくらいの値が出ているかを確認しました。現在も電流や振動の大きさを日々計測し、予防保全に役立てていただいているようです。
以下、設置した際の画像です。
分岐ボックスの中に CT センサを入れて電流の計測をしています。
モータに加速度センサをつけて振動の計測をしています。モータは鉄製なので加速度センサの内蔵マグネットで取り付けています。
株式会社 三松 様 ホームページ
本記事は株式会社 三松 様から許可をいただいたうえで作成しています。記事作成の許可をいただき、感謝申し上げます。