2014年10月14日火曜日

SPF材(1x3)で木箱を組む

ホームセンターで買った1x3(ワンバイスリー)サイズのSPF材で木箱、木製のコンテナのようなものを作ってみました。といっても、ものを格納するというよりはインテリアとしてハーブ鉢の台にするとか、なんとなくそんな使い方を考えて。
とりあえず晒し上げ。


材料はあらかじめホームセンターのカットサービスで切ってもらっておきます。長さは4種類。上の写真の上から順に、一つ目が底板4枚、二つ目が長手の側板4枚、三つ目が短手の側板4枚、四つ目が短手の側板の連結用2枚です。



ドリルで下穴を開けた上で、コーススレッドで締結していきます。


組み上げたところ。底面側から。


上から。

ここから塗装に入っていきます。

今回使用した塗料はニッペのオイルステイン、「ウォルナット」カラーです。木目を生かしつつ使い込んだような風合いのつやと色むらを演出してくれて、渋い感じに仕上げることができます。


軽く乾かしながら捨て木を挟んで底面からも塗っていきます。


塗り残しが内容に気をつければ、多少のむらはかえっていい雰囲気になります。


完成。


横置きが似合います。いくつか作ってスタックしてもおしゃれかな、きっと。

SPF材だと規格上ごっつくアメリカンな感じになるので、もうちょい華奢な木材を選んで作ってみてもいいかも。

2014年9月25日木曜日

UbuntuのXディスプレイをSSHからパワーセーブ解除する

こんなことやりたい人がいるかわかりませんが、XディスプレイをSSHからパワーセーブしたり、パワーセーブを解除したりする方法について。

通常、Xディスプレイを操作するにはxsetを使います。SSHから操作する場合もこれは変わりませんが、そのままのコマンドでは、SSHコンソールがグラフィカルウィンドウではないため、所望のXディスプレイを特定して操作することができません。したがって、-displayウィンドウを使ってXディスプレイを指定してやる必要があります。

-displayオプションに指定すべきサーバー名をうまいこと調べる方法がぐぐってもなかなか見つからないんですが、たぶん一番簡単にできるのは、当該のディスプレイ側で仮想コンソール(Xtermなどのターミナルソフト)を開いておいて、wコマンドを打つ方法です。wはSSHからでもOKです。
ここでFROMにある:0とかがXディスプレイのサーバー名です。

あとxsetコマンドがない場合は下記でパッケージインストールします。
まずは、パワーセーブを解除して復帰させるコマンド。
次に、指定時間でパワーセーブに入らせるコマンド。
タイムアウトを秒単位で指定できます。
すぐにオフにしたい場合は、
それからデフォルトのタイムアウト時間を指定しておきたい場合は、 /etc/X11/xorg.conf.d/の下にconfファイルを作っておく。
ServerLayoutセクションのOptionエントリで、"0"を指定するとその機能が無効、それ以外の数字を指定した場合は、分単位でタイムアウト時間が設定される。
この場合、1分でディスプレイがオフになる。あとMonitorセクションのOptionでDPMSを有効にしておく必要があるようです。

Raspberry PiにつないでいるUSB接続のDisplayLinkモニタをセンサー入力でオンできないかなー、なんてのが動機ですが、そこまでやるかは気分次第。


参考

Display Power Management Signaling (日本語) - ArchWiki
A Primer on Screen Blanking Under Xorg - Shallowsky.com
list existing X display names? - Ask Ubuntu

2014年7月21日月曜日

Makers' Baseでレーザーカッターのトレーニングを受けてきた

もう一年以上前の話になりますが、 APC Paperに感化されて、シングルボードコンピュータを入れるための紙箱を作ったことがありました。2mm厚のボール紙を材料に使ったんですが、これを切り出すために、寸法を測り、目印をつけて、定規を当ててカッターで切る、という作業はすごく手間がかかるということ。垂直をとるように気をつけないといけないので、当然たくさん作るのも大変。それで当時、何とか楽にできる方法はないかと頭を悩ませ、裁断機を使うなんてことまで考えたんですが、いつしかレーザーカッターという文明の利器に頼ってはどうかと思い抱くようになりました。

暫くして、 レーザーカッターの使い方を教えてもらえるような場所を探しているうち、たどり着いたのが今回お邪魔した東京は目黒のMaker's Baseさんです。こちらでレーザーカッターのトレーニングを受講することで、それ以降施設のレーザーカッター設備を時間借りできるようになります。さらにレーザーカッターのみならず、木工や金工、陶芸、3Dプリンター、シルクスクリーンといった様々な工作、造形技術のトレーニングと設備の時間貸しを行っています。去年流行った言葉で言うところのパーソナルファブリケーションをするための施設と言えます。

さて、雨もそぼ降る初夏の候、Webからばっちり予約をしてレーザーカッターのトレーニングを実際に受講してきました。JR目黒駅を西へ出たら、タクシーがベタ踏みで登っていく大円寺横の行人坂を下り、雅叙園を横目に、春には桜が綺麗だったであろう目黒川を越えると、住宅街の一角にMaker's Baseさんがあります。


2階のレセプションでトレーニング受講に訪れた旨を伝え、簡単な質問票(アンケート?)記入の後、トレーニングへ。私のときは講師1名に受講者3名、濃厚な少人数制クラスで上達せざるを得ません。2時間枠のトレーニングで最初はテキストを使った講習、機材の使い方を覚えます。次に同施設の備品のタブレットPCを使いカットのためのベクターデータ作成。続いてタブレットからレーザーカッター本体へベクターデータ出力をし、実際にカット。最後に、自由制作です。


ところで、さっきからカット、カットと言っていますが、レーザーカッターでは素材のカットだけではなく表面への彫刻も可能です。濃淡は表現できず完全な二値画像としての出力になりますが、解像度は結構高いので、ハーフトーン等で多少の表現は可能と思われます。
実際に、アクリル板に画像ベースの彫刻を試してみました。↓の画像の手前にある方はたまたまタブレットの中に入っていた画像で、↑のレーザープリンタを撮影したものと思われます。タブレットにインストールされていたイラストエディターで(トーンマップ機能を使った突貫の)二値化をして出力させました。


最後に、せっかくなら誰もレーザーカッターで出力したことのなさそうなものを作ってレーザーカッター史に名を残そうと思い、某天才コメディアンの殿様をオマージュしてみました↓。


そんな感じでトレーニング用に支給いただいたアクリル板から3作品(?)切り出したところで時間いっぱいとなりました。今後、作業性アップのために鍛錬することが課題ですね。
切断する素材によって出力時にレーザーカッターのパワーとスピードを決めなければいけないので、厚紙カットのチャレンジはまた追い追い。


麺屋百式さんでラーメン食べて帰りました。

2014年7月13日日曜日

UDOO(i.MX6)用Ubuntu 13.10のSDカードセットアップ

UDOO公式で配布されているUbuntuのバージョンは12.04と若干古めなんですが、こちらのブログで13.04のファイルシステムが配布されているのをたまたま見つけたので、インストールしてみることに。とりあえずカーネルとU-Bootは公式のものをそのまま使い、ファイルシステムだけ13.04にしてみます。

作業はLinuxマシンで行います。

1.ルートファイルシステム、カーネル、カーネルモジュール、U-Bootのダウンロード


まずは必要なものをもろもろダウンロードしてきます。

U-Boot。i.MX6 DualモデルとQuadモデルで違うので注意。
$ wget http://udoo.org/download/files/UDOO_Unico/u-Boot_Quad/u-boot-q.imx
次にカーネルイメージ。
$ wget http://udoo.org/download/files/UDOO_Unico/Kernel/uImage
それからカーネルモジュールも。
$ wget http://udoo.org/download/files/UDOO_Unico/Kernel/modules.tar.gz
後は件のルートファイルシステム(rootfs)。
$ wget http://stende.no-ip.info/jas/xubuntu_13_04_gpu.tar.gz

2. SDカードのパーティショニング


役者がそろったら、彼らに最高のステージを。SDカード。UDOOの場合はマイクロSDですな。たぶん2GBとかでもいけますけど、今日日Class10の16GBくらいじゃないと使う気になれませんね。笑
SDカードをカードリーダとかに挿してホストマシンに接続したら、dmesgとかでデバイス名を確認しておきます。パーティショニングはこの後すぐ!ホストマシンのHDDと間違えるなよ!絶対にだぞ!
 sdf: sdf1 
既存パーティションがある場合には上記のようにsdXのあとに数字のついたデバイスが見えるはず。いずれにせよ消しちゃうのであってもなくてもOK。

パーティショニングの作業はお好きなツールで。GUIならGpartedが便利ですよね。その昔、BeagleboardなんかいじってたころはfdiskでSDカードをフォーマットしたものです。最近はでっかいHDDをいじるときにfdiskがGPTに対応してなかったりするんで、私はpartedに移りつつあります。そんなわけでpartedを使ってやっていきましょう。
$ sudo parted /dev/sdf
まずはprintで中身を見てみる。
(parted) print                                                            
モデル: I-O DATA micro SD Reader (scsi)
ディスク /dev/sdf: 15.9GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    4194kB  15.9GB  15.9GB  primary  fat32             lba

既存のパーティション1をrmで削除。
(parted) rm 1
(parted) print                                                            
モデル: I-O DATA micro SD Reader (scsi)
ディスク /dev/sdf: 15.9GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始  終了  サイズ  タイプ  ファイルシステム  フラグ

次にmkpartでパーティションの作成。ファイルシステムはEXT3、サイズは先頭を10MiBほど空けて、後ろはSDカードサイズいっぱいにとってあげましょう。(パーティションテーブルをmsdosに直す場合はmklabelでできます。)
(parted) mkpart primary ext3 10MiB 15.9GB
(parted) print                                                            
モデル: I-O DATA micro SD Reader (scsi)
ディスク /dev/sdf: 15.9GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    10.5MB  15.9GB  15.9GB  primary

quitで終了。
(parted) quit
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。  

パーティショニングでEXT3指定をしましたが、mkfsもしたほうがいいっぽいので、
$ sudo mkfs.ext3 /dev/sdf1
はい。これで完了です。

3. SDカードへの書き込み


できたパーティションに先ほどダウンロードしたルートファイルシステムを書き込んでいきます。
まずはローカルにマウントポイントのディレクトリを作成し、マウント。
$ mkdir sdcard
$ sudo mount /dev/sdf1 sdcard
ルートファイルシステムをマウントしたSDカードのパーティションへ展開。sudoを忘れずに。
$ sudo tar -xzpf xubuntu_13_04_gpu.tar.gz -C sdcard/
続いてカーネルのコピー。
$ sudo cp uImage sdcard/boot
それからカーネルモジュール。既存のものを消してから。
$ sudo rm -rv sdcard/lib/modules/*
$ sudo cp -av lib sdcard/
ここまでできたら、アンマウントします。
$ sudo umount sdcard
最後に、SDカードにU-bootを書き込みます。
$ sudo dd if=u-boot-q.imx of=/dev/sdf bs=512 seek=2
これでSDカードの準備は完了。syncしてからSDカードを取り外し。
$ sync
ボードに挿して起動します。

(おまけ) Ethernetインタフェースのセットアップ


そのままだとEthernetに接続できませんが、/etc/network/interfacesに下記を追加し、
auto eth1
iface eth1 inet dhcp
下記でEthernetのインタフェースを起動すればOKです。
$ sudo ifup eth1

参考
I.MX6 - Ubuntu 13.04 with GPU acceleration - Tiny Devices
UDOO creating a bootable Micro SD card from precompiled binaries - eLinux.org
UDOOのUbuntuでネットワークに接続できない - Atelier Orchard

2014年5月20日火曜日

ウェブカメラのフォーカス

新しいウェブカメラを買いました。LogicoolのC920t。実勢で一万円ほどする高級ウェブカムですよ。Raspberry PiとかUDOOとかのARMシングルボードコンピュータとつなげて遊ぶウェブカムとしては、もともと持っていたバッファローのBSW32KM01Hを使っていたんですが、最近マクロ寄りの距離でタイムラプスを撮りたいとこっそり妄想していて、それができそうなウェブカムを探していたのです。
C920tは価格.comのWebカメラランキングでも上位にあるのですぐにアンテナにかかりましたが、決め手は
  • 最短7cmのとってもマクロな焦点距離
の他にも、
  • UVC対応
  • ハードウェアH.264エンコード
  • 海外のウェブカムハックでよく話に挙がっている
  • 三脚雲台ネジ穴
といったところがあります。ついでに言うと、「カールツァイスレンズ搭載」というのもこの製品の売りだそう。

さっそくボードにつないで実験してみるわけですが、ARMボードでの使用となれば、早々簡単にはいかない。uvccaptureで静止画撮影してみたんですが、Raspberry Piで撮るとやけに暗いし色もおかしい。UDOOだとそれなりにきれいに撮れるのに。uvccapture -vで調べてみた結果、BrightnessContrastSaturationGainの設定がおかしくなっていた。uvccaptureのソースを読んでみると、コマンドラインから前記のパラメータが指定されていない場合、v4l2ドライバへのioctlコールでパラメータリセットがかかる。そうなると、これがRPi固有の問題か、他のカーネルでも同じかわかんないけど、おかしな設定になってしまう。あとuvccaptureのソースを読んだついでに書いておくと、前記パラメータに0を指定すると無視されてリセットがかかり、やはりおかしな初期値が使われる。これはさすがにバグだと思う。

さて、UDOOを参考に
  • Brightness: 128
  • Contrast: 128
  • Saturation: 128
  • Gain: 1
で、RPiでもそれなりに素敵に撮れるようにできた。

でもまだ問題が残る。フォーカスである。

カメラの前に被写体として瓶を置いて撮ってみるものの、ピントが合ってない。さてどうしたものかと思っていろいろいじっていると、v4l2-ctlでフォーカスの設定ができそうなことに気づく。
$ v4l2-ctl --list-ctrls
...
                 focus_absolute (int)    : min=0 max=250 step=5 default=8189 value=0 flags=inactive
                     focus_auto (bool)   : default=1 value=1
...
これが使えるとしたら、UVCもなかなか気が利く。

まずはオートフォーカスをオフに。
$ v4l2-ctl --set-ctrl focus_auto=0
次にfocus_absoluteという値をいじってみる。今の設定値は
$ v4l2-ctl --get-ctrl focus_absolute
focus_absolute: 0
なので、ここから少しずつ刻みながら画像を確認してみる。
$ v4l2-ctl --set-ctrl focus_absolute=0
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus00.jpg
$ v4l2-ctl --set-ctrl focus_absolute=10
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus10.jpg
$ v4l2-ctl --set-ctrl focus_absolute=20
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus20.jpg
$ v4l2-ctl --set-ctrl focus_absolute=30
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus30.jpg
$ v4l2-ctl --set-ctrl focus_absolute=40
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus40.jpg
$ v4l2-ctl --set-ctrl focus_absolute=50
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus50.jpg
$ v4l2-ctl --set-ctrl focus_absolute=60
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus60.jpg
で、結果が下の画像。なおカメラから被写体までの距離は、チポトレソースが約10cm、シナモンシュガーが約20cm、ボトルのビールが約30cmです。(ちなみにこれらはアメリカのトレーダージョーで買い漁ってきた物。)

focus_absolute=0
focus_absolute=10
focus_absolute=20
focus_absolute=30
focus_absolute=40
focus_absolute=50
focus_absolute=60
撮影風景↓

まずfocus_absoluteに関してわかるのは、値が小さいほど無限遠側、大きいほどマクロ側のフォーカスとなること。それから10~30cm程度の近距離の被写体をうまく収める設定値はなさそう。10~40あたりの範囲で好みを調整するといいかもしれない。

オートフォーカスのときにどういう測距点を使っているのかわかりませんが、ちゃんと撮りたければマニュアルで設定してあげるほうがよさそうです。

2014年5月13日火曜日

MEncoderで動画変換

streamerコマンドを使って、Linuxコマンドラインでウェブカメラ録画をしてみた(関連記事)けど、うまいことエンコードできず無圧縮AVIのまま保存していたので、ファイルサイズがすごく大きい。

そこで、あとからでも圧縮できないかと思ってちょっと調べてみたところ、とりあえずMEncoderを使ってMPEG2にできた。

mencoderがインストールされていなければ、まずはインストール。
$ sudo apt-get install -y mencoder

で、AVI→MPEG2の圧縮が
$ mencoder input.avi -of mpeg -ovc lavc -lavcopts vcodec=mpeg1video  -oac copy -o output.mpg
でできた。元ファイルが320x240/10fpsの10秒のRGB24で約24MB、圧縮後が約820kBなので、だいたい1/30になった。

H.264とかもできたらいいなー。オプションとかいろいろ調べてみよう。

参考

Chapter 6. Basic usage of MEncoder - MPlayer - The Movie Player

ホワイトバランス設定してウェブカメラ録画

Linuxのコマンドラインでウェブカメラを使った動画撮影をする方法を昨日書いたんですが、若干ホワイトバランスが要調整という感じだった。ので、ホワイトバランス設定してから撮影する方法。

v4l2-ctlというツールを使います。インストールされていなければ
$ sudo apt-get install v4l-utils
でパッケージをインストール。

で、まずホワイトバランスを含め設定可能なパラメータの一覧を表示。
$ v4l2-ctl --list-ctrls
                     brightness (int)    : min=-64 max=64 step=1 default=0 value=0
                       contrast (int)    : min=0 max=64 step=1 default=32 value=32
                     saturation (int)    : min=0 max=128 step=1 default=67 value=67
                            hue (int)    : min=-40 max=40 step=1 default=0 value=0
 white_balance_temperature_auto (bool)   : default=1 value=1
                          gamma (int)    : min=72 max=150 step=1 default=110 value=110
                           gain (int)    : min=0 max=80 step=1 default=0 value=0
           power_line_frequency (menu)   : min=0 max=2 default=2 value=2
      white_balance_temperature (int)    : min=2800 max=6500 step=1 default=4600 value=4600 flags=inactive
                      sharpness (int)    : min=0 max=6 step=1 default=3 value=3
         backlight_compensation (int)    : min=0 max=2 step=1 default=1 value=1

現在の設定値の取得は
$ v4l2-ctl --get-ctrl white_balance_temperature
white_balance_temperature: 4600
オートホワイトバランスのON/OFF確認なら
$ v4l2-ctl --get-ctrl white_balance_temperature_auto
white_balance_temperature_auto: 1
でできる。

実際にホワイトバランスを設定してみる。オートホワイトバランスを切る必要があるので、white_balance_temperature_auto=0を入れる。で、色温度最低は
$ v4l2-ctl --set-ctrl=white_balance_temperature_auto=0,white_balance_temperature=2800
色温度最高なら
$ v4l2-ctl --set-ctrl=white_balance_temperature_auto=0,white_balance_temperature=6500
で設定できる。

あとは昨日書いた下記のコマンドで撮影してみると、違いがわかります。
$ streamer -c /dev/video0 -o test.avi -t 0:10 -s 320x240 -f rgb24

参考

Webcam settings on Ubuntu and Fedora Linux CLI from terminal - TechyTalk.info

2014年5月12日月曜日

Linuxコマンドラインでウェブカメラ動画撮影の実験

Raspberry PiのようなARMボードでも、x86マシンでも何でもいいんですが、ウェブカメラで動画撮影しようとして調べると、streamer、mencoder、gstreamer、v4l2-ctl、ffmpeg(avconv)などなど、いろんなツールがあるっぽい。ちょろっと試してみた結果、streamerでとりあえず録画できるやり方があったので、とりあえずメモ。
$ streamer -c /dev/video0 -o test.avi -t 0:10 -s 320x240 -f rgb24
avi / video: 24 bit TrueColor (LE: bgr) / audio: none
rate: queueing frame twice (18446511) -0.00s [0]
...
ただし、このコマンドだと無圧縮AVIになるので、すごくストレージ容量を食う。320x240サイズの10fpsが10秒で25MBくらい。より大きな解像度、高いフレームレート、長い時間で、と考えたら、おそろしいことに。
そこでstreamerのヘルプを見ると
$ streamer -h
...
movie writers:
...
  avi - Microsoft AVI (RIFF) format
    video formats:
      rgb15   15 bit TrueColor (LE)        [avi]
      rgb24   24 bit TrueColor (LE: bgr)   [avi]
      mjpeg   MJPEG (AVI)                  [avi]
      jpeg    JPEG (JFIF)                  [avi]
...
ということなのでMJPEGを試してみるんですが、
$ streamer -c /dev/video0 -o test.avi -t 0:10 -s 320x240 -f mjpeg
avi / video: MJPEG (AVI) / audio: none
no way to get: 320x240 MJPEG (AVI)
movie writer initialisation failed
となってしまう。何が足りないのかな。。
あとホワイトバランスも直さないとな。

なおウェブカメラの設定可能な解像度は下記コマンドで確認可能。
$ uvcdynctrl -d video0 -f

2014年5月7日水曜日

APTパッケージのソースを取得する。Raspberry Piで。

Raspberry PiのOS「Raspbian」で、apt-getでインストールするパッケージのソースを取得する方法。

いま手元で使っているバージョン(2014年1月版のイメージ、カーネル3.10.25+)だと、/etc/apt/sources.listに一行追加してやる必要がありました。
$ sudo vim /etc/apt/sources.list
deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
deb-src http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi #この行を追加
これをしないと、「E: sources.list に 'ソース' URI を指定する必要があります」と言われます。

追加できたら、アップデート。
$ sudo apt-get update
あとはお好きなパッケージのソースをお落とし下さいませ、と。
$ apt-get source uvccapture streamer v4l-utils

参考

Raspbian Repository

2014年5月4日日曜日

crontab -eのエディターをVimに変更する

Raspberry Piでcorntab -eしたら、使い慣れないnanoが起動した。なので、vimに変えたい。

Ubuntuとかだと、select-editorコマンドで対話型のメニューから変更できるみたいですね。はじめてcrontab -eを使おうとしたときにも同様に選べます。

調べてみると、crontab -eのエディター起動はeditorコマンドが呼ばれてるっぽい。whereすると/usr/bin/editorにあるんですけど、これは/etc/alternatives/editorへのシンボリックリンク。さらにそれがエディタープログラム本体(/bin/nano)へのシンボリックリンクになっている。

Raspbianではselect-editorコマンドがないっぽいので、このシンボリックリンクを手動で変更してやります。
$ sudo ln -sf /usr/bin/vim /etc/alternatives/editor
既存のシンボリックリンクを強制上書きするため、lnコマンドに-fオプションをつけます。これでcrontab -eのエディタをVimに変更できました。

参考
How to change the default crontab editor - LinuxQuestions.org
シンボリックリンクの張替え - ブログ名は後で考える

2014年4月24日木曜日

Raspberry Piのケースを加工する

最近Raspberry Pi Model Aを注文したら静電シールド袋に紙箱という質素な梱包で届いたんですが、以前Model Bを注文したときはピンク色のプラスチック製の個性的なケースに入っていました。今もあるんですかね。よくわかりませんが。

このケースを加工してワイヤレス接続のカメラサーバとして設置できるようにしてみました。フレキ接続のカメラモジュールを外に引き出し、USBのWi-Fiアダプタがぶつからないよう側面に穴を開けています。ふたを閉めても電源を供給できるよう、マイクロUSBコネクタの側も開口してあります。

↓こんな感じのケースを加工します。
カメラモジュールとWi-Fiアダプタの位置を大まかに見極めて、
開口部分に油性マーカーでしるしをつけます。
ピンバイスで輪郭沿って穴を開けていき、
ニッパやカッターで穴を繋げ、切り落とします。
バリはカッターと金ヤスリでフラットに整えます。
フレキの方も同様に。
反対側には電源用のUSBケーブルが通る穴を。
ボードを合わせるとこんな感じ。ずれていたらカッターで修正します。
カメラモジュールは裏面に両面テープをつけてケースに固定。
コンパクトにまとまりました。
中身のボードも裏面に厚手の両面テープを三枚重ねにして底に軽く固定してあります。






SDカードのUbuntuルートファイルシステムパーティションを拡張

Linuxは比較的非力な環境に入れることが多いためか、Ubuntuをしばらく使っているとパッケージのインストールやカーネル、ソースコードのダウンロードが積もり積もってディスク容量が手狭になってしまうことがよくあります。PCではWindowsと別パーティションのデュアルブートで使うこともあると思いますが、一応はHDDの増設で対応できます。VM環境でもHDD上のイメージサイズを拡張してGparted等でパーティションを動かせば割りと楽に容量確保できたりします。

これがSDカードブートのARMシングルボードコンピュータなんかだと、ちょっと厄介かも知れません。昔のBeagleBoardだと、よくfdiskを使って手作業でSDカードのパーティションを切り、ブートローダとルートファイルシステムを入れるなんてことをしました。面倒ですがパーティションサイズを任意に設定できるので、大きいSDカードを使えばそれに合わせて広いルートファイルシステムのパーティションを確保できます。これが最近のRaspberry Piになると、SDカードイメージが丸ごと配布されているので、いちいちfdiskをする必要がなくてかなり楽なんですが、SDカードサイズにかかわらずイメージとして決め打ちされたパーティションサイズになってしまいます。Raspbianはインストール時のコンフィギュレーションでパーティション拡張ができますが、他のOSやボード向けのイメージで同様の機能がサポートされることはほとんどないと思います。

そこで、既にSDカードに書き込まれたパーティションを手作業で拡張することになるわけです。今回、UDOO向けUbuntuのルートファイルシステムパーティションを拡張したので、作業手順をメモっておきます。

SDカードは16GB、UDOO公式で配布のQuad向けUbuntu 12.04 LTSを焼いてあります。最初にdfしてみると、ルートファイルシステムは6GB程度のパーティションになっていました。
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       6.4G  2.4G  3.7G  40% /
devtmpfs        438M  4.0K  438M   1% /dev
none             88M  2.6M   85M   3% /run
none            5.0M     0  5.0M   0% /run/lock
none            438M  100K  438M   1% /run/shm
では、fdiskで作業開始。
$ sudo fdisk /dev/mmcblk0
まずpで現在の構成を確認。Startセクタはあとで入力しなおす必要があるので、 飛ばさないように。
Command (m for help): p

Disk /dev/mmcblk0: 15.7 GB, 15720251392 bytes
255 heads, 63 sectors/track, 1911 cylinders, total 30703616 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
Disk identifier: 0x000c356e

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1           16065    13623119     6803527+  83  Linux
つぎに現在のd1と入力して現在のパーティションを削除。
Command (m for help): d
Selected partition 1
続いてnで新たにパーティションを作成。パーティションタイプはpでプライマリを選択します。パーティションナンバーはデフォルトのまま。ファーストセクタで先ほど表示させたStartの数字を入力します。ラストセクタは最大まで確保します。
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-30703615, default 2048): 16065
Last sector, +sectors or +size{K,M,G} (16065-30703615, default 30703615):
Using default value 30703615
新たなパーティションはこんな感じ。
Command (m for help): p

Disk /dev/mmcblk0: 15.7 GB, 15720251392 bytes
255 heads, 63 sectors/track, 1911 cylinders, total 30703616 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
Disk identifier: 0x000c356e

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1           16065    30703615    15343775+  83  Linux
では、wで書き込みます。
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
ここで再起動。
$ sudo reboot
最後に、既存のファイルシステムを拡張されたパーティションいっぱいまで広げるため、resize2fsコマンドを実行します。
$ sudo resize2fs /dev/mmcblk0p1
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/mmcblk0p1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mmcblk0p1 to 3835943 (4k) blocks.
The filesystem on /dev/mmcblk0p1 is now 3835943 blocks long.
dfで確認してみます。15GBまで拡大されました。
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  2.4G   12G  18% /
devtmpfs        438M  4.0K  438M   1% /dev
none             88M  2.6M   85M   3% /run
none            5.0M     0  5.0M   0% /run/lock
none            438M  100K  438M   1% /run/shm
まぁ手順としちゃHDDの場合と変わりませんやね。

参考
How can I resize my / (root) partition? - Stack Exchange

2014年4月20日日曜日

Raspberry Piのカメラモジュールを使ってみた


前にRaspberry Piにウェブカメラを繋いでFFmpegで動画撮影やuvccaptureで静止画撮影を試してみたことがありました(記事)。最近、Raspberry Pi Model Aを買い足したときに、カメラモジュールをセットに含めて発注しておいたので、今回ちょっと試してみようと思います。
 

箱から取り出したカメラモジュールには最初からフレキが接続されているので、反対側をボード上のコネクタS5に挿し込みます。固定具を一度緩めてフレキを挿してから固定しなおします。電極面の向きに注意が必要です。



カメラモジュールを使用するためにはOSのコンフィギュレーションが必要です。公式のRaspbianイメージをSDカードに焼いた場合は、初回の起動時にカメラを使う設定ができます。OSの使用開始後でもraspi-configコマンドでカメラ使用の設定ができました。

静止画

raspistillコマンドで撮影可能。ウェブカムでuvccaptureを使ったときよりもホワイトバランスとかが調整されてる印象。

$ raspistill -o test.jpg

動画

raspividコマンドを使用。ちゃんとそこそこのFPSで撮影できてるっぽいです。 撮影時にはSSHからコマンドしてもディスプレイを繋いでいればフレームバッファにプレビューが描画され画面表示されます。

$ raspivid -o test.mp4

撮影した動画はomxlayerで再生可能。こちらもデスクトップでなくても画面表示してくれます。

$ omxplayer test.mp4
Video codec omx-h264 width 1920 height 1080 profile 100 fps 25.000000
Subtitle count: 0, state: off, index: 1, delay: 0
V:PortSettingsChanged: 1920x1080@25.00 interlace:0 deinterlace:0

WinSCPでWindowsに持ってきて再生しようとしたんですが、WMPでもaviutlでも最初の1フレームくらいしか表示されませんでした。omx-h264というコーデックがまずいのかな?もしかしたらコーデック変換とかしたらいいのかも。


参考
Camera Module - Raspberry Pi Foundation

2014年4月18日金曜日

はじめてKickstarterで出資してみた

最近、クラウドソーシング発の製品やプロジェクトをたくさん見かけるようになりました。このブログでも以前買ってからよく遊んでいるUDOOボードなんかも、Kickstarterから飛び出したプロダクトの一つです。

映像、音楽、ゲーム、ファッションなど多様なジャンルのプロジェクトが公開されている中、テクノロジー製品だけでも個性的なアイディアを見つけることができ、眺めているだけでも楽しめます。そんなKickstarterで、今更ながら、初めてのBack=支援、出資をしてみました。

ターゲットは、先日このブログでも書いた、ウェアラブル開発ボードの「MetaWare」 です。

まずはプロジェクトのページへ。英語ですが、気合を入れてプロジェクト内容を読んだり、動画を見たりしてテンションあげていきます。


お気に入りゲージがいい感じに高まってきたところで、ページ右側に並んでいる出資オプションから、一つを選びます。金額に応じて得られる特典が変わるので、財布と相談しながら気に入った出資額を選びます。今回はボード本体と基本アクセサリがもらえる$30のコースにしてみました。なお緑色の「Back This Project」ボタンを押しても、出資オプションを選ぶページに進んで同様に選択ができます。


選択するとポップアップが開き、Pledge amount(出資確約額)が確認されます。このプロジェクトではUS国外への発送は+$10で対応されるため、合計金額$40が自動的に入力された状態で表示されます。OKなら「Continue to next step」ボタンを押します。


続いてログイン画面になります。既にログインしてる場合はスキップされると思います。今回はKickstarterを始めて利用するので、Log inではなく中央のNew to Kickstarter?のフォームで各欄を入力しサインアップします。また、Facebookアカウントを使った認証にも対応しているようです。


サインアップできたら、Amazonでの決済へ進むための確認画面が出るので、「Continue to Amazon」 を押します。


Amazonのログインページへ移ります。アメリカのAmazon.comなので、日本のAmazon.co.jpとは別にアカウントが必要のようです。持っていないので新たに作成しました。


アカウント登録してAmazon.comにログインしたら、クレジットカード情報を入力してContinueを押します。


次に請求先住所の入力です。Amazon.comですが日本の住所で大丈夫そうです。


Kickstarterによる決済を承認します。Continueで。


以上で決済手続きは完了です!これで出資額が確約されました。後は座してプロジェクトの進捗を待つばかりです。


2014年4月16日水曜日

DirectFBのサンプルをgprofでプロファイリングしてみる

i.MX6搭載のUDOOにDirectFBとExamplesをインストールしてみたんですが、df_andi(ペンギンいっぱい出るサンプル)を動かしてみると、標準のペンギン200体で20fpsしか出てない。RPiでやったときももうちょっと出てたと思うのに、上位CPUを搭載したUDOOがこんなに遅いわけがない!

ということで、GNU gprof使ってちょいとプロファイルしてみる。

df_andiのソースだけ取り出してgprof向けコンパイルできればいいんですが、依存関係とかややこしいので、CFLAGSだけいじってautotoolsで全部ビルドしちゃう。

$ cd build_dfbexamples
$ make clean
$ CFLAGS=-pg ../DirectFB-examples-1.7.0/configure
$ make

で、実行してみる。

$ sudo src/df_andi &

強制終了するとgprofの結果ファイルgmon.outが生成されないので、pkillは使わない。面倒ですが、USBキーボードを繋いでESCを押します。
gmon.outが生成されたら、gprofでプロファイル結果を表示してみる。

$ gprof src/df_andi gmon.out
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  Ts/call  Ts/call  name
100.12      0.01     0.01                             draw_penguins

draw_penguinsが100%超えてますやん笑

df_andi.cの中のこの関数の実装を見てみると、確かに二重ループになってたり、DirectFBのライブラリ関数をコールしてたり、確かに重そうではある。もうちょっと詳しく見てみる必要がありそう。。


参考
Re: using gprof with autotools - Ubuntu Forums

2014年4月15日火曜日

UDOOのUbuntuにDirectFBをインストール

以前、Raspberry PiにDirectFBをインストールして動かしてみたんですが、わけあってi.MX6でやってみたくなったのでUDOOにもインストールしてみた。

まずは公式のダウンロードページから本体とExtrasのexamplesをダウンロード。

$ wget http://directfb.org/downloads/Core/DirectFB-1.7/DirectFB-1.7.3.tar.xz
$ wget http://directfb.org/downloads/Extras/DirectFB-examples-1.7.0.tar.gz

んで本体ビルドしてみる。

$ tar xf DirectFB-1.7.3.tar.xz
$ mkdir build_directfb
$ cd build_directfb/
$ ../DirectFB-1.7.3/configure --with-gfxdrivers=gles2
...
checking for fluxcomp... no
configure: error:
*** DirectFB compilation requires fluxcomp ***

が、fluxcompがない、というエラー。調べてみたら、これもDirectFBのページでソース配布してるツールだった。ダウンロードしてインストールする。

$ cd ../
$ wget http://directfb.org/downloads/Core/flux/flux-1.4.4.tar.gz
$ tar xf flux-1.4.4.tar.gz
$ mkdir build_flux
$ cd build_flux/
$ ../flux-1.4.4/configure
$ make
$ sudo make instlal

では本体のビルドに戻る。

$ cd ../build_directfb/
$ ../DirectFB-1.7.3/configure --with-gfxdrivers=gles2
...
PNG support is missing - many applications won't work correctly!
JPEG support is missing - many applications won't work correctly!

とりあえずコンフィギュできたけど、RPiのときも出たPNGとJPEGサポートの警告。なので、

$ sudo apt-get install libpng12-dev libjpeg62-dev libfreetype6-dev

でインストールしてから、もう一度。

$ ../DirectFB-1.7.3/configure --with-gfxdrivers=gles2
$ make
make[3]: Entering directory `/home/ubuntu/work/directfb/build_directfb/systems/drmkms'
  CC       drmkms_layer.lo
In file included from ../../../DirectFB-1.7.3/systems/drmkms/drmkms_layer.c:45:0:
../../../DirectFB-1.7.3/systems/drmkms/drmkms_system.h:69:6: error: unknown type name 'drmModePlane'
...
cc1: some warnings being treated as errors

make[3]: *** [drmkms_layer.lo] Error 1
make[3]: Leaving directory `/home/ubuntu/work/directfb/build_directfb/systems/drmkms'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/ubuntu/work/directfb/build_directfb/systems'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/ubuntu/work/directfb/build_directfb'
make: *** [all] Error 2

おや、今度はdrmkmsとやらで引っかかってる?コンフィギュで回避してみる。

$ ../DirectFB-1.7.3/configure --with-gfxdrivers=gles2 --enable-drmkms=no
$ make clean
$ make
$ sudo make install

これで本体のビルドとインストールはOK。あ、忘れずにldconfigしないとね。

$ sudo ldconfig

Examplesの方も同様にビルド&インストール。

$ cd ../
$ tar xf DirectFB-examples-1.7.0.tar.gz
$ mkdir build_dfbexamples
$ cd build_dfbexamples/
$ ../DirectFB-examples-1.7.0/configure
$ make
$ sudo make install

できたら、df_andiあたりを動かしてみる。

$ sudo df_andi &

画面にペンギンがもしゃもしゃ出ればOK。HDMI接続はしつつ、コマンドはSSHから&付きで実行することで、一応コマンドラインから強制終了もできる。
$ sudo pkill df_andi

以上です。

Ubuntuの時刻を合わせる

久しぶりにUDOOを起動したら、時刻がUNIXエポックにタイムスリップしてた。

$ sudo ntpdate ntp.ubuntu.com

で、自動的にローカルタイムに合わせてくれた。


参考
Time Synchronisation with NTP - Ubuntu Documentation

2014年4月14日月曜日

Raspberry PiのArch LinuxでLXDEを使う

Raspberry Piの公式で配布してるArch Linuxには標準でデスクトップ環境がインストールされていないので、pacmanで後からLXDEをインストールします。

[1] レポジトリのアップデートとローカルパッケージ更新
pacman -Syu
pacman -Syy

[2] 各種パッケージのインストール
pacman -S openbox lxde gamin dbus
pacman -S xorg-server xorg-xinit xorg-server-utils
pacman -S mesa xf86-video-fbdev xf86-video-vesa

[3] 起動
xinit /usr/bin/lxsession


参考

Re: Can't login to GUI following updates - manjoro
Does Arch come with a GUI preinstalled? - StackExchenge
Re: x at raspberry pi - Arch Linux ARM
 

2014年4月13日日曜日

Raspberry Pi Model Aをネットワークに接続する

EthernetコネクタのないRPiのModel Aでネットワークに接続する方法。OSはArch Linuxです。

初代BeagleBoard(赤いやつ)がそうだったんですけど、USB接続のEthernetアダプタを使います。今回はウチにストックしてあったPLANEXのUE-200TX-G2を使いました。残念ながら同製品は生産終了してますが、後継機とか似たようなものがAmazonとかでもいろいろ見つかります。

では手順。

[1] まずArch Linuxの初期アカウント(Raspberry Pi公式のイメージならroot/root)でログイン。

[2] USB EthernetアダプタをUSBコネクタに接続します。Model Aには1ポートしかないので、キーボードと両立のためにUSBハブが必要です。接続すると新しいネットワークインタフェースとしてeth0という名称で登録されます。UE-200TX-G2はドライバがサポートされてます。

[3] 続いてインタフェースを有効化します。 コマンドは下記。
ip link set eth0 up

[4] 最後にDHCPでIPアドレスをもらってきます。あ、言わずもがなですが、LANケーブルでルータに接続されている必要があります。
dhcpcd eth0

これでOK。ifconfigでeth0に有効なIPアドレスが割り当てられていることを確認できると思います。これでネットワークが利用可能になります。


参考

Network Configuration (日本語) - ArchWiki

2014年4月12日土曜日

はじめてのwxWidgets

私はPCのウィンドウプログラムを作ることがほとんどないんですが、たまーに思い立って何か作りたくなることもあるんですよね。そういうときのために何かGUIツールキットを手軽に使えるようにしておくと捗るんですが、WindowsもLinuxも使う身からすると、Windows SDKだとプラットフォームが限定されるし、なんかAPIも難しそうでちょっと二の足。OpenCVとかGLUTとかProcessingとかライブラリオリエンテッドのクロスプラットフォームGUIとかもありますが、汎用的に使いたい。そのあたりでいろいろ探していて、wxWidgetsに行き着いた、というわけです。

ということで、とりあえずwxWidgetsのSDKをダウンロードして、サンプルをビルドしてみます。OSはWindows 7でございます。

1 Visual C++ Express のインストール


PCにVisual C++がインストールされている場合は飛ばしてOKです。ない場合は、Microsoft Download CenterからMicrosoft Visual Studio 2010 Service Pack 1 (インストーラー)をダウンロードしてインストールを行います。


現時点で最新版は2013なんですが、試してないのでwxWidgetsのSDKと適合するかわかりません。wxWidgetsのSDK内のライブラリやデモプログラムのプロジェクトも最新でもVisual C++ 2008またはVisual C++ 2005用のプロジェクト/ソリューションファイルしか用意されていませんが、2010で変換してインポートする分には問題なくビルドできました。Microsoft Visual Studio 2010をインストールする場合は、Service Pack 1を選ぶ必要があることに注意。SP1ではない無印を使うと、デモプログラムのビルド時に「LINK : fatal error LNK1123: COFF への変換中に障害が発生しました: ファイルが無効であるか、または壊れています。」というエラーに直面します。

2 wxWidgets SDKのダウンロード


wxWidgets公式のダウンロードページから、Windows向けのソースアーカイブをダウンロードします。Zipでもいいですが、7zの方が高圧縮で軽量です。7z対応の展開ソフトがあるなら、こちらを選ぶといいでしょう。


ダウンロードしたら、任意のフォルダで展開します。

3 ライブラリのビルド


Visual C++ Express 2010を起動し、[ファイル(F)]->[開く(O)]->[プロジェクト/ソリューション(P)...]を選びます。「プロジェクトを開く」ダイアログが開くので、展開したライブラリのbuild\msw\wx_vc10.slnを開きます。ソリューションの読み込みが完了したら、[デバッグ(D)]->[ソリューションのビルド(B)]を選び、ビルドを行います。DebugとReleaseの両方の構成でビルドしておくとよいでしょう。

4 デモプログラムのビルド、実行


同様にVisual C++ Express 2010でdemos\bombs\bombs_vc9.slnを開きます。ソリューションとプロジェクトが2010のバージョンに対して古いため「Visual Studio 変換ウィザード」が開きます。そのまま[完了(F)]でOKです。


ソリューションが読み込まれたら、[デバッグ(D)]->[デバッグ開始(S)]を選びます。しばらくビルドが走った後、マインスイーパーっぽいプログラムが起動します。


これでOK。


参考

Microsoft Visual C++ Guide - wxWiki