はじめに
前回の記事では、MQTT を利用して HDMI スイッチャーをインターネット経由で遠隔操作する方法を紹介しました。
ただ、弊社の主なお客様は工場や製造業などが多く、MQTT のようにサーバーを介した機器や新技術は嫌がられる事もあり、アナログ制御などの枯れた技術を好まれる事が多いです。
そこでシリアル通信信号をインターネット伝送し HDMI スイッチャーを切り替える機能も同時に開発致しました。
というのも、弊社の映像エンコーダー、デコーダーは映像だけでなく RS-232C や RS-485 といったシリアル信号の伝送も可能で、この機能を使う事で簡単に実装が可能だからです。
映像エンコーダー、デコーダーに興味のある方はこちら
本記事では、シングルボードコンピューター(Raspberry Pi) で信号を生成し、映像エンコーダー、デコーダーを介して遠隔から HDMI スイッチャーを制御する方法を紹介します。
関連記事
- 第 1 弾 Raspberry Pi を使って HDMI スイッチャーをシリアル通信で制御
- 第 2 弾 MQTT を使って HDMI スイッチャーをシリアル通信で制御
- 第 3 弾 映像エンコーダー、デコーダーを使って RS-232C で HDMI スイッチャーを遠隔制御
シリアル通信のセットアップ
プログラムを実装する前に、RS-232C 信号のセットアップ手順を確認します。
送信側のセットアップ
- Raspberry Pi に接続: まず、Raspberry Pi の USB ポートに USB-RS232 変換アダプタを接続します。
- ジャンパーピンの接続: USB-RS232 変換アダプタにジャンパーピンを接続し、そのピンを映像エンコーダーの RS-232C ポートに接続します。
- 準備完了: これで送信側の Raspberry Pi から RS-232C 信号を送信する準備が整いました。
受信側のセットアップ
- Raspberry Pi に接続: 受信側の Raspberry Pi でも、USB-RS232 変換アダプタを USB ポートに接続します。
- ジャンパーピンの接続: 同様に、USB-RS232 変換アダプタにジャンパーピンを接続し、映像デコーダーの RS-232C ポートに接続します。
- 受信準備完了: これで受信側の Raspberry Pi から HDMI スイッチャーへの制御信号を受け取る準備が完了しました。
RS-232C 信号のプログラム
送信側のプログラム
送信側では、ユーザーが「1, 2, 3, 4」のキーを押したときにその数字を送信します。
# mqtt-tx-switch.py
import serial
# シリアルポートの設定(ttyUSB0を使用)
ser = serial.Serial('/dev/ttyUSB0', 57600, timeout=1)
def send_number(number):
# 数字だけを送信
ser.write(number.encode())
print(f"Sent: {number}")
# キーボード入力を標準入力で待ち受ける
try:
while True:
key = input("Press 1, 2, 3, or 4 to send the channel number: ")
if key in ['1', '2', '3', '4']:
send_number(key)
else:
print("Invalid key. Please press 1, 2, 3, or 4.")
except KeyboardInterrupt:
ser.close() # プログラム終了時にシリアルポートを閉じる
print("Serial connection closed")
受信側のプログラム
受信側では、送信された数字を受け取り、それに応じた HDMI スイッチャーの制御コマンドを生成して送信します。
注意
RS-232C 受信用ポートを先に Raspberry Pi に挿して、USB0
として認識されるようにしてください。
# mqtt-rx-switch.py
import serial
import time
# シリアルポートの設定
ser_rx = serial.Serial('/dev/ttyUSB0', 57600, timeout=1) # 受信用ポート
ser_hdmi = serial.Serial('/dev/ttyUSB1', 57600, timeout=1) # HDMIスイッチャーへの送信用ポート
def send_command_to_hdmi(output, input_):
# HDMI スイッチャーへのコマンドを生成して送信
command = f'EZS OUT{output} VS IN{input_}\r\n'
ser_hdmi.write(command.encode()) # コマンドをエンコードして送信
print(f"Sent to HDMI switcher: {command}")
def receive_and_process():
while True:
if ser_rx.in_waiting > 0:
# 受信用ポートからデータを読み込む
received_data = ser_rx.read(ser_rx.in_waiting).decode().strip()
print(f"Received: {received_data}")
# 受信したデータに基づいてHDMIスイッチャーを制御
if received_data in ['1', '2', '3', '4']:
send_command_to_hdmi(1, received_data)
else:
print(f"Invalid data received: {received_data}")
time.sleep(0.1)
try:
print("Waiting for data...")
receive_and_process()
except KeyboardInterrupt:
ser_rx.close() # プログラム終了時に受信用シリアルポートを閉じる
ser_hdmi.close() # プログラム終了時に送信用シリアルポートを閉じる
print("Serial connections closed")
まとめ
今回の記事では、Raspberry Pi を用いた RS-232C 通信による HDMI スイッチャーの遠隔制御について解説しました。
送信側ではシンプルに数字だけを送信し、受信側でそのデータに基づいて HDMI スイッチャーのチャンネル切替コマンドを生成する仕組みを構築しました。
この方法により、信頼性の高い RS-232C 通信を使用したリモート制御が実現できます。