ラズベリーパイ 記事一覧

ラズパイの最低限セキュリティ・セッティング

公開日時:2016/12/14 21:12

Raspberry Pi を初めて起動したら、最低限しておきたいことを纏めました。付帯情報も書いたので少し長めに見えますが、すること自体はほんの僅かなので 10 分もあれば終わるでしょう。

root パスワードの設定

Linux では、root ユーザーは全ての操作ができる最高権限のユーザーです。このユーザーでログインされるとそのラズパイでできることは全てできてしまうので、そういうことがないように、まず強固なパスワードを設定してしまいましょう。

sudo passwd root

パスワードが 2 回聞かれます。パスワードが一致すれば変更完了です。入力したパスワードは忘れないようにしましょう。

pi ユーザーでログインした後、一時的に root ユーザーに切り替えるには

su -

として、パスワードを入力します。この場合、ホームディレクトリが /root になることを留意して下さい。ホームディレクトリや設定を pi ユーザーのもののままにしたい場合は単に su で切り替えます。

pi ユーザーに戻る場合は

exit

です。

Raspberry Pi のアップデート

sudo apt-get update

apt は Debian 用に開発されたパッケージ管理システムで、アプリケーションの管理を行ってくれます。

apt-get update を行うと、リポジトリ(ソースコード等の情報が保管されているデータベース)からパッケージインデックスファイルを取得し、お使いの OS と再同期します。apt-get update の後で apt-get install を行うと、最適なパッケージが取得できるようになります。

なお、apt-get upgrade というコマンドを実行すると、先程取得したインデックスに従ってお使いのラズパイにインストールされている全てのパッケージを最新版にアップグレードします。これはかなりの時間がかかります。必要な場合のみ行って下さい。

あとは、Raspberry Pi のファームウェアの更新です。ファームウェアを更新したら 再起動 が必要です。

sudo rpi-update

Vim のインストール

Raspberry Pi ではテキストファイルを編集することが頻繁にありますので、テキストエディタを入れておきます。標準でも入って入るのですが、vim-tiny という最小構成のエディタなので、かなり使いづらいと感じるでしょう。

sudo apt-get -y install vim

これで、正規版の Vim が入ります。これ以降の設定では多少のファイルの編集が必要になりますので、Vim の簡単な使い方として 『設定ファイルの編集方法』を適宜参照して下さい。

※なお、Emacs 派の方は勿論、Emacs をお使い下さい。

SSH と IP アドレスの固定について

最新の Raspbian(RASPBIAN JESSIE WITH PIXEL Version:November 2016 Release date:2016-11-25)では、デフォルトで SSH が無効になりました。

これまでの Raspbian では初回起動直後から SSH が有効であり、デフォルトユーザー pi、デフォルトパスワード raspberry で固定であったためセキュリティ的には穴だらけで、コンピュータに詳しくない人はそのまま運用するなど、かなり危険な状態でした。

今回の Raspbian の仕様変更はそうした背景を考慮しての苦渋の決断だったと聞いています。

さて、前置きが長くなりましたが、だからといって SSH 自体はとても便利な機能であり、使わない手はありません。特に Raspberry Pi は超小型、省電力でサーバーとしても利用できるため、場所をとらず、本棚の隅でひっそりと常時可動させるなどの用途に特に向いています。実際、普通のサーバー用途の場合、常時可動でも月の電気代は50円程度です。

こうした場合、ちょっと設定をいじるためにモニタやキーボードを接続するのは無駄なので、ネットワーク経由で他のパソコンから操作出来たほうが断然便利ですから、やはり、SSH は利用したいでしょう。

SSH で接続できるようにするには、まず、DHCP サーバーが勝手に IP アドレスを変えてしまわないように Raspberry Pi の IP アドレスを固定します。

IP アドレスの固定

sudo vi /etc/dhcpcd.conf

で設定ファイルを開き、

有線 LAN 接続の場合
interface eth0
static ip_address=192.168.**.**/32
static routers=192.168.**.1
static domain_name_servers=192.168.**.1
無線 LAN 接続の場合
interface wlan0
static ip_address=192.168.**.**/32
static routers=192.168.**.1
static domain_name_servers=192.168.**.1

を、/etc/dhcpcd.conf の末尾に追加します。** のあたりはお使いの環境に合わせて下さい。

「static ip_address=192.168.**.**/32」が、固定する IP アドレス、「static routers=192.168.**.**」「static domain_name_servers=192.168.**.**」が、ルーターと DNS サーバーの IP アドレスです。

これに加え、無線 LAN を利用する場合は

sudo sh -c 'wpa_passphrase SSID パスフレーズ >> /etc/wpa_supplicant/wpa_supplicant.conf'

を実行して下さい。SSID とパスフレーズは通常、お使いの無線 LAN 親機の本体に記載されているはずです。上記を実行した後、

sudo cat /etc/wpa_supplicant/wpa_supplicant.conf

で、無線 LAN 接続設定ファイルを開き、

#psk="*************"

の行を削除して下さい。

この行は先程入力したパスフレーズの平文ですので、セキュリティホールになります。# はコメントとなっているため、この行自体をまるごと削除しても何も問題ありません。実際に利用されるパスフレーズは、その下の psk= の行です。

設定が終わったら再起動して下さい。IP アドレスが固定されます。

sudo reboot

SSH 接続用の鍵ファイル作成

ここでは、SSH を安全に利用するための方法を記します。

まず、SSH 接続で使う鍵ファイルを作成します。

cd ~

で、ユーザーのホームディレクトリに移動した後、

ssh-keygen -t rsa

を実行して下さい。以下のようなメッセージが表示されます。鍵ファイルを作成する場所を聞かれているだけなので、特に問題がなければエンターを押すだけで構いません。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):

この後、2回パスフレーズの入力が求められるので適当なパスフレーズを入力して下さい。このフレーズ自体はそれほど強固でなくても構いません。(このフレーズは忘れないでください)。

これで、/home/pi/.ssh/ ディレクトリに id_rsa(秘密鍵) と、 id_rsa.pub(公開鍵)が作成されます。

次は、作成された公開鍵を pi ユーザーの公開鍵として登録します。

cat .ssh/id_rsa.pub >> .ssh/authorized_keys

一方、秘密鍵(/home/pi/.ssh/id_rsa)の方は外部から Raspberry Pi にアクセスする際に利用するので、他のパソコンや USB メモリ等にコピーして下さい。この鍵はとても大切なので、絶対に第三者に漏れる事がないようにしてください。

あとは、念のため今までのファイルのアクセス権を pi ユーザーのみ読み書き出来るようにしておきます。

chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa.pub

sshd の設定

鍵ファイルが作成できたら、あとは SSH サーバーの設定の変更です。

sudo vi /etc/ssh/sshd_config

で、設定ファイルを開いて 4 箇所書き換えます。なお、Vim では / をタイプしてから検索したい文字列を入力してエンターを押すことで、任意の文字検索が出来ますので利用して下さい。

ポート番号の変更

通常、不正アクセスを試そうとする人は SSH が動作しているか確認するため、デフォルトポートである 22 番をスキャンします。ここが開いていない場合、殆どの人は諦めて次のサーバーを探します。ですから、SSH で使うポート番号を変えてしまうのが最も手っ取り早いセキュリティ対策です。49152~65535 あたりで好きなポート番号を選んで設定して下さい。(ここで記したので、51327以外が良いでしょう)

# What ports, IPs and protocols we listen for
#Port 22   ← #でコメントアウト
Port 51327
管理者権限での SSH ログインの禁止。必要であれば pi ユーザーでログインしてから管理者権限になります
#PermitRootLogin without-password ← #でコメントアウト
PermitRootLogin no
平文パスワードでのログイン禁止。必ず秘密鍵が必要です。
#PasswordAuthentication yes ← #でコメントアウト
PasswordAuthentication no
空のパスワードでのログイン禁止。上記で秘密鍵が必ず必要になっていますが、一応、空パスワードでのログインも明示的に禁止します
PermitEmptyPasswords no

上記設定が終わったら設定内容を Systemd に反映します。

sudo systemctl daemon-reload

次のコマンドを実行すると、SSH サーバーの自動起動が設定され、Raspberry Pi が起動すると自動で SSH が起動します。

sudo systemctl enable ssh

次のコマンドでSSH サーバーを再起動します。SSH サーバーの停止は stop、再起動は restart に読み替えて下さい。

sudo systemctl start ssh

これで再起動したら、外部のパソコンから、ID とパスワードのみではログインできないこと、id_rsa 秘密鍵のみで SSH 接続出来ること等を確認して下さい。

補足

以前の Raspbian では sudo service sshd restart で sshd を再起動できましたが、2016-11-25-raspbian-jessie からは systemctl コマンド必須に切り替わりました。これは、Debian Jessie からシステム管理が Systemd に変更されたためです。

これまでは暫定的にそれ以前のコマンドもサポートされていましたが、順次、Systemd の作法に則った操作方法に切り替わっているようです。

init.d なども、将来的には廃止されるでしょう。

ラズベリーパイの始め方

公開日時:2016/12/14 21:10

ラズベリーパイ

もういまさら説明もいらなくなってきた超小型シングルボードコンピューター「Raspberry Pi」。その快進撃はとまらず全世界で出荷台数累計1,000万台を突破したそうですね。

Raspberry Pi の良いところは、高性能な割にとにかく小さくて省電力な事。一ヶ月の電気代は 50円 くらいで済んでしまいます。本体は輸入なので少し高くなり、今はケース込みで6,000円弱といったところ(ディスプレイ、キーボード、マウス等は別)。

完全に世間に認知されたこの小さなコンピューターですが、これまでに数々の改良が加えられてきたため、古い情報が大分役に立たなくなってきています。

そこで、ここでは最新版の Raspberry Pi 向けオフィシャル OS 「2016-11-25-raspbian-jessie」のセットアップ方法を、できるだけ簡単に説明したいと思います。

前から気にはなっていたんだけど、今から始めるのは敷居が高そう」と思っていた方も、ぜひこれを機に Raspberry Pi ライフを始めてみましょう。

必要なお金と時間

このページで紹介している部分について、目安としては、Raspberry Pi 最低構成で 14,000円位(他にパソコンがあり周辺機器が流用できる場合)、OS のダウンロードに 10分 ~ 4時間程度(…)、OS の SD カード書き込みに 10 分ほど(SD カードをフォーマットする場合は +40分程度)、最低限パソコンとして利用が開始できるようになるまでの設定が 15 分程度です。

まず、必ず揃える物

必ず必要になるものは大体以下のような物になります。あくまでも参考であり、この商品でなければいけないことはないので、一番自分に合いそうなものを選んでいただいて構いません。

なお、Raspberry Pi 3、4 は Wi-Fi が搭載されているので、有線 LAN ケーブルは必須ではありません。ケースも必須ではありませんが、手で触っていると基盤が錆びてくるので何らかのケースは必要です。場合によってはダイソーの100円のタッパーでも構いません(ケーブルを通すための穴など開ける必要があるので、手を切らないよう注意して下さい)

注意点としては USB 電源とケーブルが必要で、電圧5V 2.5A供給 の物が推奨されています。スマートフォン等の充電器は 2.1A の物が多く、これでも一応動作はしますが、Raspberry Pi 3 からは消費電力が少し増えているので、安定稼働させるにはできれば 2.5A の物を用意したいところです。

また、micro SD カードは少し慎重に選んで下さい。class 10 の 8GB 以上(理想は 16GB 以上)が必要になります。Raspberry Pi は記憶媒体として全てを SD カードで読み書きするのですが、SD カードは書き換え回数に上限があり、膨大に書き込みを行っていると破損してしまいます

あまり安いものはすぐ壊れたという報告も多いので、中間くらいの価格帯の物を買っておくのが無難です。

パソコンとして使うには

もし、別にパソコンがあるのであれば、以下は必要ありません。例えば、Raspberry Pi をサーバーとして運用するだけなら、お使いのパソコンの周辺機器を接続して設定だけ行い、設定が終わったら取り外せば良いでしょう。(モニタは HDMI ケーブルでの接続が出来ることが必要です)

そうではなく、Raspberry Pi を常時利用するコンピューターとするのであれば、このような周辺機器を揃える必要があります。勿論、以下でなくても構いません。

Raspberry Pi が小型コンピューターなのでモニタも小さいものを、といった記事をよく見ますが、パソコンとして利用する場合は全くお勧めできません。知人が小型のモニタを購入していましたが、文字が小さすぎてちょっとした設定すら難儀しました。普通のモニタを用意する方が良いでしょう。

現在の Raspberry Pi のモニタ出力端子は HDMI だけなので、別途 HDMI ケーブルが必要です。通常、市販モニタには HDMI ケーブルは何故か同梱されておらず、上記 BenQ のモニタにも付属していません。

キーボードは Happy Hacking Keyboard という、プログラマ御用達のキーボード(の一般ユーザー向けモデル)です。テンキーがなく省スペース小型ですが、とても入力がしやすくストレスがありません。初心者にもお勧めのキーボードです。

マウスはもう、正直なんでもいいです。一応 Raspbian(Linux)で利用することを考え、特殊なドライバが必要なさそうなシンプルなマウスを選びました。

最後の SD カードリーダーライターは、micro SD カードに OS のディスクイメージを書き込みする際に使います。micro SD に書き込みが行える手段が他にあるのであれば、勿論全く必要ありません。

OS をダウンロードしよう

Raspberry Pi の標準的な OS は Debian(デビアン)という Linux OS をベースにした Raspbian(ラズビアン)です。Raspberry Pi に関するインターネットの記事の殆どは Raspbian を前提に書かれてあるので、これをインストールしましょう。

Raspberry Pi のオフィシャルサイト『Raspberry Pi - Teach, Learn, and Make with Raspberry Pi』に行き、上部メニューの「DOWNLOADS」から OS のダウンロードメニュー画面を開きます。

www.raspberrypi.org

数種類の OS が選択できることが分かります。中には Windows 10 IOT CORE といった、一見簡単そうな OS もありますが、Windows 10 とは別物なので、初心者にとっては逆に情報収集が大変でしょう。素直に Raspbian を選択することをお勧めします。

Raspbian

なお、隣に NOOBS という、Raspberry Pi のロゴが書かれたボタンがあります。これはこのページにある各種の OS を選択してインストールできるインストーラーで、最も初心者向けとされています。

ただ、NOOBS は OS インストール後も SD カード内にインストーラーが残ってしまうので、Raspbian 決め打ちで綺麗にインストールしたいのであれば、NOOBS を使うメリットはあまりありません。一応、NOOBS は他の OS と違って SD カードにファイルをコピーするだけでインストールが出来るので、その分だけお手軽ではあります。

さぁ、Raspbian をクリックして、OS のディスクイメージを取得しましょう。

ディスクイメージの取得

2 つのディスクイメージがあります。左側は正規版、右側は Lite で、Lite の方は上級者向けの最小構成であり デスクトップ環境(PIXEL)等が入っていません。(勿論、後から追加することができます)

ここは素直に RASPBIAN JESSIE WITH PIXEL の ZIP ファイルをダウンロードしてください。なお、www.raspberrypi.org の回線はかなり遅く、ダウンロードに 4 時間かかったりすることもあります。

さて、ダウンロードできたら解凍して下さい。中に 2016-11-25-raspbian-jessie.img というディスクイメージファイルが入っています。

ディスクイメージ

このディスクイメージを、micro SD カードに書き込みましょう。

Windows の方

Windows の方は、Win32DiskImager を入手して下さい。

https://osdn.jp/projects/sfnet_win32diskimager/

Win32DiskImager-0.9.5-install.exe (日付: 2014-03-20, サイズ: 12.0 MB)

をダウンロードし、インストールして下さい。

Win32DiskImager

このプログラムを実行すると SD カードへのディスクイメージの読み書き用のウィンドウが開くので、先程の 2016-11-25-raspbian-jessie.img を選択し、書き込み先が micro SD カードになっているかを確認して、Write ボタンを押して書き込んで下さい。

DiskImageの書き込み

Macintosh の方

Macintosh の方は、Raspberry PiにRaspbianをインストールする for Mac OSXこちらのサイトを参考になさってください。詳細に纏められてあります。

書き込み結果

ディスクイメージが書き込まれた micro SD の中身はこのようになっています。

DiskImage書き込み後

さて、ところで 2016-11-25-raspbian-jessie から重要な変更が行われました。これまでの Raspbian では、初回起動時から sshd が動作しており、何もしなくても外部から SSH 接続が可能でしたが、2016-11-25-raspbian-jessie からはデフォルトで sshd が無効です。

これは元々、Raspberry Pi が教育用として開発され誰でも簡単に使えることを目指して作られていたためですが、デフォルトユーザーが pi、パスワードが raspberry で固定であったため、セキュリティとしてかなり脆弱でした。教育用ですから、コンピューターに詳しくないユーザーがそのまま利用した場合、誰でも自由に Raspberry Pi にログイン出来てしまいかねません。

今回の変更は、この点を重く受け止めた結果のようです。

とはいえ、始めから sshd が動いていないと設定がしづらいという方もいると思いますので、互換性を維持するための措置として、/boot ディレクトリ内に ssh というファイル(中身はなんでもいい。空ファイルで構わない)を作成してから初回起動すると、sshd が有効になるようになっています。

sshファイルを作成

sshd を有効にして初回起動したい方はこのようにしてください。

もちろん、sshd は後から設定で有効にできるので、SSH 接続をしたいからといって ssh ファイルを必ず作らねばならないわけではありません。

さて、ディスクイメージの書き込みが終わったら、いよいよ Raspbian の起動です。

Raspbian の起動

初めに断っておきますが、Raspberry Pi には電源ボタンはありません。USB 電源ケーブルを挿したら電源が入り、OS をシャットダウンさせてから、電源ケーブルを引き抜く、という流れになります。

ですから、電源ケーブルを挿す場合はまず、micro SD カードが挿入されていること、モニタやキーボードといった周辺機器が接続されていることを確認して下さい。

では、電源を投入してみましょう。

デスクトップ起動直後、Warning が表示されていますね。

SSH警告

これは先程の ssh ファイルを作成して、初回起動時に SSH サーバーを有効にしたためです。「SSH が有効にされましたが pi ユーザーのパスワードがデフォルトのままなのでセキュリティリスクが有ります。パスワードを変更して下さい」という警告メッセージです。

もちろん、最初に ssh ファイルを作成しなければ、この警告は出ません。

設定画面

Raspbian の初期設定は、左上の Raspberry Pi マークから Preferences > Raspberry Pi Configuration を辿って開くダイアログで設定できます。

System

System設定

まずは System 設定です。

Expand Filesystem

2GB 以上の SD カードを利用する場合に領域を拡張します。最初に 1 回クリックしておいて下さい

Change Password

pi ユーザーのパスワードを変更します。必ず変更して下さい。(current password はデフォルトでは raspberry です)

Boot

To CLI を選んでおくと、自動でデスクトップ環境が立ち上がらないようになります。この場合、デスクトップを立ち上げたい時は pi ユーザー等でログインしてから

startx

とタイプすることで、立ち上げることが出来ます。UNIX 系 OS で利用されるグラフィカルユーザインターフェース(GUI)環境を X Window System と呼びますので、startx は「X Window System を開始する」という意味でしょう。

Auto Login

自動で Pi ユーザーでログインするかどうかの設定です。自動でログインするようにしておくと、あなたが居ない時に誰でも Raspberry Pi の中を覗いて操作出来てしまいますので、ここのチェックボックスは外しておきましょう。

Interfaces

Interfaces

Raspberry Pi のインターフェイス設定画面です。ここに SSH の設定もあります。

電子工作がやりたくなった時は、ここで SPI や I2C といったインターフェイスを有効にして下さい。

Performance

Performance

CPU のオーバークロックや、グラフィックカードに割り当てるメモリサイズの設定です。

特に変更する必要はないでしょう。

Localisation

Localisation

国際化に関する設定です。

Locale

地域設定ですが、ここではまだ行わないで下さい。というのも、Raspbian にはデフォルトでは 日本語フォントは入っていません。この状態で Locale を日本にすると、システムメッセージから画面のラベルから、全て文字化けして何が何だか分からなくなってしまいます。今は絶対にいじらないでください

Timezone

時刻設定です。日本にはタイムゾーンは 1 つしかない(Asia/Tokyo)ので、Japan を選択してください。

タイムゾーン

Keybord

Locale と同じ理由で、ここではまだ何も設定しないで下さい。設定しても良いですが、Locale を変更するとデフォルトに戻されてしまいます。二度手間なので後回しにしましょう。

WiFi Country

Wi-Fi の地域設定です。JP Japan を選択して下さい。

Wi-Fi設定

以上を設定し終えたら、OK をクリックしてください。Raspberry Pi の再起動が求められるので Yes で再起動してください。

日本語フォントのインストールと日本語環境の設定

さて、では日本語フォントをインストールして、環境を整えます。まず、ターミナルを開いて下さい。

ターミナルの起動

この黒い画面で、

sudo apt-get -y install fonts-takao

これでしばらく待っているだけで Takao フォントがインストールされます。なお、このフォントはオープンソースの日本語フォントである「IPA フォント」の不具合を修正したものだそうです。

次に、CLI(コマンドラインインターフェイス)で日本語を表示するためのアプリケーション jfbterm をインストールします。

sudo apt-get -y install jfbterm

次に、日本語入力のための IME である、Anthy をインストールします。なお、iBus とは Unix系OSにおけるインプットメソッドフレームワークだそうです。

sudo apt-get -y install ibus-anthy

以上で、日本語に関するインストールが終わりました。これで晴れて Raspberry Pi Configuration で Locale と Keyboard の設定が出来ます。

Locale

Keyboard

キーボードは OADG 109A で大丈夫でしょう。

再起動してみると、メニューやアイコンなどのラベルが日本語になっているはずです。

日本語化完了

あとは、Anthy でキーボードショートカットを日本語入力に切り替えられるように設定します。画面左上の Raspberry Pi ボタンから 設定 > iBus の設定 で、一般タブのキーボードショートカットを space で適用し、OKを押して下さい。

これで、Shift + スペースバーで日本語入力と英字入力が切り替えができるようになりました。マウスを右クリックして新規ファイルを作成し、日本語入力ができるか確認して下さい。

ブラウザを…

パソコンとして利用するにはやはり、ブラウジングくらいは出来て欲しいものです。

現在の Raspbian の推奨ブラウザは Chromium らしいのですが、これ、上手く動かないことがあります。いろいろと対処法のページも見つかるのですが、情報が古く簡単には動作しないようです。

ですから、この場合は『Firefox ESR』を使うことにしましょう。

sudo apt-get -y install firefox-esr-l10n-ja

これで、画面左上の Raspberry Pi アイコンから インターネット > Firefox ESR と辿ってブラウザを起動することが出来るようになります。

Firefox

お疲れ様でした

以上で、Raspberry Pi の初期設定は終わりです。これで一通りの環境が整い、Raspberry Pi を使い始めることができます。お疲れ様でした。

Raspberry Pi 簡単セットアップマニュアル

公開日時:2016/07/15 17:05

目次

このコーナーは、説明を可能な限り省き、実行する命令だけを羅列することで、そのとおりにコマンドを入力するだけで一通りのセットアップが出来ることを目指しています。 (2016/07/03: 2016-05-27-raspbian-jessie にて)

念のため先に申し上げますが、「簡単」と書いてはあってもかなりめんどくさいことは確かです。Linux はまぁ、こういうものでしょう…。適度な場所にセーブポイントを設けてありますので参考になさって下さい。

なお、各処理を途中で止めたいときは Ctrl + C、直前にやった処理が何だか分からなくなった時はカーソルキーの↑を押すことで確認できます。

SDCardの入手

class 10、8GB 以上のSDカードを用意する。安い SDCard は class 2 等のことが多いので注意。とてもアクセスが遅い。

SDCardフォーマッター入手

Windows または Mac 版を選んでダウンロード。セットアップして使えるようにする。

https://www.sdcard.org/jp/downloads/index.html

SDCardのフォーマット

完全にフォーマットする。32GB だと 30 分ほどかかる。※時間が勿体無いのでJessie のディスクイメージを同時にダウンロードしておく。

上書きフォーマット、論理サイズ調整ON

Raspbian Jessie ディスクイメージのダウンロード

RASPBIAN JESSIE(Version:May 2016、Release date:2016-05-27、Kernel version:4.4)から Download ZIP。ファイルサイズ 1.3GB。光回線で 5 分ほど。ダウンロードできたら解凍する。ディレクトリの中に 2016-05-27-raspbian-jessie.img があるのを確認。

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

なお、NOOBS と Raspbian Jessie ディスクイメージ の違いですが、NOOBS はインストーラー付きであり、インストール後もこのインストーラー部分が SDカード内に残ります。残っていても困ることは無いと思いますので、どちらを使うかは単純に好みでお選び下さい

Win32DiskImagerの入手

ディスクイメージの読み書きアプリケーション。ダウンロードしたディスクイメージをSDカードに書き込むために必要。またSDカードの内容をバックアップするためにも必要。ダウンロードはすぐ終わります。セットアップして使えるようにする。Mac の人は別の手段を探して下さい。

https://osdn.jp/projects/sfnet_win32diskimager/

ディスクイメージの書き込み

SDCard のフォーマットが終わったら Win32DiskImager でディスクイメージを SDCardに書き込む。Image File にディスクイメージを指定し、Device に SDCard ライタのドライブレターを指定する。{Write}(red) ボタンをクリックする。Read するとディスクイメージが空になると思われる。同様に{ドライブレターは絶対に間違えないこと。やったことはないが、間違えるとそのドライブの内容が吹き飛ぶ気がする。}(red)書き込みは5分程で終わると思われる。

Win32DiskImager

電源投入

SDCard を差し、もろもろの周辺機器を取り付け、最後に USB 電源に接続する。Jessie でははじめから X window が立ち上がる。

諸々設定画面を開く

Menu ボタンから Preferences > Raspberry Pi Configuration。

System

Expand Filesystem でファイルシステムを expand(拡大)しておく。

Change Password でパスワード設定。強固だが忘れないパスワードを。

Boot は To CLI に。次回から X window が自動では立ち上がらなくなる。X window を開きたいときはログインしてから

sudo startx

Auto Login の Login as 'pi' をオフに。セキュリティ確保のため。

Interfaces

Camera、SSH、SPI、I2C あたりを Enabled(利用可能)に。あなたのニーズにあわせて。

Localisation

ひとまず Locale はそのままで。後で日本語に変更します。

Timezone は Area を Japan に。

Keyboard は Country を Japan に。Variant はお使いのキーボードに合わせて。OADG109A あたりが良いか?

WiFi Country を JP Japan に。

再起動

Configuration で OK をクリックすると再起動(Reboot)を促される。再起動してください。

pi ユーザーでログイン

raspberrypi login: に pi
Password: に先ほどのパスワード

で、ログインする。

IPアドレスを調べる

inet addr:xxx.xxx.xxx.xxx が、今、この Raspberry Pi のネットワークに割り当てられている IP アドレス。

ifconfig

SSH でログイン

IP アドレスが分かったら Tera Term 等のターミナルエミュレータを使い遠隔操作する。port は 22。

root にパスワードを設定

強固なパスワードを設定。絶対に忘れない事。

sudo passwd root

Vim のインストール

raspbianでプリインストールされているのはvim-tinyなので、vimをインストール。

sudo apt-get install vim

IP アドレスの固定

DHCP サーバーが勝手に IP アドレスを変えてしまわないように、IP アドレスを固定化。IP アドレスが他で使われていないか注意する。 ** をお使いの環境に合わせて適宜設定

sudo vi /etc/dhcpcd.conf

以下を追記。(Jessie では、この記述は存在しないので追記する)

interface eth0
static ip_address=192.168.**.**/32
static routers=192.168.**.1
static domain_name_servers=192.168.**.1

適度な IP アドレスを指定。/32 は CIDER表記により、その前に指定してある IP アドレスのみを使用する。

無線LAN を利用する場合は

interface wlan0
static ip_address=192.168.**.**/32
static routers=192.168.**.1
static domain_name_servers=192.168.**.1

のように設定して保存した後

sudo sh -c 'wpa_passphrase SSID PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf'

として、SSID と PASSPHRASE を指定する。SSID と PASSPHRASE は、お使いの無線 LAN ルータに設定してある値。SSID はいくつでも設定出来るようだ。設定がうまく行っていれば、wpa_supplicant.conf には次のように書き込まれている。

sudo cat /etc/wpa_supplicant/wpa_supplicant.conf

無線LAN設定

上記のうちコメントアウトされている #psk は生のパスワードなので、万が一情報漏えいしても大丈夫なよう、その行を削除してしまう。

無線LAN設定の生パスワード削除

再起動

IP アドレスが固定化されたか確認するため再起動する。

sudo reboot

SSH で再接続

IP が正しく固定されていればログインできる。できなければ Raspberry Pi のシェルで ifconfig を打ち、間違いを探す。

Raspberry Pi ファームウェアのアップデート

そこそこ時間がかかる。気長に待つ。

sudo rpi-update

再起動

sudo reboot

apt をアップデート

とても時間がかかる。気長に待つ。(2016/08/06 修正)

apt-get update && apt-get upgrade && apt-get autoremove

※2016/08/06追記 この処理は pi ユーザーでは、sudo で実行しても以下の様なパーミッションエラーが出るので、su - で root になってから行う。

エラー内容
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

とても時間がかかる。気長に待つ。

sudo apt-get dist-upgrade

これは多分、もう最新だと言われる。

sudo apt-get install raspberrypi-ui-mods

再起動

念のため再起動してアップデートが正常に行われたか確認。

sudo reboot

Save Point 1 ディスクイメージをバックアップ

ここでセーブポイント。これまでの労力をムダにしないため、SDCard を Win32DiskImager を使って保存する。もし今後、何らかの設定ミスをした場合はこの保存したイメージを復元することで、ここの続きから設定を進めることができる。

sudo poweroff

電源が切れたら SDCard を抜き、パソコンにセットし、今度は{Read}(red)を選ぶ。Writeを選ぶと SDCard の内容が消し飛ぶはず。また、Image File に保存先を指定するのを忘れないように。

Win32DiskImager

SSHのポート番号変更

ポートスキャンを蹴散らすために適当なポート番号を指定。49152~65535 あたりで好きなポート番号を選ぶ。

sudo vi /etc/ssh/sshd_config

次のようにポート番号を指定している記述があるので、この記述を書き換える。

# What ports, IPs and protocols we listen for
Port 22

   ↓ 51327 の部分を適当に

# What ports, IPs and protocols we listen for
#Port 22
Port 51327

鍵方式 SSH ログイン用の鍵作成

パスワードのみでの SSH ログインを禁止するため、RSA 暗号を使った鍵を作成する。 ``` cd ~

ssh-keygen -t rsa ```

次のメッセージで Enter。/home/pi/.ssh/id_rsa、/home/pi/.ssh/id_rsa.pub が作られる。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):

パスフレーズの入力が2回求められるので2回入力。このフレーズは強度が低くても大丈夫。なぜなら、もっと強固な秘密鍵ファイルを利用するためのフレーズであり、秘密鍵ファイルを流失させさえしなければ良いから。

公開鍵 id_rsa.pub を authorized_keys としてアカウント pi の公開鍵とする。

cat .ssh/id_rsa.pub >> .ssh/authorized_keys

秘密鍵 id_rsa を開き全文をコピー。ローカルのパソコンに id_rsa というテキストファイルとして保存。改行コードは LF なので間違えないように。WinSCP などがあるならそれでファイルそのものをダウンロードするのが安全。

sudo vi /home/pi/.ssh/id_rsa

これら鍵ファイルのアクセス権を自分 pi のみに変更

chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa.pub

SSH を鍵方式のみに変更

sshd の設定ファイルを編集する。#以下はコメント扱い。

sudo vi /etc/ssh/sshd_config

ルートでの SSH ログイン禁止。

#PermitRootLogin without-password
PermitRootLogin no

パスワードのみでのログイン禁止

#PasswordAuthentication yes
PasswordAuthentication no

空のパスワードでのログイン禁止

PermitEmptyPasswords no

最後に、sshd を再起動する。

sudo service sshd restart

Tera Term 等のターミナルエミュレーターで、先ほど指定したポートと先ほど作成した秘密鍵でログイン出来るか確認する。

Save Point 2 ディスクイメージをバックアップ

ここでセーブしておくと良い。

日本語入力環境のインストール

日本語フォントのインストール

sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname

コンソールで日本語を表示するために jfbterm をインストール

sudo apt-get install jfbterm

Raspberry Pi のコンソール画面でログインし、X window を開く。

sudo startx

Menu から Preferences > Raspberry Pi Configration > Localisation で Locale を

Language: ja(Japanese)  

に変更。先ほど日本語フォントをインストールしたので文字化けしなくなっている。

なお、Locale を変更するとキーボードセッティングがデフォルトに戻されるようなので、再び使用するキーボード用のセッティングをしておく。

OK で設定を有効にすると再起動を求められるので再起動。再起動したら Pi のコンソールでログインし、日本語入力に切り替えてみる。

jfbterm

フォントが変わっているのが分かる。

ifconfig

で、ネットワーク情報が日本語になっていれば、インストールは正常終了している。

サウンドカードの優先順位変更

とにかくサウンド周りは設定がよくわからない。何もしなくてもうまくいく場合もあれば、あれもこれもやってもダメなことがある。謎。

サウンドライブラリのインストール

sudo apt-get install alsa-utils sox libsox-fmt-all

Julius は、デフォルトではサウンドカード 0 番にマイクが無いと動作しないようなので、サウンドカードの 0 番を USB マイクにする。(USBマイクを刺している場合)

cat /proc/asound/modules

で、snd_usb_audio が 0 番であればこの処理は不要。

pi@raspberrypi:~ $ cat /proc/asound/modules
 0 snd_bcm2835
 1 snd_usb_audio

こうなっていたら設定が必要。設定ファイルを新規作成。

sudo vi /etc/modprobe.d/alsa-base.conf

現在の jessie ではこのような設定(2016/08/18追記)

options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1

以前の設定はこのような感じでした。ハイフンがアンダースコアになっていたりして、とても分かりづらい変更です。どうしてこんな事になっているんでしょう…

# This sets the index value of the cards but doesn't reorder.
options snd_usb_audio index=0
options snd_bcm2835 index=1

# Does the reordering.
options snd slots=snd-usb-audio,snd-bcm2835

再起動して再び cat。以下のようになっていれば設定完了。

pi@raspberrypi:~ $ cat /proc/asound/modules
 0 snd_usb_audio
 1 snd_bcm2835

マイクサウンドカードの確認。以下で、カード 0 となっていれば良い。

arecord -l
pi@raspberrypi:~ $ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: Device [USB PnP Audio Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

再生サウンドカードの確認。以下で、カード 1 となっていれば良い。

aplay -l
pi@raspberrypi:~ $ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 1: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
  サブデバイス #7: subdevice #7
カード 1: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

サウンドカードの設定ファイルを編集

sudo vi ~/.asoundrc
defaluts.pcm.card 1
defaults.ctl.card 0

pcm.!default {
  type hw
  card 1
}

ctl.!default {
  type hw
  card 0
}

スピーカーが HDMI 出力の場合、音の立ち上がりが悪いのでアナログライン出力をおすすめする。

なお、HDMI 接続のモニタなどでは、HDMI ケーブルが繋がっているとそちらを頑なに第一候補として音を出力するため、アナログで出力したい場合は HDMI ケーブルを外して起動し、一度音をならせばアナログから出力するようになる模様。

アナログライン出力

sudo amixer cset numid=3 1

頑なに HDMI 出力の場合は 2 に設定。ただし、HDMI で音を出すには /boot/config.txt ファイルを修正する必要がある場合がある。

sudo amixer cset numid=3 2
sudo vi /boot/config.txt

hdmi_drive=2 をアンコメント(コメントを外す)

#hdmi_drive=2
hdmi_drive=2

再起動。

テスト。まず、マイク音量を大きく50くらい(最大62)に設定。

amixer sset Mic 50 -c 0

録音テスト。マイクに向かってしゃべり、適当なところで Ctrl + C で停止。作業ディレクトリに test.wav が作成されている。

arecord -D plughw:0,0 -f cd test.wav

再生音量の設定

sudo amixer set PCM 100%

カード 1、デバイス 0 がライン出力なので、

aplay -D plughw:1,0 /usr/share/sounds/alsa/Front_Center.wav

で、ラインから音が出るはずだが、どうやってもHDMIからしか出ない時がある…。

以下で、先ほど録音した音声についても再生テスト。

aplay -D plughw:1,0 test.wav

とにかく、録音と再生が上手く行ったらそれはラッキーな事だからイメージを保存しておく。

Save Point 3 ディスクイメージをバックアップ

アプリケーション管理ソフト paco の導入

make installでインストールするアプリケーションを管理するため paco を導入。

sudo apt-get install paco

paco で管理しているアプリケーションは、以下で確認できる。

paco -a

Apache の導入とバージョン確認

sudo apt-get install apache2

apache2 -v

apache の設定ファイルの修正。サーバーシグネイチャの非表示化。

sudo vi /etc/apache2/conf-available/security.conf
ServerSignature Off
#ServerSignature On

デフォルトインデックスファイルの移動

sudo mv /var/www/html/index.html /var/www/index.html

デフォルトバーチャルホスト設定の編集。(なお本来は、規定されていないホストでのアクセスを一纏めにしてエラー画面を表示するためこのファイルを使い、実際に割り当てるホストについては、別のバーチャルホスト設定を作成した方が良いかもしれない)

sudo vi /etc/apache2/sites-available/000-default.conf
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        <Directory /var/www/html/>
            Options FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>

apache ユーザー(www-data)を sudoers に登録。

sudo visudo

www-data を追記。

pi ALL=(ALL) NOPASSWD: ALL
www-data  ALL=(ALL) NOPASSWD: ALL

設定を有効にするためサーバーの再起動

sudo service apache2 restart

memcached のインストール

2016/07/10 追加

sudo apt-get install chkconfig

sudo apt-get install memcached

sudo chkconfig memcached on

sudo service memcached start

PHP のインストールとバージョン確認

2016/07/10 YAML エクステンション関係と memcache を追加(php-pear libyaml-dev php-pecl-memcache)を追加。PHP 用の memcached ライブラリは環境によってインストール出来ない場合があったので、同様の事ができるmemcache のインストールを記す。

2016/07/15 php-pecl-memcache は間違いで、Raspbian 環境では php5-memcache が正しいようだ

sudo apt-get install php5 php5-cli php5-gd php5-pgsql php5-mysqlnd php5-sqlite php5-mcrypt php5-dev php-pear libyaml-dev php5-memcache

php -v

参考)CentOSでphpでmemcache。|erio_nk://memo

上記ブログにあるように、Raspbian Jessie でない普通の Linux 環境などでは SELinux が確かに邪魔をする。その場合は

sudo setsebool -P httpd_can_network_memcache true

pecl で yaml ライブラリをインストール ※2016/07/10 追加

もし、まだ php5-dev と php5-pear がインストールされていない場合はまずこれを入れる。(上記の PHP のインストールまとめ命令には含まれている)

sudo apt-get install php5-dev php5-pear

そして、pecl で yaml モジュールをインストール。

sudo pecl install yaml

yaml のライブラリを読み込む .ini を作成し、CLI と Apache に適用 ※2016/07/10 追加

sudo sh -c "echo 'extension=yaml.so' >> /etc/php5/mods-available/yaml.ini"

sudo php5enmod yaml

タイムゾーンの設定。CLI と Apache Module 用の両方に設定。

sudo vi /etc/php5/cli/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo
sudo vi /etc/php5/apache2/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo

ionCube Loader のインストール

cd ~

Arm v7 用 ionCube Loader のダウンロード

wget -O ioncube_loaders_lin_armv7l.tar.gz 'http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_armv7l.tar.gz'
tar zxvf ioncube_loaders_lin_armv7l.tar.gz
cd ioncube

PHP の extention ディレクトリ確認

php -r "echo ini_get('extension_dir');echo \"\n\";"

extention ディレクトリにライブラリをコピー

sudo cp ~/ioncube/ioncube_loader_lin_5.6.so /usr/lib/php5/20131226

ini ファイルの新規作成

sudo sh -c "echo 'zend_extension=ioncube_loader_lin_5.6.so' >> /etc/php5/mods-available/ioncube_loader.ini"

CLI と Apache の両方のシンボリックリンクを作成

sudo ln -s /etc/php5/mods-available/ioncube_loader.ini /etc/php5/cli/conf.d/05-ioncube_loader.ini

sudo ln -s /etc/php5/mods-available/ioncube_loader.ini /etc/php5/apache2/conf.d/05-ioncube_loader.ini

WiringPi のインストール

cd ~
sudo apt-get install libi2c-dev

sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

バージョン確認

gpio -v

WiringPi-PHP のインストール

cd ~
git clone --recursive https://github.com/WiringPi/WiringPi-PHP.git
cd WiringPi-PHP
make
sudo paco -lD "make install"
sudo vi /etc/php5/mods-available/wiringpi.ini
extension=wiringpi.so
wiringpi.pinmaptype=[PINS|GPIO|USER]

CLI と Apache の両方のシンボリックリンク生成

sudo php5enmod wiringpi

Apache が sudo 無しで GPIO を操作できるように各グループに登録

sudo adduser www-data i2c
sudo adduser www-data spi
sudo adduser www-data gpio

apache の再起動

sudo service apache2 restart

これまでのインストール状況の確認

sudo vi /var/www/html/check.php
<?php
echo phpinfo();

ブラウザから IP アドレスでアクセスし、PHP info を確認する。

http://192.168.**.**/check.php

**は適宜書き換え。wiringpi と ionCube の文字が検索できればとりあえず apache で動作する PHP へのインストールは成功している。

CLI 版の PHP については

php -r 'phpinfo();' > info.txt

で、info.txt ファイルに情報が出力されるので、wiringpi と ionCube が読み込まれているか調べる。

確認が終わったら check.php はセキュリティ確保のため削除する。

sudo rm -rf /var/www/html/check.php

Julius のインストール

cd ~
wget -O julius-4.3.1.tar.gz 'http://sourceforge.jp/frs/redir.php?m=osdn&f=%2Fjulius%2F60273%2Fjulius-4.3.1.tar.gz'
tar zxvf julius-4.3.1.tar.gz
cd julius-4.3.1/
./configure
make
sudo paco -lD "make install"

バージョン確認

julius -version

必要なカーネルモジュールの導入

sudo modprobe snd-pcm-oss

sudo sh -c "echo snd-pcm-oss >> /etc/modules"
cd ~

関連キットのダウンロード

wget -O dictation-kit-v4.3.1-linux.tgz 'http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fjulius%2F60416%2Fdictation-kit-v4.3.1-linux.tgz'

wget -O grammar-kit-v4.1.tar.gz 'http://sourceforge.jp/frs/redir.php?m=osdn&f=%2Fjulius%2F51159%2Fgrammar-kit-v4.1.tar.gz'

解凍

tar zxvf dictation-kit-v4.3.1-linux.tgz
tar zxvf grammar-kit-v4.1.tar.gz

キット用ディレクトリの作成

mkdir julius-kits

キット用ディレクトリに移動しておく

mv dictation-kit-v4.3.1-linux julius-kits/
mv grammar-kit-v4.1 julius-kits/

ディクテーションキットをつかって Juilius をテスト。あらゆる言葉に対応しているためかなり処理は遅い。

cd julius-kits/dictation-kit-v4.3.1-linux
julius -C main.jconf -C am-gmm.jconf -demo
cd ~

重要)Julius パッケージ内の不適切なファイルを置き換え

cp julius-4.3.1/gramtools/mkdfa/mkfa-1.44-flex/mkfa julius-4.3.1/gramtools/mkdfa/mkfa

cp julius-4.3.1/gramtools/dfa_minimize/dfa_minimize julius-4.3.1/gramtools/mkdfa/dfa_minimize

Save Point 4 ディスクイメージをバックアップ

Open JTalkの導入

以下、Open JTalk についてはRaspberry Piにしゃべらせてみた(OpenJTalk 1.08、.htsvoiceファイル対応)|Raspberry Piでやってみた さんの記事を全面的に引用しました。感謝します。説明については引用先を参照して下さい。

hts_engine API(version 1.09)のインストール

cd ~

sudo wget http://sourceforge.net/projects/hts-engine/files/hts_engine%20API/hts_engine_API-1.09/hts_engine_API-1.09.tar.gz
sudo tar zxvf hts_engine_API-1.09.tar.gz
cd hts_engine_API-1.09
sudo ./configure

sudo make

sudo paco -lD "make install"

Open JTalk(version 1.08)のインストール

make に結構時間がかかる

cd ~

sudo wget http://sourceforge.net/projects/open-jtalk/files/Open%20JTalk/open_jtalk-1.08/open_jtalk-1.08.tar.gz
sudo tar zxvf open_jtalk-1.08.tar.gz
cd open_jtalk-1.08
sudo ./configure --with-charset=UTF-8

sudo make

sudo paco -lD "make install"

辞書ファイル(version 1.08) のダウンロードと導入

cd ~

sudo wget http://sourceforge.net/projects/open-jtalk/files/Dictionary/open_jtalk_dic-1.08/open_jtalk_dic_utf_8-1.08.tar.gz

sudo tar zxvf open_jtalk_dic_utf_8-1.08.tar.gz
sudo mkdir /usr/local/share/open_jtalk

sudo mv open_jtalk_dic_utf_8-1.08 /usr/local/share/open_jtalk/

MMDAgent(version 1.4 ) 音声ファイルをダウンロードして導入

cd ~

sudo wget http://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.4/MMDAgent_Example-1.4.zip

sudo unzip MMDAgent_Example-1.4.zip
sudo mkdir /usr/local/share/hts_voice

sudo mv MMDAgent_Example-1.4/Voice/mei /usr/local/share/hts_voice/

喋らせるための sh スクリプトをダウンロードして配置

cd /usr/local/bin/

sudo wget http://raspi.up.seesaa.net/bin/jsay

作成した sh スクリプトに実行権限を付与。

sudo chmod +x /usr/local/bin/jsay

喋らせるテスト

jsay ラズベリーパイでやってみたさん、有難うございます

mp3プレイヤーのインストール

とりあえず、現在は mpg321 を導入してみる。

sudo apt-get install mpg321

今までに使った tar ボール類は纏めておく

cd ~

mkdir tar
mv ioncube_loaders_lin_armv7l.tar.gz tar/
mv grammar-kit-v4.1.tar.gz tar/
mv dictation-kit-v4.3.1-linux.tgz tar/
mv julius-4.3.1.tar.gz tar/
mv hts_engine_API-1.09.tar.gz tar/
mv open_jtalk-1.08.tar.gz tar/
mv open_jtalk_dic_utf_8-1.08.tar.gz tar/
mv MMDAgent_Example-1.4.zip tar/

Save Point 5 ディスクイメージをバックアップ

eSpeak text to speechの導入

2016/08/29 追記

Open JTalk は英語を発声できないため、英語読上げ用のエンジン eSpeak text to speech を導入する

sudo apt-get install espeak

これだけ。オプションパラメターについては配布サイトの『2.2 COMMAND OPTIONS』を参照。

以上(とりあえず、今は)

水槽ライブカメラ

公開日時:2016/07/05 00:28

Raspberry Pi 2 で、うちの水槽ライブカメラを作成してみました。

※現在は稼働を停止しています。

※なお、映像の色が少しおかしいのは赤外線カメラモジュールなためです。

配信環境

構成は今はこんな感じです。

システム構成

SD カードは寿命があって頻繁に読み書きしていると壊れるそうですし、さくらクラウドのストレージは SSD なのでやはり寿命が存在します。ですから、撮影データをディスクに保存しなくても良いよう、メモリキャッシュシステムである memcached に画像データを保存し、リクエストに対してはそこからデータを読みだして返すようにしています。

top コマンドを叩いてみると、10~25% 程度の CPU 使用率です。やはり Raspberry Pi Model B+ は Pi2 や Pi3 に比べてかなり処理能力が低い感じですね。1~2%の CPU 使用率で処理できる Pi2 とどっちが電気料金的におとくなのかはこれから調べてみることにします。

Raspberry Pi Model B+ はシングルコアでかなり処理能力が低いので、本当はさくらクラウドのサーバーの方で WEB からのリクエストを捌いたほうが良い気がしてきました。とりあえず、しばらく経過観察をして負荷が増えすぎないか確認してみようと思います。

赤外線LED照明(+電源アダプター)

赤外線LED照明はこちらを使いました。中国から発送されまして、到着まで2週間以上かかりましたがお値段的には今のところ満足です。(2016/07/18より設置開始。あまりにも早く壊れるようならここに追記してリンクを外します)

2016/08/27 追記 1ヶ月を超えましたが室内常時稼働で問題なく動いています。(明るさセンサー搭載のため、昼間は消えています)

電源アダプター。12V、1Aのようです。上記LED照明は500mAで駆動する模様。十分ですね。

電気代計算

以下は、赤外線LED照明やネットワークのハブなどを含まない、RPi とカメラ、温度センサーのみの電気代計算です。

RPi Model B+

● 329.2時間駆動、14.27円 = 1 時間あたり 0.043 円 => 31円/月(30日)

RPi 2

● 237.1時間駆動、12.25円 = 1 時間あたり 0.052 円 => 37円/月(30日)

流石に Raspberry Pi 2 の方が電気代はかかるようですね。ただ、コマ撮りのパフォーマンスは遥かに RPi 2 の方が上で高速です。

計測に用いたメーター

プログラムタイマー付きエコキーパーR(簡易電力計)EC-04|CUSTOM

Amazon を見ると EC-04I という商品も見つかるのですが、違いはよくわかりません。メーカーのホームページにも I のほうは見当たらないので、ひょっとしたら同じ製品なのかもしれません。

私はホームセンターで購入。Amazon のレビューに、タイマー利用時や停電復帰時にONにならないという情報がありますが、こちらの製品はチャイルド・ロック機能がついているのでそのあたりの問題かと思います。予め念頭に置いて下さい。普通に計測する限りは問題なく使えています。

ただ、機能を盛り込みすぎたせいでしょうか、操作がめんどくさ過ぎる気がします。もっと簡単な、挿すだけで計測してくれるメーターなども昔使っていたので、簡単なものが良い方はそういう商品をご利用下さい。

水温計も欲しくなってきました…

これ、買ってみます(7/19注文)。報告は後日…~~(8/2までに到着予定)~~

防水温度計、届きました

7/28 に届きました。中国からですが、かなり早かったですね。

温度センサー防水タイプ

1本の信号線だけで通信を行う 1-wire という規格のデバイスだそうです。

参考)1-Wire

新しく記事を起こそうかとも思いましたが、あまりに簡単過ぎるので参考にしたページへのリンクだけ貼っておきます。

参考)[コラム] 第9回『1-wire温度センサーで部屋の温度を測定しよう』

説明書も何もついてきませんでしたが、赤を Vcc(3.3V)、黒を GND、黄色をお好きな GPIO ピンに繋ぎ、黄色と赤の間に 4.7KΩくらいのプルアップ抵抗を挟むだけで良いようです。Raspberry Pi の設定としては、/etc/modules と /boot/config.txt の編集ですね。GPIO 番号は、黄色のリードに繋いだ GPIO 番号を指定して下さい。

私はあまり電気には詳しくないので、石器人の如く以下のように

リード線をハンダ付け

剥いたリード線をハンダで固めてブレッドボードに挿せるようにしましたが、知人から「QIコネクター使うと良いですよ」と教えていただきました。こういうのがあるんですね。後日、やってみます。

参考)【Tips】電子工作でよく使う『QIコネクタ』の圧着方法

測定結果は『気温データベースを作ってみよう!(温度の記録と確認)』の冒頭のサンプルグラフのように利用しました。

水槽用の着色灯油温度計とくらべてみても、ほとんど誤差がないので正常に稼働しているようです。

(おまけ)お魚紹介

ベタさん

ベタさん

トラディショナル・ベタ

別名「闘魚」とも呼ばれるほど闘争心溢れる魚で、ベタを2匹同じ水槽で飼うとどちらかが死ぬまで戦い続けると言われる。またグッピーのようにひらひらとした尾を持つ魚も攻撃対象になりやすく、他の魚と共泳させることも禁忌とされている。

…はずなのだが、うちのベタさんはとても温厚で。他の魚を攻撃することは殆ど無い。昔はたまにコリドラスさんを追い回したりしていたが、コリドラスさんの方が圧倒的に泳ぐスピードが速いので「すさーっ」とベタさんの攻撃をかわしてしまう。うちのベタさんが温厚なのはこれに懲りたからかもしれない。

また「年魚」とも呼ばれ、非常に寿命の短い魚らしい。

このベタさんは3代目なのだが、買って来た時から尾ぐされ病になっていて、すぐにヒレがぼろぼろになり、それほど長くは生きられないだろうと思っていた。

しかし、二週間の薬浴が効いたのか元気をとりもどし、結果として既に1年半以上生き続けている。

最近は流石に水槽の底でじっとしている事も多くなり、かなりのご老体感がある。

プラティさん

プラティさん

レッド・ワグ・プラティ

レッド・ワグ・ムーンとも呼ばれる。

とにかく食欲旺盛。水槽の側に寄って行くと餌をねだってそわそわしまくる。ひもじい思いをさせたら哀れだと思い、日に3度ほど餌を与えていたらぷっくりと膨れ上がってしまい、少し甘やかしてしまったと後悔している。

3匹購入したのだが、1匹は購入から2日後に死亡。小さい魚は難しい。

残りの2匹はしょっちゅう喧嘩している。闘魚ベタさんは彼らには全く興味を示さないのに。争いは同じレベルの者同士でしか起きないの典型。

コリドラスさん

コリドラスさん

コリドラス・ステルバイ

水槽の掃除係として2匹購入した。これを同じ水槽に入れたのがそもそもの間違いだった。

ある夏の日、ふと水槽を見ると水草の葉にびっしりと半透明の白いブツブツがくっついていた。一瞬にして事態を悟った僕はかたっぱしからぶつぶつを潰していったが、しばらくした夏の夜、水槽の壁面をにょろにょろと泳ぐ無数の小さなオタマジャクシのような影を見て、少し気が遠のいた。

現在、10匹以上のコリドラスさんが水槽の底を泳ぎまくっている。

構造が単純な生き物は爆発的に増える。今は、あまり餌を与え過ぎないようにして対応している。

ミッキーさん

ミッキーさん

ハイフィンレッドバック・ミッキーマウスプラティ

成長すると尾っぽの辺りにミッキーマウスのような模様が出るからこの名前になっているらしい。

ライブカメラ設置にあたり、水槽の彩りとして購入。小さい魚は難しいからちゃんと長生きしてくれるのか心配。

ワグ・ムーン・プラティさん同様、おなかがぷっくりと膨れてきた。餌を減らすべきのようだ。

Raspberry Pi で作る省電力ライブカメラ(後編)

公開日時:2016/07/04 16:20

HALを使って複数のカメラを一元管理

ラズベリーパイで作る省電力ライブカメラ(前編)』では、Raspberry Pi のカメラモジュールを使ったコマ撮りでのライブカメラを作ってみました。

この後編では、『ソケットサーバー「HAL」』を使い、複数台の Raspberry Pi に接続したカメラモジュールからの映像を一元管理してみたいと思います。

概念図

今回構築したシステムは、下図のようなものです。

システム構成

Raspberry Pi 2 と 3 を用いていますが、Raspberry Pi B や B+ 等の古いものでも構わないはずです。

図では WEB サーバーは別のコンピューターとして示してありますが、これは WEB ページを閲覧するパソコンの中に WEB サーバーを立てて localhost としてアクセスしても構いませんし、あるいは、Raspberry Pi のどちらかに WEB サーバーをインストールして起動しても構いません。

各 Raspberry Pi には当サイトの製品である、『ソケットサーバー「HAL」』がインストールされており、TCP/IPソケット(BSDソケット)でサーバーと通信を行います。

このようにブラウザとRaspberry Pi の間に WEB サーバーを立てることで、複数の Raspberry Pi につながっているライブカメラを一元管理することができるようになるのです。

さて、では HAL の myActions.php に記述するコードを見てみましょう。

myActions.php のコード

class MyActions
{
    public function action(HALDto $dto, $read_sock, $method)
    {
        // 以下のコードを参考に、あなたのアプリケーションを記述して下さい。
        if(preg_match("/capture/ui", $method)){

            ob_start();
            system("sudo raspistill -o - -t 1 -w 640 -h 480 -e jpg -q 50 -n -rot 180");
            $data = ob_get_contents();
            ob_end_clean();

            $response = "data:image/jpeg;base64," . base64_encode($data);
            $this->send($read_sock, $response);
            Bye::exec($dto, $read_sock);
        }
    }

/**
     * クライアントに文字列を送信する
     *
     * @param resource  $read_sock      接続ソケットリソース
     * @param string    $words          返信内容
     */
    private function send($read_sock, $words)
    {
        $words .= "\n";
        socket_write($read_sock, $words, strlen($words));
    }
}

上記では、“capture" という命令が渡されるとカメラモジュールで撮影を行います。バッファリングの開始と終了、標準出力に出力された画像データの取得については、前編の『ラズベリーパイで作る省電力ライブカメラ(前編)』と同じです。

違うのは、ブラウザではなく接続してきた WEB サーバーにレスポンスを返すことです。

コードの下にある private メソッドの send() は、汎用的に利用するレスポンス用のメソッドです。

$response = "data:image/jpeg;base64," . base64_encode($data) . "\n";
socket_write($read_sock, $response, strlen($response));

としても同じことですが、あとで他に様々な命令を実装するようになった時、レスポンス用のメソッドが切り分けてあればそれを共通で使うことができて便利です。

HAL の myActions.php への記述は以上です。なお、/HAL/setting/HALSetting.php で、IPアドレスとポート番号の指定をするのをお忘れなく。

WEB サーバーのアプリケーション

WEB サーバーに置くファイルは最低2つです。1つはブラウザから直接アクセスするライブカメラ閲覧画面、もう1つはその画面から非同期で画像データを取得するAPIです。

まず、ライブカメラ閲覧画面のコードを先に示します。

index.html
<!DOCTYPE html>
<html>
    <head>
        <title>MyCamera2</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
(function(){

    var loadable = true;
    var idx = 0;

    $(document).ready(function(){
        var cameras = [
            {ip: "192.168.1.12", port: 9002, img: $("#my-camera0")}, 
            {ip: "192.168.1.15", port: 9005, img: $("#my-camera1")}
        ];
        setInterval(function(){
            if(loadable){
                loadable = false;
                getPicture(cameras[idx]);
            }
        }, 100);
    });

    function getPicture(camera)
    {    
        var target = camera.img;
        var temp = $("<img/>");
        $.ajax({
            type:   "post",
            url:    "camera.php",
            data: {ip: camera.ip, port: camera.port}
        }).done(function(result){
            temp.on("load", function(){
                target.attr("src", $(this).attr("src"));
                if(idx === 0){
                    idx = 1;
                } else {
                    idx = 0;
                }
                loadable = true;
                $(this).remove();
            });
            temp.attr("src",  result);
        });
    }
})();
</script>
    </head>
    <body>
        <img id="my-camera0" src="" style="height: 480px;">
        <img id="my-camera1" src="" style="height: 480px;">
    </body>
</html>

このプログラムは jQuery を使って同階層にある camera.php を呼び出しています。レスポンスは Base64 でエンコードされた JPEG ファイルが返されるので、それを <img/>タグにセットして読み込みが終わった段階で実際に表示されている <img/>タグにセットしなおします。

その後でカメラを切り替え、再び camera.php を呼び出します。これを延々と繰り返すわけです。

つぎは、ブラウザからの要求に応えて Raspberry Pi と通信を行って画像データを取得する API プログラムです。

camera.php
<?php
/**
 * HAL 用サンプルプログラム
 * 
 * (c) 2016 Katsuhiko Miki
 * 
 * ※ このファイルについての詳細は、http://feijoa.jp/php365/firstLogin/loginForm/ をご確認下さい。
 * ※ このプログラムは PHP に詳しくない方でも理解しやすいよう、初歩的な記述を用いています。
 */
namespace Feijoa\HAL;
require("SOCKET.php");

$socket = new SOCKET();

$ip = filter_input(INPUT_POST, "ip");
$port = (int)filter_input(INPUT_POST, "port");
if(empty($ip)){ echo ""; exit; }
if(!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ui", $ip)){ echo ""; exit; }

// HAL の IPアドレスとポート番号
$result = $socket->connect($ip, $port);

if(!$result){
    echo "";
} else {
    $result = $socket->write("capture");

    if(!$result){
        echo "";
    } else {
        $data = $socket->read(1024*1024*50);
        echo $data;
    }
    $socket->disconnect();
}

これが API プログラムの全てです。データを受け渡すだけなので、特に難しいことはしていません。

$ip = filter_input(INPUT_POST, "ip");
$port = (int)filter_input(INPUT_POST, "port");

この 2 行は、ブラウザから渡されたリクエストの値を変数に格納しています。

PHP の古い書き方ですと、

$ip = isset($_POST["ip"])? $_POST["ip"] : "";

のように、直接スーパーグローバル変数 $_POST を参照することが多くありますが、この変数は自由に書き換えが出来てしまうので直接操作するのはあまり適切ではないとされるようになりました。

filter_input(TYPE, PARAM_NAME); は、TYPE で示された情報の PARAM_NAME で得られる値を取得し、その値が設定されていない場合は null を返すメソッドです。

if(empty($ip)){ echo ""; exit; }
if(!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ui", $ip)){ echo ""; exit; }

この 2 行は、ブラウザから渡されたリクエストの整合性をチェックしているバリデーションです。IP アドレスが渡されないか、1~3桁の数値を .(ピリオド)で区切った4つの塊になっていない場合、空文字列をブラウザに返して API の実行を終了させます。(2016/07/04追記、間違えて4桁(\d{1,3})と書いていましたが修正しました。クレジットカード決済した直後でボケていました。)

なお、$port については (int) で整数型にパースしているため、例えば文字列などが渡された場合には 0 に置き換えられます。

こうして、ブラウザから渡されたリクエストの値が適切であるかを確認するのは重要な事です。

もし仮に、API に対してリクエストされた値 $val を使って

exec("sudo {$val}");

のような処理が有ったとすると、$val に "rm -rf /" のような値を埋め込むことで、サーバーの全ての情報を全て消し去ることもできてしまう危険性があります。

ライブカメラを見てみよう

さて、ではライブカメラを動作させてみましょう。ソケットサーバー「HAL」のパッケージについては、今回は音声認識は利用しないので Julius、及び voice_client.php を起動する必要はありません。

sudo php -q /var/www/HAL/system/hal.php

として、HAL を起動するだけで大丈夫です。ブラウザで、index.html にアクセスしてみた結果が以下です。

画面の再描画がかなり遅いと思われるでしょう。JavaScript では非同期で複数のリクエストを投げる事はできるのですが、同時に行える通信は1つのため、結果については両方のリクエストの処理が終わってからでないと次のリクエストを発行出来ません。ですから2つ同時にリクエストをするのはやめて、1つのリクエストを処理したら別のカメラにリクエストを投げるようなコードにしてあります。

恐らく iframe を使って別の WEB ページとして埋め込めばもっとパフォーマンスが良くなるのでしょうが、これはサンプルプログラムですので、これでよしとします。すいません。

パフォーマンス確認画面はこちら。

1% 程度しか CPU を利用していないのがお分かりいただけるかと思います。これこそが、Raspberry Pi らしい省電力設計であり、本企画の目指したところなのです。

記事リンク