カテゴリー別アーカイブ: Raspberry Pi

Raspberry PiでリモコンYoutubeプレーヤーを作る

今回は、少し趣向を変えて、手元のスマートフォンから操作できるYoutubeプレーヤーを構築する方法を紹介します。

XBMCというオープンソースのメディアセンターソフトウェア(http://sourceforge.jp/projects/xbmc/)が公開されていて、それをRaspberry Pi用にチューンしたものが公開されています。

中でも有名なのが、

  • OpenELEC
  • Raspbmc
  • Xbian

の3つです。

http://goshawknest.wordpress.com/2013/02/19/openelec-vs-raspbmc-vs-xbian/ 

に詳しい比較が出ています。

Raspbmcをインストールした例は色んな方が紹介されているので、今回は上記記事の中でオススメされていたXbianをセットアップして、さらにYoutube再生プラグインを導入することで手元のスマートフォンから自由にYoutubeを楽しむ環境の構築をしてみたいと思います。

Xbianのインストール・初期設定

まずは、XbianのイメージをSDカードにインストールする必要があります。公式ページでは、2GB以上のSDカードを用意することを推奨しています。今回は4GB、class4のものを用いました。オフィシャルページ(http://xbian.org/)へ行き、ダウンロードページを見てみると、Windows、Mac OSX、Linuxそれぞれのインストーラが配布されています。ここでは、Ubuntu12.04 64bitの環境で作業した場合を説明します。

Linuxでこのインストーラを利用するには64bit、X11、Qt5以上が利用可能な環境が必要なのですが、Ubuntu12.04では残念ながらQtのバージョンが4.xなので、このインストーラを利用することはできません。そこで、ダウンロードページの下の方にあるrawイメージをマニュアルインストールすることにします。イメージは、XBian 1.0 Alpha 5をダウンロードします。すると、7z形式で圧縮されているので、それを解凍してから、ddコマンドを使ってイメージを次のように書き込みます。

hostpc$ sudo apt-get install p7zip-full
hostpc$ 7z x XBian_1.0_Alpha_5.7z 
hostpc$ sudo dd if=XBian1.0Alpha5.img of=/dev/sdc

ここでは、SDカードリーダにささっているSDは/dev/sdcとして見えているものとしました。

これで、無事、書き込みが終わったらSDカードを外し、Raspberry Piにさして電源投入すると、Xbianが起動します。この時、本体のHDMI出力にはモニタへのHDMIケーブルを、USBにはマウス、キーボードを、そして有線LANの口にはイーサネットケーブルを接続しておきます。モニタがHDMIで音声出力ができないタイプの場合には、アナログ端子にスピーカーを接続しておきます。

起動したら、まずは、言語と時間を設定ます。
「System」ー>「Settings」->「Appearance」を選択します。画面内で、最初に「Character set」 を「japanise(Sift-jis)」にした後に「Language」を「japanese」します。先に「Language」を変更すると全体が文字化けしてしまうので、注意が必要です。更に、タイムゾーンをjapanに設定します。

次に、デフォルトの音声出力先を設定します。
「システム」→「設定」→「システム」→「オーディオハードウェア」を選択します。「オーディオ出力」の項目がデフォルトだと「HDMI」になっています。HDMIを接続しているモニタから音声も出力できる場合はそのままで良いですが、アナログ端子から音声を出力する場合は、「アナログ」に変更します。

以上で、ネットワークメディアプレーヤーとしては使えるようになりました。再生するコンテンツをお持ちの方は、NASなどネットワークでアクセスできるところに動画、音楽ファイルがあれば、それを再生して楽しむことができます。

YouTubeアドオンのインストール

今回は、楽しむコンテンツがすぐ用意できないという場合を考えて、Xbian上でYouTubeを使えるようにする方法を紹介します。

YouTubeの設定方法については、

http://xbmc.inpane.com/main/heavy_user/script.php

を参考にして、設定を行います。

まずは、ホームに戻り、「ビデオ」→「アドオン」を選択します。すると、一覧に「GetMore…」と出てくるので、それを選択します。アドオンの一覧が出てくるので「YouTube」を選択して、インストールします。

インストールが完了し、「有効」と表示されたら、「ビデオ」→「アドオン」を選択した時に「YouTube」が表示されるようになるので、そこににカーソルを合わせて右クリックし、アドオン設定を選択して、OKします。そして、「一般」タブを選択し、「最大ビデオ品質」を1080pにしてOKします。

設定が終了したら「YouTube」を選択して、アドオンの起動をします。検索を選択して、適当な名前を入力すれば、後は、結果のサムネイルが表示されるので、適当に選択して、映像、音声が、再生されることを確認します。HD画質のビデオもコマ落ちなく、再生されます。1点、日本語での検索ができないところが残念ですが、それ以外は問題なさそうです。

スマートフォンからのリモコン操作

最後に、XBianをスマートフォンをリモコンとして操作する方法を紹介します。といっても、XBMCに対応した公式のアプリがフリーで提供されていますので、それを使うだけです。”xbmc”で検索するとiOS、Androidいずれの場合も「Official XBMC Remote」というアプリが見つかるので、それをインストールします。

インストールが完了したら、スマートフォンがRaspberry Piと同じネットワークに接続していることを確認し、アプリを起動します。起動後の最初の画面の左下に「Add Host」と出てきますので、それをクリックして、次の画面で中程にある「Find XBMC」を押すと、自動的に見つけてくれますので、「Save」ボタンをおします。トップ画面に戻ってきたら、見つかったデバイスが表示されますので、それをタップすると出てくるメニューの中から「REMOTE CONTROL」を選べば、リモコンとして使うことができます。

これで、手元のスマートフォンから操作できるYouTubeプレーヤーが完成しました。

Raspberry Piで無線ビデオストリーミングを行う

今回の投稿では、Raspberry Piを無線化し、更に、USBカメラを接続して無線越しにビデオストリーミングする方法を紹介します。

USB無線アダプタを利用した無線化

最初に、無線化の方法から説明していきます。何をおいても、まずは、デバイスの選定が重要ですが、Raspberry Piで動作する
USB無線アダプタの中で安価で入手性の良いものとして、ここでは、バッファローのWLI-UC-GNM2を利用します。

WLI-UC-GNM2をUSBの口に差し込み、dmessageをすると、下記のメッセージが出てきます。

[ 3.173460] usb 1-1.3: new high-speed USB device number 4 using dwc_otg
[ 3.320171] usb 1-1.3: New USB device found, idVendor=0411, idProduct=01ee
[ 3.329689] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3.339563] usb 1-1.3: Product: 802.11 n WLAN
[ 3.350508] usb 1-1.3: Manufacturer: Ralink
[ 3.359388] usb 1-1.3: SerialNumber: 1.0
[ 3.927354] udevd[139]: starting version 175
[ 5.498365] cfg80211: Calling CRDA to update world regulatory domain
[ 6.343345] usb 1-1.3: reset high-speed USB device number 4 using dwc_otg
[ 6.572519] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[ 6.574265] Registered led device: rt2800usb-phy0::radio
[ 6.574393] Registered led device: rt2800usb-phy0::assoc
[ 6.574516] Registered led device: rt2800usb-phy0::quality
[ 6.574643] usbcore: registered new interface driver rt2800usb

これは、何もせずともドライバが既にあり、認識してくれたということを示しています。
この状態で、iwconfigしてみても、

wlan0 IEEE 802.11bgn ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:on

と出ますので、後は、無線LANに接続するための設定を行うだけです。

今回は、一般的なWPA/WPA2で接続できる無線ルータに接続する際の設定方法を書きます。
まずは、Raspberry Piのコマンドプロンプトで下記のコマンドを打ちます。

RP$ wpa_passphrase "SSID" "pass"

SSID、passは各々の環境に合わせたSSIDとパスワードを入力します。このコマンドの結果、psk=xxxxxという内容が出てきますので、それの内容を書きフォーマットに埋め込み(ssidの部分とpskの部分を埋めます)、/etc/wpa_supplicant/wpa_supplicant.confに追記します。

network={
proto=WPA WPA2
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
ssid="SSID"
#psk="pass"
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

そして、その後、/etc/network/interfacesのwlan0の部分の設定を下記のように変更します。

iface wlan0 inet dhcp
pre-up /sbin/wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
post-down killall -q wpa_supplicant

この状態で、

RP$ sudo ifdown wlan0
RP$ sudo ifup wlan0

して、ifconfigコマンドにてIPが付与されているならば、無線化は成功です。もし、使用している無線LAN環境でDHCPサーバが動作していないということでしたら、固定のIPを割り当てる設定を書くようにして下さい。

(追記)

入手が容易なUSB無線アダプタとして、PLANEX社のGW-USWEも試してみました。USBの口に差し込み、dmesgを確認すると、

[    3.702270] usb 1-1.3: Product: GW-USValue-EZ
[    3.709140] usb 1-1.3: Manufacturer: GW-USValue-EZ
[    3.726904] usb 1-1.3: SerialNumber: 00e04c000001
[    3.934619] udevd[142]: starting version 175
[    5.162370] Registered led device: led0

のように認識されますので、後は、wlan0として、同じ設定でそのまま利用できます。

 

ビデオストリーミング環境の構築

続いて、今度はビデオストリーミングの環境を構築します。ビデオストリーミングを実現するには、様々な方法がありますが、今回は、mjpg-streamerというwebブラウザにHTTPを介してM-JPEG形式で動画像をストリーミングするためのソフトウェアを用いた方法を紹介します。

まずは、必要なパッケージをapt-getで入手します。

RP$ sudo apt-get update
RP$ sudo apt-get install subversion
RP$ sudo apt-get install libjpeg-dev imagemagick

次に、mjpg-streamerのソースをsubversionで持ってきてコンパイルします。

RP$ svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
RP$ cd mjpg-streamer/mjpg-streamer
RP$ make
RP$ sudo make install

これで、無線ビデオストリーミングのための環境が全て構築されました。後は、カメラを接続して、試すだけです。カメラはUVCカメラであれば、認識してくれるので、手元にあるものでお試し下さい。今回は、Elecom UCAMDLA200を用いて実験しました。

試すには、下記のコマンドを打って下さい。

RP$ mjpg_streamer -i "/usr/local/lib/input_uvc.so -f 20 -r 320x240 -d /dev/video0 -y" -o "/usr/local/lib/output_http.so -w /usr/local/www -p 8080"

そして、この状態で、ブラウザで、http://192.168.xx.xx:8080/stream.htmlを開くと(192.168.xx.xxはRaspberry PiのIPです。ifconfig等でwlan0に割り当てられているものを確認して下さい)「MJPG-Streamer Demo Pages」というページを見ることができて、横のリンクからStreamを選択すると、ストリーミングされた画面を確認できると思います。ちなみに、

http://192.168.x.x:8080/stream_simple.htmlにアクセスすると、ストリーミング画面のみのシンプルなものも確認できます。若干カクカクしたりしますが、遅延もあまりなく、

無線で使えていることを考えると十分実用的と言えます。iPhoneのsafariからも動画を確認出来ました。

Raspberry Piでウェブサーバ+Symfony2を動かす

今回は、Raspberry Piをウェブサーバ専用機として仕立て、そこでSymfony2を動かす方法を書きます。

Webサーバ環境の整備

ウェブサーバを上げるといっても、apache2のインストールを行うだけになってしまうので、apache2+PHP+MySQLによるちょっと本格的なウェブシステムをRaspberry Piの用な小規模サーバでも比較的簡単に構築できることを示します。ここでは、前回投稿の、最初の初期設定まではできていることを想定しています。

まずは、ここでは、ウェブサーバ専用機として使い、余計なリソースを使いたくないので、Raspberry Pi起動後に設定を変更します。

RP$ sudo raspi-config

設定画面が表示されたら、boot_behaviorをNoにして、memory_split(どれだけGPUにメモリを割り当てるか)を16(16MBということ)にして、再起動します。

続いて、必要なソフトウェア(apache2、PHP5、MySQL、phpMyAdminなど)をapt-getでインストールします。

RP$ sudo apt-get update
RP$ sudo apt-get install apache2
RP$ sudo apt-get install php5
RP$ sudo apt-get install mysql-server
RP$ sudo apt-get install php5-mysql php5-curl
RP$ sudo apt-get install php5-gd
RP$ sudo apt-get install php-apc
RP$ sudo apt-get install phpmyadmin

途中、MySQLのrootユーザのパスワード設定を聞かれます。特に何でも良いのですが、ここでは、元々の初期設定パスワードと同じraspberryにしておきました。

また、phpmyadminのconfigurationを聞かれますが、apache2の方を選択(スペースキーを押して*印をつける)してOKします。更に、Configure database for phpmyadmin with dbconfig-common?、と聞かれたらYesにし、パスワードを聞かれたら、先程MySQLのrootユーザ用に設定したのと同じパスワードを設定しておきます。

ここまで来ると、apache2、MySQLは既に動作しています。Raspberry Piと同じネットワーク内にあるマシンのブラウザから、Raspberry PiのIPアドレスを指定して開く(http://192.168.xx.xx/ のように指定、xx.xxの部分は各環境に合わせて変えて下さい)と”It works!”という画面が出ればapache2が無事動いているということの証拠になります。

また、http://192.168.xx.xx/phpmyadmin (上記と同様、各環境に合わせてxx.xxの部分は変えて下さい)にアクセスするとphpMyAdminの画面が立ち上がります。phpMyAdminはMySQLをブラウザから閲覧・操作するためのインタフェースを提供してくれる大変便利なプログラムです。先に設定したroot, raspberryというユーザ、パスワードの組み合わせで、ログインすると、現在のMySQLのデータベースの中身を確認することができます。

ここまで、できたら、もうウェブサーバは動いているので、後はコンテンツを作って自由に使ってみて下さい。今回は、その一例として、、PHPを用いたウェブシステムフレームワークであるSymfony2を動かしてみることにします。

Symfony2をRaspberryPiで動かす

具体的なサンプルとして、http://docs.symfony.gr.jp/sf2-blog-tutorial/ にあるblogチュートリアルを動作させます。まずは、上記チュートリアルページに沿ってSymfony2をインストールします。

RP$ cd ~/
RP$ wget http://symfony.com/download?v=Symfony_Standard_Vendors_2.2.0.tgz
RP$ tar xvzf download?v=Symfony_Standard_Vendors_2.2.0.tgz
RP$ mv Symfony blog_tutorial

次に、このblog_tutorial/webが実際にウェブ上に公開されるディレクトリとして外部から参照できるようにapache2の設定をします。今回は/var/www/blog_tutorialが/home/pi/blog_tutorial/webを指すように設定します。尚、Debianでは、/etc/apache2/sites-available/defaultを修正します。

具体的には、<VirtualHost *:80>で設定されている中のDirectoryディレクティブとして、以下の設定を追記します。

        <Directory "/var/www/blog_tutorial">
            AllowOverride All
        </Directory>

そして、その後、/home/pi/blog_tutorial/web から /var/www/blog_tutorial へシンボリックリンクを張り、apache2を再起動します。

RP$ sudo ln -s /home/pi/blog_tutorial/web /var/www/blog_tutorial
RP$ sudo /etc/init.d/apache2 restart

次に、Symfony2が動作するかどうかを調べるために~/blog_tutorial/web/config.phpの一部を編集します。具体的には、

if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
    '127.0.0.1',*
    '::1',
))) {
    header('HTTP/1.0 403 Forbidden');
    exit('This script is only accessible from localhost.');
}

の部分を先頭行に#をつけてコメントアウトします。

その後、http://192.168.xx.xx/blog_tutorial/config.php にアクセスすると(xx.xxは変更して下さい)、Symfony2を動作させるのに
何が問題かが表示されますので、そのコメントに沿って、修正を行い、修正の度に上記アドレスにアクセスして、確認を行います。

今回は以下の作業を行いました。

RP$ cd ~/blog_tutorial/
RP$ chmod -R 777 app/cache
RP$ chmod -R 777 app/logs
RP$ sudo emacs -nw /etc/php5/apache2/php.ini
 date.timezone =	Asia/Tokyo
 ;short_open_tag = On
 short_open_tag = Off
RP$ sudo apt-get install php5-intl
RP$ sudo /etc/init.d/apache2 restart

これで、全て、問題の箇所と推奨の設定が満たされたので、config.phpの先ほどコメントアウトした部分をまた元に戻しておきます(サーバ設定が外部から確認できるのは、セキュリティ上よろしくないので)。

次は、データベースの設定です。データベースを修正するときは、先程設定したroot、raspberrypiで行います。

RP$ mysql -u root -p
   mysql> CREATE DATABASE `blogsymfony2` DEFAULT CHARACTER SET 'utf8';
   mysql> GRANT ALL ON `blogsymfony2`.* TO 'blogsymfony2'@localhost IDENTIFIED BY 'blogsymfony2';
   mysql> exit;

ここでは、例として直接データベースをいじりましたが、phpMyAdminから作業しても問題ありません。続いて、symfony側の設定を行います。

RP$ emacs -nw ~/blog_tutorial/app/config/parameters.yml
parameters:
    database_driver:   pdo_mysql
    database_host:     localhost
    database_port:     ~
    database_name:     blogsymfony2
    database_user:     blogsymfony2
    database_password: blogsymfony2

としておきます。

RP$ php app/console generate:bundle --namespace=My/BlogBundle --format=yml

このあと、app/autoload.iniを修正する必要があります。ドキュメントはバージョン2.0を対象としていますが、バージョン2.1以降では下記のように$loaderの下に1行追加するのが正しい方法のようです。

<!--?php use DoctrineCommonAnnotationsAnnotationRegistry; $loader = require __DIR__.'/../vendor/autoload.php'; $loader--->add( 'My', __DIR__.'/../src' );

引き続き、データベースにテーブルを作る作業を行います。

RP$ php app/console generate:doctrine:entity --entity=MyBlogBundle:Post --format=annotation --fields="title:string(255) body:text createdAt:datetime updatedAt:datetime"
RP$ php app/console doctrine:schema:create

ここまで、できたら、後は、チュートリアルに沿って、ページのルーティング設定、コントローラの書き換え、ビューの生成をします。blogチュートリアル(6)の下まで来たら、~/blog_tutorial/web/app_dev.phpを先にconfig.phpでやったのと同じように127.0.0.1からしかアクセスできないようにしてある部分をコメントアウトして、その後、以下のようにして、キャッシュをクリアします。

RP$ sudo rm -rf app/cache/*
RP$ sudo rm -rf app/logs/*

これで、http://192.168.xx.xx/blog_tutorial/app_dev.php/blog にアクセスすると、”Blog posts”と書かれたページが見えると思います。

あとは、チュートリアルに従って、最後までやれば大丈夫です。

最後に、このままでは動作が遅すぎて使えないので、app_dev.phpではなく、app.phpを使うようにします。この時、config.phpと同様にapp_dev.phpも先程コメントアウトした部分を戻しておきます。

http://192.168.xx.xx/blog_tutorial/app.php/blog へアクセスしてやるようにすると、キャッシュが作るられるまでは遅いですが、一度、キャッシュが作られると、それなりに使える感じにはなります。

後、おまけですが、

RP$ sudo a2enmod rewrite
RP$ sudo /etc/init.d/apache2 restart

すると、mod_rewriteが使えるようになり、http://192.168.xx.xx/blog_tutorial/blog でアクセスできるようになります。

以上で、コメント投稿、編集、削除ができるバリデーション機能付きの簡易ブログ投稿システムがRaspberry Piで利用できるようになりました。

Raspberry Pi OS(wheezy)初期設定

この投稿では、まっさらなSDカードにDebianをカスタマイズしたOSであるwheezyをインストールして、その初期設定を行う方法について書きます。

今回は、ホストマシンとしてUbuntu 12.04 64bit版での作業を行いました。以下、ホストマシンでの作業はhostpc$、Raspberry Piでの作業はRP$ と記述します。

まずは、下記公式ホームページからOSイメージをzipでダウンロードします。
http://www.raspberrypi.org/downloads

続いて、適当な大きさのSDカードを用意して、SDカードリーダなどを介してホストマシンで読み込みます。今回は4GBのSDカードを用意しました。

まずは、SDカードのパスを確認します。ここでは/dev/sdb1となっており、/media/3935-6164に自動マウントされているのでアンマウントします。

hostpc$ df -h
hostpc$ sudo umount /media/3935-6164

続いて、ダウンロードしたzipファイル(2012-12-16-wheezy-raspbian.zip)をunzipして、 SDカードにddコマンドでで直接コピーします。注意点としては、パーティションの上からコピーするため、 /dev/sdb1でなく/dev/sdbを指定します。

hostpc$ sudo dd if=2012-12-16-wheezy-raspbian.img of=/dev/sdb bs=256M

ここで、bsはブロックサイズを意味します。コピーが終わったら、SDカードを抜いて、本体にさします。 そして、HDMIケーブルを介してモニタに接続し、USBキーボード(Xを利用するならマウスも)をさしてからmicroUSB電源アダプタをコンセントにさしこみ電源をONにします。

Raspberry Piは電源ボタン等はなく、直接アダプタの抜き差しで電源ON/OFFします。ONはいいとしてもOFFもそれで良いのか、ということについては やや不安がなくもないですが、公式ページのFAQに電源OFFで大丈夫とあるので、それを信じます。

そのまま、やや待つと、起動時のコンソール画面が表示され、やがて初期設定画面が出てくるので、各種設定を行います。

  • expand_rootfs容量一杯を使うようにresizeします。
  • overscandisableにします。
  • keyboardEnglish(US)、Generic 101-key、ctrol+alt+backspace は有効にします。キーボード配列は勿論日本語で大丈夫です。ただの趣味です。
  • pass初期設定のものから変更します。
  • timezoneAsia/Tokyoに変更します。
  • overclock700MHz->1000MHzにもできるようですが、多少不安定になるという報告もあるので、今回は昇圧なしで動作する800MHzにして運用することにします。
  • sshenableにします。
  • boot_behaviorXを自動的にあげるかどうかです。お好みで。サーバとして利用する場合には、無駄にリソースを食わないように自動で起動は しないようにしておきます。勿論、自動起動しない場合でもstartxとコンソールから打ち込むことで手動でXを 立ち上げることはできます。
  • updateエンターを押すとアップデートプロセスが始まります。2013年1月末時点では、後々エラーの原因になったので、押さないように気をつけます。

これで、ひと通り設定したので、Finishして再起動します。ちなみに、ここで行った設定は、後から変更することもでき、その場合は、下記のコマンドを用います。

RP$ sudo raspi-config

再起動後、ログインして、swapの設定もします。
ログインするには、ユーザpi、パスワードはraspberry(上記で変更していれば、そちらを用いる)とします。

RP$ sudo dd if=/dev/zero of=/var/swapfile bs=1M count=256
RP$ sudo mkswap /var/swapfile
RP$ sudo swapon /var/swapfile
RP$ sudo reboot

次に、スワップファイルが起動時にマウントされるように設定します。

RP$ sudo vi /etc/fstab

以下の行を追加します。

/var/swapfile none swap sw 0 0

また、dhcpでなく、固定IPを振るなどネットワークを設定する場合には、
/etc/network/interfaces や /etc/resolve.confを修正しておきます。
これで、再起動して、設定を完了します。

起動後、Xを利用する場合には、Xの各種設定を行います。

まず、好みの問題ですが、

RP$ sudo vi /etc/default/keyboard
XKBOPTIONS="terminate:ctrl_alt_bksp, ctrl:swapcaps"

と修正することでctrlキーとcapsキーを入れ替えることができます。

次に日本語を設定します。

RP$ sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
RP$ sudo raspi-config

で設定メニューを出し、「change_locale」で

ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8

を追加し、デフォルトをUTF-8にします。
更に、anthy, emacsを入れます。

RP$ sudo apt-get install ibus-anthy
RP$ sudo apt-get install emacs

基本的にはDebianなので、必要なソフトウェアはほとんどすべてapt-getでインストールすることができます。

以上で最初の基本的な設定は全て終了しました。