生産現場IoTへの挑戦 #04　~システムの構成と簡単なテスト~

#１．はじめに
前回までの開発で、M5StickCを振動ピックアップとして利用できそうなことがわかりましたので、他にも測定したいデータ項目を整理して、全体のシステム構成を考えてみました。
あわせて、センサー類との通信に使用するI2C接続のテストと、測定時間を正確に記録するためのリアルタイムクロックの設定を行います。

#２．システム構成のイメージ
前回までは振動センサーについて述べていましたが、実際に運用するシステムはもう少し欲張りな仕様となっています。
##２－１．そもそも何がしたいのか？
今回の目的はプラスチック成型機の設備稼働状況の監視で、測定したいデータが複数あります。
設備稼働状況というと、生産管理に結びつくような生産状況情報（何を何個作ったとか、生産条件のトレンドデータなど）のイメージもありますが、今回は設備の故障や不具合を感知することが目的ですので、ユーティリティー関連の状態監視が目的です。

測定項目（予定）

|測定対象| 測定項目 | センサー |　センサー出力|
|:-:|:-:|:-:|:-:|
|環境| 雰囲気温度 | BMP280 | I2C |
|環境| 湿度 | BMP280 | I2C |
|環境| 気圧 | BMP280 | I2C |
| 油圧ポンプ | 振動 | M5StackC | BTシリアル通信 |
| 油圧ポンプ | 回転数| M5StackC | BTシリアル通信 |
| 油圧ポンプ | 瞬時電力|電流センサ| アナログ電流 |
| 油圧ポンプ | 瞬時電力|電流センサ| アナログ電流 |
| 油圧ポンプ | 瞬時電力|電圧センサ| アナログ電圧 |
| 油圧ポンプ | 圧力 | 圧力センサ | アナログ電流|
| 冷却水系統1 | 水温 | 熱電対 | アナログ電圧 |
| 冷却水系統1 | 流量 | 流量計 | アナログ電圧 |
| 冷却水系統2 | 水温 | 熱電対 | アナログ電圧 |
| 冷却水系統2 | 流量 | 流量計 | アナログ電圧 |
| 高圧エア | 圧力 | 圧力センサ | アナログ電圧|
| 油圧ポンプ | 圧力 | 圧力センサ | アナログ電流|

とりあえずいろいろ上げましたが、まずは環境の３パラメータとテスト済みの振動系のデータ採取から開始します。
他の項目はセンサー類の準備ができ次第順次追加することにしました。

##２－２．システムの構成
今回はクラウドを使用しないことを宣言しましたが、そもそも測定現場にネットワーク環境が無いことも考えられる、というか今回のプロジェクト先ではネットワーク環境が無いため、スタンドアロンでも稼働することを前提にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/2071247f-e4cd-5371-d0f0-520db85b8044.png)

全体の構成は上図の通りです。
各種センサーとラズパイはBluetooth及びI2Cで接続します。環境センサーはBMP280というセンサーをI2C接続で使用します。また、今回はアナログ出力センサーを多く使用するためADS1115Sというアナログデジタル変換ボードを使用してラズパイとI2C接続します。ADS1115Sは4chのアナログ入力を持っていますので、必要に応じて追加します。ADS1115Sは一つのI2Cバスに最大4個まで接続できます。4×4=16個以上のアナログデータを入力したい場合もI2Cバスを変えるかI/Oエキスパンダー使用すれば接続数を増やすことが（たぶん）できますのでどんどんデータ測定しましょう。

DS3231はリアルタイムクロック（RTC）機能を追加するためのボードです。RTC機能を持ったPCは電源がオフになっても内蔵電池などで時計機能を維持しますが、ラズパイにはRTC機能がありませんので、ネットワーク接続の無い状態で電源を切ると時計が狂います。今回は時系列データを取ることが目的ですのでRTC機能を追加しています。

##２－３．接続に関する注意点
このシステムは、I2CとBluetoothシリアルによる接続を前提としていますが、どちらもノイズや障害物、距離などの環境により接続が不安定になります。
I2C接続の場合、特別な対策をしない限り数十センチが目安です。Bluetoothは見通し無かったり、周囲に電磁波のノイズが多いと接続が不安定になります。
アナログ信号も電流出力の場合は比較的遠距離まで対応できますが、電圧出力の場合は信号線の抵抗によりデータが狂いますので注意が必要です。

#３．データベース
測定したデータは、データベースに記録します。
CSVなどのファイルに保存することもできますが、膨大なデータをCSVファイルで管理するのは至難の業ですので、データベースによるデータ管理に挑戦しました。

使用したデータベースソフトは、ラズパイでよく使われるMariaDBです。MariaDBはフリーのデータベースとしてもっとも有名なMySQLの派生版で使い勝手もほぼ一緒です。（[MySQLとMariaDBの比較](https://www.xplenty.com/jp/blog/mariadb-vs-mysql-everything-you-need-to-know-ja/)）
使用方法の学習もMySQLの資料がそのまま使え、参考情報も広く頒布されているため採用しました。

#４．I2C接続のテストとRTCの有効化
I2c接続のテストを兼ねて、DS3231によるRTCの有効化とBMP280による環境データの測定を行います。

##４－１．接続方法
I2C接続では、VCC（電源）、GNDと信号用のSDC、SCLという4本の線を用いて接続します。
接続元のラズパイをマスター、接続先のセンサーをスレーブとして制御しますが4本の線を複数のスレーブ機器で共有できるため、数珠繋ぎ状の接続（デイジーチェーン）で簡単にスレーブ機器を増設できるという特徴があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/4cd040fa-ceff-65e4-5088-21f126898140.png)
DS3231とBMP280も上の模式図の通り、4本の配線を接続します。

| ラズパイ | DS3231 | BMP280 |
|:-:|:-:|:-:|
|3V3(Pin1)|VCC|VCC|
|GND(Pin9)|GND|GND|
|GPIO2(Pin3)|SDA|SDA|
|GPIO3(Pin5)|SCL|SCL|

ラズパイでは使用できるI2C BUSは複数チャンネルありますが、今回はI2C1を使用しますのでSDAとSCLはそれぞれGPIO2と3(PIN3とPIN5）、VCCは3.3V(PIN1)を使用します。



##４－２．DS3231の有効化
※DS3231の有効化については[こちらのサイト](https://risaiku.net/archives/5620/)を参考にさせていただきました。

DS3231はLIR2032というボタン電池型のバッテリーを使用しますのでバッテリーを入れます。
充電機能を持ったボードですのでCR2032などの充電できないボタン電池は絶対に使用しないで下さい。

配線が接続できたら、LX terminalから以下の操作を行います。

・I2Cの有効化
メニューから、「設定」⇒「Raspberry Piの設定」⇒「インターフェイス」タブ⇒「I2C」の「有効」をチェック

・DS3231の有効化

```sh
pi@raspberrypi:~ $ sudo apt-get purge fake-hwcloc

pi@raspberrypi:~ $ sudo vi /boot/config.txt
# viが立ち上がるので最後に次の行を追加して保存
dtoverlay=i2c-rtc,ds3231

pi@raspberrypi:~ $ sudo vi /etc/udev/rules.d/85-hwclock.rules
# viが立ち上がり、新規ファイルを作成するので次の行を入力して保存
KERNEL=="rtc0", RUN+="/sbin/hwclock --rtc=$root/$name --hctosys"
```
viというのはテキスト編集アプリですが、使い慣れていないと難しいかもしれません。
[こちらのサイト](https://rat.cis.k.hosei.ac.jp/article/rat/serverliteracy/2004/vi.html)などで使用方法を確認してテキストを編集して保存しましょう。

・I2C接続状況の確認
i2cdetectコマンドで、I2Cの接続状況が確認できます。

```sh
pi@raspberrypi:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 
```

57、68が表示されている場合、配線は接続されていますがDS3231は有効化されていません。
有効化さると、68の部分がUUに変化します。
ラズパイをリブートしても有効化されない場合は次のコマンドを試してみてください。

```sh
pi@raspberrypi:~ $ sudo modprobe --first-time rtc-ds3232
```

##４－３．BPM280による測定
BPM280による測定はpythonのプログラムで実行します。
ラズパイ標準のTohnnyもしくはvscodeなどでプログラミングしてください。
前回まではTohnnyを使用していましたが、最近vscodeを使い始めました。慣れるまでは若干の訓練が必要ですが、慣れると作業性が上がるためvscodeの使用をお勧めします。

まずは、ターミナルを開いて、次の二つのライブラリをインストールします。

```sh
pi@raspberrypi:~ $ sudo pip3 install smbus2
pi@raspberrypi:~ $ sudo pip3 install RPi.bme280
```

ライブラリが入ったら、サンプルコードで動作を確認します。
サンプルは[こちらのコード](https://pypi.org/project/RPi.bme280/)を参考にしています。


```sh
import smbus2
import bme280

port = 1                        #I2C1を使用するため1
address = 0x76                  #BMP280のI2Cアドレス
bus = smbus2.SMBus(port)        #I2Cの設定

calibration_params = bme280.load_calibration_params(bus, address)　#BMP280の設定値取得

data = bme280.sample(bus, address, calibration_params)             #BMP280の測定値取得

print(data.timestamp)                                            #測定時間表示
print("temperature : %s *C" % str(round(data.temperature,1)))    #温度表示
print("pressure    : %s hpa" % str(round(data.pressure,1)))      #気圧表示
print("humidity    : %s %%" % str(round(data.humidity,1)))       #湿度表示
```

５．まとめ
今回は、ラズパイを使ったIoTシステム制作の前準備としてI2C接続とRTCの設定を行いました。
データ蓄積のためのデータベースの準備を行います。