Posted at

年末年始に向けて家電作りに挑戦してみる


はじめに

グロービス Advent Calendar 2018 21日目を担当する本間です。

普段は Ruby ばかり書いているので、たまには Ruby 以外のことを書きたいと思います。

タイトルのとおり、Raspberry Pi 3 Model B(本稿ではラズパイ3と記載します)を使って簡単な家電(HDDレコーダー)作りをしてみます。

本記事では著作権で保護されたコンテンツを扱うシステムを構築します

いわずもがなですが、著作権で保護されたコンテンツを適正な利用範囲を超えて利用することは犯罪となります

扱いには充分注意して下さい


必要なもの

この記事に沿ってオリジナルの HDD レコーダーを作ってみたいと思われた方は以下の材料を揃えてください。

沢山書いてますが、おそらく新たに買う必要があるものは Amazon とダイソーで何とかなると思います。

肝になりそうな IC カードリーダーとチューナーは Amazon のリンク貼っておきました。アフィリエイトのリンク貼れば良かった

これ以外の組合せでも組めるとは思いますが、ドライバーのインストールでハマったりするかもしれないので、本記事を参考にして新たに購入するならば上記をお勧めします。

なお、基本的なターミナルの使い方等は説明しません。ある程度のスキルを持っている方向けです。(Qiita 読者には不要な注釈かもしれませんが)


ラズパイ3 に最新の RASPBIAN をインストールする

まずは、本体となるラズパイ3に OS をインストールします。


OS イメージのダウンロード

作業用の Mac で OS のイメージをダウンロードします。

ダウンロードURL

https://www.raspberrypi.org/downloads/

不要なものはインストールしない、かつ足りないものは後からインストールすれば良いので、 LITE を選択します。ここでは Zip ファイルダウンロードを選びました。

image.png

ダウンロードしたファイルはチェックサムを確認しておきます。Mac では shasum コマンドで確認します。サイトには SHA-256 で記載されているので、 -a 256 オプションを忘れずに。

/Users/norifumi/Downloads% shasum -a 256 2018-11-13-raspbian-stretch-lite.zip

47ef1b2501d0e5002675a50b6868074e693f78829822eef64f3878487953234d 2018-11-13-raspbian-stretch-lite.zip

この値がダウンロードページのものと合わなかったら、ダウンロードし直します。合っていたら次に進みます。


イメージをマイクロ SD カードに書き込む

作業用の Mac にマイクロ SD カードを差し込んで、 diskutil list を実行します。


/Users/norifumi% diskutil list

...(略)...

/dev/disk2 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *15.5 GB disk2
1: Windows_FAT_32 boot 46.0 MB disk2s1
2: Linux 15.5 GB disk2s2

...(略)...

既に利用したことのある SD カードだと上記のようにパーティションが切られているかもしれません。

カード容量で SD がどの IDENTIFIER かを判断します。分かりづらかったら、一度カードを抜いて diskutil を実行すると、無くなっているものがどれかで判断できます。

SD カードの IDENTIFIERdisk2 と分かったので、フォーマットします。

Apple から始まるドライブをフォーマットすると辛い未来が待ち受けているので、指さし確認する位でちょうど良いと思います。

コマンドは以下を参考にして下さい。 RASPBIAN というのはカードに対して付けるラベルなので、何でも良いです。

/Users/norifumi% diskutil eraseDisk MS-DOS RASPBIAN disk2

少し時間が掛かります。以下のようなメッセージが出て。

Started erase on disk2

Unmounting disk
Creating the partition map
[ / 0%..10%..20%......................................... ]

このようなメッセージが出たら完了です。

Creating the partition map

Waiting for partitions to activate
Formatting disk2s2 as MS-DOS (FAT) with name RASPBIAN
512 bytes per physical sector
/dev/rdisk2s2: 29897536 sectors in 467149 FAT32 clusters (32768 bytes/cluster)
bps=512 spc=64 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=411648 drv=0x80 bsec=29904896 bspf=3650 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished erase on disk2

フォーマットが終わったら、ダウンロードした OS イメージファイルを展開して書き込みます。

まずは、展開。

/Users/norifumi/Downloads% unzip 2018-11-13-raspbian-stretch-lite.zip 

Archive: 2018-11-13-raspbian-stretch-lite.zip
inflating: 2018-11-13-raspbian-stretch-lite.img

その後、一旦 SD カードをアンマウントします。マウントポイントを指定するので /dev/disk2 となります。(この例の場合)

/Users/norifumi/Downloads% diskutil umountDisk /dev/disk2

Unmount of all volumes on disk2 was successful

dd コマンドで書き込みます。 if= の後は、展開した OS イメージファイル、 of= の後は今アンマウントしたデバイスのマウントポイントを指定します。

この時、 /dev/disk2 の場合に /dev/rdisk2 といった具合に r を付けると高速に書き込めます。

また、 bs=16m というオプションを指定すると、ブロックサイズを 16MB として書き込めるので、これまた高速化します。

/Users/norifumi/Downloads% sudo dd bs=16m if=/Users/norifumi/Downloads/2018-11-13-raspbian-stretch-lite.img of=/dev/rdisk2

Password:

書き込み中はただ待たされるだけなので、気長に待ちます。せっかちな人は control + t を押すと途中経過が出ます。

load: 2.52  cmd: dd 54798 uninterruptible 0.00u 0.36s

29+0 records in
28+0 records out
469762048 bytes transferred in 48.450478 secs (9695715 bytes/sec)

全て終わるとこのような表示になります。末尾に記載されているとおり、およそ3分掛かりました。

111+1 records in

111+1 records out
1866465280 bytes transferred in 182.270500 secs (10240084 bytes/sec)

以上で Mac を使って OS イメージを書き込んだ SD カードを作成することができました。

この SD カードをラズパイに挿して、電源を入れます。


ラズパイの設定

OS イメージが書き込まれたマイクロ SD カードを挿し、ディスプレイやキーボード、マウスを接続し、ラズパイの電源を入れます。

作業はなるべく Mac から実施したいので、早速 Wi-Fi に繋ぎます。


Resized root file system

起動すると最初に root file system の調整が自動で行われます。その後再起動しますので、少し待ちます。


Wi−Fi 設定

まずはログインします。初期状態では、以下のユーザーが設定されています。


  • ユーザー名: pi

  • パスワード: raspberry

これを使ってログインしたら、さっそく以下のコマンドを打ちます。 <SSID><PASSPHRASE> は利用する Wi-Fi のものを記載します。

pi@raspberrypi:~ $ sudo sh -c 'wpa_passphrase <SSID> <PASSPHRASE> >> /etc/wpa_supplicant/wpa_supplicant.conf'

(個人で使う分には気にならないとは思いますが)生パスフレーズが記載されているのが気になる場合は /etc/wpa_supplicant/wpa_supplicant.conf ファイルを開いて生の Wi-Fi パスフレーズがコメントとして書かれて居る箇所( #psk=XXXX )を削除しておきます。

ここで一旦再起動しましょう。

pi@raspberrypi:~ $ sudo init 6

再起動が完了したら、 DHCP で取得した IP アドレスを確認します。

pi@raspberrypi:~ $ ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether b8:27:eb:12:34:56 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:12:34:57 brd ff:ff:ff:ff:ff:ff
inet 192.168.43.22/24 brd 192.168.43.255 scope global wlan0
valid_lft forever preferred_lft forever
inet6 fe80::dc99:5b44:6a5f:b73f/64 scope link
valid_lft forever preferred_lft forever

wlan0inet の箇所を確認します。この例では 192.168.43.22 が取得できています。

アドレスが取得出来ていることを確認できたら、 ssh を有効にし、後は作業用の Mac から操作します。

pi@raspberrypi:~ $ sudo service ssh start

作業用の Mac から ssh で接続できるか確認します。

作業用の Mac のコンソールから先程確認した IP アドレスに向けて pi ユーザーで ssh 接続します。

パスワードは初期設定のままです。

/Users/norifumi% ssh pi@192.168.43.22

pi@192.168.43.22's password: <raspberry:初期パスワード>
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Dec 13 02:09:12 2018 from 192.168.43.224

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $

ここまでできれば、キーボードでログインした方はログアウトしても構いません。

ディスプレイやキーボードを外せます(ネットワーク設定等でミスしたらまた繋ぐ必要があります)。


OS の初期設定を行う

ここからは、Mac から ssh で設定します。まずはお馴染みの raspi-config を実行します。

pi@raspberrypi:~ $ sudo raspi-config

こんな画面が出ます。

image.png

順番に設定していきましょう。以下に記載の無いものは必要になった時に設定すれば良いと思います。


1 Change User Password

これを選択して、エンターキーを押します。メッセージが表示された後にコンソールで新しいパスワードを2回聞かれるので同じものを入力します。

Password changed successfully と表示されたら完了です。


2 Network Options



  • N1 Hostname


    • 設定しておきましょう。拘りが無ければそのまま(raspberrypi)でも構いません。今回は raspberrypi のままにします。




4 Localisation Options



  • I1 Change Locale



    • [ ] ja_JP.UTF-8 UTF-8 にチェックします。その後の質問も ja_JP.UTF-8 にします。




  • I2 Change Timezone



    • Asia → Tokyo を選択します




  • I3 Change Keyboard Layout


    • キーボードを既に外していたら特に実行する必要はありません




  • I4 Change Wi-fi Country



    • JP Japan を選びます




5 Interfacing Options

※これを忘れると面倒です



  • P2 SSH


    • これを選択して、有効化してください。これを忘れると次の再起動で ssh できなくなります。




7 Advanced Options

最近のラズパイは初回起動時に自動で実施してくれるようですが、念のため。



  • A1 Expand Filesystem


    • これを選択して実行します。



Root partition has been resized.

The filesystem will be enlarged upon the next reboot

と表示されたら完了です。 Finish を選択すると一度再起動され、これまでの設定が反映されます。


IP アドレスを固定する

DHCP のままでも hostname を使ってアクセスはできますが、IP アドレスを固定しておきたい場合もあります。その時は以下の設定を行います。

今回は Wi-Fi を使って設定していますが、運用後のことも考えて有線 LAN も固定しておきます。

まず、有線 LAN のインターフェース名が自動で変更されないように、 eth0 で固定する設定を追加します。

pi@raspberrypi:~ $ sudo vi /boot/cmdline.txt 

1行で設定がツラツラと書かれていますので、最後に以下の設定を追加します

net.ifnames=0

こんな感じになればOKです。

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=12345678-01 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait net.ifnames=0

そして、DHCP の設定を変更して固定されるようにします。

pi@raspberrypi:~ $ sudo vi /etc/dhcpcd.conf

末尾に以下の設定を記載します。 eth0wlan0 を指定しています。

interface eth0

static ip_address=192.168.43.200/24
static routers=192.168.43.254
static domain_name_servers=192.168.43.254

interface wlan0
static ip_address=192.168.43.201/24
static routers=192.168.43.254
static domain_name_servers=192.168.43.254

設定を反映するときは再起動します。次に ssh 接続する時は新しい IP アドレスになっていることに注意。


周辺機器の設定

ここから、ラズパイに接続する各周辺機器の設定を行います。引き続き Mac から ssh 接続で操作します。


IC カードリーダー

カードリーダーを利用できるようにするためにいくつかパッケージをインストールします。ラズパイに IC カードリーダーを接続する前に、以下のコマンドを実行します。

pi@raspberrypi:~ $ sudo apt-get update

pi@raspberrypi:~ $ sudo apt-get install pcscd libpcsclite-dev libccid pcsc-tools

インストールが完了したら、IC カードリーダーをラズパイの USB ポートに差し込みます。B-CAS カードもセットしておきます。

差し込んだら、以下のコマンドで B-CAS カードが認識できているかを確認します。

pi@raspberrypi:~ $ pcsc_scan

以下のような表示が出たらOKです

pi@raspberrypi:~ $ pcsc_scan

PC/SC device scanner
V 1.4.27 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.8.18
Using reader plug'n play mechanism
Scanning present readers...

(中略)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B F0 12 34 56 78 9A BC DE F0 12 34 56
Japanese Chijou Digital B-CAS Card (pay TV)

Chijou Digital という単語に圧倒されながら、確認出来たら control + c でコマンドを中断します。


地上デジタルTVチューナー

ドライバーは既に Linux カーネルに含まれているので、ファームウェアのファイルだけあれば利用可能です。

必要なファイルはメーカーのサイトの旧版のドライバーから手に入れることができます。

ダウンロード先: http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip

pi@raspberrypi:~ $ wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip

pi@raspberrypi:~ $ unzip PX-S1UD_driver_Ver.1.0.1.zip
pi@raspberrypi:~ $ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware

ここまで完了したら、以下のコマンドを実行します

pi@raspberrypi:~ $ lsusb

カードリーダーと、あとは元々ラズパイに搭載されているもののみ表示されます

Bus 001 Device 004: ID 072f:b100 Advanced Card Systems, Ltd ACR39U

Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

地上デジタルTVチューナーを接続して、再度実行します

pi@raspberrypi:~ $ lsusb

Bus 001 Device 005: ID 3275:0080 VidzMedia Pte Ltd 

Bus 001 Device 004: ID 072f:b100 Advanced Card Systems, Ltd ACR39U
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

VidzMedia というのが増え、認識されたのが確認できました


録画用ソフトウェアのインストール

ここからソフトウェアをインストールして、コマンドラインで録画ができるところまで進めます


デコーダーのインストール

Linux用ARIB STD-B25ライブラリ のダウンロードとインストールを行います

pi@raspberrypi:~ $ sudo apt-get install cmake

pi@raspberrypi:~ $ wget https://github.com/stz2012/libarib25/archive/master.zip
pi@raspberrypi:~ $ unzip master.zip
pi@raspberrypi:~ $ cmake libarib25-master
pi@raspberrypi:~ $ make
pi@raspberrypi:~ $ sudo make install


録画アプリケーションのインストール

コマンドラインから録画ができる recdvb をインストールします

pi@raspberrypi:~ $ sudo apt-get install autoconf

pi@raspberrypi:~ $ wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.2.tgz
pi@raspberrypi:~ $ tar zxvf recdvb-1.3.2.tgz
pi@raspberrypi:~ $ cd recdvb-1.3.2
pi@raspberrypi:~ $ ./autogen.sh
pi@raspberrypi:~ $ ./configure -enable-b25
pi@raspberrypi:~ $ make
pi@raspberrypi:~ $ sudo make install

ここまでできたら、一度動作確認をします。地上デジタルTVチューナーに TV のアンテナ線を接続して、コマンドラインから以下のコマンドを実行します。

※以下のコマンドの 29 は栃木(矢板発)のとちぎテレビの物理チャンネル番号です。チャンネル番号はマスプロ社の資料 等を参考に、適宜変更します

pi@raspberrypi:~ $ recdvb --b25 --strip 29 5 ~/sample.m2ts

コマンドの 5 は 5秒録画するという指定なので、5秒ほど待たされた後に完了します。

録画されたビデオを Mac 等で取得して、 VLC for Mac OS X 等で再生してみます。

/Users/norifumi% scp pi@192.168.43.201:~/sample.m2ts ~/Desktop

デスクトップにコピーされた sample.m2ts ファイルを開いて確認して下さい。テレビ番組の内容が5秒表示されたらここまでの作業は成功です。


ネットワーク越しにファイルを再生できるようにする

ラズパイに撮りためたテレビ番組を家庭内のテレビ等から見られるようにしたいので、 DLNA サーバーをインストールします。ラズパイに GUI を導入して、ラズパイに接続したディスプレイで再生しても良いのですが、家電感を出すにはやはりテレビで見たいです。


USB 接続の HDD を追加する

DLNA サーバーを導入する前にラズパイに HDD を追加しておきます。録画した番組を SD カードに保存するとあっという間に容量を使い切りそうですし、OS とは別のドライブに保存したいので。

ラズパイに HDD を接続して、以下のコマンドを実行します。

以下の操作を行うと接続されたHDDのデータは全て削除されます

pi@raspberrypi:~ $ sudo fdisk -l

すると、以下のような表示が出てきます。今回は 500GB の HDD を接続しました。

/dev/sda に接続されていることが分かります。

(前略)

Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000A57-4A2C-0000-0034-0000789A0000

(後略)

このディスクをフォーマットし直します。

pi@raspberrypi:~ $ sudo mount | grep sda

何も表示されなければ自動でマウントされていないので、作業を開始できます。

(自動でマウントされていたら umount コマンドでアンマウントします)

/dev/sda で認識されているので、 fdisk コマンドでパーティションを切り直します。

pi@raspberrypi:~ $ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

A hybrid GPT was detected. You have to sync the hybrid MBR manually (expert command 'M').

Command (m for help):

対象ディスクを誤っていると再度インストールし直しになるので、まずはパーティション一覧を確認します。

p コマンドを入力して、エンターキーを押します。

(この HDD は元々 Macbook に接続されていたものなので Apple boot があったりします)

Command (m for help): p

Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000A57-4A2C-0000-0034-0000789A0000

Device Start End Sectors Size Type
/dev/sda1 40 409639 409600 200M EFI System
/dev/sda2 409640 975503591 975093952 465G Microsoft basic data
/dev/sda3 975503592 976773127 1269536 619.9M Apple boot

このディスクで間違いありません。 /dev/sda1/dev/sda2/dev/sda3、全てを削除します。

d を入力してエンターキーを押します。

Command (m for help): d

Partition number (1-3, default 3): 1

Partition 1 has been deleted.

Command (m for help): d
Partition number (2,3, default 3): 2

Partition 2 has been deleted.

Command (m for help): d
Selected partition 3
Partition 3 has been deleted.

あっさり削除できます。再度設定を確認します。p コマンドを実行します。

Command (m for help): p

Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000A57-4A2C-0000-0034-0000789A0000

パーティションが無くなりました。

n コマンドを実行して、新しいパーティションを作成します。

パーティション番号は 1、パーティションの先頭は最小の数字(この例では 34)、最後の数字はデフォルト(全部使う)にします。

Command (m for help): n

Partition number (1-128, default 1): 1
First sector (34-976773134, default 2048): 34
Last sector, +sectors or +size{K,M,G,T,P} (34-976773134, default 976773134):

Created a new partition 1 of type 'Linux filesystem' and of size 465.8 GiB.

ここまでできたら、w コマンドで変更を反映して完了です。

Command (m for help): w

The device contains hybrid MBR -- writing GPT only. You have to sync the MBR manually.

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

次に、パーティションをフォーマットします。 mkfs.ext4 コマンドを実行します。入力を求められたらエンターキーを押して先に進みます。

pi@raspberrypi:~ $ sudo mkfs.ext4 /dev/sda1

mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 122096637 4k blocks and 30531584 inodes
Filesystem UUID: 082f76dd-7694-4613-b3c2-85278bcb9a4e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks):
done
Writing superblocks and filesystem accounting information: done

あと一息です。今フォーマットしたパーティションをラズパイの起動時に自動でマウント(利用可能に)するようにします。

最初にマウント先を作成します。

pi@raspberrypi:~ $ sudo mkdir /var/lib/minidlna

次に、ディスクの UUID を調べます。

pi@raspberrypi:~ $ sudo blkid /dev/sda1

/dev/sda1: UUID="08abcdef-789a-4567-bcdef-123456789abc" TYPE="ext4" PARTUUID="12345678-6789-abcd-ef12-3456789a1234"

それらの値を /etc/fstab に追記します。

pi@raspberrypi:~ $ sudo vi /etc/fstab 

追記するのは以下の行です。最後に1行追記します。 UUID の値は上記で調べたものにします。

UUID=08abcdef-789a-4567-bcdef-123456789abc /var/lib/minidlna ext4 defaults 0 0

手動でマウントできるか確認します。

pi@raspberrypi:~ $ sudo mount -a

エラーが出なければOKです。念のため確認してみましょう。

pi@raspberrypi:~ $ mount | grep sda1

/dev/sda1 on /var/lib/minidlna type ext4 (rw,relatime,data=ordered)

上記のような表示が出ればOKです。

マウント先を /var/lib/minidlna にしていますが、このすぐ後に理由が分かります。


ReadyMedia のインストール

DLNA サーバーソフトウェアの ReadyMedia(旧MiniDLNA) をインストールします。 apt を使って簡単にインストールできます。

pi@raspberrypi:~ $ sudo apt-get install minidlna

録画したファイルを DLNA で共有するために、ディレクトリのオーナーを変えます。

外付け HDD のマウントポイントをここにしておいたのは、 ReadyMedia がデフォルトでここを共有するからでした。

pi@raspberrypi:~ $ sudo chown pi:pi /var/lib/minidlna

pi@raspberrypi:~ $ ls -la /var/lib/minidlna/
合計 28
drwxr-xr-x 4 pi pi 4096 12月 13 18:10 .
drwxr-xr-x 30 root root 4096 12月 13 18:21 ..
drwx------ 2 root root 16384 12月 13 19:00 lost+found

試しに、先程 5秒テスト録画したファイルを移動して、 Mac から試聴できるか確認します。

pi@raspberrypi:~ $ mv sample.m2ts /var/lib/minidlna

作業用の Mac で VLC for Mac OS X を立ち上げて、 ローカルネットワークユニバーサルプラグ & プレイ を開きます。

少し待つと raspberrypi:minidlna といった名前(: の前はホスト名です)が見つかります。

ビデオ を開くと sample(先程のサンプル録画したファイルのファイル名)が見つかるので、それをクリックして再生します。

image.png

録画したテレビ番組が見られれば成功です。

動作は問題無さそうですが、ログを確認すると、気になるメッセージが出ています。

pi@raspberrypi:~ $ cat /var/log/minidlna.log

(前略)

[2018/12/13 18:22:21] inotify.c:199: warn: WARNING: Inotify max_user_watches [8192] is low or close to the number of used watches [2] and I do not have permission to increase this limit. Please do so manually by writing a higher value into /proc/sys/fs/inotify/max_user_watches.

(後略)

Inotifymax_user_watches8192 だと小さすぎるとのことでした。運用してみないと適正値は分かりませんが、何となく4倍くらいにしておきます。

現状の設定を念のため確認します。

pi@raspberrypi:~ $ sysctl fs.inotify.max_user_watches

fs.inotify.max_user_watches = 8192

やはり 8192 でした。設定を変えます。

pi@raspberrypi:~ $ sudo vi /etc/sysctl.conf

一番最後に以下の1行を追加します。

fs.inotify.max_user_watches = 32768

設定変更を反映するには -p オプションを付けて sysctl コマンドを実行します。

pi@raspberrypi:~ $ sudo sysctl -p

fs.inotify.max_user_watches = 32768

先ほどと同じコマンドで反映されたか再度確認します。

pi@raspberrypi:~ $ sysctl fs.inotify.max_user_watches

fs.inotify.max_user_watches = 32768

OKでした。

あともう1個だけ、設定を変えておくと良い場所があります。

pi@raspberrypi:~ $ sudo vi /etc/minidlna.conf

以下の箇所を修正します。

(前略)

# Automatic discovery of new files in the media_dir directory.
inotify=yes # ← コメントアウトされているので、コメントを外します

(中略)

# SSDP notify interval, in seconds.
notify_interval=60 # ← コメントを外し、数字を 895 から 60 に変更

(後略)

ファイルを自動で探してくれる設定です。保存したら、 minidlna を再起動します。

pi@raspberrypi:~ $ sudo service minidlna restart

ここまでで、ある程度形になってきました。後は


  • コマンドラインではなく、もっと簡単な方法で録画ができるようにしたい

  • 録画したファイルが自動的に DLNA 共有ディレクトリに入って欲しい

が満たせれば、HDD レコーダーとして使えそうです。


チューナーサーバーのインストール

インストールする順番が逆になりますが、録画サーバーとして Chinachu を使いたいと思います。そのため、まず Mirakurun をインストールします。


Node.js のインストール

Mirakurun をインストールするために、Node.js が必要なのでインストールします。

apt-get コマンドでインストールできる Node.js では Mirakurun のインストールがうまく行かないので、手動でインストールします。

このドキュメントを参考に、 一部 sudo を足して実行します。

pi@raspberrypi:~ $ curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -

pi@raspberrypi:~ $ sudo apt-get install -y nodejs

バージョンを確認すると以下のものが入りました。Mirakurun の Requirements を満たしています。

pi@raspberrypi:~ $ node -v

v8.14.0
pi@raspberrypi:~ $ npm -v
6.4.1


Mirakurun のインストール

Node.js のインストールが完了したら、あとは npm コマンドで入ります。動作確認のために Rivarun もインストールしておくと便利です。

pi@raspberrypi:~ $ sudo npm install pm2 -g

pi@raspberrypi:~ $ sudo npm install mirakurun -g --unsafe --production
pi@raspberrypi:~ $ sudo npm install rivarun -g

エラーが出ずに終了したら次に進みます。


Mirakurun の設定

まずチューナーの設定を行います。

pi@raspberrypi:~ $ sudo vi /usr/local/etc/mirakurun/tuners.yml

ファイルの最後に以下を追記します。 yaml ファイルなので、インデントも重要です。

- name: PX-S1UD

types:
- GR
command: recdvb --b25 --strip <channel> - -

次に、チャンネルファイルの設定を変更します(以下は那須塩原市の例)。

pi@raspberrypi:~ $ sudo mirakurun config channels

自動でチャンネルスキャン してくれますが、時間が掛かるので、先ほどのマスプロ社が公開している資料を見て、チャンネル設定を書き込みました。

- name: GYT

type: GR
channel: '29'

- name: CX
type: GR
channel: '35'

- name: TBS
type: GR
channel: '15'

- name: TX
type: GR
channel: '18'

- name: EX
type: GR
channel: '17'

- name: NTV
type: GR
channel: '19'

- name: NHK E
type: GR
channel: '39'

- name: NHK G
type: GR
channel: '47'

以上が完了したら、一度 Mirakurun を再起動します。

pi@raspberrypi:~ $ sudo mirakurun restart

[PM2] Applying action restartProcessId on app [mirakurun-server](ids: 0)
[PM2] [mirakurun-server](0) ✓
┌──────────────────┬────┬─────────┬──────┬─────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────────────┼────┼─────────┼──────┼─────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ mirakurun-server │ 0 │ 2.7.4 │ fork │ 722 │ online │ 1 │ 0s │ 0% │ 15.3 MB │ root │ disabled │
└──────────────────┴────┴─────────┴──────┴─────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app

再起動したら、ログを確認してエラーが無いことをチェックします。

pi@raspberrypi:~ $ sudo mirakurun log server

特にエラーが出ていなければ、以下のコマンドを打って、とちテレを5秒録画してみます。

pi@raspberrypi:~ $ rivarun --ch GR/29 5 /var/lib/minidlna/tochitele.m2ts

status: 200
headers: {"server":"Mirakurun/2.7.4","content-type":"video/MP2T","date":"Fri, 14 Dec 2018 12:06:49 GMT","connection":"close","transfer-encoding":"chunked"}

保存先を DLNA で共有しているディレクトリにしたので、録画ファイルが DLNA を経由して見られればOKです。


録画サーバーのインストール

Chinachu をインストールします。Github からソースを取得してコンパイルするので、 git コマンドが使えるようにします。

pi@raspberrypi:~ $ sudo apt-get install git

ソースコードを取得します。

pi@raspberrypi:~ $ git clone git://github.com/kanreisa/Chinachu.git ~/chinachu

インストーラーを実行します。 Auto を選びます。

pi@raspberrypi:~ $ cd ~/chinachu/

pi@raspberrypi:~/chinachu $ ./chinachu installer
Chinachu Installer Menu:
[!] These are installed under all /home/pi/chinachu/...
[!] Recommend the Auto installation.
1) Auto (full) 3) Node.js Environment 5) ffmpeg
2) submodule 4) Node.js Modules
what do you install? > 1
selected: Auto (full)

かなり時間が掛かるので、このまましばらく放置します。先に tmux をインストールして、セッションが切れないようにすると良いかも知れません。

以下のような表示が出たら完了です。(ここでインストールされる ffmpeg は使わないのですが)

(前略)

ffmpeg-4.1-32bit-static/ffmpeg
ffmpeg-4.1-32bit-static/GPLv3.txt
'ffmpeg-release-32bit-static.tar' を削除しました
Creating libav aliases...
'/home/pi/chinachu/usr/bin/avconv' -> '/home/pi/chinachu/usr/bin/ffmpeg'
'/home/pi/chinachu/usr/bin/avprobe' -> '/home/pi/chinachu/usr/bin/ffprobe'
ffmpeg --> done.


ARM 用 ffmpeg の導入

Chinachu の設定の前に ffmpeg build のサイトから ARM 用にビルド済みの ffmpeg をダウンロードし、 Chinachu が標準でインストールしたものと入れ替えます。

pi@raspberrypi:~ $ wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-armhf-static.tar.xz

pi@raspberrypi:~ $ tar xvf ffmpeg-release-armhf-static.tar.xz
pi@raspberrypi:~ $ cd ffmpeg-4.1-armhf-32bit-static
pi@raspberrypi:~/ffmpeg-4.1-armhf-32bit-static $ cp ffmpeg ffmpeg-10bit ffprobe qt-faststart ~/chinachu/usr/bin/
pi@raspberrypi:~/ffmpeg-4.1-armhf-32bit-static $ sudo cp ffmpeg ffmpeg-10bit ffprobe /usr/local/bin


Chinachu の設定

Chinacu の設定を行います。細かい設定は運用しながら行うとして、今は動くための最低限のものだけ。

pi@raspberrypi:~/chinachu $ cp config.sample.json config.json

pi@raspberrypi:~/chinachu $ vi config.json

uid が設定されていないので、 pi ユーザーで動かします。また保存先を /var/lib/minidlna/ に変更し、ストリーミング再生時に HW 支援を使用します。

  "uid": null,

# ↓ "pi" に変更
"uid": "pi",

"recordedDir" : "./recorded/",
# ↓ "/var/lib/minidlna/" に変更
"recordedDir" : "/var/lib/minidlna/",

"vaapiEnabled": false,
# ↓ true に変更
"vaapiEnabled": true,

次に空のルール設定ファイルを作成します。この辺は本家のインストレーションガイドのとおりに進めます。

pi@raspberrypi:~/chinachu $ echo [] > rules.json


Chinachu の動作チェック

ここまでできたら、 Chinachu を起動して動作確認します。

pi@raspberrypi:~/chinachu $ ./chinachu service wui execute

特にエラーが表示されず、コマンドが終了しなければOKです。以下のような表示がありますので

14 Dec 09:34:31 - HTTP Open Server Listening on { address: '192.168.43.200', family: 'IPv4', port: 20772 }

ブラウザで http://[http://[ラズパイのIPアドレス]:20772]/ (この例だと IPアドレスは 192.168.43.200)にアクセスします。以下のような画面が出ればここまで成功です。

image.png

まだ、番組表等は取得していないので、取得します。ラズパイのコンソールで control+¥ を押して、サーバーを停止し、以下のコマンドを実行します。

pi@raspberrypi:~/chinachu $ ./chinachu update

特に Mirakurun への接続エラー等が出なければOKです。再度

pi@raspberrypi:~/chinachu $ ./chinachu service wui execute

を実行して、ブラウザからアクセスして、番組表が取得できればOKです。

a57c0bf0-1a2b-df7b-8599-e4a49930f505.png


自動実行の設定

ここまで設定できたら、 Chinachu が自動で起動するように設定します。

pi@raspberrypi:~/chinachu $ sudo pm2 start processes.json

pi@raspberrypi:~/chinachu $ sudo pm2 save

エラーが出ずに実行できたら、一度再起動して、自動で起動できたことを確認します。

pi@raspberrypi:~/chinachu $ sudo init 6

再起動後にブラウザで Chinachu にアクセスできたら成功です。


最後に

実装中は Mac の VLC プレイヤーで再生を試したりしていましたが、家庭用のテレビからも再生できるようになっています。

例えば、 Panasonic のテレビであれば「お部屋ジャンプリンク」という機能で、家庭内の LAN 上のラズパイが見つけられ、そこに録画したファイルが再生できます。

また、最近のテレビにはブラウザ機能も付いているので、そのブラウザで Chinachu をブックマークしておけば、テレビから Chinachu の番組表を開いて、録画することもできます。もちろん、スマートフォンで Chinachu を操作しても良いでしょう。

ここまでできれば、一応家電と言えるのでは無いでしょうか。オープンソースソフトウェアだけでここまでできることに、作者の皆さまには感謝しかありません。

年末年始は、ここから自分なりのカスタマイズを楽しんでみたいと思います。