大型TVをデジタルサイネージ化し社内情報表示に利用

昨年度に色々揃えた物で少しづつ見せれる形になってきましたので途中経過の報告がてらチラ見せ Part2 です
今回はStickPC + 大型TVのデジタルサイネージ化について焦点を当てます。

目的

KPI値や社内情報を高頻度に更新/表示し見える化する

利用した物

TVSignage
  • 大型TV
    REGZA G9シリーズ
  • StickPC
    Windows10搭載 Diginnos Stick (Raspberry Pi2のGPUパワーが足りなかったためこちらを選定)
  • USB接続型 学習リモコン
    ビット・トレード・ワン様のUSB接続 赤外線リモコンキット

購入した大型TVなのですが、パワーオンタイマー機能が搭載されていなかったため
少し無理やりですが、USB接続型 学習リモコン + 電源On/Offアプリケーションを自作する事にしました。
コミュニティサイトが存在しサンプルコードもあるため非常に利用しやすかったです

実施した内容

※WindowsPCのスリープを行わず、テレビの電源はOn/OffをUSB接続型学習リモコンより実施

設置

TVの裏側にStickPCを設置
USB接続型 学習リモコンを受光部の隣に両面テープで貼り付け
ほぼ90度の角度でも添付されている拡散LEDキャップを被せる事で、十分に安定して動作する事を確認できました。

IMG_4137
加工に多少手間どいましたがフリスクケースに格納しました!

アプリケーションの作成

コミュニティサイトよりダウンロード出来る下記を利用して作成しました。

  • 送信用設定ツール (テレビリモコンの信号データ解析に利用)
  • 赤外線送信ライブラリ C#サンプルコード
  • 赤外線送信ライブラリ

TVの電源On/Offステータスは実装しておりません。
TVにLANケーブルを挿してPingを打つ等も検討しましたが、ややこしくなるため誰も触れない前提です。
(PowerOn/PowerOffはいずれも電源ボタンを押した際のシグナルのため、逆の動作をするケースもあるという事です。)

下記リモコンコードはTOSHIBAのREGZAで動作したコードとなります

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Power On 処理
this.Invoke((MethodInvoker)delegate()
{
    // 入力をHDMI1に切り替え
    SendIR(new byte[] { 0x40, 0xBF, 0x12, 0xED }); // 電源ボタンを押下
    System.Threading.Thread.Sleep(3000);
    SendIR(new byte[] { 0x40, 0xBF, 0x01, 0xFE }); // 1チャンネルを押下
    System.Threading.Thread.Sleep(1000);
    SendIR(new byte[] { 0x40, 0xBF, 0x0F, 0xF0 }); // 入力切替を押下
    System.Threading.Thread.Sleep(500);
 
    // ボリュームを最小にする 100回 VolumeDown
    for (int i = 1; i < 100; i++)
    {
        SendIR(new byte[] { 0x40, 0xBF, 0x1E, 0xE1 });
        System.Threading.Thread.Sleep(300);
    }
 
    // ボリュームをUIから設定した設定値にする X回 VolumeUp
    for (int i = 0; i < Int32.Parse(GetSetting("MaxVolume")); i++)
    {
        SendIR(new byte[] { 0x40, 0xBF, 0x1A, 0xE5 });
        System.Threading.Thread.Sleep(300);
    }
});
 
// Power Off 処理
this.Invoke((MethodInvoker)delegate()
{
    SendIR(new byte[] { 0x40, 0xBF, 0x12, 0xED });
});
 
...
 
private void SendIR(byte[] code)
{
    try
    {
        int i_ret = 0;
 
        if (handle_usb_device != null)
        {
            i_ret = USBIR.writeUSBIRex(handle_usb_device, USBIR.IR_FORMAT.NEC, code, 32, 0);
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
}

基本的にはサンプルコードに時間判定処理を追加しただけとなります。

表示コンテンツ

Dashingで作成した社内KPI値等複数のダッシュボードを自動巡回する形でChromeで表示しています。
こちらはまた別の機会に紹介させて頂きます。

投稿者プロフィール

takashi
Japan AWS Ambassadors 2023, 2024
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


Time limit is exhausted. Please reload CAPTCHA.