post-cover

2024-09-11 技術ブログ

Raspberry Pi を使って HDMI スイッチャーをシリアル通信で制御 | インターネット経由で遠隔操作可能な HDMI 切替器(HDMI スイッチャー)の開発(第1弾)

はじめに

弊社では、HDMI 出力の映像をインターネットを介して遠隔地に伝送できる映像伝送装置を販売しております。

映像伝送装置は 1 つの映像源しか伝送できないため、複数の映像を送信する際には、その数に応じた機器が必要となります。また、複数の映像を同時に遠隔地へ伝送する際には、ネットワーク帯域を大きく消費するため、映像の遅延や他の通信に影響を及ぼす可能性があります。

これらの課題を解決するため、遠隔操作可能な HDMI 切替器(HDMI スイッチャー)を開発しました。本製品を使用することで、遠隔地から映像の切替が可能となり、複数の映像を確認することができます。システム概要は以下の通りです。

raspberry-pi-hdmi-switcher-1-001

HDMI 切替器は最大 4 チャンネルに対応しています。

関連記事

切替装置の仕組み

切替装置は、シングルボードコンピューター(SBC)の Raspberry Pi を用いて開発しました。動作の仕組みは以下の通りです。

  1. 切替スイッチの信号を SBC に入力し、その入力信号をもとに指令を作成します。
  2. MQTT を使用して、現地に設置された SBC に指令を送信します。
  3. 現地の SBC は受信した指令に基づき、RS-232 の制御信号を生成し、HDMI 切替器に送信します。

raspberry-pi-hdmi-switcher-1-002

MQTT とは

MQTT(Message Queuing Telemetry Transport) とは、軽量な通信プロトコルであり、主に IoT(モノのインターネット)デバイス間でのデータ送受信に利用されます。低帯域幅や不安定なネットワーク環境でも効率的に動作するよう設計されています。

MQTT を使った理由は以下の通りです。

  1. 軽量であり、通信量が非常に少ないため。
  2. SSH によるリモート操作も検討したが、不正ログインによる内部ネットワークへの侵入のリスクを懸念したため
  3. 現地に設置する際、Wi-Fi 接続のみで煩雑なネットワーク設定が不要となるため。

この切替器は設置場所の Wi-Fi につなぐだけで簡単に使用できるので非常にお手軽です。

また弊社の映像伝送装置には RS-232 信号を映像と一緒に送る機能がついております。その機能を使って遠隔地から HDMI 切替器に切替制御信号を送るといった事も可能です。

raspberry-pi-hdmi-switcher-1-003

プログラムの紹介

最後に、弊社が開発したシングルボードコンピューター(Raspberry Pi)によるシリアル通信制御プログラムと、MQTT を使った通信プログラムをご紹介します。

記事の内容がボリュームが大きいため、2 回に分けてお届けします。本記事では、シリアル通信で信号を出力する部分までをご紹介いたします。次回の記事で、MQTT を使用した通信部分について詳しく解説いたします。

シリアル通信による HDMI スイッチャーのチャンネル変更プログラム

Raspberry Pi を活用して、シリアル通信で HDMI スイッチャーのチャンネルを変更する方法について解説します。

HDMI スイッチャーには USB ポートがあり、製造元から提供されたシリアルコマンドを用いて制御を行います。

シリアル通信の詳細

製造元から提供された情報によると、以下のコマンドを使用して HDMI スイッチャーのチャンネルを変更できます。 EZS OUTx VS INy : Set Output x To Input y {x=1, y=[1~4]}

また、ボーレートは 57600 と指定されています。

シリアルポートの確認方法

Raspberry Pi ではシリアルポートは通常 /dev/ttyUSB0 に割り当てられますが、確認するためには以下のコマンドを使用します。

ls /dev/ttyUSB*

これにより、接続されているシリアルデバイスを確認できます。

Python によるシリアル通信プログラム

次に、Python を使って HDMI スイッチャーにシリアルコマンドを送信するコードを紹介します。

このコードは、ユーザーの入力に応じて HDMI スイッチャーのチャンネルを切り替えます。

import serial
import time

# シリアルポートの設定(ttyUSB0を使用)
ser = serial.Serial('/dev/ttyUSB0', 57600, timeout=1)

def send_command(x, y):
    # xとyの値を入れて、コマンドを作成
    command = f'EZS OUT{x} VS IN{y}\r\n'
    ser.write(command.encode())  # コマンドをエンコードして送信
    print(f'Sent: {command}')

# キーボード入力を標準入力で待ち受ける
try:
    while True:
        key = input("Press 1, 2, 3, or 4 to change the channel: ")

        if key == '1':
            send_command(1, 1)
        elif key == '2':
            send_command(1, 2)
        elif key == '3':
            send_command(1, 3)
        elif key == '4':
            send_command(1, 4)
        else:
            print("Invalid key. Please press 1, 2, 3, or 4.")

except KeyboardInterrupt:
    ser.close()  # プログラム終了時にシリアルポートを閉じる
    print("Serial connection closed")

まとめ

このプログラムを使用することで、Raspberry Pi を通じて HDMI スイッチャーをシリアル通信で簡単に制御できます。

シリアル通信の基本設定やコマンド送信の仕組みを活用し、柔軟にデバイスの操作が可能です。