TSL2572センサーとラズパイで明るさ(照度)を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、TSL2572センサーで明るさを測定する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

更新日 : 2024年2月20日

概要

TSL2572センサーに対応した拡張基板を用いることで、Raspberry Piで明るさ(照度)を測定することが可能になります。一方で、ハードウェアがあっても、センサーを制御するソフトウェアがなければ測定を行うことはできません。

そこで、Indoor Corgi製のRaspberry Pi拡張基板に搭載されているセンサーを一括して制御できるソフトウェア「cgsensor」を開発しました。

コマンドラインツールを使えば1行もコードを書かずに測定ができるほか、Pythonパッケージでご自身のプログラムから簡単にセンサーを制御できます。本記事では明るさセンサー TSL2572を制御する方法について解説します。

拡張基板

TSL2572を搭載している拡張基板以下の通りです。詳細は製品ページを参照して下さい。

Raspberry Pi 5について

2024年2月20日時点の安定版OSにおいて、I2C信号タイミングがシビアすぎるためTSL2572センサーを認識しない問題が起きています。修正済みのkernel6.6.yで解決することを 確認しています。将来のkernelのアップデートを待つか、手動でプレリリース版にアップデートするなどして対応してください。




I2C有効化

センサーとはI2Cで通信しますので、以下の記事を参考にI2Cを有効化して下さい。

インストール

センサー制御ソフトウェア「cgsensor」をインストールするには、以下のコマンドを実行します。ターミナルを開き、$に続くコマンドを実行して下さい。最新版へのアップグレードも同じコマンドで可能です。

ソースコードやサンプル、ライセンスはGitHubページに公開しています。

$ sudo python3 -m pip install -U cgsensor --break-system-packages

エラーが出る場合は最後のオプションを指定せずにお試しください。

$ sudo python3 -m pip install -U cgsensor

インストールが完了すると、cgsensorコマンドが使用可能になります。以下のように-hオプションを指定すると、使い方が画面に表示されます。

$ cgsensor -h

測定

tsl2572コマンドで、測定を行い、結果をlux単位で表示します。

$ cgsensor cgsensor tsl2572
TSL2572 測定
  明るさ[lux]:  141.8

薄暗い室内から晴天の屋外まで、幅広い明るさを測定できるようにTSL2572では測定時間や倍率を変更できます。適切でない設定を用いると、測定レンジ外となったり、測定レンジに対して暗すぎて精度が悪化してしまいます。cgsensorでは、周囲の明るさに合わせてこれらの設定を自動的に最適化して測定を行うプログラムになっています。

-vオプションを指定すると、実際に使用した測定倍率、時間、および2つのセンサーのADCレジスターの値を表示することができます。

$ cgsensor tsl2572 -v
TSL2572 測定
  明るさ[lux]:  141.7
  測定倍率: 16
  測定時間[ms]:  349.44
  ADC Ch0:  18294
  ADC Ch1:  2724

全センサーの一括測定、記録

cgsensorには対応する全センサーを一括で測定したり、連続で測定、結果をファイルに保存するといった、便利な機能が備わっています。cgsensor all … コマンドを利用します。

1回のみの測定

オプションを指定しない場合は、対応するセンサーを検出して測定し、結果を表示します。

$ cgsensor all
BME280
  温度[°C]:  29.3
  湿度[%]:   59.1
  気圧[hPa]: 1022.1
BME280#2
  温度[°C]:  34.0
  湿度[%]:   41.1
  気圧[hPa]: 1022.8
TSL2572
  明るさ[lux]:  149.3
SCD41
  CO2濃度[ppm]: 472
連続測定

-cオプションに続けて秒数を指定すると、指定した秒数おきに測定を連続して行い、時刻と測定結果を画面に表示します。値の変化を画面上でモニターしたい場合に便利です。

以下の例では、RPZ-IR-Sensorの基板上のBME280センサーと、TSL2572センサーの測定結果が表示されています。一番右の列がTSL2572の明るさのデータです。

Ctrl+Cで終了します。

$ cgsensor all -c 10
時刻, BME280#2 温度[°C], BME280#2 湿度[%], BME280#2 気圧[hPa], TSL2572 明るさ[lux]
2021/10/13 16:58:12, 36.4, 31.4, 1021.5, 141.6
2021/10/13 16:58:22, 36.2, 31.7, 1021.5, 141.3
2021/10/13 16:58:33, 36.1, 31.9, 1021.5, 141.3
2021/10/13 16:58:43, 36.0, 32.1, 1021.5, 141.7
...
ファイルに保存

-fオプションに続けてファイル名を指定すると、時刻と測定結果をcsv形式で保存します。結果の保存や解析に便利です。

ファイルが既に存在する場合は、最後の行に追記していきます。追記する場合は、センサーの増減が無いようにして下さい。増減があると列がずれる場合があります。

以下のコマンドで、1回測定を行って結果を「sensor_log.csv」に保存します。

$ cgsensor all -f sensor_log.csv

-cオプションを併用すると、一定間隔で測定を行い、かつ結果を「sensor_log.csv」に保存していきます。

$ cgsensor all -c 60 -f sensor_log.csv

きっちりと決まった時刻に測定したい場合はcronなどの定期実行ソフトウェアと連携させて下さい。以下を/etc/crontabに追記すると、毎時0分、10分、20分、30分、40分、50分に測定を行い、結果を/home/pi/sensor_log.csvに保存します。

*/10  *  * * * pi cgsensor all -f sensor_log.csv

設定ファイルの編集方法が分からない場合は、以下の記事を参考にして下さい。




Pythonパッケージの利用

これまでコマンドラインツールでセンサーを制御する方法について解説しました。一方、ご自身のPythonプログラムからセンサーを使いたい場合は、cgsensorパッケージを利用することで簡単に制御することができます。

1度だけ測定して結果を表示するサンプルコードを用意しています。

インポート

使用前の準備として、cgsensorパッケージをインポートしておきます。

import cgsensor  # インポート
TSL2572クラス

TSL2572の機能はTSL2572クラスにまとめられています。まずは以下のようにインスタンスを作成します。

tsl2572 = cgsensor.TSL2572()  # TSL2572制御クラスのインスタンス
測定

TSL2572クラスの各種メソッドや変数にアクセスしてセンサーを制御できます。

ここではsingle_auto_measureで測定します。このメソッドは、

  1. ゲイン1倍、短めの時間で測定実行
  2. ADCレジスター読み出し
  3. 結果に応じて、最適なゲイン、時間を決める
  4. 測定実行
  5. ADCレジスター読み出し
  6. 実際の明るさを計算

という一連の測定の処理を全て行ってくれます。

single_auto_measureが正常に完了すると、illuminance変数に結果が入るので、それを画面に表示しています。

tsl2572.single_auto_measure()  # 条件を自動で調整しながら1回測定を行い, luxに結果を入れる
print('明るさ {}lux'.format(tsl2572.illuminance))  # 明るさを取得して表示
例外

センサーが接続されていない場合も含め、センサーとの通信に失敗するとIOError例外が発生します。必要に応じて処理して下さい。

その他の機能

その他のメソッド等を利用すると、より細かい制御も可能です。ソースコードのコメントおよび、TSL2572データシートも合わせてご確認下さい。

注意事項

本ページの内容は、TSL2572に関する資料をIndoor Corgiが解釈した結果、および実際に動作させた結果をもとに記載しております。センサーに関する情報の正確性を保証するものではありません。

センサーについての情報はams社の資料をご確認下さい。

まとめ

センサー制御ソフトウェア「cgsensor」を利用して、TSL2572センサーで明るさを測定する方法の解説は以上です。Pythonプログラムや他のソフトウェアと連携することで、センサーを使った様々なシステムを簡単に実装することができます。

また、「RPZ-PowerMGR」拡張基板と組み合わせると、指定した時刻だけ起動して測定することもできます。モバイルバッテリーを使って、電源の確保できない環境でのセンシングも可能になるので、検討してみてはいかがでしょうか。

CO2濃度に応じてLEDの色を変化させ、リレーで外部機器をON/OFFする

Raspberry PiとRPZ-CO2-Sensorを使ってCO2(二酸化炭素)濃度を測定し、LEDの色を変化させる応用例です。LEDを見ることで、換気の必要性がひと目でわかります。濃度が一定以上になったらリレーで換気ファンなどの外部機器をONすることも可能です。

ラズパイ/Jetsonの消費電力測定&モバイルバッテリー稼働時間の計算 (RPZ-PowerMGR)

RPZ-PowerMGRを使って、Raspberry Pi(ラズパイ)/Jetson Nanoの消費電力を測定する方法の解説です。モバイルバッテリーでの運用可能な時間を計算し、実際の運用時間と比較しました。

RPZ-PowerMGR (Raspberry Pi/Jetson Nano用 電源管理/制御/RTC拡張基板)

スイッチで電源ON/OFF、指定時刻に電源ON/OFF、シャットダウン後自動電源OFFを可能にする拡張基板です。Raspberry Pi(ラズパイ)やJetson Nanoの電源の課題を解決し、省電力運用を可能にします。RTCで電源OFF時も時刻を保持します。USB Type-C端子を搭載し、モバイルバッテリーでも利用できます。