しばらく愛用のVaio Proをいじる時間がとれなかったもんで、新しい記事をポストできずにおった。
実におよそ2ヶ月ぶりの新規記事。新年あけましておめでとうございます。
今年もぼちぼちでやっていきます。目指せ100記事。
いま自分のとこで扱っているRaspberry Piは、基本的に画面を接続せず、操作はネットワーク越し(SSH)に行う前提にしている。
そのため、SSHによるログインにあたってはRaspberry PiのIPアドレスを知る等してネットワーク的にリーチする必要がある。
いままではarpをしてみたりpingをブロードキャストに投げてみたり、ホストネームを打ってみたり、色々やっていたのであるが、
いまひとつうまく行かないことがあって、そのたびにトラブルシューティングのために、結局画面を接続する必要が生じていた。
実に間抜け感を感じるわけである。
PiTFTをくっつけた、というのはちょっと前の記事で書いたところなのであるが、
じゃあとりあえず、Raspberry Pi起動時にこいつに現在のIPアドレスを出力してみれば便利なのでは、と思ったのである。
IPアドレスさえわかれば、だいたいにおいてSSH接続できるしね。
方法は、
ちなみに私が扱っているRaspberry PiにはArch Linuxが載っている。
Raspbian、Pidora等とは設定が違うと思われるので注意されたし。
Arch Linuxなので、現在のところ起動時の仕組みはSystemdが用いられている。
Systemdにおける自動ログインの設定は、例によってArch Wikiに載っていたのでそれを参照した。
ここを参照。→ Automatic login to virtual console
仮想コンソールの章を、騙されたと思ってそのまま設定し、そんで再起動してやればもう自動ログインできているはずである。
自動ログインできたらあとは簡単で、.bashrcにでもIPアドレス出力用の何かを書いてあげればOKである。
{% codeblock .bashrc %}
ifconfig | grep inet
{% endcodeblock %}
これでいいや、という感じで書いておいた。
ただ、起動と同時に自動ログイン → IPアドレス表示、だと、IPを取れてないことがあって具合が良くない。
そのため、上記IPアドレス取得の前に、ちょっとだけsleepなんかを入れてあげるとそのへんは心配がなくなる。
{% codeblock .bashrc %}
sleep 5
ifconfig | grep inet
{% endcodeblock %}
こんな具合である。
PiTFTだとちょっとやりすぎなので、もっと小さい画面モジュールでやってもいいと思う。
というか早く無線化しようね。次の目標は無線化です。それでは。
Raspberry Piをリモートから制御する第一歩として、
ネットワーク越しに、AndroidアプリからLチカさせてみる、をやってみた。
いまのところ実にしょうもないレベルであるが、最初は誰もがしょうもなかったと言い聞かせつつ、
やったことを公開しつつ、どんなあんばいだったか記録しておこうと思う。
ちなみに、ここでいっているLEDとは、Raspberry Piボード上のLED “ACT” を指している。
ブレッドボードやらそういった類の何かは使っていない。
前回に引き続き、PiTFTの話題。
前回でPiTFTにコンソール画面だったりXの画面だったりを出力させるところまでいった。
タッチパネルの設定がまだだったので、手順を簡単に記しておく。
例によって、Raspberry PiにはArch Linuxが載っている前提。
前回、FBTFTがビルトインされているカーネルを以下のコマンドでインストールした。
$ sudo -E REPO_URI=https://github.com/notro/rpi-firmware BRANCH=builtin rpi-update
これが正しく入っていれば、タッチパネルのドライバもカーネルに含まれているはず。
ただし、画面に何かを表示させる時と異なり、手動でドライバをロードする必要がある。
以下のコマンドで、タッチパネルのドライバをロードする。
@@@@ 忘れたのであとで追記する @@@@
基本的にはこれだけで動作すると思われる。
例によってnotroさんのところのWikiに載っている内容だが、
notroさんのところは充実しすぎて逆に迷う気がするので、備忘録的に残しておくことにする。。
evtestを用いて確かめられる。
evtestを起動したのちにタッチパネルをぐりぐり触ってみると、
タッチイベントの詳細がコンソールに出力される。
また、正常にドライバがロードされると、/dev/input/touchpanel
なるファイルが現れるはずである。
ちなみにこれはeventXへのシンボリックリンクになっている。
このファイルの有無でもドライバのロードが正しく行われたか判断できると思われる。
2014/07/23/Wed 追記
以下のポストに誤りがあることがわかったので、訂正。
誤っている部分には打ち消し線を入れておく。
PiTFTを購入。
さっそくRaspberry Piで動かそうとしてみたところ、これがなかなかうまくいかず。
3日程粘ってようやく動いた。やり方を記載しておく。
Raspberry Piには、Arch Linuxが載っている前提です。
notroさんのfbtftに関するWiki。本当に感謝。Great。
ただ、ここに書いてある手順を踏んだだけではうまく動かなかった。
以下、顛末と動かすまでの手順。
以下、Raspberry Pi上でのコマンド入力。
以下のコマンドでrpi-updateを取得&実行可能権限付与。
$ wget https://raw.github.com/Hexxeh/rpi-update/master/rpi-update
$ chmod +x ./rpi-update
rpi-updateは適当な場所に移しておく。パスが通っているところに置いておくと便利。
以下、rpi-updateがある場所にパスが通っている前提で記載。
FBTFTドライバがビルトインされているとされるバージョンにしてみる。
$ sudo -E REPO_URI=https://github.com/notro/rpi-firmware BRANCH=builtin rpi-update
なんやかや起こったあと、リブート。
$ sudo reboot
これでFBTFTドライバが準備オッケーになっているはず、なのだが…?
fbtft_deviceを有効にするために、modprobeしてみる。
$ sudo modprobe fbtft_device name=adafruit22
すると帰ってきた答えは、
FATAL: Module fbtft_device not found.
とのこと。実際に探してみたところ、fbtft_device.koというモジュールは存在していない様子。
2014/07/23/Wed 訂正
結論から言うと上記の挙動であっていた。BRANCH=builtin
を選択した場合はfbtft_deviceがloadableなモジュールとして現れない、
つまり modprobe で見つからないと言われるのは正しかった。
上記の状態で、あとは /boot/cmdline.txt に然るべき内容を追記するだけでOK。
その後PiTFTを接続し、Raspberry Piを再起動すれば画面に何か映るはず。
よって以下の手順はすべて無駄であるが、
以下の手順が誤りであることを示すために残しておく。。
以下、無駄な手順メモ。全く不要。
fbtft_deviceを求めて色々さまよったところ、上述のKernelアップデートの際に、
sudo REPO_URI=https://github.com/notro/rpi-firmware rpi-update
とビルトインではなく、loadable moduleとしてfbtft_deviceが現れるやつをチョイスしてみたところ、sudo modprobe fbtft_device name=adafruit22
がnot foundではなく、別のエラーになった。探してみたところ、実際にモジュールは存在した。ただし正常にmodprobeできていない。
FBTFTのモジュールは、/lib/modules/$(uname -r)/kernel/video/fbtft
に置かれている。これをどこか別の場所にコピーしておく。後々使う。
上で一回やってるやつをやって、FBTFTビルトインバージョンのKernelに戻す。
$ sudo -E REPO_URI=https://github.com/notro/rpi-firmware BRANCH=builtin rpi-update
$ sudo reboot
/lib/modules/$(uname -r)/kernel/video/fbtft
の位置に戻す。
sudo depmod -a
not foundとは言われなくなり、ちゃんとロードされる。はず。
/boot/cmdline.txtであるとか、もろもろ変更する。
PiTFTはきっと動き出す。
Raspberry Pi+カメラモジュールを使って、
どうやらそのようである。最初は、
「Webページ上にボタンを用意し、押されたら raspistill
コマンドを発行する。」というやり方でやろうと思ったので当てが外れた感じ。
mjpg-streamerで動画を配信する状態になっている状態でraspistillコマンドを実行すると、エラーが吐かれてしまってうまくいかない。
mjpg-streamerにカメラデバイスを専有されてしまっているとか、そういう雰囲気でうまくいかないんだろうと予想。
ではどうするかと言うと、mjpg-streamerには静止画を撮影する機能があるので、これを使ってみた。
mjpg-streamerのプロジェクトのページに少しサンプルがあって、例えば、mjpg-streamerを動作させている状態でもって、http://[Raspberry PiのIPアドレス]:8080/?action=stream
というURLにアクセスすれば動画配信になり、http://[Raspberry PiのIPアドレス]:8080/?action=snapshot
というURLにアクセスすれば、静止画の撮影になる。
これらは、同時に行うことができる。つまり、これをうまく使えば動画を配信しながら静止画の撮影ができるのでは、と。
Webページ上にボタンを用意しておくところまでは同じで、ボタンが押されたら raspistill
の代わりに、wget
を発行する。
例) wget -O /tmp/picture.jpg http://[Raspberry PiのIPアドレス]:8080/?action=snapshot
上記の例では、/tmp/picture.jpgという名前でmjpg-streamerが出力している動画のスナップショットが保存される。
なので一応、動画配信しながら写真を撮る、という目的は達成できた。
できた、が、、、
動画配信中の画像をそのまま静止画にするだけなので、例えば静止画の画質を動画のものより良くする、とか、画像サイズを変更する、アス比を変更する、とかできない。
あくまで動画を一枚切り取っただけ、という感じ。まあ及第点か。。
Raspberry PiでRailsなんてどうなのか。でもちょっと作ってみた。
目下作り途中だが。とりあえず動いてるのを見るのは楽しい。
https://github.com/pankona/raspi_camera_server
みたいなもの。テスト書いたりして改善していこう。。
Raspberry PiにRailsを入れたときのこと。
あまりすんなりとはいかなかったので、つまづいたところなんかをメモ。
(ちなみにRaspberry Piで動いているOSはArch Linuxです。)
Raspberry Piにsshで接続し、gem install rails
とやるだけでRailsのインストールが始まる。
簡単、、、なのだがこれがなかなか終わらない。しかしこれはただ単純に待てばいいので難しいことは何もない。
終わるまで3時間程度。
sshで接続してる場合、ほっとくとタイムアウトしてしまうと思われる。
その場合は、screen というので対策できる。nohup というのもある。
とにかく長時間放置でタイムアウトしちゃってもいい(ログアウトしちゃってもいい)対策は必要。
Railsアプリを動かす前準備で bundle install
。やると思います。
これがまた死ぬほど時間かかる上に、インストール中に、
killed
とだけ出て終了しちゃう。当然だが bundle install は終わってない。
こっちのが問題だった。
bundle install で Killed になっちゃうのは、メモリ不足のための模様。
これは、スワップ領域を設定してあげることで回避できた。
スワップ領域設定の方法については、例によってArch LinuxのWikiを参照した。
何でも載ってるね!ちなみ参照したページはこれ - Swap (日本語) - ArchWiki。
killed されなくなったのはいいけど、Railsのインストールのときと同じく、やたら時間がかかる。。。
9000秒くらいかかったので、実に3時間弱くらい。
なんで時間かかるかというと、まず、 therubyracer をインストールしようとしてるのが原因。
これ自体はいれたかったのでいいんだけど、どうやらこいつを入れるのに伴って、 libv8 というのが入る模様。
そんでこれがどうやら ソースとってきてビルドしている ようなのである。Raspberry Piになんてことさせるんや。。。
最近の割とパワーのあるPCなら10分程度で終わるらしいのだが。
RailsをRaspberry Piにインストールするためには、
ちなみにRailsの起動がまたすっとろい。webrickじゃなくてthinにするとちょっとだけ早くなる気がする、とか。
Raspberry Piにカメラモジュールを接続し、映像をWebで配信させてみた。
いろいろ悩んだ点もあったので、やり方の結論をメモしておく。
ちなみに、Raspberry PiにはArch Linux (ARM版) を載せている。
参考にしたウェブサイトは↓。結論からするとここだけでOKだった。
https://github.com/jacksonliam/mjpg-streamer
上記のリポジトリからソースコードをもってきてビルド。ビルド方法も上記のリポジトリのREADMEに記載されている。
pacmanであったりyaourtで取得できるmjpg-streamerのパッケージは使わない。それらはinput_raspicam.soを作ってくれないため。
下記のような。とりあえずサンプルなので、簡単に。。
書いたHTMLは、任意の場所におく。ここではひとまず、~/www/index.html
として置いたとする。
<html>
<body>
<h1>Raspberry Pi</h1>
<img src="/?action=stream">
</body>
</html>
このコマンドも件のリポジトリに記載されているが、一応。
ライブラリ(.so)へのパスが通ってなかったら、LD_LIBRARY_PATHを設定してライブラリへのパスを通すか、もしくはライブラリをフルパスで指定する。
mjpg_streamer -o "output_http.so -w ./www" -i "input_raspicam.so -x 1280 -y 720 -fps 15 -ex night"
こんな感じに入力してやると、カメラが動き出して動画配信が始まる。
別のPC等からブラウザで、
http://[Raspberry PiのIPアドレス]:8080/
にアクセスしてあげると、カメラが写してる画像が配信されているのが確認できると思われる。