本記事で紹介するプログラムは以下の GitHub リポジトリで公開しています
本記事は連載形式でお届けしています。各回の内容は以下のリンクからご覧いただけます。
はじめに
エレベーターと自動運転装置の間で行われる RS422 通信を解析し、現在階や行先階といった情報をリアルタイムで映像化して監視室に表示したい——
そうした顧客ニーズに応えるため、Raspberry Pi 4B を用いた RTSP 映像配信システムを構築しました。
このシステムでは、RS422 経由で受信したシリアル信号を解析し、その内容に基づいて映像を自動生成します。
ただし、開発初期にはエレベーター実機との接続が困難だったため、仕様書に基づき ENQ 信号を送信する専用のテストシミュレーターを開発する必要がありました。
本記事は、全 3 回にわたる技術ブログシリーズの第 1 回として、シミュレーターの開発背景と実装概要を紹介します。
プログラムの実行手順
本シミュレーターは、GitHub リポジトリ内の backend
フォルダにある elevator_enq_only_simulator.py
を使用します。任意のディレクトリにコピーして実行してください。
動作環境
- Python 3.8 以上がインストールされていること
- 必須ライブラリ:
pyserial
ライブラリのインストール
以下のコマンドで必要なライブラリをインストールしてください:
pip install pyserial
Windows 環境でインストールに失敗する場合
Windows 環境で pip
コマンドが正常に動作しない場合は、Python を Microsoft Store からインストールし直したうえで、以下のコマンドで pip
をアップグレードしてください。
python -m pip install --upgrade pip
使用機材と接続構成
本シミュレーターを実行するには、以下のハードウェアを使用します。
使用機材一覧
✅ RS422 対応 USB シリアルコンバーター ×2
- WaveShare RS232/485/422/TTL コンバーター
- ※PC 側・Raspberry Pi 側で各 1 台ずつ使用します。
- ⚠ 注意:格安品(半額以下)も市場に出回っていますが、シリアル信号の安定性が低く、正常に通信できない事例が確認されています。特に開発や検証用途では、WaveShare 製のような信頼性の高い製品を使用することを強く推奨します。
✅ RS232C DB9 メス-メス シリアルケーブル
接続構成
- PC 側:WaveShare コンバーターを USB 経由で接続
- Raspberry Pi 側:同様に USB 経由で接続
- 中継接続:両方のコンバーターの DB9 ポートを、メス-メスのシリアルケーブルで直結
PC(シミュレーター) → RS422 コンバーター → DB9 シリアルケーブル → RS422 コンバーター → Raspberry Pi 4B
この構成により、PC から送信される ENQ 信号が物理的に RS422 経由で Raspberry Pi に届き、実機に近い通信環境での動作確認・開発が可能になります。
実行方法
elevator_enq_only_simulator.py
は、デフォルトで COM1
ポートを使用する設定になっています。
ポートの指定方法
実行時にコマンドライン引数で使用ポートと開始階数を指定することも可能です:
# 使用するCOMポートと開始階数を指定して実行
python elevator_enq_only_simulator.py --port COM31 --start-floor 1
# COMポートのみ指定(開始階数はデフォルトの1F)
python elevator_enq_only_simulator.py --port COM31
# すべてデフォルト(COM1、開始階数1F)
python elevator_enq_only_simulator.py
ソースコードでポートを固定する場合
毎回コマンドラインでポート指定をする必要がないようにするには、スクリプト内の SERIAL_PORT
を直接編集してください:
SERIAL_PORT = "COM31" # 実際に使用するCOMポートに変更
ポートの確認方法(Windows)
接続されているシリアルデバイスのポート番号は、以下の手順で確認できます:
- デバイスマネージャーを開く
- 「ポート(COM と LPT)」を展開
- 「USB Serial Port(COMxx)」を確認
確認した COMxx
を上記の方法で指定することで、正しく通信が行えるようになります。
実行例とログ出力
以下は、シミュレーターを実行した際の実際のコマンドおよびログ出力例です。
起動コマンド例
C:\> python elevator_enq_only_simulator.py --port COM31 --start-floor 1
出力ログ例
2025-06-11 09:30:00,123 - INFO - 🏢 エレベーターENQ専用シミュレーター初期化
2025-06-11 09:30:00,124 - INFO - 📡 シリアルポート: COM31
2025-06-11 09:30:00,125 - INFO - ✅ シリアルポート COM31 接続成功
2025-06-11 09:30:00,126 - INFO - 🏢 開始階数: 1F
2025-06-11 09:30:00,127 - INFO - ✅ システム準備完了(Ctrl+C で終了)
2025-06-11 09:30:00,128 - INFO - 🚀 シミュレーション開始
2025-06-11 09:30:00,129 - INFO - 📋 送信仕様:
2025-06-11 09:30:00,130 - INFO - ①現在階 → ②行先階 → ③着床 → ④乗客降客 → 5秒待機
2025-06-11 09:30:00,131 - INFO - ※①~③は1秒間隔で送信
2025-06-11 09:30:00,132 - INFO - 🎯 新しい移動シナリオ: 1F → 3F
2025-06-11 09:30:00,133 - INFO - [2025年06月11日 09:30:00] 📤 ENQ送信: 現在階: 1F (1/5)(局番号:0002 データ:0001 チェックサム:CE)
2025-06-11 09:30:01,134 - INFO - [2025年06月11日 09:30:01] 📤 ENQ送信: 現在階: 1F (2/5)(局番号:0002 データ:0001 チェックサム:CE)
...
このように、送信ステップごとに詳細なログが出力されるため、動作確認やデバッグが容易です。通信仕様やシナリオの流れもログに明示されるため、開発中の他システムとの整合性確認にも役立ちます。
エレベーターの通信仕様
本システムが対象とするのは、自動運転装置とエレベーターが RS422 通信で情報をやり取りする構成です。以下に、その通信仕様とデータ構造の詳細を示します。
RS422 通信仕様
項目 | 内容 |
---|---|
通信方式 | RS422(4 線式、全二重) |
通信速度 | 9600 bps |
データビット長 | 8 bit |
パリティ | 偶数(even) |
ストップビット | 1 bit |
送信データ定義(エレベーター → 自動運転装置)
RS422 経由で送信されるデータは、ENQ(0x05)で始まる 16 バイト固定長のコマンド電文です。
データ種別一覧
データ番号 | 意味 | データ例 |
---|---|---|
0001 |
現在階数 | FFFF (B1F) |
0002 |
行先階 | 0003 (3F) |
0003 |
荷重 | 074E (1870kg) |
電文構造(フォーマット)
フィールド | 内容 |
---|---|
コントロールコード | 05H (ENQ) |
局番号 | 例:0002 (送信元:エレベーター) |
コマンド種別 | W (Write) |
データ番号 | 例:0001 (現在階数) |
データ値 | 例:FFFF (B1F) |
チェックサム | 局番号 〜データ値 の ASCII 文字を加算した下位 1 バイト(HEX) |
※ チェックサムは、局番号・コマンド・データ番号・データ値の各文字の ASCII コードを 10 進数で加算し、下位 8 ビット(1 バイト)のみを 16 進表記したものです。
ENQ 命令フォーマット
各フィールドの意味と仕様
コントロールコード(1 バイト)
- 固定値:
0x05
(ASCII の ENQ 制御文字)
- 固定値:
局番号(4 バイト)
- エレベーター:
0002
(本シミュレーターでは送信側) - 自動運転装置:
0001
(本システムでは受信側)
- エレベーター:
コマンド(1 バイト)
- 書き込み:
W
- 読み込み:
R
(今回は使用しません)
- 書き込み:
データ番号(4 バイト)
0001
:現在階0002
:行先階0003
:荷重
データ値(4 バイト)
階数:
- B1F:
FFFF
- 1F:
0001
- 2F:
0002
- 3F:
0003
- 行先なし:
0000
- B1F:
荷重:16 進数(例:1870kg →
074E
)
チェックサム(2 バイト)
局番号
からデータ値
までの ASCII 文字コードを加算し、その合計値の下位 1 バイトを 16 進表記した値(例:CE
)
通信パケットの例
以下は、実際に送信される ENQ 電文の構造例です:
ENQ 命令(16バイト固定長):
[05H][局番号4桁][W][データ番号4桁][データ値4桁][チェックサム2桁]
例:
05H 0002 W 0001 FFFF CE
このような構造で構成されるデータを定期的に送信することで、受信側(Raspberry Pi)は現在階・行先階・荷重といった状態を逐次取得できるようになります。
まとめ
本記事では、エレベーターと自動運転装置間の RS422 通信における ENQ 信号の送信を再現するために開発したPython 製シミュレーターについて、使用機材・接続構成・プログラムの実行手順・通信仕様などを詳しく紹介しました。
このシミュレーターは、以下のような場面で活用できます:
- エレベーター実機が未導入の開発初期段階でも、通信処理や映像生成のテストが可能
- 仕様書ベースの通信プロトコル検証に活用できる
- RTSP 配信システムとの組み合わせにより、リアルタイムな監視映像との統合テストも実現可能
次回の記事では、本シミュレーターから送信される ENQ 電文を Raspberry Pi で受信し、その情報をもとに状態管理と映像生成を行う処理の実装について解説します。
RS422 通信のテスト環境を自作しようと考えている方や、同様の用途で RTSP 連携を行いたい方の参考になれば幸いです。
※ご質問やフィードバックがありましたら、問い合わせフォーム経由でお気軽にお寄せください。
本記事で紹介するプログラムは以下の GitHub リポジトリで公開しています