今日も微速転進

ここではないどこかへ

ラズパイをプロキシサーバー(キャッシュサーバー)として使う( Raspbian & Squid )

大したネタではないですが備忘録。


複数の仮想マシンapt(あるいはyumとかHomebrewも含めて)で同じパッケージをダウンロードをするケースが結構ある。

Ubuntu 16.04の仮想マシンが複数あるとして、どっちも同じようにapt upgradeを実行すると、同じ修正パッケージを取得することになり、明らかに無駄。

ホスト側でプロキシサーバーを動かして、透過型プロキシもありかと思ったけど、ちょっと面倒だなってことでラズパイを活用してみる。

構成

仮想化ホストマシンと同じサブネット上に接続したラズパイをキャッシュサーバーとして使う。

スループットの面からすると激しくイマイチだけど、どのみち外向けの回線がWiMAX2+なので問題ない。

ラズパイのイーサネットポートは100MbpsなのでIEEE 802.11nWifiの方が速度は出るかもしれない。

要件

  • LAN内部に設置
  • ローカルホストおよび仮想マシン(ゲスト)から接続できればOK
  • ある程度大き目のファイル(100MB〜200MBぐらい)もキャッシュさせたい
  • ラズパイの microSD の空き領域の有効活用(10GBぐらいはキャッシュに使って問題ない)

インストール

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install squid
$ sudo apt install squidclient

squidclientは動作状態をチェックするためのツールです。なくても動作します。

設定

$ sudo vi /etc/squid/squid.conf

修正結果の差分は以下のとおり。

$ sudo diff -N /etc/squid/squid.conf.orig /etc/squid/squid.conf
609,611c609,611
< acl localnet src 10.0.0.0/8   # RFC1918 possible internal network
< acl localnet src 172.16.0.0/12        # RFC1918 possible internal network
< acl localnet src 192.168.0.0/16       # RFC1918 possible internal network
---
> #acl localnet src 10.0.0.0/8  # RFC1918 possible internal network
> #acl localnet src 172.16.0.0/12       # RFC1918 possible internal network
> acl localnet src 192.168.0.0/24       # RFC1918 possible internal network
676c676
< #http_access allow localnet
---
> http_access allow localnet
1738c1738
< # cache_mem 8 MB
---
>  cache_mem 16 MB
1747c1747
< # maximum_object_size_in_memory 8 KB
---
>  maximum_object_size_in_memory 16 KB
1945c1945
< # cache_dir ufs /var/spool/squid 100 16 256
---
>  cache_dir ufs /var/spool/squid 8196 16 256
1988c1988
< # maximum_object_size 20480 KB
---
>  maximum_object_size 204800 KB
3392a3393
> visible_hostname unknown
4699c4700
< # forwarded_for on
---
>  forwarded_for off

要点は、

  • ローカルネットワーク(192.168.0.0/24)からのアクセスを許可
  • キャッシュするファイルのサイズを大きく(maximum_object_size
  • 使用するディスク領域の上限を大きく(cache_dir
  • プロキシ経由であることをアクセス先に通知しない(forwarded_for

下記のコマンドで設定ファイルの書式のチェック。

$ sudo squid -k parse

エラーが出なければプロセスを起動。

$ sudo systemctl start squid

設定ファイルのリファレンス:squid : Optimising Web Delivery

有効化

問題なく動くようなら自動的にsquid起動するようにする。

$ sudo systemctl enable squid

クライアント側の設定

ブラウザからは利用するようにしてもいいが、基本的にaptgitで同じファイルをダウンロードするケースを高速化できればいいので環境変数のみセットする。

VirtualBox 上のゲスト

VirtualBoxの「環境設定」から「プロキシ」タブを選択して「手動設定」で設定する。ゲスト側は気にする必要がない。

コンソール系のツール

一度実行すればあとはコマンド履歴から再実行すればいい。ノートPCを持って外出する場合は環境変数の値を空にする。

export http_proxy=http://プロキシサーバーのIP:3128
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export rsync_proxy=$http_proxy
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"

ポート番号をデフォルトの"3128"から変更している場合はそれに合わせて修正する。

手作業で環境変数をセットするのが面倒ならArch Linuxにオンオフを切り替えるスクリプトの例が記載されているのでこれを参考にする。

プロキシ設定 - ArchWiki

sudo経由で実行するコマンドは設定しない限り環境変数は引き継がないので注意する(Arch LinuxWikiを参照。

動作状態のチェック

悲しいことにsquidclientコマンドを実行するとIPv6のポートへ接続しようとするのでエラーになる。

$ squidclient -h localhost mgr:mem
client: ERROR: Cannot connect to [::1]:3128: Connection refused

対処法としては-hIPv4のアドレスを指定する。

$ squidclient -h 127.0.0.1 mgr:mem
Sending HTTP request ... done.
HTTP/1.0 200 OK
Server: squid/2.7.STABLE9
Date: Thu, 09 Mar 2017 19:30:52 GMT
Content-Type: text/plain
Expires: Thu, 09 Mar 2017 19:30:52 GMT
X-Cache: MISS from unknown
X-Cache-Lookup: MISS from unknown:3128
Via: 1.0 unknown:3128 (squid/2.7.STABLE9)
Connection: close

Current memory usage:
Pool     Obj Size       Allocated                                        In Use         Idle                     Allocations Saved                       Hit Rate
         (bytes)        (#)      (KB)    high (KB)       high (hrs)      impact (%total)(#)      (KB)    high (KB)       portion (%alloc)       (#)      (KB)    high (KB)     (number)  (%num)  (%vol) (%num)  (number)
2K Buffer                2048    2       4       4       0.42    2       2       4      4        100     0       0       2       28      0.52    5.89    93.33   30
4K Buffer                4096    4       16      16      0.35    7       1       4      16       25      3       12      16      61      1.13    25.65   93.85   65
Store Client Buffer      4096    1       4       4       0.05    2       1       4      4        100     0       0       4       3       0.06    1.26    75.00   4
acl                        48    11      1       1       0.42    0       11      1      1        100     0       0       0       0       0.00    0.00    0.00    11
acl_ip_data                16    5       1       1       0.42    0       5       1      1        100     0       0       0       0       0.00    0.00    0.00    5
acl_list                   12    23      1       1       0.42    0       23      1      1        100     0       0       0       0       0.00    0.00    0.00    23
CacheDigest                24    1       1       1       0.42    0       1       1      1        100     0       0       0       0       0.00    0.00    0.00    1
 <skip>

他にも確認できる項目の一覧を表示する場合は、squidclient -h 127.0.0.1 mgr:を実行。

関連URL

今更な感じもしますが、ないよりマシでしょうってことで。


[2017/03/12 追記] よく考えたらgithub経由のダウンロードはHTTPS経由なんで(プロキシではキャッシュできないので)大した効果はない……。


それではまた。

ラズパイにOpenCV 3.2 をインストールする(暫定版)

前回の記事で年内の最後の予定だったけどせっかくなので。

ほぼ作業メモみたいなものです。

環境

準備

旧バージョンのアンインストール(元からインストールされている場合のみ)

OpenCV 3.1 をビルドしたディレクトリ(私の環境では~/work/opencv-3.1.0/build*1)に移動して下記を実行。

$ sudo make uninstall

ついでにmicroSDを圧迫するのでコンパイル時の中間生成物など古いファイルは削除しておく。

作業ディレクトリの作成

適当な場所に作業ディレクトリを作成して移動。

$ mkdir work
$ cd work

依存ライブラリについては過去記事参照。

a244.hateblo.jp

ソースの入手

公式からOpenCV 本体と拡張モジュール(contrib)のソースを入手。

本体の方は"OpenCV for Linux/Mac"というリンクをクリック。拡張モジュールの方は3.2.0の"tar.gz"のリンクから。

wget でダウンロードするなら下記のようにする。

$ wget https://github.com/opencv/opencv/archive/3.2.0.zip
$ wget https://github.com/opencv/opencv_contrib/archive/3.2.0.tar.gz

展開

$ unzip opencv-3.2.0.zip
$ tar zxf opencv_contrib-3.2.0.tar.gz

本体の展開先に移動し、cmake用の出力先ディレクトリを作ってそこに移動。

$ cd opencv-3.2.0/
$ mkdir build_with_contrib
$ cd build_with_contrib

ビルド

最初から拡張モジュール(contrib)ありでビルドします。

CMake

前回と同じ要領で行くと、下記のバグ?に遭遇するのと、C++チュートリアル(Example)のビルドでこけるのでそこを踏まえてcmakeを実行。
またfreetypeというcontribのモジュールも無効化します(後述)。

github.com

TBBは並列化のためのバックエンドの一つ。つまり代替手段があるので無効化しても問題ない。

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
     -D CMAKE_INSTALL_PREFIX=/usr/local \
     -D INSTALL_PYTHON_EXAMPLES=ON  \
     -D PLANTUML_JAR=/usr/share/java/plantuml.jar  \
     -D ENABLE_NEON=ON \
     -D WITH_TBB=OFF -D BUILD_TBB=OFF  \
     -D WITH_QT=ON -D WITH_OPENGL=OFF \
     -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.2.0/modules \
     -D BUILD_opencv_freetype=OFF \
     -D BUILD_EXAMPLES=OFF ..

前回との変更点は以下のとおり。

  • TBBの無効化("-D WITH_TBB=OFF -D BUILD_TBB=OFF"に変更)
  • 8行目のOPENCV_EXTRA_MODULES_PATHを3.2向けに修正
  • freetypeモジュールをビルドしないように(-D BUILD_opencv_freetype=OFF)
  • サンプルをビルドしないように( -D BUILD_EXAMPLES=OFF )

cmakeの出力で、必要なモジュールが有効になっていることを確かめる。また、freetypeがDisabledのリストに存在することを確認する。

f:id:atuyosi:20161230232146p:plain

以下参考。

CMake configuration for OpenCV 3.2 (with contrib) 2016/12/30 on Raspbian jessie · GitHub

ビルド

f:id:atuyosi:20161230225017j:plain

$ make -j4

空冷ファンありなので発熱は気にせずに4並列でコンパイル

使用しているのはUSB接続の小型ファンです。電源はHDMIディスプレイのUSBハブから確保しています。

タイムリー USBファン [ 40mm角ファンモデル ]  LittleFAN40U

タイムリー USBファン [ 40mm角ファンモデル ] LittleFAN40U

輪っかにしたマスキングテープを両面テープ代わりにして固定しているだけです。小型ファンの宿命として騒音がかなり気になります。

取り付け方法によっては振動も気になりますが、発熱による警告マークは表示されません。

インストー

$ sudo make install

普通にインストールするだけ。

動作確認

C++

過去記事と同じコードをビルドして実行できたらひとまずOKとします。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>

int main( int argc, char** argv){

    cv::Mat img_rgb, img_gry, img_cny;

    cv::namedWindow( "Example Gray", cv::WINDOW_AUTOSIZE );
    cv::namedWindow( "Example Canny", cv::WINDOW_AUTOSIZE );

    img_rgb = cv::imread( argv[1]);

    cv::cvtColor( img_rgb, img_gry, cv::COLOR_BGR2GRAY);
    cv::imshow( "Example Gray", img_gry );

    cv::Canny( img_gry, img_cny, 10, 100, 3, true );
    cv::imshow( "Example Canny", img_cny );


    cv::waitKey(0);
    return 0;
}

過去記事と同じです。sample.cppというファイル名で保存して下記の手順でビルド。pkg-configを使うのはデフォルトでインストールされているOpenCV 2.4が間違ってリンクされるのを防ぐため。

$ g++ `pkg-config opencv --cflags --libs` sample.cpp

以下のようにグレースケール画像とエッジ抽出の結果が表示されれば問題なし。

f:id:atuyosi:20161230234328j:plain

Python 3

Pythonはモジュールのロードのみ確認。

$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
>>>

遭遇したエラーとその対処

以下、遭遇したエラーメッセージとその対処。基本的にビルド時に無効化しただけですが。

エラーメッセージでググった時にヒットすることを期待しています。読む必要は特になし。

TBB関連

[2017/06/08 追記]

最新の開発版では修正されているようです。そのうちリリースされるであろうOpenCV 3.3 で取り込まれると思われます。

c.f. TBB: fix build on ARM by mshabunin · Pull Request #8844 · opencv/opencv · GitHub

[追記ここまで]

エラーメッセージをメモし忘れた。現象は下記と同じ。

TBB compile error 3.1-dev · Issue #7890 · opencv/opencv · GitHub

前述の通り別の選択肢があるので無効にして回避。  

-D WITH_TBB=OFF -D BUILD_TBB=OFF

バージョン3.1の時はすんなり通ったはずなんだけど。

[2017/01/23 追記]

解決先らしきものが issuesトラッカーに投稿されている。

freetype モジュール

[2017/06/08 追記]

こちらについても最新の開発版では修正されているようです。

[追記ここまで]

ビルド自体は成功するかに見えるが、Python 3でOpenCVモジュールをロードしようとすると下記のエラーに遭遇する。

>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /usr/local/lib/libopencv_.so.3.2: undefined symbol: hb_shape

必要なライブラリであるfreetype2harfbuzzはインストールされているので問題ないはずだが、実際にはエラーになっている。

関連:OpenCVのcontribにモジュールを追加してPRしてみた - Qiita

便利なモジュールが増えるのはいいことだけど、 使わない立場からすると微妙。環境依存でビルドに失敗するからといって文句言うのは筋違いなんだけど。

Githubの最新版では修正されているかも。

関連:Fix Opencv3.2 freetype module build failed in macOS10.12 #919 by Kumataro · Pull Request #926 · opencv/opencv_contrib · GitHub

macOS環境のビルドエラーの修正だけど、他のバグも一緒にクローズされてる。なのでこの問題も修正されているかもしれない。未検証。

Example ビルドエラー

これも前述のfreetype関連なのか?

[ 84%] Building CXX object samples/cpp/CMakeFiles/cpp-tutorial-pnp_registration.dir/tutorial_code/calib3d/real_time_pose_estimation/src/RobustMatcher.cpp.o
[ 84%] Linking CXX executable ../../bin/cpp-tutorial-pnp_registration
../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_get_glyph_infos' に対する定義されていない参照です
../../lib/libopencv_freetype.so.3.2.0: `hb_font_destroy' に対する定義されていない参照です
../../lib/libopencv_freetype.so.3.2.0: `hb_ft_font_create' に対する定義されていない参照です
../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_add_utf8' に対する定義されていない参照です
../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_destroy' に対する定義されていない参照です
../../lib/libopencv_freetype.so.3.2.0: `hb_shape' に対する定義されていない参照です
../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_guess_segment_properties' に対する定義されていない参照です
../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_create' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
samples/cpp/CMakeFiles/cpp-tutorial-pnp_registration.dir/build.make:345: recipe for target 'bin/cpp-tutorial-pnp_registration' failed
make[2]: *** [bin/cpp-tutorial-pnp_registration] Error 1
CMakeFiles/Makefile2:21767: recipe for target 'samples/cpp/CMakeFiles/cpp-tutorial-pnp_registration.dir/all' failed
make[1]: *** [samples/cpp/CMakeFiles/cpp-tutorial-pnp_registration.dir/all] Error 2

ぶっちゃけなくてもいいので素直にOFFにする。

-D BUILD_EXAMPLES=OFF

まとめ

最低限の確認しかしていませんが、ひとまずビルド成功です。


ではまた。

*1:buildというディレクトリは自分で作成したビルド用のディレクトリで、Makefileが存在する場所

ラズパイ公式カメラモジュール その2

前回の続きです。

部品を購入したところで取り付けないと始まりません。

a244.hateblo.jp

前提条件と準備

前提条件は以下の通り。

  • Camera Module V2.1
  • Raspberry Pi 3 model B
  • Raspbian Jessie

過去記事で使っている環境にカメラが追加されただけです。

注意点など

  • Raspbian をアップデートした状態に
  • GL Driver は無効化*1しておく

以下のコマンドを実行してOSをアップデート。

$ sudo apt update
$ sudo apt upgrade

念の為、ファームウェアもアップデートしておく。

$ sudo rpi-update

正常終了したら再起動。

以下、参考。

$ uname -a
Linux raspberrypi 4.4.38-v7+ #938 SMP Thu Dec 15 15:22:21 GMT 2016 armv7l GNU/Linux

接続と設定

カメラモジュールは静電気に弱いらしいので、周囲の金属に触れるなどして静電気を逃がしてから作業する*2

  1. ラズパイの電源を切り、しばらく待っってから*3、電源ケーブルを取り外しておく
  2. カメラ接続用のコネクタ(HDMIポートの隣)の両端の黒いツメを垂直方向に引き上げる
  3. 向きに注意しつつ、コネクタにケーブルを差し込む。青い文字の印刷されている側がUSBポート側になるように
  4. しっかり押し込んだ状態で、コネクタの黒いツメを押し込んで固定する

f:id:atuyosi:20161228025305j:plain:w320
接続後の状態

f:id:atuyosi:20161228025244j:plain:w320
反対側から

通電状態で作業しても問題ないのかもしれませんが、気軽に電源の入った状態で抜き差しできるUSBが特別なのであって、本来周辺機器は電源オフで取り外すべきかと思います。

ソフトウェア側の設定

GUI環境の場合

f:id:atuyosi:20161228031709p:plain:w320

  1. 画面左上端のメインメニューから「設定」「Raspberry Piの設定」をクリックして設定画面へ
  2. 「インターフェイス」タブの「カメラ:」の有効というラジオボタンをクリック
  3. 「OK」をクリックすると再起動を促してくるので素直に再起動

f:id:atuyosi:20161228031804p:plain:w320

CLI(CUI)環境

sudo rasps-configから設定。"5. Interfacing Options"から"P1 Camera"と順に進んで行けばOK。

f:id:atuyosi:20161229000245p:plain:w320
特に説明は不要なはず

補足:エラーの例など

ケーブルがしっかり刺さっていない(もしくはRaspbian側でカメラ用のインターフェイスが有効になっていない)状態でカメラにアクセスすると下記のようなエラーが表示される。

$ raspistill  -w 1920 -h 1080 -o try.jpg
mmal: Cannot read cameara info, keeping the defaults for OV5647
mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM)
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
mmal: Failed to create camera component
mmal: main: Failed to create camera component
mmal: Camera is not detected. Please check carefully the camera module is installed correctly

ピント調整時にケーブルを引っ張ってしまったせいで遭遇しました。

なお、カメラモジュール自体が故障している場合のエラーは不明です*4

フォーカス調整

マクロよりの条件で撮影したい場合のみ。監視カメラなどの用途であれば不用意に弄らない方がベターだと思います。もちろん自己責任で。

f:id:atuyosi:20161228025114j:plain:w320
調整用の治具

付属の治具*5の裏側をよく見ると、微妙に凹みがあるのでその部分をカメラの先端部にはめ込む*6

f:id:atuyosi:20161228025136j:plain:w320

初回のみ強めに押し付けた状態で軽く時計回りにひねってやると固定用の糊が外れるのか、すんなり回転するようになります*7

初期状態では無限遠方にピントが合うように設定されているため、時計方向にはほとんど回らないはずです。

近方にピントを合わせたいときは反時計回りに、遠方にピントを合わせたいときは時計回りに。反時計回りに回しすぎると完全なピンボケ状態になる。

時計回りに締め込んで行くとほぼ出荷時の状態に戻る。

ピント調整は接続したままの状態で問題ないです。用途に応じて撮影結果を確認しながら調整(静電気対策もお忘れなく)。

例えば以下のようにコマンドにraspistill(後述)の-tオプションに"0"ミリ秒を指定するとCtrl+Cを入力するまでプレビュー画像を撮影し続けるのでかなり楽(raspvidでも可)。

$ raspistill -t 0

raspistillraspvidでプレビュー表示の見え方が微妙に違うので目的にあった方のコマンドで確認しながら調整する。

専用コマンドで撮影

公式ドキュメントによると、カメラモジュール専用のコマンドとして、raspistillraspividraspistillyuvの3つが紹介されている。

しかしながら現在のところ、raspistillyuvではなくraspiyuv'に名称が変更されていたり、raspividyuv`が追加されているので結局全部で4つとなっている。

  • raspistill : 静止画用の画像データ取得コマンド
  • raspiyuv : YUV形式でデータ画像を取得するコマンド
  • raspivid : H264形式で動画を撮影するコマンド
  • raspividyuv : YUV420形式で動画を撮影するコマンド

それぞれオプションなし、もしくは-?オプション付きで実行するとオプション一覧が表示される。なおこれらのコマンドはlibraspberrypi-binというパッケージに含まれており、基本的に最初からインストールされている。

基本的なオプションは下記のページに一通り記載されてる。

Interface(インターフェース) 2016年09月号にカメラモジュール自体と、付属コマンドの解説が載っているのでそちらも参考に。

Interface(インターフェース) 2016年09月号

静止画の撮影

静止画を撮影するには-oオプションでファイル名を指定したうえで実行する。もうひとつ重要なのは画像を回転させるための-rotオプション。

また、-hで撮影する画像の高さ、-wで撮影する画像の幅を指定する。省略した場合は最大解像度(3280x2464)。

最大解像度未満の値を指定すると、不要な部分を切り捨てるケースと指定された解像度に縮小するケースがある。結果として指定する高さと幅の比率が画角に影響する。

$ raspistill  -w 1280 -h 800 -o test.jpg

コマンドを実行するとプレビューが表示された後、画像が保存される。プレビュー画像の表示位置と解像度は-pオプションで変更可能。

デフォルトではコマンドが実行されてから5000ミリ秒(つまり5秒)ほど待機してから撮影される。これは-tオプションで変更可能。 

以下は2秒後に撮影する例:

$ raspistill -t 2000 -o image.jpg

png形式で保存する(可逆圧縮):

$ raspistill  -o image.png -e png

-eで保存する形式を指定しない限りファイル名の拡張子によらずJPEG形式で保存される((jpg, bmp, gif, png)の4種が指定できる)。

他にもカメラの設定を変更するオプションと、夜景や花火などの特定の撮影シチュエーション向けのモード指定オプション、撮影した画像にエフェクトをかけるオプション*8がある。

撮影してみた画像

そのままでは固定できないので、Amazonで購入したクリップで挟んで固定。

f:id:atuyosi:20161229013948j:plain:w320
なんとも微妙な絵面。

下記のように画像サイズを指定する。

$ raspistill  -w 1280 -h 800 -o testimage.jpg

撮影した画像は以下のとおり(フォーカス変更前)。

f:id:atuyosi:20161229013813j:plain:w320
普通にいい感じに見える。


フォーカスをいじった後の画像。

f:id:atuyosi:20161229014426j:plain:w320 ちょっとマクロよりに調整しずぎでピントが甘い。


ちょうどいい被写体がないので微妙ですが、マクロの例(だいたい8cmぐらい)。

f:id:atuyosi:20161229021437j:plain:w320
その1

f:id:atuyosi:20161229021502j:plain:w320
その2

Interfaceの記事の通り、5cmぐらいまではいけるのは確認済み。マクロよりにすると焦点の合う範囲が狭くなるのも記事の通り。

動画は面倒なので省略。

おわりに

静電気に弱いらしいのと、オートフォーカスがない点を除けば非常にいい感じだという印象です。

気が向いたらPytonのPiCameraモジュールを使うサンプルにトライするつもりです。 トランジスタ技術なりInterfaceの記事を参考に遊んでみたいとは思っています。


ひとまずこんな感じです。

その他・関連リンク

これ1冊でできる! ラズベリー・パイ 超入門 改訂第4版 Raspberry Pi 1+/2/3/Zero/Zero W対応

これ1冊でできる! ラズベリー・パイ 超入門 改訂第4版 Raspberry Pi 1+/2/3/Zero/Zero W対応

*1:初期状態では無効なので自分で有効にしていないなら何もしなくてよい

*2:気にしすぎ?

*3:少なくとも20秒、ランプが点滅しなくなるまで

*4:率直に申し上げてそのような状況には陥りたくない

*5:購入時期によっては付属してないかもしれない。「Amazon.co.jpが販売・発送」しているものは問題なし。11月中旬にKSYに問い合わせたところ、付属しているとの回答だったのでKSYも大丈夫なはず。

*6:押し当てた状態で左右にひねるとはまり込む

*7:誤ってこれ以上回転しない方向に破損しないように意図的に緩めた状態で固定しているのだと思う

*8:あくまでもGPU側の機能

結局、ラズパイ公式カメラモジュールを買った

まさかのAmazonポイントゲットという天の助け、まさに天佑があったのでポチッと*1

開封してやっつけ仕事でケースを自作したところまで、です。

付属のケーブルが短いのでどう使ったものやら。

はじめに

Raspberry Pi 高精細カメラボード Camera Module V2

Raspberry Pi 高精細カメラボード Camera Module V2

Amazonで購入する場合は販売元に注意されたし。私はAmazonポイントを使用すべくAmazonでで購入しました。

商品に付属のケーブルは15cmと短いのでKSYで別売の長いケーブル*2とセットで買うほうがベターだろうと思います。送料を除けば価格もAmazonよりKSYの方が安いし。

カメラモジュールの商品ページ:ホーム - Raspberry Pi Shop by KSY

カメラモジュールについて

f:id:atuyosi:20161227165518j:plain

公式の紹介:

搭載センサーなど詳細

  • 名称:RaspberryPi Camera Module V2.1
  • ソニーIMX219PQ(裏面照射型)
  • 実効800万画素(3280 × 2464 pixels)
  • 固定フォーカス
  • 25mm x 24mm x 9mm

一番の特徴は、高解像度という点ですが、固定フォーカスながら専用の治具を使うことでフォーカスを調整できるようです。

f:id:atuyosi:20161227165820j:plain
白いプラスチックの部品がフォーカス調整用の治具(10月末くらいからの出荷分には付属してるらしい)。

参考:ビジョンプロセッシング・コミュニティ:ブログ
11/8のエントリを参照。

諸事情はこの辺りに

具体的なフォーカスの調整についてはInterface の2016年9月号が詳しいです。どれくらいの調整量でどの程度の焦点距離になるか、表にまとめられています。

2016年9月号目次|Interface

記事によると無限遠から5cmまで調整可能。ただし自己責任で、だそうです*3

レンズに傷がつくリスクがあるので保護フィルムを貼れとか、思わず躊躇するような注意書きが書いてあります*4

紙媒体版はアマゾンでは在庫切れだったので、Tech Village から電子版を購入しました。 電子部品を取り扱っている店だとバックナンバーを置いてる店があると思います。
CQ出版からバックナンバーを購入することもできるようですが。

ケースの自作

ケースの自作は以下を参考に。

shikky-lab.hatenablog.com

問題はフリスクの20%増量によるパッケージ変更というところですかね。

このフリスクのケースの寸法ですが、長辺が約70ミリ、幅38ミリ、高さが9ミリとなっています。

カメラモジュールは2.5×2.4と微妙に正方形ではないうえ、コネクタが基盤の裏に出っ張っているせいで高さが9mm。そのままでは微妙にケースのカバー側が干渉します。

[2016/12/29 追記] 公式に寸法の資料がありました。

MECHANICAL DRAWING

加工手順

とりあえず真ん中でぶった切ります。多少ずれても目の粗い紙やすりでゴリゴリ削ってリカバリーできます。元から中央に丸くぼみと出っ張りがあるのでそこを目安に。

固定用のネジ穴を開けます。 コピー用紙*5にカメラモジュールのネジ穴の位置をマークしたものを貼り付けて、ピンバイスでサクッと固定用のネジ穴を開けただけのやっつけ仕事です。

f:id:atuyosi:20161227171459j:plain

上面はざっくり油性ペンでマーキングしてピンバイスでミニ四駆の肉抜きの要領で。

M2のネジとナット、上下にスペーサーを挟んで固定。ネジの長さはスペーサーの都合で5mmでは不足で15mmでは長すぎました…。

f:id:atuyosi:20161227172731j:plain
レンズの保護フィルムを剥がしていない状態です。


構造上、背面にネジが突き出すので固定する際に問題があります。 その辺りを考慮するなら、上記のリンク先と同様に前面カバー側に固定用の穴を開けて固定する方がいいと思います。

まあ暫定措置としてはいいんじゃないでしょうか。

販売されてるカメラケースも特にかっこいいとは思えないのでどっこいどっこいです。

このフリスクのケース、何が素晴らしいかというとラベルシールが綺麗に剥がれるというところです。あとは高さがもう2ミリほどあればレンズと干渉しないのでスライド式ケースにできたんですが。

付属のケーブルについて

よく考えるまでもなく15cmは短いです。もちろん用途によりますが。

Amazonでカメラモジュール用のケーブルを買おうとすると高いので、KSYで他の商品とセット購入がベターだろうと思います。


ラズパイと接続は次回ってことで。

a244.hateblo.jp

それではでは。

これ1冊でできる! ラズベリー・パイ 超入門 改訂第4版 Raspberry Pi 1+/2/3/Zero/Zero W対応

これ1冊でできる! ラズベリー・パイ 超入門 改訂第4版 Raspberry Pi 1+/2/3/Zero/Zero W対応

*1:自分にクリスマスプレゼントとかなんとか

*2:12月末の時点でケーブルは品切れという悲しい現実もセットです

*3:まあいつものことです

*4:ピント調整の結果を確認するには保護フィルムを剥がす必要があるんですが

*5:方眼紙でやったほうがベターだったかな

ラズパイ(Raspbian Jessie)とスワップメモリ容量の変更(環境設定の続き)

過去記事についても分割・統合して整理する予定。


以前はどうだったのかよくわかりませんが、現在のRaspbian は初期設定の状態でChromiumGoogle Chromeオープンソース版)がインストールされているので、Youtubeの動画が見れたり、それなり普段使いの環境になります。

さりげなくFlash再生プラグインが導入済みなのである程度はFlashゲームも遊べたりします。

ただ、メインメモリ容量が1GBなうえにスワップメモリ容量も少ないのでChromeでたくさんタブを開くとかなりの確率でハングします。そこで対処法としてSwapをの容量を変更します。

スワップの設定

理由はわかりませんが、dphys-swapfileというプログラムにより管理されています。

初期状態では100MBになっていて、調子に乗ってChromiumでタブをたくさん開くとハングアップ。

GUIベースで作業したいとか、サイズの大きい画像ファイルを扱う場合は物理メモリと同じぐらいのサイズに設定しておきたい。

サーバー用途ならSwapなしでも大丈夫な場合もあるので用途に応じて容量は調整する必要があります。また、microSD の寿命から考えると、USBメモリを接続してそっちにSwap領域を作ってメインのmicroSDへの負荷を減らすのも一つの方法。

dphys-swapfileについてざっくり整理すると以下のようになります。

  • インストール直後の初期設定:100MB
  • 明示的に上限値を変更しない限り、2GB以下の値に切り捨て
  • MB単位で指定する方法と、実メモリの容量に対する倍率を指定する方法の二通り

ラズパイ3の搭載メモリは1024MB。実際にカーネルが認識するのはこの値からGPU用に割り当てた容量を引いた値になる。

固定値を指定する方法

エディタで/etc/dphys-swapfileを開き、CONF_SWAPSIZE という行の値を変更。例えば2048MB(2GB)なら以下のように変更。

CONF_SWAPSIZE=2048

設定したいSwapのサイズをMB単位で指定。

$ sudo systemctl stop dphys-swapfile
$ sudo systemctl start dphys-swapfile

systemctl経由でstop/start する。実際に呼び出されるのは/etc/init.d/dphys-swapfile。 なお、swapの容量を変更した直後は内部でddコマンドが呼び出されるので非常に時間がかかります。

最後にfree -hで意図した容量に設定されているか確認。

$ free -h
             total       used       free     shared    buffers     cached
Mem:          862M       833M        28M       6.3M        36M       656M
-/+ buffers/cache:       140M       721M
Swap:         2.0G         0B       2.0G

-hは人間が読みやすい単位で出力するというオプション。

freeコマンドに-mオプションを指定するケースをよく見かけるのでついでに書いておくと、-b-k-m-g--teraオプションでそれぞれバイト、キロバイト、メガバイト、ギガバイト、テラバイトの単位で出力(小数点以下切り捨て) )。デフォルトはキロバイト単位。ちなみに-tはトータル容量表示。

倍率指定による方法

もし倍率指定で設定する場合は。修正箇所は、

  1. CONF_SWAPSIZE=100 という行をコメントアウト
  2. CONF_SWAPFACTOR=2 という行の行頭のコメント記号を削除

これでカーネルが認識しているメモリ量の2倍に設定される。もしGPUへの割り当てメモリを頻繁に変えるなら固定値にしておいた方がいいと思います。

注意点

もし2048(2GB)以上の値を設定するなら、CONF_MAXSWAP=2048という行の行等のコメントを削除、等号の右側の2048という値を4096などの大きい値にする。

このパラメータを指定しない場合、古い32ビットカーネルを考慮しているのか、2048より大きい値を指定しても自動的に2048(2GB)にセットされるので注意。

どこかのサイトで2GB以上に設定できないという話はこの設定を変更していないせいだろうと思います。

そのほか

もちろんWebサイトによってはユーザーエージェントで弾かれたりします。

スワップの容量を増やした状態でもmicroSDへのデータアクセスの最中にプチフリのような現象が発生したり、色々ツライ場面は多々あります。

コンパイルの待ち時間に暇つぶししたりする分には十分です。購入当初の目論見とは違うところで活躍していますがまあドンマイってことで。

たかだかスワップ容量の変更にグダグダと書けるとは自分でも意外ですが以上です。

広告