Raspberry PiでWebサーバ(冗長構成)を構築② 今度はセンサー

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に障害が発生しても測定を継続させることができるようになりました。

著者について

インフラPL/PMを担当しています。

岩井義文をフォローする

クラウドに強いによるエンジニアブログです。

SCSKでは、自社クラウドと3大メガクラウドの強みを活かし、ハイブリッドクラウド/マルチクラウドのソリューションを展開しています。業界の深い理解をもとに、お客様の業務要件に最適なアーキテクチャをご提案いたします。サービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。

その他技術ナレッジ
シェアする
タイトルとURLをコピーしました