本文へスキップ

空想DIYを紹介するページです。


PowerShot S95 でCHDK

PowerShot S95は撮像素子にCCDを使ったコンデジです。
CHDK(Canon Hack Development Kit)は、CANONのDIGICチップのハッキングソフトです。
元々機能全開に近いS95ですが、開放されていない機能はあります。
封印されている機能をハッキングしてこじ開け使ってしまおう、というものです。

お約束:メーカーが実際には存在する機能を使えないようにしているのには理由があります。
より高価な機種との差別化とか、サポートが面倒とか、個体差管理とか、特許の問題とかいうのもあるでしょうが、
ハードウェアを壊しかねないとか、未完成でバグるとかいうのもあるはずです。
これを無理矢理こじ開けて使ってカメラを壊しても、メーカーは保証してくれません。
もちろん私も一切関知しません。
全て自己責任で出来ない人は、けっして真似をしてはいけません。

何ができるか

たとえば、


起動法の選択

CHDKのロードは、ファームウェアのアップという形で行います。
実際にファームウェアを書き換えるわけではなく、ファームウェア書き換えソフトに化けたCHDKを
書き換え手順によって起動させるのです。
ですから、電源を切ったら元に戻ってしまいます。
電源を入れるたびにCHDKを起動しなければいけません。
自動的にファームウェア書き換えを起動させるには、SDカードがFAT16でフォーマット
されていなくてはなりません。つまり、8GB以上のSDカードの場合は
パーティションを切って、一部をFAT16、残りをFAT32にする必要があります。
パーティションを切ると、複数のドライブが見れる高級なカードリーダが必要になります。
また、自動的にファームウェア書き換えを起動させるには、SDカードを書き込み禁止にしなくてはなりません。
CHDKは書き込み禁止状態のSDカードでも書き込みできますが、
カードリーダはそうはいきませんので、書き込み禁止スイッチを頻繁に操作する必要があります。
つまり、自動的にファームウェア書き換えを起動させるのは面倒なのです。
幸いPowerShot S95でCHDKが必要な機能は多くはないので、必要な時だけ手動で起動することにしました。


インストール、起動

CHDKのインストール方法を説明したホームページはたくさんあるので、詳細説明は割愛します。
自分のカメラと機種名、バージョンが完全に同じのファイルをダウンロードして、解凍し、
SDカードのルートに置くだけです。
(機種名は海外での名前です。IXYは場合は日本と海外で機種名が違うので、読み替えが必要です。)
ダウンロードページに書かれているバージョンは、CHDKソフトのバージョンではなく
カメラのハードウェアのバージョンですので間違えないようにしましょう
(カメラのバージョン毎にメモリーテーブルのアドレスが変わるらしく、バージョン毎に専用のCHDKがあります。)。
起動は、電源ボタンではなく再生ボタン長押しで起動し、MENUボタン、
上に移動(つまり一番下に移動)、Firm Updateの実行(FUNC.SET、OK選択)です。
CHDKのロゴが出たら起動完了です。

全般的な使い方

CHDKが起動したカメラには2つのモードがあります。
呼び名が良くわからないのでここでは「<ALT>モード」と「撮影モード」とします。
プリントボタンを押すとモードが切り替わります。
「<ALT>モード」のときは画面の下(画面下部)に<ALT>と表示されます。
「<ALT>モード」では、設定メニューの表示、入力と、スクリプトの起動、終了が出来ます。
「撮影モード」はスクリプトを使わない撮影一般です。
「<ALT>モード」から「撮影モード」に入ったときは画像再生状態です。
ここで再生ボタンを押すと電源が切れてCHDKが終了してしまいます。
ここではシャッターを押して撮影可能にします。
「<ALT>モード」でシャッターを押してしまったらスクリプトが開始されますが、
初期状態では空のスクリプトが入っていますから、延々何もしません。
もう一度シャッターを押してスクリプトを終了します。

シャッタースピードをハックしてみよう

CHDKはカメラの中の変数テーブルを書き換えます。
シャッタースピードが自動で調整されるモードでシャッタースピードの変数を書き換えても
すぐに別の値に書き換えられてしまい意味がありません。
従って、シャッタースピードをハックしたかったら、シャッタースピードは手動状態でなくてはなりません、
S95では、シャッター優先AE(Tvを選択)を使いましょう
(シャッタースピードが手動になるならば、他のモードでも構いません)。
では、シャッタースピードのハック手順です。
「<ALT>モード」でMENUに入り、1行目のExtra...を選択します。
最初のDisable...は、シャッターボタンを半押しした時に、
CHDKの設定を反映させるのを止めさせるかどうかの設定です。
Disable=半押ししなくても止めさせるのを禁止する、を選択します。
分かりにくいですが、DisableのときはCHDKがハックするということです。
撮影するときはほぼ必ず半押しはするので、
Off=半押しすると止めさせるのを禁止する、でも良いです。
On=半押しした時に止めさせる、だとCHDKの設定は機能しません。
3行目のOverride...がシャッタースピードの設定値です。
単位は5行目で選択し、Ev stepの時は秒単位になります。
最高速度1/100kまで設定は出来ますが、実力は後述の通り1/4000位まででした。
まあ、標準では1/1600までしか設定できないようになっていますから、
かなり速くできます。
4行目のValue factorは設定値を書き換えるかの設定で、
Offは書き換えない、1は書き換えるです。(数字は書き換える場合の比のようですが、
シャッタースピードの場合は選択できるのは1だけです。)
他の設定値書き換えとの組み合わせもできます。
書き換えたい項目以外はOffにしておきます。
設定が終了したらMENUボタンでメニューを終了して、プリントボタンで「撮影モード」に入り、
シャッターを押して撮影可能状態にします。
1/100kとかは本来サポートされていない値なので、標準の表示には反映されませんし、
撮影した画像のデータにも書き込まれません。
代わりに画面左上に表示されます。
さて、何を撮りましょうか。ミルククラウンや電動ドリルくらいなら1/1600でほとんど静止しますから、
より高速な撮影が必要になるのはハチドリとかとんぼの羽の動きあたりでしょうか。
そんなものは準備できないので、とりあえず電子回路で複数のLEDを点滅させて実力を測定してみました。
写真は、1/1600で撮影した5kHz、10進カウントのLED写真です(4017を使ったごく簡単なリングカウンターです)。


部屋はかなり暗くしてるのに背景が写っているのはさすがです。

実際には1つづつ左から順に点灯しているのですが、シャッターが開いている間に光ったものは全て写ります。
5つ点灯しているように写って、5つめがやや暗いということは、4/5000〜5/5000の範囲にあるということ。
つまり、1/1250〜1/1000の間にあるということで、設定値の1/1600は出てないですね。
純正速度にしては結構ずれてます。

下は、CHDKを使って1/40000設定にして、20kHzの場合です。幾ら設定値を高くしても、
ハードの限界以上には上がらないので、これでハードの限界が見れるはずです。


4/20000〜5/20000(1/5000〜1/4000)の範囲にあるようです。
ということで、実力シャッタースピードは1/4000強でした。
1/1600設定でもそうですが、高速シャッターの時は周辺の方が暗くなるようです
(被写体までの距離が近いから周辺歪補正が悪さしてるのかな?)。
ストロボも使えますが、露光は不足しました。
なお、当然ですがCHDK使用中はオートオフは効きませんので、電池の減りには注意が必要です。

動画中に光学ズームやAFを使えるようにしよう

光学ズームは、CHDKではデフォルトで有効になっていますので、
CHDKを起動するだけで使えるようになります(MENU、Extra...がOnでなければ)。
AFを使えるようにするには、CHDKの設定画面で"Video parameter"を選択し、
その中の"AF key"という項目の値を[Shutter]に変更します。
動画撮影中にシャッターボタンを半押しするとAFが働きます(自動では動きません)。
なお、光学ズームやオートフォーカスをすると、モーター音が録音されます。

深度合成のために自動フォーカス送り連写する

Extra Photo Operationsメニューの中のBracketing in continuous modeを使います。
Subj. Dist. Bracket Val.(焦点距離の増加値)=1以上
Valume factor(焦点距離の増加レンジ)=Off以外
Bracketing type=+
その他の機能は全てオフ
とします。
例えば焦点距離を5mmステップで増加したければ、
Subj. Dist. Bracket Val.=5
Valume factor=1
です。
20mmステップなら
Subj. Dist. Bracket Val.=2
Valume factor=10
です。
「撮影モード」で撮影可能にしたら、連写モードにして、リング機能の設定を焦点距離にします。
Bracketing typeを+にしたので、順次増加です。従って焦点距離を最短に設定して
連写開始します。シャッターを押し続けていると、順次焦点距離が増加しながら撮影されます。
シャッターを押し続けたくない人は、他の機能と組み合わせてください。

深度合成のスクリプト

(深度合成=フォーカス合成、焦点合成、多焦点合成、多重フォーカス合成、focus stacking、DoF Stacking (Depth of Field Stacking))
CHDKにはスクリプトがあり、カメラの動作を自動化できます。
例えば、10秒おきに延々シャッターを切り続けるとか、雷が光ったらシャッターを切るとか、
いろいろ出来るようです。
深度合成は、例えばフォーカスのみ異なる複数の画像に対し、
各画像の各ピクセルにコントラスト評価係数を掛けておき、平均をとることで実現できます。
極端な話、コントラスト評価係数を1に固定して(つまり何もしないで)
ただピクセル毎に全画像の平均をとっても、多少コントラストは甘くなりますが、深度合成にはなります。
しかし、S95には色々なエフェクトがありますから、コントラスト強調的なエフェクトを掛けて
自動フォーカス送り連写で撮影した画像を平均合成すればかなりまともな深度合成になるはずです。
深度合成ソフトでは、画像のぶれ補正がありますが、三脚に固定して自動フォーカス送り連写で
撮れば、これはしなくても良いでしょう。手振れ防止は切っておいた方が良さそうですが。
ということで、スクリプトでこれを行うのは可能そうです。
しかし、CHDKでピクセル毎に全画像の平均を取るにはRAWでなければならないようです。
RAWは転送時間が掛かるので、10〜20枚を合成するととても時間が掛かるでしょう。
また、カメラを通さない素のRAWは周辺歪みまくりだそうですので、結局パソコンでこれの補正をやらないといけなそうです。
カメラ本体でこれをやるメリットを感じなくなったので、スクリプトの作成は止めにしました。


追記

後日思い当った事があります。
CANONの仕事で、1/1600の設定で1/1250〜1/1000というのは、ずれ過ぎではないか?。
そして思いつきました。
明るく見えるからといって点灯時刻のほぼ全範囲が写っているとは限らない。
点灯している5個の内、左端のも点灯期間の内のごく一部なのではないか?。
とすると、3/5000〜5/5000となって、1/1600もあり得ます。
しかし、これでは10個くらいのリングカウンターでは測定精度が出ないので、何とも言えなくなります。
ということで、LED 100個のリングカウンターを作りました。
4017を2個使って、2個目のクロックを1個目のキャリーアウトに接続すると、
1個目が1巡すると2個目が1つ移動するようになるので、
1個目で列、2個目で行を駆動し、10行10列で100個が順番に点灯するようにしました。

 

左から右に1つづつ点灯し、右端に来たら1つ下の行の左端に移動し・・・右下まできたら左上に移動する、
となるように接続しています。
(正確には、電源の置き具合の都合で横向きに置いて撮影して、画像処理でもとの状態に回転させています。)

ジグも作らずに、いい加減に組み上げたので、LEDの向きがバラバラで、写っている明るさが不揃いですが、
とりあえず写る個数は数えられるので目的は達成できるようです。
1/1600設定で100kHzで点灯させて87個見えますので
(シャッターの切れ始めの部分でなぜか1個離れて写るのですが、どの位置で写ってもそうなので、
これはシャッターの特性かもしれません)、
85/100k〜87/100kということで、1/1176〜1/1149となりました。
(かなりの枚数を撮ったんですが、ちょうど端から始まる(あるいは終わる)のが撮れませんでした。)

 
やはり1/1600は出てないですねー。
シャッターの後半は次第に暗くなっているように見えるので、暗くなり始めまでをシャッター速度と定義しているのかしら、
しかし1/1600っていったら、100kHzの画像で63個分なので、実際写っている画像を見る限り、これはあり得ないですね。


同様にCHDKを使って制限を解除した場合は、300kHzで66/300k〜68/300kで、1/4545〜1/4412でした。
一山幾らの骨董LEDで3.3μsの点灯ではさすがに写りが暗かったので、個数カウントのために画像処理しています。
右下は処理前の画像です。

  



このページの先頭へ