1. aike@github

    Posted

    aike@github
Changes in title
+Raspberry Pi 2で照度センサーTSL2561をシンプル使うメモ
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,76 @@
+照度センサーTSL2561のI2C対応モジュールを使おうと思って調べると、いろいろ面倒くさいことがわかる。いくつものPythonモジュールに依存していたり、サンプルプログラムがなぜか何百行にもなってたりする。
+
+http://qiita.com/masato/items/1dd5bed82b19477b45d8
+http://shimobayashi.hatenablog.com/entry/2015/07/27/001708
+
+I2Cのセンサーなら、smbusモジュールだけでシンプルに書けるはず、と思って書いてみました。
+
+https://github.com/aike/SimpleTSL2561.py
+
+```py:SimpleTSL2561.py
+#!/usr/bin/python
+#
+# SimpleTSL2561.py by aike
+# licenced under MIT License.
+#
+
+import smbus
+import time
+
+class SimpleTSL2561:
+
+ def __init__(self, address=0x39):
+ self.bus = smbus.SMBus(1)
+ self.address = address
+ self.write8(0x80, 0x03) # 0x03=PowerON 0x00=PowerOFF
+
+ def write8(self, reg, value):
+ try:
+ self.bus.write_byte_data(self.address, reg, value)
+ except IOError, err:
+ print "IO Error"
+
+ def readU16(self, reg):
+ try:
+ result = self.bus.read_word_data(self.address,reg)
+ return result
+ except IOError, err:
+ print "IO Error"
+ return 0
+
+ def setParam(self, param):
+ # param gain integral
+ # 0 x 1 13.7 ms
+ # 1 x 1 101 ms
+ # 2 x 1 402 ms (default)
+ # 3 x 16 13.7 ms
+ # 4 x 16 101 ms
+ # 5 x 16 402 ms
+ if param >= 3:
+ param = param - 3 + 16
+ self.write8(0x81, param)
+
+ def readData(self):
+ return self.readU16(0xAC)
+
+if __name__ == "__main__":
+ tsl = SimpleTSL2561()
+ while True:
+ print tsl.readData()
+ time.sleep(1)
+```
+
+
+複雑になる原因
+
+TSL2561の仕様
+・可視光と赤外線の両方を検知することができる
+・感度を1倍と16倍の2種類選ぶことができる
+・積分時間を13.7ms/101ms/402msから選ぶことができる
+
+TSL2561のデータ仕様
+・取得データの値がルクスの値と比例しておらず、場合分けした変換係数が必要
+・TSL2561には大別してT、FN、CLとCSの2種類あって両者の係数が異なる
+
+そんなわけで、すべてのTSL2561に対して正確なルクス値を取得できるプログラムは、それなりの行数になります。手持ちのモジュールに対応するだけなら2種類の変換処理は不要です。
+よくある、暗くなったら電気をつける、といった用途であればルクス値である必要もなく、変換処理を省略した上記のプログラムでいけます。