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

RGBと?が得られる

 ロームのBH1745NUCは、RGBとCという四つの光センサの出力が得られます。スイッチサイエンスでモジュールを入手しました。

  Conta デジタルカラーセンサモジュール BH1745NUC搭載

 モジュールの特徴に「0.005 Lx~40k Lx」とありますが、データシートにはレジスタから読み出せるカウント値からlxへの変換式がありません。測定時間は設定できるので、感度を可変できるようです。最高感度は0.005lx/stepとなっているので、緑の16ビットのデータでLSBが0.005lxということかもしれません。そのときの設定条件は不明です。

BH1745NUCモジュールのスペック

  • 動作電圧 2.3~3.6 V
  • ロジック電圧 1.8~3.6V
  • インターフェース I2C(最大400kHz)、Vih1.26V(min)。プルアップ抵抗は実装されていない
  • スレーブ・アドレス 0x39(7ビット表記、デフォルト)、ADDR端子をGNDにつなぐと0x38。SJ1端子で設定

接続

 ラズパイとの接続です。

BM1383AGLV ラズパイ
SDA 3番ピン
SCL 5番ピン
GND 6番ピン
3.3V 1番ピン 3.3V
IO4(INT) -

 上記のように接続が完了したら、ラズパイの電源を入れます。ターミナルから、i2cdetect -y 1 で接続を確認しました。スレーブ・アドレスは0x39です。

レジスタ

 製造元のロームのデータシートに転載不可と書かれているので、直接データシートを読んでください。

プログラム

 RGBCの四つの値を読み出します。CはClearとデータシートに書かれていますが、何の値は不明です。赤外線かもしれません。ゲインはデータシートの測定条件と同じ16倍にします。測定時間は'000'の160msから'101'の5120msまで設定できますが、最初はパワーオン・リセットの設定値160msのままにします。

 MODE_CONTROL3 ( 44h ) はパワーオン・リセットの初期値は0x00ですが、0x02に設定し直さないといけないようです。

 読み出すデータは、RGBCの順で、それぞれ16ビット、下位、上位の順です。

 RGBCのカウント値の測定条件にEV = 20µW/cm^2と書かれています。放射照度のエネルギー単位と思われます。緑の1ルクスは1.46 mW/m^2に換算できるので、20µW/cm^2は200mW/m^2なので137lxを受光したものと思われます。この明るさは、事務机の上が500lxなので少し暗めです。

#!/usr/bin/env python
import smbus
import time
i2c = smbus.SMBus(1)
addr=0x39
configM2 = 0x12
configM1 = 0b00000000
#main
i2c.write_byte_data(addr,0x40,0x80) #reset
i2c.write_byte_data(addr,0x44,0x02)
i2c.write_byte_data(addr,0x41,configM1)
i2c.write_byte_data(addr,0x42,configM2)
while 1:
data = i2c.read_i2c_block_data(addr,0x50,8)
R = (data[1]<<8 | data[0])
G = (data[3]<<8 | data[2])
B = (data[5]<<8 | data[4])
C = (data[7]<<8 | data[6])
print R,G,B,C
time.sleep(10)

実行例

 最初の実行例はMODE_CONTROL1 ( 41h )=0b00000000 測定時間160msです。つぎに0b000000101=測定時間を最大の5120msにしました。Cのデータ以外は全部飽和しています。机の上でセンサは天井を向いた状態で、照度計で測ると400lx前後の明るさです。ゲインと測定時間を組み合わせると、広範囲の明るさが測れます。

※執筆時点;2017-11-29版をダウンロードし、sudo apt-get update と sudo apt-get upgrade -y および sudo rpi-update で更新し、カーネルはuname -a で確認。4.9.73でした。

※プログラムを仮にbh1745.pyという名前で/home/piに保存すると、sudo chmod 755 bh1745.py で実行権を付け、ターミナルから、python bh1745.pyで実行します。I2CやSPIのグループにpiユーザが属しているので、sudoは不要です。
 プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。ラズパイに持っていくと、スペースやリターン・コードなどが化けていることがあるので、一度消して、ラズパイのテキスト・エディタで修正してください。

※I2Cの有効化は、こちらの説明を参照ください。SPIなどにもEnableにチェックを入れています。

コラム I2Cの電圧

 Standard Modeでは、HighとLowの電圧規定は次のとおりです。Vdd=3.3Vとします(https://www.nxp.com/documents/user_manual/UM10204_JA.pdf)。

  • VIL(Low Level Input Voltage) :-0.5V~0.99V(1.5V固定の例外もある)
  • VIH(High Level Input Voltage):最小2.31V(3V固定の例外もある)

 汎用のGPIO端子(21,20,16,26,19,13)に実験用電源から電圧をかけ、論理的HIGHになる電圧を計測しました。

  ヒステリシスがあります。0Vから電圧を上げるときは1.3xV、3.3Vから電圧を下げるときは1.1xVでした

 I2Cの3番(GPIO2)と5番(GPIO3)は1.8kΩでプルアップされています。

  ヒステリシスがあります。0Vから電圧を上げるときは1.3xV、3.3Vから電圧を下げるときは1.2xVでした