ラズパイをプロキシサーバー(キャッシュサーバー)として使う( Raspbian & Squid )
大したネタではないですが備忘録。
複数の仮想マシンでapt
(あるいはyum
とかHomebrewも含めて)で同じパッケージをダウンロードをするケースが結構ある。
Ubuntu 16.04の仮想マシンが複数あるとして、どっちも同じようにapt upgrade
を実行すると、同じ修正パッケージを取得することになり、明らかに無駄。
ホスト側でプロキシサーバーを動かして、透過型プロキシもありかと思ったけど、ちょっと面倒だなってことでラズパイを活用してみる。
構成
仮想化ホストマシンと同じサブネット上に接続したラズパイをキャッシュサーバーとして使う。
スループットの面からすると激しくイマイチだけど、どのみち外向けの回線がWiMAX2+なので問題ない。
ラズパイのイーサネットポートは100MbpsなのでIEEE 802.11n のWifiの方が速度は出るかもしれない。
要件
- 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
クライアント側の設定
ブラウザからは利用するようにしてもいいが、基本的にapt
やgit
で同じファイルをダウンロードするケースを高速化できればいいので環境変数のみセットする。
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にオンオフを切り替えるスクリプトの例が記載されているのでこれを参考にする。
sudo
経由で実行するコマンドは設定しない限り環境変数は引き継がないので注意する(Arch Linux のWikiを参照。
動作状態のチェック
悲しいことにsquidclient
コマンドを実行するとIPv6のポートへ接続しようとするのでエラーになる。
$ squidclient -h localhost mgr:mem client: ERROR: Cannot connect to [::1]:3128: Connection refused
対処法としては-h
でIPv4のアドレスを指定する。
$ 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
- squid : Optimising Web Delivery
- FrontPage - Squid Web Proxy Wiki
- rasbianにSquidをインストール - Qiita
- プロキシ設定 - ArchWiki
- Squid - ArchWiki
今更な感じもしますが、ないよりマシでしょうってことで。
[2017/03/12 追記] よく考えたらgithub経由のダウンロードはHTTPS経由なんで(プロキシではキャッシュできないので)大した効果はない……。
それではまた。
ラズパイにOpenCV 3.2 をインストールする(暫定版)
前回の記事で年内の最後の予定だったけどせっかくなので。
ほぼ作業メモみたいなものです。
環境
- Raspbian
- Raspberry Pi 3 model B
準備
旧バージョンのアンインストール(元からインストールされている場合のみ)
OpenCV 3.1 をビルドしたディレクトリ(私の環境では~/work/opencv-3.1.0/build*1)に移動して下記を実行。
$ sudo make uninstall
ついでにmicroSDを圧迫するのでコンパイル時の中間生成物など古いファイルは削除しておく。
作業ディレクトリの作成
適当な場所に作業ディレクトリを作成して移動。
$ mkdir work $ cd work
依存ライブラリについては過去記事参照。
ソースの入手
公式からOpenCV 本体と拡張モジュール(contrib)のソースを入手。
- 本体:DOWNLOADS | OpenCV
- 拡張モジュール(contrib):Releases · opencv/opencv_contrib · GitHub
本体の方は"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のモジュールも無効化します(後述)。
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のリストに存在することを確認する。
以下参考。
CMake configuration for OpenCV 3.2 (with contrib) 2016/12/30 on Raspbian jessie · GitHub
ビルド
$ make -j4
空冷ファンありなので発熱は気にせずに4並列でコンパイル。
使用しているのはUSB接続の小型ファンです。電源はHDMIディスプレイのUSBハブから確保しています。
タイムリー USBファン [ 40mm角ファンモデル ] LittleFAN40U
- 出版社/メーカー: タイムリー
- 発売日: 2015/06/03
- メディア: Personal Computers
- この商品を含むブログを見る
輪っかにしたマスキングテープを両面テープ代わりにして固定しているだけです。小型ファンの宿命として騒音がかなり気になります。
取り付け方法によっては振動も気になりますが、発熱による警告マークは表示されません。
インストール
$ 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
以下のようにグレースケール画像とエッジ抽出の結果が表示されれば問題なし。
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トラッカーに投稿されている。
- TBB compile error 3.1-dev · Issue #7890 · opencv/opencv · GitHub
- opencv/arm_linux_stub.cpp at master · opencv/opencv · GitHub
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
必要なライブラリであるfreetype2
とharfbuzz
はインストールされているので問題ないはずだが、実際にはエラーになっている。
関連:OpenCVのcontribにモジュールを追加してPRしてみた - Qiita
便利なモジュールが増えるのはいいことだけど、 使わない立場からすると微妙。環境依存でビルドに失敗するからといって文句言うのは筋違いなんだけど。
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
まとめ
最低限の確認しかしていませんが、ひとまずビルド成功です。
ではまた。
ラズパイ公式カメラモジュール その2
前回の続きです。
部品を購入したところで取り付けないと始まりません。
前提条件と準備
前提条件は以下の通り。
- 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。
- ラズパイの電源を切り、しばらく待っってから*3、電源ケーブルを取り外しておく
- カメラ接続用のコネクタ(HDMIポートの隣)の両端の黒いツメを垂直方向に引き上げる
- 向きに注意しつつ、コネクタにケーブルを差し込む。青い文字の印刷されている側がUSBポート側になるように
- しっかり押し込んだ状態で、コネクタの黒いツメを押し込んで固定する
接続後の状態
反対側から
通電状態で作業しても問題ないのかもしれませんが、気軽に電源の入った状態で抜き差しできるUSBが特別なのであって、本来周辺機器は電源オフで取り外すべきかと思います。
ソフトウェア側の設定
GUI環境の場合
- 画面左上端のメインメニューから「設定」「Raspberry Piの設定」をクリックして設定画面へ
- 「インターフェイス」タブの「カメラ:」の有効というラジオボタンをクリック
- 「OK」をクリックすると再起動を促してくるので素直に再起動
CLI(CUI)環境
sudo rasps-config
から設定。"5. Interfacing Options"から"P1 Camera"と順に進んで行けばOK。
特に説明は不要なはず
補足:エラーの例など
ケーブルがしっかり刺さっていない(もしくは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。
フォーカス調整
マクロよりの条件で撮影したい場合のみ。監視カメラなどの用途であれば不用意に弄らない方がベターだと思います。もちろん自己責任で。
調整用の治具
付属の治具*5の裏側をよく見ると、微妙に凹みがあるのでその部分をカメラの先端部にはめ込む*6。
初回のみ強めに押し付けた状態で軽く時計回りにひねってやると固定用の糊が外れるのか、すんなり回転するようになります*7。
初期状態では無限遠方にピントが合うように設定されているため、時計方向にはほとんど回らないはずです。
近方にピントを合わせたいときは反時計回りに、遠方にピントを合わせたいときは時計回りに。反時計回りに回しすぎると完全なピンボケ状態になる。
時計回りに締め込んで行くとほぼ出荷時の状態に戻る。
ピント調整は接続したままの状態で問題ないです。用途に応じて撮影結果を確認しながら調整(静電気対策もお忘れなく)。
例えば以下のようにコマンドにraspistill
(後述)の-t
オプションに"0"ミリ秒を指定するとCtrl+C
を入力するまでプレビュー画像を撮影し続けるのでかなり楽(raspvid
でも可)。
$ raspistill -t 0
raspistill
とraspvid
でプレビュー表示の見え方が微妙に違うので目的にあった方のコマンドで確認しながら調整する。
専用コマンドで撮影
公式ドキュメントによると、カメラモジュール専用のコマンドとして、raspistill
、raspivid
、raspistillyuv
の3つが紹介されている。
しかしながら現在のところ、raspistillyuv
ではなくraspiyuv'に名称が変更されていたり、
raspividyuv`が追加されているので結局全部で4つとなっている。
- raspistill : 静止画用の画像データ取得コマンド
- raspiyuv : YUV形式でデータ画像を取得するコマンド
- raspivid : H264形式で動画を撮影するコマンド
- raspividyuv : YUV420形式で動画を撮影するコマンド
それぞれオプションなし、もしくは-?
オプション付きで実行するとオプション一覧が表示される。なおこれらのコマンドはlibraspberrypi-bin
というパッケージに含まれており、基本的に最初からインストールされている。
基本的なオプションは下記のページに一通り記載されてる。
- githubリポジトリのページ : userland/host_applications/linux/apps/raspicam at master · raspberrypi/userland · GitHub
- 公式ドキュメント(やや古い):Raspberry Pi Camera Module - Raspberry Pi Documentation
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で購入したクリップで挟んで固定。
なんとも微妙な絵面。
下記のように画像サイズを指定する。
$ raspistill -w 1280 -h 800 -o testimage.jpg
撮影した画像は以下のとおり(フォーカス変更前)。
普通にいい感じに見える。
フォーカスをいじった後の画像。
ちょっとマクロよりに調整しずぎでピントが甘い。
ちょうどいい被写体がないので微妙ですが、マクロの例(だいたい8cmぐらい)。
その1
その2
Interfaceの記事の通り、5cmぐらいまではいけるのは確認済み。マクロよりにすると焦点の合う範囲が狭くなるのも記事の通り。
動画は面倒なので省略。
おわりに
静電気に弱いらしいのと、オートフォーカスがない点を除けば非常にいい感じだという印象です。
気が向いたらPytonのPiCamera
モジュールを使うサンプルにトライするつもりです。
トランジスタ技術なりInterfaceの記事を参考に遊んでみたいとは思っています。
ひとまずこんな感じです。
その他・関連リンク
これ1冊でできる! ラズベリー・パイ 超入門 改訂第4版 Raspberry Pi 1+/2/3/Zero/Zero W対応
- 作者: 福田和宏
- 出版社/メーカー: ソーテック社
- 発売日: 2017/06/03
- メディア: 単行本
- この商品を含むブログを見る
結局、ラズパイ公式カメラモジュールを買った
まさかのAmazonポイントゲットという天の助け、まさに天佑があったのでポチッと*1。
開封してやっつけ仕事でケースを自作したところまで、です。
付属のケーブルが短いのでどう使ったものやら。
はじめに
Raspberry Pi 高精細カメラボード Camera Module V2
- 出版社/メーカー: Raspberry Pi
- メディア: Tools & Hardware
- この商品を含むブログを見る
Amazonで購入する場合は販売元に注意されたし。私はAmazonポイントを使用すべくAmazonでで購入しました。
商品に付属のケーブルは15cmと短いのでKSYで別売の長いケーブル*2とセットで買うほうがベターだろうと思います。送料を除けば価格もAmazonよりKSYの方が安いし。
カメラモジュールの商品ページ:ホーム - Raspberry Pi Shop by KSY
カメラモジュールについて
公式の紹介:
搭載センサーなど詳細
- 名称:RaspberryPi Camera Module V2.1
- ソニーIMX219PQ(裏面照射型)
- 実効800万画素(3280 × 2464 pixels)
- 固定フォーカス
- 25mm x 24mm x 9mm
一番の特徴は、高解像度という点ですが、固定フォーカスながら専用の治具を使うことでフォーカスを調整できるようです。
白いプラスチックの部品がフォーカス調整用の治具(10月末くらいからの出荷分には付属してるらしい)。
参考:ビジョンプロセッシング・コミュニティ:ブログ
11/8のエントリを参照。
諸事情はこの辺りに
- mieki256's diary - Raspberry Pi のカメラモジュールV2はピントが合ってない
- Raspberry Pi • View topic - New 8MP Camera - Q&A thread
具体的なフォーカスの調整についてはInterface の2016年9月号が詳しいです。どれくらいの調整量でどの程度の焦点距離になるか、表にまとめられています。
記事によると無限遠から5cmまで調整可能。ただし自己責任で、だそうです*3。
レンズに傷がつくリスクがあるので保護フィルムを貼れとか、思わず躊躇するような注意書きが書いてあります*4 。
紙媒体版はアマゾンでは在庫切れだったので、Tech Village から電子版を購入しました。 電子部品を取り扱っている店だとバックナンバーを置いてる店があると思います。
CQ出版からバックナンバーを購入することもできるようですが。
ケースの自作
ケースの自作は以下を参考に。
問題はフリスクの20%増量によるパッケージ変更というところですかね。
このフリスクのケースの寸法ですが、長辺が約70ミリ、幅38ミリ、高さが9ミリとなっています。
カメラモジュールは2.5×2.4と微妙に正方形ではないうえ、コネクタが基盤の裏に出っ張っているせいで高さが9mm。そのままでは微妙にケースのカバー側が干渉します。
[2016/12/29 追記] 公式に寸法の資料がありました。
加工手順
とりあえず真ん中でぶった切ります。多少ずれても目の粗い紙やすりでゴリゴリ削ってリカバリーできます。元から中央に丸くぼみと出っ張りがあるのでそこを目安に。
固定用のネジ穴を開けます。 コピー用紙*5にカメラモジュールのネジ穴の位置をマークしたものを貼り付けて、ピンバイスでサクッと固定用のネジ穴を開けただけのやっつけ仕事です。
上面はざっくり油性ペンでマーキングしてピンバイスでミニ四駆の肉抜きの要領で。
M2のネジとナット、上下にスペーサーを挟んで固定。ネジの長さはスペーサーの都合で5mmでは不足で15mmでは長すぎました…。
レンズの保護フィルムを剥がしていない状態です。
構造上、背面にネジが突き出すので固定する際に問題があります。 その辺りを考慮するなら、上記のリンク先と同様に前面カバー側に固定用の穴を開けて固定する方がいいと思います。
まあ暫定措置としてはいいんじゃないでしょうか。
販売されてるカメラケースも特にかっこいいとは思えないのでどっこいどっこいです。
このフリスクのケース、何が素晴らしいかというとラベルシールが綺麗に剥がれるというところです。あとは高さがもう2ミリほどあればレンズと干渉しないのでスライド式ケースにできたんですが。
付属のケーブルについて
よく考えるまでもなく15cmは短いです。もちろん用途によりますが。
Amazonでカメラモジュール用のケーブルを買おうとすると高いので、KSYで他の商品とセット購入がベターだろうと思います。
ラズパイと接続は次回ってことで。
それではでは。
これ1冊でできる! ラズベリー・パイ 超入門 改訂第4版 Raspberry Pi 1+/2/3/Zero/Zero W対応
- 作者: 福田和宏
- 出版社/メーカー: ソーテック社
- 発売日: 2017/06/03
- メディア: 単行本
- この商品を含むブログを見る
ラズパイ(Raspbian Jessie)とスワップメモリ容量の変更(環境設定の続き)
過去記事についても分割・統合して整理する予定。
以前はどうだったのかよくわかりませんが、現在のRaspbian は初期設定の状態でChromium(Google 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
はトータル容量表示。
倍率指定による方法
もし倍率指定で設定する場合は。修正箇所は、
- CONF_SWAPSIZE=100 という行をコメントアウト。
- CONF_SWAPFACTOR=2 という行の行頭のコメント記号を削除
これでカーネルが認識しているメモリ量の2倍に設定される。もしGPUへの割り当てメモリを頻繁に変えるなら固定値にしておいた方がいいと思います。
注意点
もし2048(2GB)以上の値を設定するなら、CONF_MAXSWAP=2048
という行の行等のコメントを削除、等号の右側の2048
という値を4096などの大きい値にする。
このパラメータを指定しない場合、古い32ビットカーネルを考慮しているのか、2048より大きい値を指定しても自動的に2048(2GB)にセットされるので注意。
どこかのサイトで2GB以上に設定できないという話はこの設定を変更していないせいだろうと思います。
そのほか
もちろんWebサイトによってはユーザーエージェントで弾かれたりします。
スワップの容量を増やした状態でもmicroSDへのデータアクセスの最中にプチフリのような現象が発生したり、色々ツライ場面は多々あります。
コンパイルの待ち時間に暇つぶししたりする分には十分です。購入当初の目論見とは違うところで活躍していますがまあドンマイってことで。
たかだかスワップ容量の変更にグダグダと書けるとは自分でも意外ですが以上です。