micro:bit 環境光センサ(micro:bit周囲の明るさ測定,光源検出)

2021.10.30 Coskx Lab  

1 はじめに

micro:bitは周囲の明るさを測定することができます。
LED画面を構成しているいくつかのLEDの電圧減衰速度を測定し,明るさを推定しています。
明るい:255,暗い:0として,明るさを取得することができます。

2 使用環境

3 周辺の明るさ測定テスト

MakeCodeプログラムにおいては,周辺の明るさは「明るさ」ブロックで取得できます。
周辺の明るさと言ってもLED画面側の明るさです。
事前テストで,LEDを点灯しているときでも明るさ測定が可能であることがわかりましたが,暗いときに0になりませんでした。
次のようなプログラムで,動作を調べて見ました。明るさ推定値はバラつくことがあるので平均値を求めています。



(1)このプログラムを動かしながら,LEDを覆って,どのLEDが働いているか調べたところ,上部の5つのみが明るさ測定に関与していることがわかりました。



(2)周辺の明るさを一定に保ちながら,測定に関与している5つのLEDを覆って,1つずつ覆いを外していったときの明るさ値は次のようになりました。5つ全てを使用した方が高感度で計測できることがわかりました。

LED 1つ有効のとき   63
LED 2つ有効のとき  155
LED 3つ有効のとき  187
LED 4つ有効のとき  204
LED 5つ有効のとき  214

4 光源検出

micro:bitの周辺光検出機能を使って,光源検出方法を検討しました。
紙で四角断面の筒(導光器)を作って,測定に関与している5つのLEDの前に取り付けてみました。
micro:bitのLED面に対して,上下方向に対して,せまい範囲でのみ大きな明るさ値を得ることができました。(光源が正面に来たことがわかります。)
思い通りの指向性を持たせるためにはさらに導光器の工夫が必要でしょう。






5 まとめ

micro:bitの周辺光の明るさ検出を試しました。
検出に関与するLEDは上方の5つのみでした。
LEDは5個全部を使うと良いでしょう。
LEDの前に導光器を付けると,検出すべき光の方向を狭めることができ,光源検出もできるようになります。

注意 環境光センサを連続使用するときは,最低でも20msは間隔をとる必要があります。micro:bit側の測定値更新が20msほどかかるので,それ以下の間隔での測定値取得では,同じ値を取り込んでしまうことになります。特に測定値の平均化のときは,平均化が無意味になってしまうので注意が必要です。(「補足 短インターバル繰り返し測光」参照)



補足 短インターバル繰り返し測光

周辺光センサは人間の目には確認できないくらいの時間間隔でLEDを操作しています。 LEDに電気エネルギを蓄えて,減衰速度を測定しているようです。
そのため,ある程度のインターバルが必要となります。(実は舞台裏でセンサ値の更新周期が設定されています。)
micro;bitを絶えず動かしながら(取得されるべきセンサ値は不規則に変化するはず)
 (1)インターバル無し
 (2)インターバル10ms
 (3)インターバル20ms
で16回連続測光し,測定値を確かめてみました。

(1)インターバル無し(測定間隔ほぼ0)
16回の測定するときは,時間のかかる測定値表示をせず,配列に測定値を保存して,最速で測定します。測定終了後に,配列に保存されていた測定値をコンソールに表示する手法をとりました。
測定時は,Micro:bitの方向を変化させ,毎回異なる値を取得できるようにしています。




その結果は次の通りになりました。
16回の取得データはすべて同じ値でした。
データの更新が間に合わず,同じデータを受け取り続けていたと考えられます。 これでは使えません。
(改行を省き,表示を横に並べて表示しています)

started 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109 109

(2)インターバル10ms(測定間隔10ms)
16回の測定するときは,時間のかかる測定値表示をせず,配列に測定値を保存して,10msのpause(一時停止)を行っています。測定終了後に,配列に保存されていた測定値をコンソールに表示する手法をとりました。
測定時は,Micro:bitの方向を変化させ,毎回異なる値を取得できるようにしています。




その結果は次の通りになりました。
同じデータが2回ずつ続けて得られています。
データの更新が間に合わず,同じデータを受け取ってしまうことがあると考えられます。 これでは使えません。
(改行を省き,表示を横に並べて表示しています)

started 50 50 51 51 53 53 55 55 59 59 62 62 64 64 65 65

(3)インターバル20ms(測定間隔20ms)
16回の測定するときは,時間のかかる測定値表示をせず,配列に測定値を保存して,20msのpause(一時停止)を行っています。測定終了後に,配列に保存されていた測定値をコンソールに表示する手法をとりました。
測定時は,Micro:bitの方向を変化させ,毎回異なる値を取得できるようにしています。




その結果は次の通りになりました。
同じデータが繰り返し取得されることなく,測定できていると考えられます。
(改行を省き,表示を横に並べて表示しています)

started 99 105 107 110 110 92 121 137 144 139 131 94 125 56 76 73

このテストから,環境光センサでの測光には,20msほどのインターバルが必要なことがわかりました。
なお,「ずっと」ブロックでは舞台裏において20msのpause(一時停止)が行われているため,「ずっと」ブロック中ではプログラム中にpause(一時停止)を書かなくても正しく測定できます。