post-cover

2024-09-18 技術ブログ

映像エンコーダー、デコーダーを使って RS-232C で HDMI スイッチャーを遠隔制御 | インターネット経由で遠隔操作可能な HDMI 切替器(HDMI スイッチャー)の開発(第3弾)

はじめに

前回の記事では、MQTT を利用して HDMI スイッチャーをインターネット経由で遠隔操作する方法を紹介しました。

ただ、弊社の主なお客様は工場や製造業などが多く、MQTT のようにサーバーを介した機器や新技術は嫌がられる事もあり、アナログ制御などの枯れた技術を好まれる事が多いです。

そこでシリアル通信信号をインターネット伝送し HDMI スイッチャーを切り替える機能も同時に開発致しました。

というのも、弊社の映像エンコーダー、デコーダーは映像だけでなく RS-232C や RS-485 といったシリアル信号の伝送も可能で、この機能を使う事で簡単に実装が可能だからです。

映像エンコーダー、デコーダーに興味のある方はこちら

raspberry-pi-hdmi-switcher-3-001

本記事では、シングルボードコンピューター(Raspberry Pi) で信号を生成し、映像エンコーダー、デコーダーを介して遠隔から HDMI スイッチャーを制御する方法を紹介します。

関連記事

シリアル通信のセットアップ

プログラムを実装する前に、RS-232C 信号のセットアップ手順を確認します。

送信側のセットアップ

  1. Raspberry Pi に接続: まず、Raspberry Pi の USB ポートに USB-RS232 変換アダプタを接続します。
  2. ジャンパーピンの接続: USB-RS232 変換アダプタにジャンパーピンを接続し、そのピンを映像エンコーダーの RS-232C ポートに接続します。
  3. 準備完了: これで送信側の Raspberry Pi から RS-232C 信号を送信する準備が整いました。

raspberry-pi-hdmi-switcher-3-002

受信側のセットアップ

  1. Raspberry Pi に接続: 受信側の Raspberry Pi でも、USB-RS232 変換アダプタを USB ポートに接続します。
  2. ジャンパーピンの接続: 同様に、USB-RS232 変換アダプタにジャンパーピンを接続し、映像デコーダーの RS-232C ポートに接続します。
  3. 受信準備完了: これで受信側の Raspberry Pi から HDMI スイッチャーへの制御信号を受け取る準備が完了しました。

raspberry-pi-hdmi-switcher-3-002

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 通信を使用したリモート制御が実現できます。