STEMMAで広がるArduinoの世界④Step1 照度センサTSL2591

 Luxの単位で輝度が得られるセンサTSL2591は、古くから使われています。受光波長領域が異なる二つのフォト・ダイオードが搭載されていて、ch0は赤外線を含む広い波長領域を検知し、ch1は赤外線だけを測り、luxを計算するときに誤差を生む赤外線の影響を排除できるようになっています。

 luxは「ルーメン毎平方メートル」の単位で、1m×1mの面積に当たる光の量を表しています。ルーメン(lm)は光源の出す光の量で、40W相当LED電球は約500ルーメンです。

Adafruitブレークアウト・ボード

 STEMMA QT(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

  Adafruit TSL2591 High Dynamic Range Digital Light Sensor Overview

 STEMMA QTを搭載していないボードは、下記の記事で取り上げています。

  5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (27) ディジタル光センサ1 I2C TSL2561

 

 ボードには、5V->3.3Vのレギュレータと3.3<->5V信号レベル変換回路が入っています。TSL2591は3.3Vで動作させますが、Arduino UNOでは5Vの電源を利用します。信号のHighレベルは5Vです。

 裏面には、測定時にじゃまになるとき、ボード表面のLEDを消灯するジャンパがあります。切り離すと点灯しません。

 SDA/SCL信号には10kΩのプルアップ抵抗が入っています。I2Cのスレーブ・アドレスはデフォルトが0x29です。回路図は、次のページに掲載されています。

  Adafruit TSL2591 High Dynamic Range Digital Light Sensor Downloads

TLS2561のスペック

 データシート TSL2591 Datasheet - Apr. 2013 - ams163.5

  • 電源電圧 2.7~5V
  • インターフェース I2C(最大400kHz)
  • スレーブ・アドレス 0x29、0x39、0x49から選択。このボードでは0x29固定
  • ダイナミック・レンジ 0.1~40000lux
  • 50/60Hzの照明リプル自動排除

使用環境

  • Arduino UNO R3
  • Arduino IDE 1.8.13
  • Windows10 20H2

接続

 電源は5V を使いました。Arduino UNO R3のI2Cは、SCLとSDA端子がありますが、SCLはA5に、SDAはA4につながっています。どちら側につないでもかまいません。白色のリード線は見えないので、黄色で配線図を描きました。

スケッチ

 利用手順は、Adafruit TSL2591 High Dynamic Range Digital Light Sensor Overviewに書かれています。

 ライブラリを導入します。メニューのツールから、ライブラリを管理を選び、検索欄にTSL2591を入力します。見つけてきたAdafruit TSL2591 Libraryのインストールをクリックします。

 同時にサンプル・スケッチも導入されます。

 メニューのファイルからサンプルの入っているスケッチ例を選択します。そこから、Adafruit TSL2591 Library - tsl2591 を選択します。

 実行中の様子です。中ごろで、蛍光灯の真下から、そうでない暗いところに動かしました。

ソースを眺める

 PCにインストールされた中にソース・プログラムがありますが、GitHubでも見れます。

  Adafruit_TSL2591_Library

 処理本体は、Adafruit_TSL2591.cpp(Copyright (c) 2014 Adafruit Industries)に書かれています。

 luxの計算をしている関数は、calculateLux(uint16_t ch0, uint16_t ch1) です。ある時点でluxを求める計算式が変更されています。現在は、次の計算式を使っています。

  lux = (((float)ch0 - (float)ch1)) * (1.0F - ((float)ch1 / (float)ch0)) / cpl;

 ch0は赤外線を含む広い波長領域を検知し、ch1は赤外線だけを測り、その読み出した値の差がluxになります。データシートのグラフにもありますが、全体の強度や波長によって補正をします。ひとつ前の補正式では、照度が低いとき、マイナスのlux値になったようです(https://github.com/adafruit/Adafruit_TSL2591_Library/issues/14)。

 cplは、cpl = (atime * again) / TSL2591_LUX_DF;で求め、利得と積分時間の積を、luxの係数で除しています。atimeとagainの設定値は、レジスタのch0とch1を読み出したとき0xffff(飽和している)を超えないような最大値が設定されているように読み取れます(getFullLuminosity())。

資料

センサの前面にカスタム・フィルタを作るときの補正;https://ams.com/documents/20143/36005/AmbientLightSensors_AN000173_2-00.pdf/ce3360f8-fb85-bc22-0bad-b60d3b31efc8

前へ

STEMMAで広がるArduinoの世界③Step1 湿度センサSHTC3

次へ

Groveで広がるArduinoの世界-Senser Kit-① Grove Light Sensor