2016年4月27日水曜日

ラズパイのモニタ

公式のやつ、接続超簡単でした。手順は以下
https://raspberry-pi.ksyic.com/page/page/pgp.id/4

・フレキ接続
・電源をGPIO経由で接続

以上

Ubuntu Mateでもちゃんと動きました

ラズパイ2BのAP化~続き

ちょっと前に説明したAP化ですが、どうやら不安定なので対策することにしました。できればログインしたと同時にAP立てたいし。

なにが問題かというと、起動してすぐに
sudo hostapd /etc/hostapd/hostapd.conf
を実行しても
nl80211: could not configure driver mode
nl80211: deinit ifname=(interface name) disabled_11b_rates=0
nl80211: driver initialization failed.
みたいなこと言ってきて立ち上がりません。 この状態からアダプタを脱着すればちゃんとAP化できるので、これまではそれで誤魔化していましたが、実戦投入するに当たってこれは不都合なので対策を打つことにしました。

http://askubuntu.com/questions/472794/hostapd-error-nl80211-could-not-configure-driver-mode

ここにある回答の通りです。
sudo nmcli nm wifi off (←もしダメならsudo nmcli radio wifi off)
sudo rfkill unblock wlan

sudo ifconfig wlan0 10.15.0.1/24 up
sleep 1 (←bashで実装する場合に1秒待機させるためと思われる)
sudo service isc-dhcp-server restart
sudo service hostapd restart
最後から2番目はDHCPサーバーの再起動なので、DHCP使わない場合は省略します。それで、sleep 1ってのがあるので、どうみてもbashスクリプト向けだからやってみました。問題はservice hostapd restartで、これそのままスクリプトに入れるとエラーが返されます。そこで直接サービスが再起動できるように、http://www.ksknet.net/linux/post_57.htmlを参考に
sudo /etc/init.d/hostpapd restart
としました。

他にもhostapdを入れ替える手段があるそうです。
http://qiita.com/arc279/items/21a3cda14f7dfdb267ca

http://ftp.ubuntu.com/ubuntu/pool/universe/w/wpa/

2016年4月17日日曜日

Carl Zeissが出してた「MTFの読み方」を読んでみた(4)

今回は数値を代入してどうなるか見ていきます。

被写体側のコントラストはc_object = (64-1) / (64+1) = 63/65 ≒ 0.97
これが50%で変調されるのでc_image ≒ 0.475で、これが(Max - Min) / (Max + Min)なので
0.475 ≒ (Max - Min) / (Max + Min)
(Max + Min) * 0.475 ≒ Max - Min
0.475 * Min + Min ≒ Max - 0.475 * Max
1.475 * Min ≒ 0.525 * Max
Max ≒ 2.81 * Min
Max / Min ≒ 2.81
なので像側のコントラストは約2.8です。段数に換算するとLog2(2.81) ≒ 1.49で1.5段です。

そ れで6ページの最後のグラフですが、MTFと被写体側のコントラスト比、そして像側のコントラスト比の関係です。コントラスト比の段数の極限値(被写体側 で無限の明暗差があってコントラスト比1のときの像側のコントラスト比の段数)は、光学系のMTF値をmとしたときLog2[(1+m)/(1-m)]で す。実際には有限のコントラスト比(<1で、たとえば先の例のように0.97 ≒ (64-1)/(64+1))ですが、この場合は上記の式のmのところに「被写体側のコントラスト比に光学系のMTF値を乗じた値」を代入すれば良い(少しだけmの数値が下がる)わ けです。

重要な点は
  1. 高いMTF値の差は被写体のコントラスト比が高いときに特に有意になる
  2. 被写体側が弱いコントラスト比のとき、それを像側で再現するために高いMTFは不要である
  3. とても低いMTF値では被写体側である程度以上のコントラスト比は像側のコントラスト比に影響しない。言い換えるといくら被写体側のコントラスト比が高くても、像側のコントラスト比はほぼ一定になる
という3つの点です。

具体的には次回

2016年4月14日木曜日

wiringPiでGPIOをsudoなしで実行する

別端末から接続しようとするとsudoがネックになる。特に別端末側でもラズパイを走らせて、そっち側のGPIOの入力によって(具体的にはスイッチでHigh, Low切り替えてHighになったときに)元の端末のGPIO出力を変える(スクリプトなりプログラムを実行する)というのが難しい(sudoのパスワード入力が問題になる)。そこでsudoなしでGPIOをいじれるようにしたい。

キーワードでいうと「gpio without sudo」とか「raspberry pi gpio without sudo」ってやつ。GPIOをwiringPiを使ってC言語によって操作したい時は通常sudoが必要(以下はsudoが必要としているサイト)

https://learn.sparkfun.com/tutorials/raspberry-gpio/c-wiringpi-example
sudo ./blinker
http://kaiware007.hatenablog.jp/entry/2015/07/07/024930
実行はroot権限が必要だった。
http://make.bcde.jp/raspberry-pi/gpio%e3%81%a7led%e3%81%ae%e7%82%b9%e6%bb%85python/
 sudoで実行するのは、GPIOの制御は、rootにのみ権限があるためです。
https://tool-lab.com/2013/12/raspi-gpio-controlling-command-2/
コンパイルした実行ファイルはpiユーザとして(一般ユーザ権限で)実行されますので、sudoをつけます。

しかしこれは不便!
【解決策】
前回の例にあったwiringPiSetup()またはwiringPiSetupGPIO()の代替としてwiringPiSetupSys ()を使ってバイナリを作成。また本体起動後、バイナリ実行前に
gpio export #port out
を実行する。

参考→https://www.raspberrypi.org/forums/viewtopic.php?f=33&t=16897

スクリプトでgpio export 17 outとかすればOKだし、ついでにそのスクリプトにバイナリ実行する部分も含めちゃえばお手軽。

なおwiringPiSetup()を使っていた場合はポート番号が変わる点に注意。たとえばGPIO 17の場合のポート番号は、wiringPiSetup()なら0だけどwiringPiSetupSys ()なら17を指定する。

たしかにwiringpi.comのリファレンスを見ると
  • wiringPiSetup (void) ;
This initialises wiringPi and assumes that the calling program is going to be using the wiringPi pin numbering scheme. This is a simplified numbering scheme which provides a mapping from virtual pin numbers 0 through 16 to the real underlying Broadcom GPIO pin numbers. See the pins page for a table which maps thewiringPi pin number to the Broadcom GPIO pin number to the physical location on the edge connector.
This function needs to be called with root privileges.
  • wiringPiSetupGpio (void) ;
This is identical to above, however it allows the calling programs to use the Broadcom GPIO pin numbers directly with no re-mapping.
As above, this function needs to be called with root privileges, and note that some pins are different from revision 1 to revision 2 boards.
これら2つはthis function needs to be called with root privilegesとあるので、これがsudoとしなければならない理由です。ところがwiringPiSetupSysは
  • wiringPiSetupSys (void) ;
This initialises wiringPi but uses the /sys/class/gpio interface rather than accessing the hardware directly. This can be called as a non-root user provided the GPIO pins have been exported before-hand using the gpio program. Pin numbering in this mode is the native Broadcom GPIO numbers – the same as wiringPiSetupGpio()
This can be called as a non-root userなのでsudoなしでOKということです。

そもそもなんでこんなことが必要になったかというと、前回に述べたとおりSSH経由でコマンド実行しようとしたためで、手入力でいいなら以下のように
http://qiita.com/yutaro1985/items/e01586c263fb16fec9ba

すればパスワードを入力することで実行可能
ssh -t username@IPaddress sudo ./program
だけどこれだと2回もパスワードを入力するよう(1回目はSSH接続のため、2回目はsudo実行のため)で手間

最初のSSHでログインするときのパスワードはRSA鍵で解決できる
http://ubuntu.u-aizu.ac.jp/004/index.html
http://kappa-bioinformatics.blogspot.ca/2014_03_01_archive.html

けど、sudoはどうやるか分からないのでググった

https://www.reddit.com/r/raspberry_pi/comments/3lo0gt/is_there_a_way_to_use_gpio_without_root/
http://askubuntu.com/questions/39281/how-to-run-an-application-using-sudo-without-a-password

それによるとsetuidという方法(http://www.cyberciti.biz/faq/unix-bsd-linux-setuid-file/を参照)の他に
sudo visudo
で例外指定すればいいという(ただしバイナリを直接指定する必要がある)のでやり方を調べる。

http://qiita.com/yuku_t/items/5f995bb0dfc894c9f2df
http://ryodotanaka.github.io/ubuntu/2015/02/09/ubuntu-without-passwd/

ちなみにsudo visudoで起動するのはviじゃなくてnano(なぜ?)なので操作性は問題ないけど、でも肝心のバイナリの指定が分からない。これはsudoが必要なのは、ソースの中でもwiringPiSetup()なりwiringPiSetupGPIO()だけなので、ソースを指定すればいいわけではないため。こんなのも見つかったけど、どうも動かない
https://dissectionbydavid.wordpress.com/2013/10/21/raspberry-pi-using-gpio-wiringpi-without-root-sudo-access/

グループが原因か?と思ってグループの追加方法(gpasswd)も調べた
http://qiita.com/orangain/items/056db6ffc16d765a8187
http://d.hatena.ne.jp/thegoodbadugly/20130116/1358316032
 % sudo usermod -G subversion user # ダメ!
だからこのサイトのような「usermod -G」は禁止

これらのページに沿ってgpioというグループに属させたけど、それでも動かなかった。そして最終的に先に述べた方法にたどり着いた。

ところでPythonで同じくやるにはどうすればいいんだろう。

ラズパイのGPIOを使ってカメラのレリーズをコントロールしよう

ひとまずはGPIOで2.5ミニピンジャックを制御していけばOK

目標はこんなの
https://www.zugyuuun.com/examples/io_relay.php

ひとまずはもっと簡便な構成にします。GPIOを使ったLED点灯がすべての基本。LEDで遊ぶ場合は必ず電流制限抵抗を入れるように!(うっかり忘れて1つ燃やした!!!)

手動でGPIOの動作チェック
https://tool-lab.com/2013/12/raspi-gpio-controlling-command-2/
http://mas-home.hatenablog.com/entry/2013/01/06/204616
 gpio -g mode 18 out
これで出力モードになるので、続けて
 gpio -g write 18 1
LED点灯するはず。そして
gpio -g write 18 0
で消灯。

次にC言語でちゃんとしたプログラムを書く(wiringPiをインストールする。gitとgccは入ってなかったらインストール)

http://mas-home.hatenablog.com/entry/2013/01/06/204616
http://make.bcde.jp/raspberry-pi/gpio%e3%81%a7led%e3%81%ae%e7%82%b9%e6%bb%85c%e8%a8%80%e8%aa%9e/
 gcc -o sample wiringpi_sample.c -lwiringPi
これで
sudo ./sample
でLED明滅が完成(sudo不要にする方法は次回)。wiringPiSetup()を使ったときに必要になる物理端子番号(左上が1で右下が40)とwiringPiにおける番号とGPIOの端子の番号の対応は、ここに掲載されている
http://blog.negativemind.com/2015/04/14/raspberry-pi-2-gpio-pin/
http://usicolog.nomaki.jp/engineering/raspberryPi/raspberryPi2_GPIO.html

このままだと端子の制御に使えないので、トランジスタで電子スイッチにする。
http://startelc.com/elc/elc_3_7Tr2sw.html

アイディアとしては、GPIOの出力を10 kΩ通してトランジスタのベースに入れる。このときGPIOがhighならトランジスタがONでlowならトランジスタがOFFになる。
http://www.onsemi.com/pub_link/Collateral/BC546-D.PDF

カメラの制御は一番の根元がGNDで真ん中が「半押し」でチップ(先端)が「全押し」になっているから、トランジスタのエミッタはラズパイのGNDかつカメラの「根元」にする。コレクタには真ん中 or チップを接続する。そうすればベースの電位が高いときにコレクタ→エミッタの電流が流れてショート状態になるからシャッターが切れる。

注意点は、全押しと半押しの両方がONじゃないとシャッターが切れないこと。手元のD810Aで見た限りだと全押しだけGNDに落としてもシャッターは切れなくて、半押しもGNDに落とさないといけない。ひとつの手法はコレクタに半押しと全押しの両方を同時に接続することで、もう一つの手法は、半押しに対応するトランジスタをONにしてから、そのまま続けて全押しに対応するトランジスタをONにする。

ここまでできれば制御そのものは完成したので、前に述べたようにしてAPを設置し、別の端末からSSHを通して接続し、コマンドを実行すればいいということになる。

次回に続く

ラズパイ2B+にUbuntu入れてAP化させる

OSはラズビアンが定番ですが、なんかWi-Fiが思い通りに動かなかったのでUbuntuにしました。15.10以降は簡単にインストールできるようになっていて、次期バージョンがLTSの16.04なので遊びが終わったら16.04にする予定。

https://ubuntu-mate.org/raspberry-pi/

micro SDHCは8 GBのを使いましたが、インストールが終わった時点だと4 GBしか使えない状態になっているので別のLinuxでGpartedによって8 GBフルに使えるようにします。

続いてAP化。作業に入る前にWi-FiアダプタがAP対応かチェック

http://askubuntu.com/questions/180733/how-to-setup-an-access-point-mode-wi-fi-hotspot

iwが入ってなければインストールしてから
iw list
を実行してこれで
Supported interface modes:
         * IBSS
         * managed
         * AP
         * AP/VLAN
         * monitor
         * mesh point
 が出ることを確認する。確認できたらインターフェース名をチェック
 nmcli dev status
ここで該当するデバイス名(通常だとwlan0とか簡単なのが出てくるはずなのに、どういうわけかwlx000ナントカってすごい長い名称だった)を記録する。ip aでも一覧が出せる。以降は

http://maruchan-shiro123.hatenablog.com/entry/2015/04/05/175257

を参考に
sudo systemctl stop network-manager
でnetwork-managerを無効化する。http://xmodulo.com/disable-network-manager-linux.htmlを見る限りだと、今回の手法はDebian 8以降の手法でUbuntuの手法ではないが、Ubuntuの手法が使えなかったので仕方ない。次にhostapdインストール
sudo apt-get install hostapd
さらに/etc/hostapd/hostapd.confを設定する。ドライバはnl80211で、インターフェースはテンプレのwlan0からさっきのに変更する。

設定が終わったら次はIPアドレスの設定
sudo ifconfig (iface) 192.168.xxx.xxx netmask 255.255.255.0

このIPアドレスは必ず既存のネットワークと異なるもの(既存が192.168.1.xなら192.168.2.xなど)を使うようにする。 どうやらこれだと毎回設定するようらしい(※未確認)ので、https://wiki.debian.org/NetworkConfigurationにあるように/etc/network/interfacesを設定

 あとはこれでAP化できる…はず
sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
ひとまずクライアント側とサーバー側からpingが通るのをチェックするのが良い。

次回の課題はDHCPサーバーの設定だけど、今回のAPの設置目的はルーティングじゃないから、省略してもいいかな…
http://tmtms.hatenablog.com/entry/2012/11/17/002416
http://maruchan-shiro123.hatenablog.com/entry/2015/04/05/112530

そのほか参考になりそうなページ
http://karaage.hatenadiary.jp/entry/2015/11/04/073000
http://seriousbarbarian.blogspot.co.id/2013/08/raspberry-pi-ap_8.html
http://kkayataka.hatenablog.com/entry/2012/10/19/235609
http://d.hatena.ne.jp/penkoba/20130806/1375742819
http://qiita.com/kasei-san/items/087e5b33207c214c8db6
http://taker.hatenablog.jp/entry/2015/11/02/031218
http://herb.h.kobe-u.ac.jp/raspiinfo/raspiAP.html

AP設置して接続が不安定になったら読んでみようと思う(思うだけ)
https://community.netgear.com/t5/WiFi-Range-Extenders-Repeaters/WNAP320-Disconnects-clients-frequently/td-p/381449
http://forums.techarena.in/networking-security/1430491.htm

2016年4月10日日曜日

Carl Zeissが出してた「MTFの読み方」を読んでみた(3)

引き続きMTFについて。

光学系では明部と暗部の差が「contrast」(→明暗差)と呼ばれます。より一般的な定義に基づけば正弦波の明暗差は「modulation」(→直訳で「変調」だとしっくりこないけど適切な訳がないので「変調」とする)と呼ばれます。

なぜしっくり来ないかというと、電気系で「変調」と言えば正弦波(搬送波)に信号(被変調波)を乗せることを指します。そして変調した結果、搬送波は形状が変わります。たとえばAMなら振幅が時間変化していて、その包絡線が乗せられてる信号=被変調波です。FMなら周波数が時間変化していて、その周波数とキャリア周波数の差違が被変調波です。いずれ「変調」というと綺麗な正弦波を基準にして、振幅なり周波数なり位相がズレることと関連します。光学においては「変調された後の波」が「正弦波の明暗差」ということですが、正弦波で周波数も明暗差(振幅)も一定だと「変調されてない波」、電気系で言うところの搬送波と区別がつかないためです。

このようにmodulationという単語の定義はやや疑問が残りますが、ひとまず本文に戻ります。
被写体側の変調と像側の変調の比率をとったものが「modulation transfer」(→「変調伝達」)ということになっていますが、これは平たく言うと被写体側と像側のコントラストの伝達(コントラストの差)です。これが空間周波数に対して「関数」であることから、計測結果はmodulation transfer function (MTF)と呼ばれます。この数字は0と1の間になります(完璧に伝達されてれば1でまったく伝達されずに明暗差が一切現れなかったら0で、あとはその中間値)

少し話が変わりますが、写真家は明暗差をしばしばどのくらいの絞り段数に相当するか、それは我々の目が対数のスケールで関知するものと表現すると理に適っている、による表現になれています。この絞り段数による表現で50%のMTFはどのようなことになるでしょうか。たとえば6段相当の絵(1:64の明暗比)は3段相当の絵(1:8の明暗比)になるのか、それとも1:32の明暗比(5段相当)になるのでしょうか。実は両方とも間違っていて、6段相当1:64を50%のMTFに突っ込むと1.5段相当(1:2.9)になりますが、これはコントラストの定義によるものです。

contrast = (Max - Min) / (Max + Min)

次回は実際に数値を代入していきます。

2016年4月4日月曜日

Carl Zeissが出してた「MTFの読み方」を読んでみた(2)

今回はModulation Transfer(訳すと「変調伝達」かな?)について

なぜMTFが必要かというと、実際の像は有限個の点光源の集合体というよりも無限の点光源の集合体だからです。前者は星景ですが、この場合は分布関数(PSF)で評価できますが、後者の場合無限の点光源の集合で構成される像なので、PSFはほとんど役立たずになるからです。いわゆる典型的な写真は後者なのですが、これに対しても、PSFのように像の品質(像の善し悪し)を表す客観的な指標が必要です。

そこで使われるのが輝度が正弦波のように分布している(連続的で徐々に明暗が繰り返している)パターンです。このパターンはPSFが如何であっても像が再び正弦波になる(パターンと像の間が単純な関係性になる)ため使われます。

補足ですが、正弦波チャートが「一般的な像の代表」として使われる理由は、一般的な像は無限個の点光源の集合として考えることができると同時に、無限個の正弦波の集合としても考えることができるためです。これはフーリエ級数展開をすればわかりますが、いかなる像(点光源を含む)も無限個の異なる振幅と異なる周波数の組み合わせによって表現することができます。このため像をPSFで代表するか、正弦波で代表するかの違いだけで本質は同じです。PSFでは複数の収差がそれぞれ顔をだすので、どのような収差がどのようなPSFを持つのか知っている必要があります。一方でMTFでは複数の収差の総和だけが出てくるのでどの種類の収差が原因になっているかを追求することは難しくなります。つまりPSFではしばしば「実際にはあまり影響のない要素」まですべて明らかになってしまいPSFが複雑すぎて評価することが難しくなり、MTFではしばしば「実際に影響がある要素」が結果に表れず単純すぎて評価することが難しくなる傾向があります。それでもPSFであれば絞りを変化させたり点光源の大きさと波長を変えたときにPSFがどのように変化するかを丹念に観測していくことで、MTFであれば周波数を10, 20, 40 lp/mmだけでなくもっと多種多様な空間周波数で白色光以外にも緑や橙など複数の単色光を計測することで、それぞれ十分に深い考察や分析が可能なはずです。

さて話を戻すと、正弦波チャートの方向とその周波数は像側でも変化しません。変化するのは唯一明暗の強度差です。この理由はPSFの応用で、明部の光が暗部に重なるために暗部の黒が浮いてしまうためです。

5ページにある図は正弦波パターンの断面図の一例です。1 mmあたり20サイクルなので1サイクルは50 um、赤と青の曲線はそれぞれ赤点と青点を点光源として考えたときの輝度分布の断面図です。青点で示された位置における理想的な輝度分布は実際には青い曲線のようになります。この青い曲線を見ると±25 umの位置、理想的な輝度分布では谷になっている(→真っ黒になっている)箇所にも多少の光が分布していることが見て取れます。同様にして赤点における点光源を仮定して計算される輝度の分布は、その輝度こそ小さいものの-25 umに近いため青点を基準にした点光源からの分布よりも実質的に強いものになります。

つまり暗い場所(-25 umなど「谷」になっている箇所)における像側での輝度の強度は隣接する空間から漏れてくる輝度の合計値になっています。結果として像側における(変調された)強度分布(imageで表記されてる○印の明暗差)は弱くなってしまいます。正弦波チャートの暗い部分は(先に述べたように)諸収差によって明るくなり、また明るい部分は暗くなります。

今回はここまで。次回はMTFが落ちてくると何が起きるのか、複数の被写体側強度にたいする像側の強度という観点から解説していく箇所です。