プロトが動いたあと、正式版にするため いろいろな作業をしていたが、意外にうまく行っており、今は実際に使ってみて問題がないか確認中である。

光センサで取得した部屋の明るさに基づいて自動調整されるサブディスプレイ(EIZO S170)の輝度は、概ねメインディスプレイ(同CX241)に合っている。微妙に明るさが違うことはあるが、同じウインドウを二つのディスプレイに またがって表示して比べたりしなければ気にならない。(自分の性格のため、一旦気にし出すと気になってしまうのだが・・・)

ただ、視覚特性の影響や階調特性や発色の違いなのか、色や表示の明るさによって明るさの差が違って感じることがある※(例: 無彩色(白・グレー系)でも、ある色(明るさ)がCX241とS170で同じ明るさに見えても、それより暗い色が なぜかS170のほう明るく見える場合がある)ので、完全に合わせるのは無理そうだ。

※これは実は明るさでなく、色の違いによるなのかも知れない。二つのディスプレイの発色・色温度などが異なるので、無彩色でも、明るさによって色が違って見え、それが明るさの違いと認識されるのではないだろうか?

それから、センサ基板(YL-40基板: 以下、「基板」)に載っているので「ついで」に試した温度センサは、誤差(真の室温が分からないので、正確には「本物の温度計との差」)はあるものの、「それなりに」室温が取れるようになった。

 

今回の一番大きな改良は、基板をケースに入れ、それをスタンドに付けて設置を安定させたことだ。また、さまざまな部屋の明るさで画面の明るさの違いをチェックして、センサの明るさ値からS170に設定する輝度を求める近似式を改良した。

不思議と、近似式はグラフの形状から予想した指数関数でなく、3次の多項式が合った。指数関数(ただし、輝度がほぼ一定な暗い領域(概ね、明るさが30以下)を直線近似にした)のパラメタをいろいろ調整しても、明るい領域(概ね、明るさが60以上)で輝度が大きくなり過ぎてしまう。画面の輝度は無限に明るくできないから、CX241は指数関数を使っていないのだろうか。あるいは、指数関数は処理が大変なので、多項式にしたのだろうか。いや、そうでなく、視覚的に現状の特性がいいから こうなっていて、それがたまたま3次に近いのだろう。

 

今回使ったハード(物)は全部手持ちのものの再利用で済ませた。基板のケースはエーモンの部品(車用電装部品? 古過ぎて何だったかは不明w)が入っていた小さいプラケースを使った。基板を支えるスタンドは、オーディオの特性測定・調整を始めようとした時に買ったけど、小さ過ぎて今ひとつで使わずに死蔵していて何度も捨てようと思って居たマイクスタンドを使った。基板をスタンドに付ける台は、2年くらい前の猫のカレンダーのベース(台)を使った。そのカレンダーを挟む溝の幅がスタンドのポールの直径に近く、丁度良かった。※ ただ、ポールだけだと少し低かったので、以前エアコンの温度の微調整に使おうとして断念した灯油ポンプのパイプ(この直径も丁度良かった)の切れ端(写真上部の半透明の筒)で延長した。

※スタンドに添付のマイクホルダーがあれば、角度が自由に変えられて更に都合が良かったのだが、捨ててしまったようだ。

なお、基板を垂直に設置したら若干明るさが弱くなったので、プロトのように少し(15°くらい?)上に向けて取り付けた。※ 角度を付けるための台には、楽天モバイルのポケットWi-Fiの緩衝材が役に立ったw

※光センサが多少暗くても輝度の自動調整は可能だが、折角調整(較正)した明るさから輝度への変換式のパラメタが変わってしまうので、なるべく合わせたかった。

基板とPCの接続ケーブルはUSBケーブルの両端のコネクタを切って作った(本当は、電話線のような もっと細くて柔らかいものが良かったが、手持ちにはなかった。電話線は余るほどあったが、随分前に全部捨ててしまった)。基板とケーブル間のコネクタは、アンプで余ったXHコネクタの延長コードを使った。

ケースはいろいろ迷った。最初はSDカードケースを考えていたが、基板の部品の背が高くて入らず、エーモンの薄目(高さ約1.2cm)のケースを試したが まだ無理があったので、同じくエーモンの厚目(高さ約1.7cm)のケースにした。それでも幅が少し足らなかったので、右側のPC接続用ピンに挿すコネクタのカバーを切り詰め(写真右側の黒い長方形。ただし、その後 気が変わって使わなくなった)、左側のアナログ入力用のピンを少し上に曲げて収めた

ケース(基板)の取り付け方(オリエンテーション)もかで迷った。最初はコードの引き回しの関係で縦にしたが、光センサがジャンパピンのカバーの陰になる(左側からの光が遮られる)気がしたので(写真: カバーは中央辺りの赤い四角、そのすぐ上に光センサ)、カバーを外して「肉抜き」した。(写真: ケースの中央左端にピン、そのすぐ右の丸が光センサ) ただ、この状態だとピンの保持が完全でなくて外れやすいので、あとでちゃんとする必要があった。そうこうするうちに、やっぱり横に戻したので、カバー付きのものに戻した(が、それもあとで使わなくなる)。

それから、ケースでなくても基板をカバーすればいいのではと思って、少し厚手のビニルで覆ってみた。が、ビニルを台に付けるために折って居るところに埃が溜まりそうだったので止めてケースに戻した。更に、厚いケースは不格好に思えたので、いろいろ無理して薄目のケースに収めた出来上がりは、なんとなく(実物を見たことはないが)可搬式オービスを連想させる。

※上記のアナログ入力用のピンとジャンパピンを2-3mmくらい切り詰め、ボリュームの脚を折って付けて低くした。ボリュームを低くしたあと、なぜか抵抗の両端(電源とGNDに繋がっている)がショートしてしまって起動しなくなったが、付け直したら直った。電源側がGNDのパターンに繋がってしまったのか。

更に、ジャンパピンはピンのカバーが高いので、光と温度センサのジャンパのパターンをリード線でショートしてピンを不要にした。ボリュームは滅多に使わないので信頼性はなくて良いから、ジャンパはカバーを外したピンの上部を折って低くしたものを使った。

また、幅を狭めるため、PC接続用ピンとコネクタは使わず、コードを半田付けし、外にコネクタ(XH, プラグ)を付けた。なお、電源スイッチは無意味なので付けないことにした。漏れ電流のせいか、なぜかoffでも動いてしまうので・・・

あと、温度センサ(後述)の室温への追従性を向上させるために、左右両端に通気口を開けた。まあ、気休めの気はするが・・・

それから、試している時に気付いたが、ケーブルの力が掛かって、ブルタックでケースに固定した基板の上部が浮いてしまうので(下部はボリュームなどがあって隙間がないので、動かない)、蓋に届く厚さの緩衝材(上記の楽天のもの)で上の角を押さえた

 

輝度自動調整プログラムは、基本的な動きは最初の長ーいコマンドと同様で、さまざまな明るさで確認して近似式の係数を調整した程度である。現状の、YL-40基板で測定した部屋の明るさとCX241の画面輝度(青)、それに合うように本プログラムで設定したS170の輝度(赤)のグラフを次に示す。

YL-40の明るさとCX241, S170の輝度

通常使っている明るさの領域は点が密集した辺りで、S170の輝度が変化する範囲は約15-22%と大きくないが、昼にカーテンを開けて明るくすると、右側の明るい領域になる。また、夜に照明を消した場合などの暗い領域(左側: グラフにはないが、その領域での確認もしている)ではCX241が自動調整する輝度に下限(約50cd/m2)があるため、S170も14%までしか下げられない(まあ、際限なく下げたら見えなくなるがw)。あと、前回も同様なことを書いたが、CX241はOSDで表示している輝度と実際の輝度が異なることがある(グラフで、同じ明るさで点が上下にあるところ)ようで※、その場合にはS170の輝度は合わず、「わずかに違う」状態となることがある。

※想像だが、CX241が輝度の調整速度が遅く(ユーザに急変を感じさせないため?)、OSDで見た時には まだその輝度に達していないのかも知れない。

輝度の調整以外では、随分 機能追加・改良した。例えば、測定値の移動平均(4点、約2分分)を取るようにして、頻繁・無駄に輝度を変更しないようにした。また、ディスプレイのOSD(メニュー)で手動で変更した輝度を自動調整に加味できるようにした(具体的には、変更分を加算して設定する)。その際、PCの省電力機能(DPMS)やスリープからの復帰時にディスプレイが消灯状態から点灯した時に自動的・一時的に画面が明るくなって輝度が大きくなっているのを、手動での変更とみなさず無視するようにした。

他には、起動時に基板やS170の接続をチェックし、接続されていなかったらエラーで終了するようにした。

あと、全くの お遊びだが、起動時と毎回の測定後にLED(基板のIC PCF8591のDACに繋がっている)を一瞬弱く点灯させて、動いているのが分かるようにした。LEDに関しては、電源LEDが明る過ぎて目障りかつケース内面に反射して光センサに影響を及ぼしそうなので、パターンカットして点灯しないようにした。当初はLEDの上にハリ玉を被せて見えないようにしたのだが、明る過ぎるためか光が通ってしまうので、点かないようにした。

 

「ついで」の温度測定については、前回参考にしたGayの本に書いてある計算式(下記)を用いて、センサ(サーミスタ)の値から実際の温度を計算するようにした。※ 恒常的な誤差が約1℃*あるのと**、部屋の気流が かなり影響するが、定常状態になれば概ね(本物の)温度計の値に近い温度が得られることが分かった。

サーミスタ(NTC)の温度T(K)を求める式: 1/T= 1/T0 + 1/B * ln(R/R0)

定数・係数

    • R: 温度Tでのサーミスタの抵抗 (Ω)
    • B: サーミスタの「B定数」
      • 試行値: 3947
    • R0: 温度T0(「室温」)での抵抗 (Ω)
      • 試行値: 当初: 4700 → 現在: 5000 (Ω)
    • T0: R0の温度, 「室温」 (K)
      • 試行値: 25℃ (= 298.15 (K))

※明るさと同様に移動平均(8点、約4分分)して、値の変動を抑えた。

* その後、いくつかの室温と比較し、恒常的な誤差(オフセット?)を1.44として補正すると、更に(本物の)温度計に近い値となった。上の式を見ると、このオフセットはR0の仕様との差で生じているのではないか。実際、上の式で、Rを元の4.7kΩと別の情報で見た5kΩで比較すると、現在の通常の室温約28℃での差は約1.4℃と上のオフセットに合うので、現在はR= 5kΩ, オフセット= 0で試している。

なお、別品種のBやR0でも試したが、良い結果は得られなかった。 (8/7 10:30)

**書いたあとで気付いたが、基板に載っているサーミスタの仕様が分からないので、別のページに書かれた値("YL-40 #1"の、25℃での抵抗値=4.7kΩ, 係数B=3977)を使って計算しているのだが、実はそれも正しくないために温度の差が出ている可能性は否定できない。

ただ、ADCの量子化ステップ(室温では約0.6℃相当)の関係で※、室温との差が、大きい時(例: 室温がじわじわ上がっている時)には1℃近くなるので、エアコンの微妙(「自分にとって快適な」の意味)な調整には向かなそうだ。とは言え、そもそも、室温を正確に測っても、それでエアコンの微妙な調整ができる訳では全くない(物理的な温度よりも体感温度が重要)から仕方ない。まあ、大まかな室温が分かって自動的に記録できれば、何かの役に立つかも知れない。

※この点は、回路を変更して狭い温度レンジにADCのレンジ(0-255)を割り当てるようにすれば(要するに、「倍率を上げる」)、もう少し分解能(精度と同じではない)が上げられると思うが、具体的にどうすればいいかは まだ分かっていない。

→ その後検討して、サーミスタに直列に接続されている抵抗(R1, 1kΩ)を大きくすれば、ある程度 分解能を上げられることが分かった。

使用する温度範囲でセンサ出力をADCの入力レンジに最適化するには、ADCの前で増幅する必要があるが、アンプを入れるのは面倒だし、「ついでに」やっていることなのに、そこまでする意味がない。もしかしたらADCにPGA(プログラマブル・ゲイン・アンプ)が入ってないかと思ったが、さすがになかった。

計算では、R1を4.7kΩにすることで、通常の室温(10-40℃)でのADC出力レンジは元の46から82(cnt※)に広がり、分解能(上記の量子化ステップと同じ)が約0.7℃/cntから約0.4℃/cntに改善できることが分かり、実際に抵抗を換えて(限られた室温であるが)試してみたら、確かに分解能が向上したようだ。

※特定の単位がないADC出力の単位の書き方が分からないので こう書いたが、何かの個数ではない。

分解能を調べるのと同時に精度も調べたのだが、やはり固定した誤差(偏差)が気になり、計算式を検討したら、サーミスタのB定数と直列抵抗の誤差が考えられた。試算では後者のほうが効くようだったので、いくつかの値を試したところ、今のところ、-0.3%の補正(抵抗が0.3%大きいと想定)が良い感じで、限られた室温での短時間での評価ではあるが、本物の温度計との差は概ね±0.4℃以内となり、冬など条件が異なる場合でもこれなら、充分に満足できそう(「許せる」)だ。 (8/7 17:18)

ところが、いつものように、そう やすやすとはうまく行かない。温度の誤差が大きくなる場合があるのだ。通常は大きくても0.4℃なのだが、なぜか0.8℃くらいになることがあって、どうも許せない。観察していると、起こりやすい温度範囲がある。温度が上がる場合と下がる場合に(起こりやすい温度範囲はそれぞれ異なる)しばらく起こる。いろいろ検討し、試行錯誤しているが、何となくADCの性能(精度)に依存するような気がしている。 (8/9 7:55)

その後、自動測定・記録しているセンサなどの値をグラフにすればおもしろいと思い、Linuxの管理ソフトMuninで取り込んでグラフにするようにした。最初は温度(室温)だけだったが、ついでに部屋の明るさとそれに合わせて設定したS170の画面の輝度も出すことにした。今までのグラフを下に示す。

明るさ(グラフの緑線)は外(天気や日照)やカーテン・照明の状態によってダイナミックに変わるので、結構おもしろい。当然ながら、画面の輝度(グラフのオレンジ線)は 明るさに合わせて変わる。室温(グラフの青線)は上記のように調整・確認中である。 (8/7 17:18)

 

というところで、あとはケースやスタンドやケーブルをちゃんとする(接着・固定や補強や外見の改善)こと、プログラムの細かい改良などである。これ以上買うものはなさそうだから、結局150円くらいでできた。

書いて気付いたが、「細かくない」問題として、CX241の輝度(自動調整のベースとなる輝度)を手で変更した場合には、当然ながらS170の輝度が合わなくなってしまう。S170の輝度を手で調整して合えばいいが、非線形なので、そうも行かない気がする。CX241の輝度を変更することがないので実害はないが、気分的には良くない。

この辺りは近似式の較正・調整の話に関連し、例えばディスプレイの設置位置や向きを変えたら再調整が必要になるかも知れない。マウスでグラフィカルにできると手軽だが(→ イメージ)、そういうものを作る気合いは なかなかないw

 

結局、今回の一番の効果は、寿命になったサブディスプレイ(M170)をスペアだったS170に交換するに あたり、格安で同等の機能(自動輝度調整)にできたことだ^^ そもそも、今はスクエア型のディスプレイは入手困難なので、(自分のスペアだから無料で)交換できたことだけでも良かった。

そして、PCにI2CのADC/DACを繋げられたので、今後はRaspberry PiやArduinoなど用のI2Cのセンサ類(既にADCがあるので、なんならセンサの素子単体でも)が容易に使えそうだから、楽しみが増えた。何をするかは別としてw

 

PS. YL-40基板は手軽でいいんだけど、僕にしてみれば いろいろ甘い。例えば、本文に書いたように、LEDが明る過ぎるとか、サーミスタの分解能など、抵抗の値の決め方が安直だ。抵抗が小さくて(ほとんど1kΩ)、流れる電流が大き過ぎる。電源スイッチを切っても電源LEDが付いたり回路が動作するなんてのは、その証拠だ。確実には動くんだろうけど、僕の好みではない。

PS2. 上を書いたあとで回路図を見ていて、電源スイッチがoffでも(電源を供給していなくても)動く理由が分かった。I2Cのclockとdataが、(プルアップのためだろうけど、)それぞれ10kΩでVcc(電源)に繋がっており、VccとGNDには平滑コンデンサが繋がっている。そうすると、clockやdataの電圧は変動するだろうが、コンデンサで平滑化されて「電源」になってしまって、IC PCF8591が動くのだ。PCF8591の動作電圧は広く、低消費電力であろうから、そういう弱い電源でも動いてしまうのではなかろうか。

まあ おもしろいけど、「ちょっと」だ。だったら無電源で(clockとdataの電力で)動くようにすればいいのに・・・

とは言え、10kΩならプルアップとしては適当な気がするから、ちゃんと対処するのは難しいのかも知れない。33kとか47kΩくらいにする? それでも動いちゃうかもね。

  •  0
  •  0

3件のコメント

  1. naoki:

    エントリの内容とあまり関係なくて申し訳ないですが、もうここまで来たら、車の両サイドに「lentoの科学サービス」と貼ってはどうかと思ってしまいました。

    •  0
    •  1
  2. れんと:

    ●車ですかーwww

    痛車的にしたりしてw でも、さすがにディーラーに行けなくなりますw

    •  1
    •  0
  3. れんと:

    ●あと、乗る時は常にツナギとか^^ 楽しそうですが、面倒ですw

    •  0
    •  1

コメントを書く

名前    

メール 

URL