SCSK 岩井です。
前回はRaspberry Pi × 2台でWebサーバの冗長化を行いつつ、LED点灯を行いました。
今回はWebサーバの冗長化を踏襲しつつ、気温/気圧/湿度センサーを使って情報取得部分の冗長化をしてみたいと思います。
下準備
使用するRaspberry Piは前回同様に以下のものです。
【Raspberry Pi 5】
CPU: Broadcom BCM2712 quad-core Arm Cortex A76 processor @ 2.4GHz
Memory: 8GB
OS: Bookworm
【Raspberry Pi 3 Model B+】
CPU: Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bit SoC @ 1.4GHz
Memory: 1GB
OS: Bookworm
この2台にflaskを利用してWeb画面に測定結果を表示する構成を組んでみます。
【追加で用意するもの】
温湿度・気圧センサーモジュールキット(BME280使用) × 2
ジャンパーケーブル×8
ブレッドボード×1
Webサーバアクセス用PC
I2Cの有効化
Raspberry Piとセンサーの通信を行うために、Raspberry Pi側でI2C通信を有効化する必要があります。
コンソールで以下のコマンドを実行します。
※以下はRaspberry Pi 5のものですが、Raspberry Pi 3も同様に設定します。
sudo raspi-config
GUIが立ち上がるので、「3. Interface Options」を選択して[ENTER]キーを押します。
次の画面で「I5 I2C」を選択して[ENTER]キーを押します。
次に確認画面が表示されるので<はい>を選択し、[ENTER]キーを押します。
I2Cが有効化されたメッセージが表示されるので[ENTER]キーを押します。
Raspberry Piを再起動します。
ライブラリのインストール
Raspberry PiでBME280センサーからデータを取得するために、前回分にsmbus2
およびbme280
ライブラリを追加します。
今回はGPIOまわりのライブラリは使用しないため、バージョン差異はありません。
Raspberry Pi 3/5共通で必要になるライブラリになります。また、I2C動作確認のためi2c-toolsライブラリも追加します。
sudo pip3 install smbus2 –break-system-packages sudo pip3 install bme280 –break-system-packages sudo sudo apt-get install i2c-tools sudo pip3 install RPi.bme280 –break-system-packages |
インストールオプションに「–break-system-packages」をつけないとインストール時にエラーになります。
OSがbookwormとなり、pipの扱いが厳しくなったことが原因のようです。
仮想環境を使用することが推奨されているようですが、今回は「–break-system-packages」で対処します。
また、「bme280」をインストールしているにもかかわらず、スクリプト実行時にライブラリが
見つからないというエラーが発生したため、「RPi.bme280」も併せてインストールしています。
温湿度・気圧センサーモジュールキットとRaspberry Piを接続する
ブレッドボードに温湿度・気圧センサーモジュールキットを接続します。
今回もRaspberry Pi 5用とRaspberry Pi 3用に2セット回路を作ります。
次に回路とRaspberry Pi 5、Raspberry Pi 3を接続します。
センサ側 | Raspberry Pi 3/5共通 |
---|---|
BME280 VDD | 3.3V:1ピン |
BME280 GND | GND:9ピン |
BME280 SDI | GPIO2(SDA):3ピン |
BME280 SCK | GPIO3(SDL):5ピン |
【Raspberry Pi 5のピン配置】
Raspberry Pi 5 Pinouts including GPIO for the 40 Pin Header – element14 Community
【Raspberry Pi 3のピン配置】
Raspberry Pi 3 Model B GPIO 40 Pin Block Pinout – element14 Community
接続が終わったら、以下のコマンドを実行します。
sudo i2cdetect -y 1 |
実行結果に「76」という表記があれば、正常に接続できています。
Pythonスクリプトの作成
前回同様にPythonでFlaskアプリケーションをRaspberry Pi 3/5でそれぞれ作成しますが、
内容は同じものとなります。画面に表示される「BME280 センサーデータ」の部分に
Raspberry Pi 5は(Unit 1)、 Raspberry Pi 3は(Unit 2)と追記します。
ファイル名はtemp.pyにしてみました。
from flask import Flask, render_template_string
import smbus2
import bme280
app = Flask(__name__)
def read_bme280_data():
port = 1 address = 0x76
bus = smbus2.SMBus(port)
bme280.load_calibration_params(bus, address)
data = bme280.sample(bus, address)
return {
'temperature': round(data.temperature, 1),
'pressure': round(data.pressure, 1),
'humidity': round(data.humidity, 1)
}
@app.route('/')
def index(): sensor_data = read_bme280_data()
html = '''
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>センサーデータ</title>
</head>
<body>
<h1>BME280 センサーデータ</h1>
<ul>
<li>温度: {{ data.temperature }} °C</li>
<li>気圧: {{ data.pressure }} hPa</li>
<li>湿度: {{ data.humidity }} %</li>
</ul>
</body>
</html>
'''
return render_template_string(html, data=sensor_data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Webサーバの起動(Pythonスクリプトの実行)
各Raspberry Piのコンソールで、Webサーバを起動します。
まずはIPアドレス確認から。
# Raspberry Pi 5/Raspberry Pi 3共通 ip addr
次に各Raspberry PiでWebサーバを起動します。
# Raspberry Pi 5/Raspberry Pi 3共通 python3 temp.py
Webブラウザからアクセス
Webサイトアクセス用PCでブラウザを2つ起動し、それぞれ以下のURLにアクセスします。
それぞれセンサーが稼働し、「温度」「気圧」「湿度」が表示されます。
http://Raspberry Pi 5のIPアドレス:5000 |
http://Raspberry Pi 3のIPアドレス:5000 |
湿度低め…。
冗長化確認
前回のnginxとkeepallived設定がそのまま残っているので、流用しました。
Webサイトアクセス用PC上のブラウザで仮想IPアドレスのURLにアクセスします。
http://192.168.11.110/ |
Unit 1の表記があり、Master側(Raspberry Pi 5)のWebサイトにアクセスしていることがわかります。
Raspberry Pi 5をシャットダウンします。
その後上記URLにアクセスするとUnit 2の表記があり、Backup側(Rapberry Pi 3)のWebサイトにアクセスしています。
センサーを稼働させながらシステムの冗長化を実現することができました。
これで片系のRaspberry Piに障害が発生しても測定を継続させることができるようになりました。