📦 ソースコード: この記事で紹介しているソースコードは GitHub で公開しています。
記事一覧
前回までのあらすじ
第 1 弾ではアナログ入力方式で 4-20mA 信号の測定に挑戦しましたが、精度に課題が残りました。第 2 弾では INA219 と OLED を使って高精度測定と現場表示を実現。
お客様からの要望は「離れた場所からも確認できるようにしてほしい」というものでした。クレーンの操作室だけでなく、事務所や監視室からもリアルタイムで重量を確認したいとのことです。
第 1 弾と第 2 弾では、まず電流が測定できるかを確認するための実験を行いました。測定が可能であることが確認できたため、次は映像化に取り組みます。
顧客の要望は、クレーンの荷重をモニターに表示させることです。これを実現するため、RTSP 映像配信を採用しました。
なぜ「映像」なのか?
数値データだけなら MQTT や HTTP でも送れます。RTSP 映像配信を選んだ理由は以下の通りです。
メリット ①:表示ソフトが不要
RTSP に対応したプレーヤー(VLC、ffplay など)があれば、すぐに視聴できます。専用アプリのインストールは不要。
メリット ②:既存の監視システムと統合しやすい
多くの監視カメラシステム(NVR/VMS)は RTSP に対応しています。既存のインフラにそのまま組み込めます。
メリット ③:視覚的に分かりやすい
数字だけでなく、バーグラフや色で状態を表現できます。「一目で分かる」のは現場では重要です。
システム構成
Raspberry Pi 5 への移行
RTSP 映像配信を実現するには、映像のエンコードと配信処理が必要です。Raspberry Pi Pico はマイコンであるため、以下の理由でRaspberry Pi 5に移行しました。
- OS が動作しない:GStreamer などの映像処理ライブラリを使用するには、Linux OS が必要
- メモリ不足:映像エンコードには十分な RAM が必要(Pico は 264kB、Raspberry Pi 5 は 4GB/8GB)
- 処理能力不足:H.264 エンコードには CPU パワーが必要
| 機器 | 役割 |
|---|---|
| Raspberry Pi 5 | 映像生成・RTSP 配信 |
| INA219 | 電流センサ |
| Ethernet ケーブル | ネットワーク接続 |
HDMI モニタは不要です。ヘッドレス(画面なし)で動作し、ネットワーク経由で映像を配信します。
アーキテクチャ
┌──────────┐
│ INA219 │ (I2C)
│ 電流センサ │───┐
└──────────┘ │
│
┌──────────────┼───────────────────────────────────┐
│ │ Raspberry Pi 5 │
│ │ │
│ │ ┌──────────┐ ┌──────────────┐ │
│ └─▶│ 映像生成 │──▶│ RTSP配信 │ │
│ │ (Pillow) │ │ (GStreamer) │ │
│ └──────────┘ └──────┬───────┘ │
│ │ │
└────────────────────────────────────────┼─────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ VLC │ │ NVR │ │ スマホ │
│ (PC) │ │ (監視室) │ │ (現場) │
└───────────┘ └───────────┘ └───────────┘

実装の詳細
重量への変換
お客様の要件を思い出しましょう。
- 4mA = 0 トン
- 20mA = 60 トン
電流値を重量に変換する関数を追加します。
def mA_to_ton(current_mA: float) -> float:
# 4mA → 0t, 20mA → 60t の線形変換
ratio = (current_mA - 4.0) / 16.0
ton = ratio * 60.0
return max(0.0, min(60.0, ton)) # 0〜60tにクランプ
映像フレームの生成
Pillow を使って、1280×720 解像度の映像フレームを生成します。
def draw_frame(weight_ton, current_mA, percent, raw_mA):
img = Image.new("RGB", (1280, 720), (0, 0, 0))
d = ImageDraw.Draw(img)
# タイトル
d.text((40, 30), "INA219 4-20mA Weight Monitor",
font=font_mid, fill=(255, 255, 255))
# 重量(メイン表示)← ここが一番目立つ
d.text((40, 120), f"W = {weight_ton:.1f} t",
font=font_big, fill=(255, 255, 255))
# 補助情報
d.text((40, 230), f"I = {current_mA:.2f} mA", ...)
d.text((40, 290), f"Load = {percent:.1f} %", ...)
# バーグラフ
bar_width = int((percent / 100.0) * 1200)
d.rectangle((40, 430, 40 + bar_width, 490), fill=(255, 255, 255))
# 時刻
d.text((40, 520), time.strftime("%Y-%m-%d %H:%M:%S"), ...)
return img
ポイントは重量を一番大きく表示すること。お客様が知りたいのは電流値ではなく「今、何トン吊っているか」です。
GStreamer で RTSP 配信
映像のエンコードと配信にはGStreamerを使います。Python から制御するためにGstRtspServerを利用。
class INA219RtspFactory(GstRtspServer.RTSPMediaFactory):
def __init__(self, state):
super().__init__()
self.state = state
# GStreamerパイプライン
self.launch_string = (
'appsrc name=mysrc is-live=true block=true format=TIME '
'caps=video/x-raw,format=RGB,width=1280,height=720,framerate=15/1 '
'! videoconvert '
'! video/x-raw,format=I420 '
'! x264enc tune=zerolatency speed-preset=ultrafast bitrate=1200 '
'! rtph264pay name=pay0 pt=96 config-interval=1'
)
パラメータの意味
| パラメータ | 意味 |
|---|---|
tune=zerolatency |
遅延を最小化(リアルタイム監視向け) |
speed-preset=ultrafast |
エンコード速度を最優先 |
bitrate=1200 |
ビットレート 1.2Mbps(静止画メインなので低めで OK) |
framerate=15/1 |
15fps(数値表示なので十分) |
複数クライアント対応
VLC で確認しながら、別の PC からも同時に視聴したい。そんなときのために、共有ファクトリを有効化。
factory = INA219RtspFactory(state)
factory.set_shared(True) # ← これで複数クライアントOK
mounts.add_factory("/ina219", factory)
動作確認
プログラムを起動すると、RTSP サーバーが立ち上がります。
$ python3 rtsp_ina219_ton_overlay.py
RTSP server started
URL: rtsp://192.168.1.100:8554/ina219
VLC で視聴
- VLC を起動
- メディア → ネットワークストリームを開く
rtsp://192.168.1.100:8554/ina219を入力
画面いっぱいに重量情報が表示されます。バーグラフがリアルタイムで動くのを見ると、「おお、動いてる!」と思わず声が出ます。
ffplay でも視聴可能
ffplay rtsp://192.168.1.100:8554/ina219 -fflags nobuffer
-fflags nobufferオプションで遅延を最小化できます。
実運用に向けて
RTSP で配信できるようになったことで、様々な活用方法が広がります。
活用例 ①:NVR に録画
監視カメラと同じように NVR に登録すれば、24 時間録画も可能。「あのとき何トン吊ってたっけ?」という問い合わせにも対応できます。
活用例 ②:大型モニターに表示
弊社の RTSP 対応製品を使えば、大型モニターに直接表示できます。操作室に設置すれば、オペレーターが常に重量を確認できます。
活用例 ③:YouTube ライブ配信
RTMP 対応製品と組み合わせれば、YouTube でライブ配信も可能。遠隔地の関係者と情報を共有するのに便利です。
まとめ
第 3 弾では、Raspberry Pi 5 を使って RTSP 映像配信システムを構築しました。
- INA219で高精度に電流を測定
- 重量(トン)に変換してメイン表示
- 1280×720 の映像を生成して RTSP 配信
- VLC/NVR/スマホなど様々なデバイスで視聴可能
OLED では「目の前でしか見えない」という制約がありましたが、RTSP 配信によりどこからでも確認できるシステムになりました。
技術的なポイントまとめ
| 項目 | 内容 |
|---|---|
| 電流測定 | INA219(I2C)、2 点補正、10 回サンプリング平均 |
| 映像生成 | Pillow、1280×720、15fps |
| 映像配信 | GStreamer、H.264、RTSP |
| 遅延 | 0.2〜0.5 秒程度(zerolatency チューニング) |
RTSP URL
rtsp://<Raspberry Pi 5のIPアドレス>:8554/ina219
使用機材
| 機材 | 用途 | 購入リンク |
|---|---|---|
| Raspberry Pi 5 | 映像生成・RTSP 配信 | Amazon |
| INA219 | I2C 電流センサ | Amazon |
| 4-20mA 信号発生器 | テスト・校正用 | Amazon |
| 直流安定化電源 | 電源供給 | Amazon |
| ジャンパーワイヤー | 配線用 | Amazon |
| Raspberry Pi OS (Bookworm) | OS | - |
| Python 3 + GStreamer | 開発環境 | - |
部品の選び方(初心者向け)
INA219
- 第 2 弾と同じ INA219 を使用しています
- I2C 通信でデジタル値として電流を取得できるため、高精度な測定が可能です
- 2 個セットで購入すると、予備も確保できて安心です
- 動作電圧は 3-5.5V で、Raspberry Pi 5 の 3.3V で動作します
ジャンパーワイヤー
- 電子部品同士を接続するためのケーブルです
- オス-メス、オス-オス、メス-メスの組み合わせがあるので、用途に応じて選びましょう
- 120 本セットがあれば、様々なプロジェクトで使えます
4-20mA 信号発生器
- システムの動作確認やテスト時に使用しました
- 4.00mA と 20.00mA を正確に出力できるため、校正にも使用できます
- 実際のクレーン重量センサーがなくても、システムの動作確認が可能です
直流安定化電源
- Raspberry Pi 5 や INA219 に安定した電源を供給するために使用しました
- 0-32V、0-10A の範囲で電圧・電流を可変でき、様々な電子部品の動作確認に使用できます
- 過電流保護(OCP)機能により、部品を保護しながら安全にテストできます
注意
- Raspberry Pi 5 は Raspberry Pi Pico とは異なり、1 系統の I2C バス(GPIO2/GPIO3)しかありません
- INA219 と OLED を同時に使う場合は、同じ I2C バスに接続するか、I2C マルチプレクサを使用する必要があります
次のステップ
第 4 弾では、弊社の RTSP 対応製品と組み合わせて、モニター表示やYouTube ライブ配信を実現する実運用システムについて紹介します。
お楽しみに!