RaspberryPiで「猫シアター」を作成する

猫のふーちゃんは最近YouTubeを覚えた様子。スマホを触っているとYouTubeで「猫が喜ぶ動画」を見せろと要求して来ます。どうやら幼児くらいの知能があるようです。

そんなふーちゃんのために、「猫が喜ぶ動画」をエンドレスで再生する「猫シアター」を作成してみました。

完成の様子

まずは完成した状態をごらんください

用意したもの

  • 使っていないRaspberry Pi 3B
  • 壊れたiPadから取り外したRetina液晶
  • 百均で購入した、表彰状などを入れるフレーム
  • 猫が喜ぶ動画はこちらをお借りしました。ありがとうございます。

作成中のフレームを裏から見た様子。3Dプリンタで作成したフレームは外しました。

手順

基本的に過去記事と同じ事をします。ブラウザ(Chromium)の代わりにVLCを起動します。

Raspberry Pi Imager

いつも通り、Raspberry Pi ImagerでOSを新規作成します。今回はRaspbian 32bit を選択しました。

OSセットアップ

ufw

「ローカルで誰もアタックしないからファイアーウォールなんて不要だよ。」なんて言わずに、設定しておきましょう。sshもVNCも使わないって方は、4行目、5行目は不要です。ポート番号を変えてるよって方は番号を変更してください。

$ sudo apt-get install ufw
$ sudo ufw disable
$ sudo ufw default deny
$ sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22
$ sudo ufw allow proto tcp from 192.168.1.0/24 to any port 5900
$ sudo ufw enable

自動更新を有効

「ローカルだから更新なんて良いんだよ。」って言わずに、自動更新は必ず仕掛けておきましょう。

$ sudo apt install unattended-upgrades
$ sudo dpkg-reconfigure -plow unattended-upgrades

VLC 自動起動

ラズパイの電源を入れた際に、VLCが自動起動するように仕掛けます。

sudo vim /lib/systemd/system/kiosk.service

ファイルの中身はこんな感じです(chromiumの時と一緒です)。

[Unit]
Description=Chromium Dashboard
Requires=graphical.target
After=graphical.target

[Service]
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/pi/.Xauthority
Type=simple
ExecStart=/home/pi/dashboard.sh
Restart=on-abort
User=pi
Group=pi

[Install]
WantedBy=graphical.target

起動用のスクリプトを作成します。

sudo vim dashboard.sh

ファイルの中身はこんな感じにしました。これで指定したファイルがフルサイズ(-f)でリピート再生(-R)されます。

#!/bin/bash
/usr/bin/vlc -R -f --video-on-top /home/pi/cat.mp4

スクリプトの実行権限もつけておきましょう。

sudo chmod +x dashboard.sh 

VLCのヘルプ

今回、VLCのヘルプを参照して、「-R -f –video-on-top」を指定しました。他のオプションも一応のっけておきます。

VLC media player 3.0.12 Vetinari (revision 3.0.12-1-0-gd147bb5e7e)
利用方法: vlc [オプション] [ストリーム] ...
コマンドライン上で複数のストリームを指定することが可能です。
指定されたストリームはプレイリストにキューイングされます。
最初に指定されたものから順に再生されます。

オプションの指定形式:
  --option  プログラムの長さを指定するグローバルオプション
   -option  グローバルオプション --option の一文字バージョン
   :option  ストリームに直接適用するオプション、前の設定は上書きされます。

ストリームのMRL指定形式:
  [[access][/demux]://]URL[#[title][:chapter][-[title][:chapter]]]
  [:option=value ...]
  複数のグローバルオプション --option は、MRL固有のオプション :option の
  組みとして扱われます
  複数の :option=value の組みが指定可能です。

URLの指定形式:
  file:///path/file              プレーンなメディアファイル
  http://host[:port]/file        HTTP URL
  ftp://host[:port]/file         FTP URL
  mms://host[:port]/file         MMS URL
  screen://                      画面キャプチャー
  [dvd://][device]               DVDデバイス
  [vcd://][device]               VCDデバイス
  [cdda://][device]              オーディオCDデバイス
  udp://[[<source address>]@[<bind address>][:<bind port>]]
                                 ストリーミングサーバーによって送信される
                                 UDPストリーム
  vlc://pause:<seconds>          再生を指定された時間で一時停止する特別な指定
  vlc://quit                     VLCを終了させる特別な指定

 コアプログラム (core)

 オーディオ
      --audio, --no-audio        オーディオの有効化
                                 (デフォルトで有効)
      --force-dolby-surround {0 (自動), 1 (オン), 2 (オフ)} 
                                 ドルビーサラウンドの検出を強制
      --audio-replay-gain-mode {none,track,album} 
                                 再生ゲインモード
      --audio-replay-gain-preamp <浮動小数点> 
                                 再生プリアンプ
      --audio-replay-gain-default <浮動小数点> 
                                 デフォルト再生ゲイン
      --audio-time-stretch, --no-audio-time-stretch 
                                 オーディオのタイムストレッチの有効化
                                 (デフォルトで有効)
      --audio-filter <文字列>    オーディオフィルター
      --audio-visual {any,visual,glspectrum,none} 
                                 オーディオの視覚化

 ビデオ
  -f, --fullscreen, --no-fullscreen 
                                 全画面ビデオ出力
                                 (デフォルトで無効)
      --video-on-top, --no-video-on-top 
                                 常に手前に表示
                                 (デフォルトで無効)
      --video-wallpaper, --no-video-wallpaper 
                                 壁紙モードの有効化
                                 (デフォルトで無効)
      --video-title-show, --no-video-title-show 
                                 ビデオにメディアタイトルを表示
                                 (デフォルトで有効)
      --video-title-timeout <整数> 
                                 ビデオタイトルを表示する時間(ミリ秒)
      --video-title-position {0 (中央), 1 (左), 2 (右), 4 (上), 8 (下), 5 (左上), 6 (右上), 9 (左下), 10 (右下)} 
                                 ビデオタイトルの位置
      --mouse-hide-timeout <整数> 
                                 カーソルと全画面表示コントローラーを隠すまでの
                                 時間(ミリ秒)
   スナップショット:
      --snapshot-path <文字列>   ビデオスナップショットのディレクトリ(またはフ
                                 ァイル名)
      --snapshot-prefix <文字列> ビデオスナップショットファイル名のプレフィック
                                 ス
      --snapshot-format {png,jpg,tiff} 
                                 ビデオスナップショットの形式
      --snapshot-preview, --no-snapshot-preview 
                                 ビデオスナップショットを表示
                                 (デフォルトで有効)
      --snapshot-sequential, --no-snapshot-sequential 
                                 ファイル名にタイムスタンプの代わりに連番を使用
                                 (デフォルトで無効)
   ウィンドウプロパティ:
      --crop <文字列>            ビデオクロッピング
      --custom-crop-ratios <文字列> 
                                 カスタムのクロッピング比率リスト
      --aspect-ratio <文字列>    ソースのアスペクト比
      --autoscale, --no-autoscale 
                                 ビデオ自動スケーリング
                                 (デフォルトで有効)
      --custom-aspect-ratios <文字列> 
                                 カスタムのアスペクト比リスト
      --deinterlace {0 (オフ), -1 (自動), 1 (オン)} 
                                 デインターレース
      --deinterlace-mode {auto,discard,blend,mean,bob,linear,x,yadif,yadif2x,phosphor,ivtc} 
                                 デインターレースモード
      --video-filter <文字列>    ビデオフィルターモジュール
      --video-splitter <文字列>  ビデオ分割モジュール

 サブピクチャー
   オンスクリーンディスプレイ(OSD):
      --spu, --no-spu            サブピクチャーの有効化
                                 (デフォルトで有効)
      --osd, --no-osd            オンスクリーンディスプレイ(OSD)
                                 (デフォルトで有効)
   字幕:
      --sub-file <文字列>        字幕ファイルを使用
      --sub-autodetect-file, --no-sub-autodetect-file 
                                 字幕ファイルの自動検出
                                 (デフォルトで有効)
      --sub-text-scale <整数 [10 .. 500]> 
                                 字幕スケーリング係数
   オーバーレイ:
      --sub-source <文字列>      サブピクチャーソースモジュール
      --sub-filter <文字列>      サブピクチャーフィルターモジュール
   トラック設定:
      --audio-language <文字列>  オーディオ言語
      --sub-language <文字列>    字幕の言語
      --menu-language <文字列>   メニュー言語:
      --preferred-resolution {-1 (利用可能な最高値), 1080 (フルHD (1080p)), 720 (HD (720p)), 576 (標準の解像度(576、または480ライン)), 360 (低い解像度(360ライン)), 240 (かなり低い解像度(240ライン))} 
                                 優先するビデオの解像度
   再生制御:
      --input-repeat <整数 [0 .. 65535]> 
                                 入力ストリームの繰り返し
      --input-fast-seek, --no-input-fast-seek 
                                 高速シーク
                                 (デフォルトで無効)
      --rate <浮動小数点>        再生速度
   デフォルトデバイス:
      --dvd <文字列>             DVDデバイス
      --vcd <文字列>             VCDデバイス
   詳細設定:
      --input-title-format <文字列> 
                                 再生中メディアのタイトル変更

 入力
      --stream-filter <文字列>   ストリームフィルターモジュール

 プレイリスト
   パフォーマンスオプション:
  -Z, --random, --no-random      ファイルをランダムに再生
                                 (デフォルトで無効)
  -L, --loop, --no-loop          すべてをリピート
                                 (デフォルトで無効)
  -R, --repeat, --no-repeat      再生中タイトルをリピート
                                 (デフォルトで無効)
      --play-and-exit, --no-play-and-exit 
                                 再生と終了
                                 (デフォルトで無効)
      --play-and-stop, --no-play-and-stop 
                                 再生と停止
                                 (デフォルトで無効)
      --start-paused, --no-start-paused 
                                 最初のフレームで一時停止
                                 (デフォルトで無効)
      --playlist-autostart, --no-playlist-autostart 
                                 自動的に開始
                                 (デフォルトで有効)
      --playlist-cork, --no-playlist-cork 
                                 オーディオ通信の一時停止
                                 (デフォルトで有効)
      --media-library, --no-media-library 
                                 メディアライブラリを使用
                                 (デフォルトで無効)
      --playlist-tree, --no-playlist-tree 
                                 プレイリストのツリー表示
                                 (デフォルトで無効)
      --open <文字列>            デフォルトのストリーム
      --auto-preparse, --no-auto-preparse 
                                 項目の自動的な事前解析
                                 (デフォルトで有効)
      --preparse-timeout <整数>  予備解析のタイムアウト
      --metadata-network-access, --no-metadata-network-access 
                                 メタデータのネットワークアクセスを許可
                                 (デフォルトで有効)
      --recursive {none,collapse,expand} 
                                 サブディレクトリの振る舞い
      --ignore-filetypes <文字列> 
                                 除外する拡張子
      --show-hiddenfiles, --no-show-hiddenfiles 
                                 隠しファイルを表示
                                 (デフォルトで無効)
  -v, --verbose <整数>           メッセージの出力レベル(0,1,2)
      --pidfile <文字列>         ファイルにプロセスIDを書き込む
      --advanced, --no-advanced  詳細設定オプションを表示
                                 (デフォルトで無効)
      --interact, --no-interact  対話的なインターフェース
                                 (デフォルトで有効)
  -I, --intf <文字列>            インターフェースモジュール
      --extraintf <文字列>       拡張インターフェースモジュール
      --control <文字列>         制御インターフェース

 ホットキー
      --hotkeys-y-wheel-mode {-1 (無視), 0 (音量の制御), 2 (再生位置の制御), 3 (再生位置制御を反転)} 
                                 マウスホイールの垂直軸制御
      --hotkeys-x-wheel-mode {-1 (無視), 0 (音量の制御), 2 (再生位置の制御), 3 (再生位置制御を反転)} 
                                 マウスホイールの水平軸制御
      --global-key-toggle-fullscreen <文字列> 
                                 全画面表示
      --key-toggle-fullscreen <文字列> 
                                 全画面表示
      --global-key-leave-fullscreen <文字列> 
                                 全画面表示の解除
      --key-leave-fullscreen <文字列> 
                                 全画面表示の解除
      --global-key-play-pause <文字列> 
                                 再生/一時停止
      --key-play-pause <文字列>  再生/一時停止
      --global-key-faster <文字列> 
                                 速く
      --key-faster <文字列>      速く
      --global-key-slower <文字列> 
                                 ゆっくり
      --key-slower <文字列>      ゆっくり
      --global-key-rate-normal <文字列> 
                                 通常レート
      --key-rate-normal <文字列> 通常レート
      --global-key-rate-faster-fine <文字列> 
                                 少しだけ速く
      --key-rate-faster-fine <文字列> 
                                 少しだけ速く
      --global-key-rate-slower-fine <文字列> 
                                 少しだけゆっくり
      --key-rate-slower-fine <文字列> 
                                 少しだけゆっくり
      --global-key-next <文字列> 次へ
      --key-next <文字列>        次へ
      --global-key-prev <文字列> 前へ
      --key-prev <文字列>        前へ
      --global-key-stop <文字列> 停止
      --key-stop <文字列>        停止
      --global-key-jump-extrashort <文字列> 
                                 ほんの少し前に戻る
      --key-jump-extrashort <文字列> 
                                 ほんの少し前に戻る
      --global-key-jump+extrashort <文字列> 
                                 ほんの少し先に進む
      --key-jump+extrashort <文字列> 
                                 ほんの少し先に進む
      --global-key-jump-short <文字列> 
                                 少し前に戻る
      --key-jump-short <文字列>  少し前に戻る
      --global-key-jump+short <文字列> 
                                 少し先に進む
      --key-jump+short <文字列>  少し先に進む
      --global-key-jump-medium <文字列> 
                                 前に戻る
      --key-jump-medium <文字列> 前に戻る
      --global-key-jump+medium <文字列> 
                                 先に進む
      --key-jump+medium <文字列> 先に進む
      --global-key-jump-long <文字列> 
                                 かなり前に戻る
      --key-jump-long <文字列>   かなり前に戻る
      --global-key-jump+long <文字列> 
                                 かなり先に進む
      --key-jump+long <文字列>   かなり先に進む
      --global-key-frame-next <文字列> 
                                 次のフレーム
      --key-frame-next <文字列>  次のフレーム
      --global-key-quit <文字列> 終了
      --key-quit <文字列>        終了
      --global-key-vol-up <文字列> 
                                 音量を上げる
      --key-vol-up <文字列>      音量を上げる
      --global-key-vol-down <文字列> 
                                 音量を下げる
      --key-vol-down <文字列>    音量を下げる
      --global-key-vol-mute <文字列> 
                                 ミュート
      --key-vol-mute <文字列>    ミュート
      --global-key-audio-track <文字列> 
                                 オーディオトラックの切り替え
      --key-audio-track <文字列> オーディオトラックの切り替え
      --global-key-audiodevice-cycle <文字列> 
                                 オーディオデバイスの切り替え
      --key-audiodevice-cycle <文字列> 
                                 オーディオデバイスの切り替え
      --global-key-subtitle-revtrack <文字列> 
                                 字幕トラックの切り替え順を反転
      --key-subtitle-revtrack <文字列> 
                                 字幕トラックの切り替え順を反転
      --global-key-subtitle-track <文字列> 
                                 字幕トラックの切り替え
      --key-subtitle-track <文字列> 
                                 字幕トラックの切り替え
      --global-key-subtitle-toggle <文字列> 
                                 字幕切り替え
      --key-subtitle-toggle <文字列> 
                                 字幕切り替え
      --global-key-program-sid-next <文字列> 
                                 次のプログラムサービスIDを切り替え
      --key-program-sid-next <文字列> 
                                 次のプログラムサービスIDを切り替え
      --global-key-program-sid-prev <文字列> 
                                 前のプログラムサービスIDを切り替え
      --key-program-sid-prev <文字列> 
                                 前のプログラムサービスIDを切り替え
      --global-key-aspect-ratio <文字列> 
                                 ソースのアスペクト比の切り替え
      --key-aspect-ratio <文字列> 
                                 ソースのアスペクト比の切り替え
      --global-key-crop <文字列> ビデオのクロッピングの切り替え
      --key-crop <文字列>        ビデオのクロッピングの切り替え
      --global-key-toggle-autoscale <文字列> 
                                 自動スケーリングの切り替え
      --key-toggle-autoscale <文字列> 
                                 自動スケーリングの切り替え
      --global-key-incr-scalefactor <文字列> 
                                 スケーリング係数の増加
      --key-incr-scalefactor <文字列> 
                                 スケーリング係数の増加
      --global-key-decr-scalefactor <文字列> 
                                 スケーリング係数の減少
      --key-decr-scalefactor <文字列> 
                                 スケーリング係数の減少
      --global-key-deinterlace <文字列> 
                                 デインタレースの切り替え
      --key-deinterlace <文字列> デインタレースの切り替え
      --global-key-deinterlace-mode <文字列> 
                                 デインターレースモードの切り替え
      --key-deinterlace-mode <文字列> 
                                 デインターレースモードの切り替え
      --global-key-intf-show <文字列> 
                                 全画面表示モードでコントローラーを表示
      --key-intf-show <文字列>   全画面表示モードでコントローラーを表示
      --global-key-wallpaper <文字列> 
                                 ビデオ出力の壁紙モードの切り替え
      --key-wallpaper <文字列>   ビデオ出力の壁紙モードの切り替え
      --global-key-random <文字列> 
                                 ランダム再生
      --key-random <文字列>      ランダム再生
      --global-key-loop <文字列> 通常再生/ループ/リピート
      --key-loop <文字列>        通常再生/ループ/リピート
      --global-key-zoom-quarter <文字列> 
                                 1:4 1/4
      --key-zoom-quarter <文字列> 
                                 1:4 1/4
      --global-key-zoom-half <文字列> 
                                 1:2 1/2
      --key-zoom-half <文字列>   1:2 1/2
      --global-key-zoom-original <文字列> 
                                 1:1 オリジナル
      --key-zoom-original <文字列> 
                                 1:1 オリジナル
      --global-key-zoom-double <文字列> 
                                 2:1 2倍
      --key-zoom-double <文字列> 2:1 2倍
   ジャンプする長さ:
      --extrashort-jump-size <整数> 
                                 ほんの少し戻ったり、進んだりする長さ
      --short-jump-size <整数>   少し戻ったり、進んだりする長さ
      --medium-jump-size <整数>  戻ったり、進んだりする長さ
      --long-jump-size <整数>    かなり戻ったり、進んだりする長さ
      --bookmark1 <文字列>       プレイリストのブックマーク1
      --bookmark2 <文字列>       プレイリストのブックマーク2
      --bookmark3 <文字列>       プレイリストのブックマーク3
      --bookmark4 <文字列>       プレイリストのブックマーク4
      --bookmark5 <文字列>       プレイリストのブックマーク5
      --bookmark6 <文字列>       プレイリストのブックマーク6
      --bookmark7 <文字列>       プレイリストのブックマーク7
      --bookmark8 <文字列>       プレイリストのブックマーク8
      --bookmark9 <文字列>       プレイリストのブックマーク9
      --bookmark10 <文字列>      プレイリストのブックマーク10
  -h, --help, --no-help          VLCのヘルプの表示(--advancedと--help-verboseを
                                 組み合わせ可能)
                                 (デフォルトで無効)
  -H, --full-help, --no-full-help 
                                 VLCとそのモジュールの網羅的なヘルプ
                                 (デフォルトで無効)
      --longhelp, --no-longhelp  VLCとすべてのモジュールのヘルプの表示(--advanc
                                 edと--help-verboseを組み合わせ可能)
                                 (デフォルトで無効)
      --help-verbose, --no-help-verbose 
                                 ヘルプ表示の際の冗長表示
                                 (デフォルトで無効)
  -l, --list, --no-list          有効なモジュールの一覧を表示
                                 (デフォルトで無効)
      --list-verbose, --no-list-verbose 
                                 詳細情報を伴って有効なモジュールの一覧を表示
                                 (デフォルトで無効)
  -p, --module <文字列>          特定モジュールのヘルプを表示
                                 (--advancedと--help-verboseオプションを組み合
                                 わせ可能)モジュール名のプレフィックスに一致す
                                 るものを表示
      --ignore-config, --no-ignore-config 
                                 すべての設定オプションを読み込まない、また、設
                                 定を保存しない
                                 (デフォルトで有効)
      --reset-config, --no-reset-config 
                                 現在の設定を既定値にリセットする
                                 (デフォルトで無効)
      --reset-plugins-cache, --no-reset-plugins-cache 
                                 現在のプラグインキャッシュをリセット
                                 (デフォルトで無効)
      --version, --no-version    バージョン情報の表示
                                 (デフォルトで無効)
      --config <文字列>          別の設定ファイルを使用

注釈: --advancedをコマンドラインに付加すると詳細設定オプションが表示されます。

包括的なヘルプを表示するためには、'-H'オプションを指定してください。

液晶が使えるように設定する

config.txtを修正します。vimでもnanoでもお好きなエディタをご利用ください。

$ sudo cp /boot/config.txt /boot/config.txt.org
$ sudo vim /boot/config.txt

config.txtの一番下に追記します。

hdmi_cvt 2048 1536 40 1 0 0 1
hdmi_ignore_edid=0xa5000080
hdmi_drive=2
hdmi_group=2
hdmi_mode=87
hdmi_pixel_encoding=2
framebuffer_width=2048
framebuffer_height=1536

再起動すると、無事に繋がりました。

ふーちゃんの反応

いつもご飯を食べている場所に仮置きしてみました。「最初は変なものが来た」って感じで近寄りませんでしたが、鳥を認識したようでがっつり見ていました。

iPhoneで同じ動画を見せると、画面をタッチしますが、サイズが大きいとタッチしませんね。テレビでも同じです。ひょっとしたら、スマホは「タッチで操作するもの」、テレビは「タッチしないもの」と認識できているのかもしれません。非常に面白いです。

よかったら、動画もごらんください。