| 1 | 現在こちらのページで販売中の[https://www.switch-science.com/catalog/2498/ TSL2561デジタル光センサボード]の説明ページです。 |
| 2 | TSL2561はデジタル出力の光センサーです。 |
| 3 | |
| 4 | 取得したデータを元に計算することで、Cdsセルなどに比べて正確な照度を求めることができます。 |
| 5 | メーカー公開のデータシートへのリンクはこちらです。([http://www.adafruit.com/datasheets/TSL256x.pdf pdf]) |
| 6 | |
| 7 | デーシートに記載されている詳細説明を意訳したものを載せます。※内容の正確さについては保証いたしかねます。 |
| 8 | " |
| 9 | TSL2560とTSL2561は次世代型の光センサデバイスです。どちらの製品も2つのアナログ・デジタルコンバーター(ADC)を搭載し、2つのフォトダイオードからの電流を積分します。両チャンネルの積分は同時に行われます。A/D変換サイクルが終わると、変換結果はChannel0とChannel1レジスタにそれぞれ送られます。送信はデータが完全なままであるのを保証するためにダブルバッファリングされています。この送信の後、デバイスは自動的に次の積分(測定)サイクルに入ります。 |
| 10 | |
| 11 | デバイスとの通信はI^2^CまたはSMBus通信によって独立して成し遂げられます。よって、TSL256xデバイスはマイクロコントローラや組み込みのコントーローラと簡単に接続できます。 |
| 12 | |
| 13 | 信号品質のために外部回路を必要としないので、基板面積を大幅に節約できます。 |
| 14 | |
| 15 | TSL256xはデジタル出力であるため、出力はアナログ信号と比較してノイズに耐性があります。 |
| 16 | |
| 17 | TSL256xは割り込み機能にも対応し、センサが光強度測定をするのを待つ必要性を排除することでシステムを簡便化できます。割り込み機能の主要な使い方は光強度の有意な変化を検知することです。検知する変化量はユーザーが光強度と時間で指定したり、光強度の不変さによって指定したりできます。 |
| 18 | TSL2561は現在の光量からの強弱方向への変化量に対して閾値を設定することができます。 |
| 19 | 割り込みは測定値がこれらの閾値を超えた時に生成されます。" |
| 20 | |
| 21 | また、Adafruitからライブラリが公開されています。リンク([https://github.com/adafruit/TSL2561-Arduino-Library github]) |
| 22 | こちらも参考にしてください。[[BR]] |
| 23 | また、上記ライブラリのサンプルスケッチのコメントを意訳したものもページ下部にて公開していますので、ご覧ください。 |
| 24 | |
| 25 | ---- |
| 26 | |
| 27 | == 通信方法 == |
| 28 | |
| 29 | I^2^CまたはSMBusで通信を行います。電子工作で利用する際はI^2^Cになるとおもいますので、 |
| 30 | このページではI^2^C通信での利用を前提に解説を進めます。 |
| 31 | |
| 32 | === 送信方法 === |
| 33 | |
| 34 | データシートの一部を抜粋します。 |
| 35 | 脚注にあるように、I^2^C通信では簡略化して行われます。[[BR]] |
| 36 | 結果として一般的なI^2^C通信と大きな違いはありません。 |
| 37 | [[Image(tsl2561_fig16.png)]] |
| 38 | |
| 39 | 下はArduinoでの1byte分を書き込む実装例の一つです。 |
| 40 | {{{ |
| 41 | int _addr = 0x39; |
| 42 | void TSL2561::write8 (uint8_t reg, uint8_t value) |
| 43 | { |
| 44 | Wire.beginTransmission(_addr); |
| 45 | Wire.write(reg); |
| 46 | Wire.write(value); |
| 47 | Wire.endTransmission(); |
| 48 | } |
| 49 | }}} |
| 50 | |
| 51 | === 受信方法 === |
| 52 | |
| 53 | データシートの一部を抜粋します。 |
| 54 | 脚注にあるように、I^2^C通信では簡略化して行われます。[[BR]] |
| 55 | 結果として一般的なI^2^C通信と大きな違いはありません。 |
| 56 | [[Image(tsl2561_fig17.png)]] |
| 57 | |
| 58 | 下はArduinoで2byte分を読みだす実装例の一つです。 |
| 59 | |
| 60 | {{{ |
| 61 | int _addr = 0x39; |
| 62 | uint16_t TSL2561::read16(uint8_t reg) |
| 63 | { |
| 64 | uint16_t x; |
| 65 | uint16_t t; |
| 66 | |
| 67 | Wire.beginTransmission(_addr); |
| 68 | Wire.write(reg); |
| 69 | Wire.endTransmission(); |
| 70 | |
| 71 | Wire.requestFrom(_addr, 2); |
| 72 | t = Wire.read(); |
| 73 | x = Wire.read(); |
| 74 | x <<= 8; |
| 75 | x |= t; |
| 76 | return x; |
| 77 | } |
| 78 | }}} |
| 79 | |
| 80 | === 接続 === |
| 81 | |
| 82 | 下図のように配線してください。(実体配線図) |
| 83 | |
| 84 | また、Arduinoのanalogピンの部分に次のように設置することもできます。 |
| 85 | この場合、ピンの入出力設定を書く必要があります。 |
| 86 | Setup(){}内部の、初期化のはじめの方にに以下の文を追加してください。 |
| 87 | |
| 88 | == 計算方法 == |
| 89 | |
| 90 | 取得した測定値を指揮に代入することで、照度(単位:lux(ルクス))を正確に求めることができます。 |
| 91 | データシートに記載されている式を抜粋します。 |
| 92 | |
| 93 | == 動作サンプル == |
| 94 | |
| 95 | サンプルスケッチ(コメント意訳版)※コメントの正確性については保証いたしかねます |
| 96 | {{{ |
| 97 | #include <Wire.h> |
| 98 | #include "TSL2561.h" |
| 99 | |
| 100 | // TSL2561 サンプルプログラム 2015/12 |
| 101 | |
| 102 | // SCL は analog 5 に接続してください |
| 103 | // SDA は analog 4 に接続してください |
| 104 | // VDD は 3.3V DC に接続してください |
| 105 | // GROUND は common ground に接続してください |
| 106 | // ADDR を未接続/GND/VDDのどれに接続するかによってi2cアドレスを変更します |
| 107 | // Adruinoで利用する際の7bit表記では以下のとおり |
| 108 | // 接続状況によって適宜変更してください |
| 109 | // 未接続: TSL2561_ADDR_FLOAT (0x39) |
| 110 | // GND: TSL2561_ADDR_LOW (0x29) |
| 111 | // VDD: TSL2561_ADDR_HIGH (0x49) |
| 112 | TSL2561 tsl(TSL2561_ADDR_FLOAT); |
| 113 | |
| 114 | void setup(void) { |
| 115 | Serial.begin(9600); |
| 116 | //while (!Serial); |
| 117 | if (tsl.begin()) { |
| 118 | Serial.println("Found sensor"); |
| 119 | } else { |
| 120 | Serial.println("No sensor?"); |
| 121 | while (1); |
| 122 | } |
| 123 | |
| 124 | // 周囲の明暗状況に合わせて適切にゲインを変更してください |
| 125 | //tsl.setGain(TSL2561_GAIN_0X); // ゲインなし:周囲が明るい場合 |
| 126 | tsl.setGain(TSL2561_GAIN_16X); // ゲインx16:周囲が暗い場合 |
| 127 | |
| 128 | // 積算時間を変更することで、光の測定時間を変更することができます |
| 129 | // 長時間測定すると、データの取得は遅くなりますが、低光度環境での測定性能が向上します |
| 130 | tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); // 短時間測定:明るい環境 |
| 131 | //tsl.setTiming(TSL2561_INTEGRATIONTIME_101MS); // 中時間測定:中程度の明るさ |
| 132 | //tsl.setTiming(TSL2561_INTEGRATIONTIME_402MS); // 最長時間測定:暗い環境 |
| 133 | |
| 134 | // 設定は以上です |
| 135 | } |
| 136 | |
| 137 | void loop(void) { |
| 138 | // データを取得する簡単なサンプルです |
| 139 | //単純に、赤外線か全波長域のダイオードの値か |
| 140 | // "可視光"(ダイオードからの値とは違います)のチャンネルの測定値を読みます |
| 141 | |
| 142 | // 13-402 millisecondsかかります |
| 143 | // 取得したいデータに応じてコメントアウトを外してください |
| 144 | uint16_t x = tsl.getLuminosity(TSL2561_VISIBLE); |
| 145 | //uint16_t x = tsl.getLuminosity(TSL2561_FULLSPECTRUM); |
| 146 | //uint16_t x = tsl.getLuminosity(TSL2561_INFRARED); |
| 147 | |
| 148 | Serial.println(x, DEC); |
| 149 | |
| 150 | // 詳細な値をよみとるサンプルです |
| 151 | // MSB 16bitが赤外線、LSB 16bitが全波長域チャンネルの値で構成された32bitのデータを読みます |
| 152 | // 値を自由に加工や比較して利用してください |
| 153 | uint32_t lum = tsl.getFullLuminosity(); |
| 154 | uint16_t ir, full; |
| 155 | ir = lum >> 16; |
| 156 | full = lum & 0xFFFF; |
| 157 | Serial.print("IR: "); Serial.print(ir); Serial.print("\t\t"); |
| 158 | Serial.print("Full: "); Serial.print(full); Serial.print("\t"); |
| 159 | Serial.print("Visible: "); Serial.print(full - ir); Serial.print("\t"); |
| 160 | |
| 161 | Serial.print("Lux: "); Serial.println(tsl.calculateLux(full, ir)); |
| 162 | |
| 163 | delay(100); |
| 164 | } |
| 165 | }}} |