Initial report by Christopher Kucinski - 4 April 2007
The TSL-13S converts light intensity (irradiance) to voltage. Voltage output is linear to the light intensity it receives. The sensor is part of a larger light-to-voltage sensor family made by Texas Advanced Optoelectronic Solutions (TAOS). It responds to light with wavelengths in the range of 320nm to 1050nm. This range is just above the 'Near-UV' range (which is 200 - 400nm) through about half of the 'Near-Infrared range' (750 - 1400nm) and all of the visible light in between. The bell curve of the photodiode's spectral responsivity peaks near 760-780nm (a range just above the limit that most humans would perceive as the color 'red').
Due to high integration of components (a photodiode and a transimpedance amplifier) on a monolithic IC, there are no extra parts (breakout board, etc.) needed to use the sensor, though an external amplifier circuit may be needed to boost the output signal to a desired range. The sensor output maybe interfaced with a comparator circuit for light-activated switching, or an analog-to-digital converter for linear light measurement.
The sensor is fairly small with package dimensions at 4.60mm X 4.60mm (0.18" X 0.18") with three 14.86mm-long (0.58") leads.
This is the function block diagram of the TSL13S circuit:
The sensor is available from Mouser Electronics. It was $1.10 and readily available in a lead-free package.
According to TAOS' product line brochure, "light-to-voltage converters can be used to measure ambient light in lighting controls and electronic dimming ballasts, contrast and brightness controls in signs, media detection in printers, measuring light absorption and reflection in a variety of applications, and medical applications such as reagent strip readers and pulse oximetry [(measuring the amount of oxygenated hemoglobin in blood)]."
The TSL13S will output 246 mV per μW/cm2. As a reference, the Sun's peak irradiance at the Earth's equator is 1,020 W/m². According to this site a fluorescent bulb 10 cm above a surface will "achieve irradiance of 50 µW/cm2."
Supply voltage (VDD) must between 2.7V and 5V, with an absolute maximum supply of 6V. The sensor requires 1.1 - 1.7mA of current to run. Both voltage and amperage requirements are well within the range of a typical voltage regulator or from sourcing a microcontroller. Output voltage will range from 0.0V to a maximum of 4.9V. Typical 'dark' voltage (when the sensor is not receiving light) will be 0.0V, but may output 0.08V. Amperage output will range from ±10mA.
As light strikes the photodiode lens, the photodiode and transimpedance amplifier respond by increasing output voltage linearly, up to 4.9V. The output pulse delay for both rising and falling edges are typically around 8µs.
There are three pins on this sensor: Ground, VDD, and Output. The output pin should be connected to ground ('pulled down') through a 10K-Ohm resistor (but I didn't find this necessary as the resistor did not attenuate excess noise from the signal - there wasn't any noise to begin with).
Pin Diagram as looking at the front of the TSL13S:
Using the TSL13S is straightforward - connect power and ground to the appropriate pins to turn it on. To interface with a microcontroller, simply connect the output pin to an ADC pin. The TSL13S maybe used in a comparator circuit as well, so connect the output pin to one of the inputs of the op amp in that circuit.
Code for Arduino and Processing.
The graph below shows an approximation of the ranges of types of light (ultraviolet, visible, infrared) and the spectral response of the sensor. Note that almost half of the response occurs in the IR range.
This sensor is extremely responsive - even picking up the 60Hz AC oscillations (the undulating yellow line on the scope readout below) in the fluorescent lights in the room I was working in . The frequency of the wavelength is ~120Hz (the 'Delta' menu on the oscilloscope on the right says "119.0Hz") which corresponds to 2 X 60Hz.
The sensor seemed to have a slightly slower response time than the 8µs the datasheet indicated it would. I found that the response time was 20µs for both rising and falling edge time (but I was not doing my readings under the strict control the datasheet information was gleaned from). 20µs is still plenty quick. Here's a photo of the rise time:
I did not notice any particularly peculiar behavior in the sensor, except that it seemed to have an affinity for light near the red end of the spectrum. It also seemed to not sense green light as well as it did red and blue, though this may have been due to the type of green LED I was using.
I used this sensor to make a very simple, low resolution scanner. I attached a cardboard tube to a wooden board and placed a TSL13S and a tricolor LED (common anode) inside that tube against the wood facing the open end of the tube. I programmed the arduino to cycle through the three colors of the LED, taking a reading of the reflected light the sensor picked up for each color. The cycle went something like this:
- Turn on red LED
- Take a sensor reading of how much red light is reflected back. (The more 'red' something is, the more light will be reflected)
- Send that value to Processing applet
- Turn off red LED
- Repeat with green, then blue LEDs
I realized how nice it is to have a digital camera that has a nice white balance function early on in this project, since I had calibrate my own white balance in this circuit. Because the LED's were of different intensities and the sensor prefers red and infrared light, I tuned the intensity of each LED with different resistor values so that the sensor output the same voltage for each color when it was scanning a white sheet of paper (i.e., custom white balance). I was using a common anode Tricolor LED from Super Bright LEDs. I used a 470-ohm resistor for the red LED, a 47-ohm resistor for green, and a 380-ohm on blue. In doing this, the sensor output approximately 950mV for each individual color on a sheet of white paper:
I could have used an amplifier to boost the signal to 5V before it got to the arduino, but I chose to amplify and normalize the sensor values in the processing code like this: normalizedScaledValue = (sensorvalue * 5) / 1023;
My code for both the Arduino and Processing are available here.
This photograph shows the TSL13S picking up the refresh rate (~990 HZ) of my cell phone's LCD display: