2015-01-28 21:10:39
Raspberry Piでログインを自動化、ついでに現在のIP表示させてみる

しばらく愛用のVaio Proをいじる時間がとれなかったもんで、新しい記事をポストできずにおった。
実におよそ2ヶ月ぶりの新規記事。新年あけましておめでとうございます。
今年もぼちぼちでやっていきます。目指せ100記事。

Raspberry Pi起動時に、PiTFTにIPアドレスを表示させる

いま自分のとこで扱っているRaspberry Piは、基本的に画面を接続せず、操作はネットワーク越し(SSH)に行う前提にしている。
そのため、SSHによるログインにあたってはRaspberry PiのIPアドレスを知る等してネットワーク的にリーチする必要がある。

いままではarpをしてみたりpingをブロードキャストに投げてみたり、ホストネームを打ってみたり、色々やっていたのであるが、
いまひとつうまく行かないことがあって、そのたびにトラブルシューティングのために、結局画面を接続する必要が生じていた。
実に間抜け感を感じるわけである。

PiTFTをくっつけた、というのはちょっと前の記事で書いたところなのであるが、
じゃあとりあえず、Raspberry Pi起動時にこいつに現在のIPアドレスを出力してみれば便利なのでは、と思ったのである。
IPアドレスさえわかれば、だいたいにおいてSSH接続できるしね。

方法は、

  • 自動でログインさせる
  • ログイン時にifconfigし、IPアドレスの部分を抽出しつつ、コンソール(PiTFT)出力
    といった感じ。以下、詳細。

自動ログインさせる

ちなみに私が扱っているRaspberry PiにはArch Linuxが載っている。
Raspbian、Pidora等とは設定が違うと思われるので注意されたし。
Arch Linuxなので、現在のところ起動時の仕組みはSystemdが用いられている。

Systemdにおける自動ログインの設定は、例によってArch Wikiに載っていたのでそれを参照した。
ここを参照。→ Automatic login to virtual console
仮想コンソールの章を、騙されたと思ってそのまま設定し、そんで再起動してやればもう自動ログインできているはずである。

ログイン時にifconfigし、IPアドレス部分を抽出

自動ログインできたらあとは簡単で、.bashrcにでもIPアドレス出力用の何かを書いてあげればOKである。
{% codeblock .bashrc %}
ifconfig | grep inet
{% endcodeblock %}
これでいいや、という感じで書いておいた。

ただ、起動と同時に自動ログイン → IPアドレス表示、だと、IPを取れてないことがあって具合が良くない。
そのため、上記IPアドレス取得の前に、ちょっとだけsleepなんかを入れてあげるとそのへんは心配がなくなる。
{% codeblock .bashrc %}
sleep 5
ifconfig | grep inet
{% endcodeblock %}
こんな具合である。

IPアドレスがわかるようになったがPiTFTがもったいない感

PiTFTだとちょっとやりすぎなので、もっと小さい画面モジュールでやってもいいと思う。
というか早く無線化しようね。次の目標は無線化です。それでは。

2014-11-25 22:16:43
Raspberry Piにて、リモートからLチカさせてみた

Raspberry Piをリモートから制御する第一歩として、
ネットワーク越しに、AndroidアプリからLチカさせてみる、をやってみた。
いまのところ実にしょうもないレベルであるが、最初は誰もがしょうもなかったと言い聞かせつつ、
やったことを公開しつつ、どんなあんばいだったか記録しておこうと思う。
ちなみに、ここでいっているLEDとは、Raspberry Piボード上のLED “ACT” を指している。
ブレッドボードやらそういった類の何かは使っていない。

構成

  • Raspberry Pi (OSはArch Linux) 有線LAN接続
    • Railsが動いていて、REST APIを公開している。
    • REST APIを叩くことで、LEDのON/OFFを制御するスクリプトが動作し、Lチカを実現する。
  • Androidアプリ
    • ボタンが2個ついてるだけの超絶シンプルアプリ
    • ONボタンを押すとLEDを点けるほうのREST APIを叩きにいく。
    • 同様に、OFFボタンを押すとLEDを消すREST APIを叩きにいく。
    • 対向機のIPアドレスはまさかのハードコーディング。

ソースコード

  • Raspberry Pi側のソースコードはこちら。Railsアプリ。
  • Android側のアプリは後ほどアップロード(手元になかった)。

今後に向けてメモ

  • Railsアプリは、スクリプトへのパスがハードコードされていたりしてだいぶ恥ずかしいので、そのうち直す。
  • というかファイルI/OすればLチカできることがわかったので、もはやスクリプトを使う必要はなかった。そのうち直す。
  • 応用して、自動草花への水やり機の作成を目論んでおく。できたら画像と共にアップロードしよう。
  • カメラと合わせて、水やりしつつ、草の成長記録をツイッターに投稿する、というのもいいかもしれない。
  • ツイッター越しに命令(水やり、写真撮影、等)を発行できるようにしてもいいかもしれない。
2014-07-23 21:54:58
PiTFTのタッチパネルを動作させる

前回に引き続き、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-17 21:11:11
PiTFTをArch Linux on Raspberry Piで動かすのに苦戦

2014/07/23/Wed 追記

以下のポストに誤りがあることがわかったので、訂正。
誤っている部分には打ち消し線を入れておく。


PiTFTを購入。
さっそくRaspberry Piで動かそうとしてみたところ、これがなかなかうまくいかず。
3日程粘ってようやく動いた。やり方を記載しておく。

Raspberry Piには、Arch Linuxが載っている前提です。

参考になるページ

notroさんのfbtftに関するWiki。本当に感謝。Great。
ただ、ここに書いてある手順を踏んだだけではうまく動かなかった。
以下、顛末と動かすまでの手順。

rpi-updateが使える状態にする

以下、Raspberry Pi上でのコマンド入力。
以下のコマンドでrpi-updateを取得&実行可能権限付与。

$ wget https://raw.github.com/Hexxeh/rpi-update/master/rpi-update
$ chmod +x ./rpi-update

rpi-updateは適当な場所に移しておく。パスが通っているところに置いておくと便利。
以下、rpi-updateがある場所にパスが通っている前提で記載。

rpi-updateを使ってKernelをアップデート

FBTFTドライバがビルトインされているとされるバージョンにしてみる。

$ sudo -E REPO_URI=https://github.com/notro/rpi-firmware BRANCH=builtin rpi-update

なんやかや起こったあと、リブート。

$ sudo reboot

これでFBTFTドライバが準備オッケーになっているはず、なのだが…?

fbtft_deviceがない

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を用意する

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
に置かれている。これをどこか別の場所にコピーしておく。後々使う。

rpi-updateを使ってFBTFTビルトインバージョンに戻す

上で一回やってるやつをやって、FBTFTビルトインバージョンのKernelに戻す。

$ sudo -E REPO_URI=https://github.com/notro/rpi-firmware BRANCH=builtin rpi-update
$ sudo reboot

戻したのち、コピーしておいたfbtftを所定の位置に戻す

/lib/modules/$(uname -r)/kernel/video/fbtftの位置に戻す。

depmodする。

sudo depmod -a

fbtft_deviceをmodprobeする

not foundとは言われなくなり、ちゃんとロードされる。はず。

あとはnotroさんのところの手順に従う

/boot/cmdline.txtであるとか、もろもろ変更する。
PiTFTはきっと動き出す。

2014-06-10 21:49:47
RaspberryPiで動画を配信しながら写真も撮る

Raspberry Pi+カメラモジュールを使って、

  • 映像をWebページで配信しつつ。
  • いま写してる絵を保存する(写真を撮るみたいな)。写真を撮るボタンもWebページに備える。
  • 撮った写真はRaspberry Piにとりあえず保存しておいて、Webページ越しに確認できる。
    というのをやってみた。
    例によっていくつか躓いた点があるので、備忘録的に記しておく。

raspistillでの静止画撮影とmjpg-streamerでの動画配信は同時に行えない?

どうやらそのようである。最初は、
「Webページ上にボタンを用意し、押されたら raspistill コマンドを発行する。」というやり方でやろうと思ったので当てが外れた感じ。
mjpg-streamerで動画を配信する状態になっている状態でraspistillコマンドを実行すると、エラーが吐かれてしまってうまくいかない。
mjpg-streamerにカメラデバイスを専有されてしまっているとか、そういう雰囲気でうまくいかないんだろうと予想。

mjpg-streamerのsnapshot機能を使う

ではどうするかと言うと、mjpg-streamerには静止画を撮影する機能があるので、これを使ってみた。
mjpg-streamerのプロジェクトのページに少しサンプルがあって、例えば、mjpg-streamerを動作させている状態でもって、
http://[Raspberry PiのIPアドレス]:8080/?action=stream というURLにアクセスすれば動画配信になり、
http://[Raspberry PiのIPアドレス]:8080/?action=snapshot というURLにアクセスすれば、静止画の撮影になる。
これらは、同時に行うことができる。つまり、これをうまく使えば動画を配信しながら静止画の撮影ができるのでは、と。

wgetで画像を保存する

Webページ上にボタンを用意しておくところまでは同じで、ボタンが押されたら raspistill の代わりに、wget を発行する。
例) wget -O /tmp/picture.jpg http://[Raspberry PiのIPアドレス]:8080/?action=snapshot
上記の例では、/tmp/picture.jpgという名前でmjpg-streamerが出力している動画のスナップショットが保存される。
なので一応、動画配信しながら写真を撮る、という目的は達成できた。

できた、が、、、
動画配信中の画像をそのまま静止画にするだけなので、例えば静止画の画質を動画のものより良くする、とか、画像サイズを変更する、アス比を変更する、とかできない。
あくまで動画を一枚切り取っただけ、という感じ。まあ及第点か。。

撮った画像を確認するためにRailsアプリを作った

Raspberry PiでRailsなんてどうなのか。でもちょっと作ってみた。
目下作り途中だが。とりあえず動いてるのを見るのは楽しい。
https://github.com/pankona/raspi_camera_server

  • あらかじめmjpg-streamerを起動した状態で、上記Railsアプリを動かす
  • Railsアプリに何かからアクセスすると、動画が配信されている状態を確認できる
  • 動画をクリックすると、スナップショットが保存される。
  • 保存されたスナップショットは、動画下部に小さく表示される。

みたいなもの。テスト書いたりして改善していこう。。

2014-05-29 21:02:35
Raspberry PiでRailsを動かしてみたときのこと

Raspberry PiにRailsを入れたときのこと。
あまりすんなりとはいかなかったので、つまづいたところなんかをメモ。
(ちなみにRaspberry Piで動いているOSはArch Linuxです。)

第一の関門 Railsのインストール

Raspberry Piにsshで接続し、gem install rails とやるだけでRailsのインストールが始まる。
簡単、、、なのだがこれがなかなか終わらない。しかしこれはただ単純に待てばいいので難しいことは何もない。
終わるまで3時間程度。

sshで接続してる場合、ほっとくとタイムアウトしてしまうと思われる。
その場合は、screen というので対策できる。nohup というのもある。
とにかく長時間放置でタイムアウトしちゃってもいい(ログアウトしちゃってもいい)対策は必要。

第二の関門 bundle install

Railsアプリを動かす前準備で bundle install 。やると思います。
これがまた死ぬほど時間かかる上に、インストール中に、

killed

とだけ出て終了しちゃう。当然だが bundle install は終わってない。
こっちのが問題だった。

killed されちゃうのはメモリ不足のため

bundle install で Killed になっちゃうのは、メモリ不足のための模様。
これは、スワップ領域を設定してあげることで回避できた。
スワップ領域設定の方法については、例によってArch LinuxのWikiを参照した。
何でも載ってるね!ちなみ参照したページはこれ - Swap (日本語) - ArchWiki

killed されなくなったけど、、、超時間かかる

killed されなくなったのはいいけど、Railsのインストールのときと同じく、やたら時間がかかる。。。
9000秒くらいかかったので、実に3時間弱くらい。

なんで時間かかるかというと、まず、 therubyracer をインストールしようとしてるのが原因。
これ自体はいれたかったのでいいんだけど、どうやらこいつを入れるのに伴って、 libv8 というのが入る模様。
そんでこれがどうやら ソースとってきてビルドしている ようなのである。Raspberry Piになんてことさせるんや。。。
最近の割とパワーのあるPCなら10分程度で終わるらしいのだが。

まとめると

RailsをRaspberry Piにインストールするためには、

  • スワップ領域を拡大する(bundle install 中に killed されちゃうならば)
  • あとはひたすら待つ。トータルで6時間くらい待つ。

ちなみにRailsの起動がまたすっとろい。webrickじゃなくてthinにするとちょっとだけ早くなる気がする、とか。

2014-05-05 23:38:52
Raspberry Pi + カメラモジュール + Webで配信

Raspberry Piにカメラモジュールを接続し、映像をWebで配信させてみた。
いろいろ悩んだ点もあったので、やり方の結論をメモしておく。
ちなみに、Raspberry PiにはArch Linux (ARM版) を載せている。

良さそうな例

参考にしたウェブサイトは↓。結論からするとここだけでOKだった。
https://github.com/jacksonliam/mjpg-streamer

上記のリポジトリの情報を元にやったこと

mjpg-streamerのインストール。

上記のリポジトリからソースコードをもってきてビルド。ビルド方法も上記のリポジトリのREADMEに記載されている。
pacmanであったりyaourtで取得できるmjpg-streamerのパッケージは使わない。それらはinput_raspicam.soを作ってくれないため。

超簡単にhtmlを書く。

下記のような。とりあえずサンプルなので、簡単に。。
書いた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/

にアクセスしてあげると、カメラが写してる画像が配信されているのが確認できると思われる。