ATtiny10で光センサーモジュールを作ってみた。

少し前にLEDを光センサーとして使う方法を投稿した。

LEDを光センサーとして使う。

この方法はCPUやLEDのスペックに大きく影響される。色々試して見た結果、AVRでは動作したがESP-WROOM02/32ではGPIOの入力インピーダンスが低すぎるのか全く使い物にならなかった。また、AVRでも数百M以上と思われる超高インピーダンス状態での動作となるためノイズを拾いやすく扱いがかなり面倒でもあり気楽に使うのはなかなか難しいものがありそうだ。

ただダイナミックレンジは広いようで感覚的には最大5万ルクス~最低1ルクス未満もいけそうな感じではある。市販の光センサーなどと比べても特に暗い領域での感度が良さそうなので色々応用は出来そうな気がする。なので、なんとかより気軽に使える方法はないものかと考えてみた。

結論としては完成版の光センサー・モジュールにしてしまえばいいのかな?ということで早速試作してみた。コストも基板も消費電流も全て小さいほうがいいに決まってるのでCPUは使い道に困っていたATtiny10だ。(笑)

【光センサー・モジュールのスペック】

・PCBサイズは、10.4 x 13.6mm。(メチャちっちゃい)
・動作電圧範囲は、3.3V~5.5V
・平均消費電流は、5V動作時の実測値で約0.3mA
・約524.3ms毎にセンサー値を出力(UARTモードかパルス幅モードが選択可能)
・LED点灯機能(データ・ラインをショートすると点灯)
・出力モード選択機能(外部リセット有効(RSTDISBL=1)かPB3オープンでUARTモード、それ以外はパルス幅モード)

※UARTモードの速度は115200bps固定、データ形式は4桁16進文字列+CR+LF
※ボーレート誤差は5V動作時で約3%、3.3V動作時で約4%
※完成モジュールの個体差によるバラツキがどれだけあるかは不明
※データ・ラインは内部プルアップされているが受信エラーが発生するようなら外部回路にプルアップ抵抗(10K以下)が必要
※特性の違うLEDに変更することで異なる波長の光検出が可能
※PCBを除く部品代は約100円程度

【回路図】

【完成モジュール】

いつものようにPCBGOGOに発注したら基板がちっちゃいのに値段が同じなのは可哀そうだと思われたのか発注数10枚に対し14枚ほど届いてしまった。最近オマケが多くなってきた気がするが担当者にもよるのかな?とりあえず謝謝しておこう!<(_ _)>

【UARTケーブルに接続】

【TeraTermでデータ受信】

【消費電流】

最初がデータ送信処理の山で、次のでかいのは計測中の山でプログラム的にはタイマーオーバーフロー割り込み待ちでスリープ中のはず。そして山の頂上がキャプチャー完了タイミング。キャプチャー処理はHW任せでプログラム的には何もしてないからなんでこうなるのかが全くわからない。誰か知ってる人いたら教えて!と思ったが、とりあえず自分で調べてみた。どうやらGPIOの入力電圧がONとOFFの中間の不安定な状態では貫通電流というものが流れるらしい。で、その貫通電流はキャプチャー完了つまりGPIOがOFFに切り替わる瞬間がピークになるということだ。これを防ぐには、外部にコンパレータ等を使うしかないけどピーク電流は最大でも1mAちょいくらい。とりあえず壊れることはなさそうだから気にしないでおこう...

ATtiny10では今までLチカぐらいしかやってみたことはなく今回が初めての本格的?なプログラムの開発だ。開発環境は暫く使っていなかったATmelStudio7.0+AVRISPmkⅡ。

PCBのハンダ・ジャンパーにより、UART出力(オープン)、或いは、パルス幅出力(ショート)のどちらかを約524.3ms間隔でデータ出力する仕様だ。

また、せっかくLEDが付いてるのに光らないのは本末転倒?ということでLEDを点灯させることも可能だ。若干、トリッキーな方法ではあるが、データ・ライン1本しかないのでデータ・ラインをオープン・ドレイン出力としデータ・ラインがショートされるとLEDが点灯する仕様としている。ショートするタイミングによってはUARTモードで約650us程度、パルス幅出力モードで最大約524.3msの点灯オン制御の遅れが発生する。

ちなみに、CPUは常にアイドル・スリープ・モードで停止状態とし割り込みのみで処理することで消費電力削減を図っている。同じことをポーリング処理で行なうと消費電力は10倍ほど増えてしまうぞ!

アリエクスプレスで購入した激安パックのLEDを使って、夜のLED照明中の部屋の中でLEDの色別感度を試したところ、
黄>緑>赤>青=白
の順になった。何故か青と白はほとんど反応なし。LED照明だからなのかな?。参考まで。

で、使って見た感じ、照度はわからないけどRohmのBH1750よりも感度良さげな気が...って、まじっすか?(笑)

【修正】
2021-09-20
ファームウェア(main.cpp)の修正。パルスモードの最小幅が数マイクロ秒であるため、計測した時間に1ミリ秒を加算したパルス幅を出力するように変更。UARTモード時のボーレートを38400に変更。

PS.
2021-07-22
Arduino用のデータ受信ライブラリを作ってみたので追記。

【サンプル(Arduino)】

【ライブラリ(Arduino)】

【ファームウェア(ATtiny10)】