In a recent set of experiments concerned with the establishment of a reliable behavioral measure of neural regeneration in the optic nerve, we were faced with the problem of measuring phototaxic responses in larval salamanders approximately an inch or less in length. The larval salamander presents a particular challenge for the observer in the laboratory because it is small and it moves rarely and only in short bursts (1968). Cognizant of this fact, our initial determinations utilized a time lapse video system to monitor the movement of animals to the dark side or illuminated side of an alley over a 24 hour period. This method had a number of limitations. For example, when observed at normal tape speed, it required approximately 1 hour and 15 minutes to observe and score the number of crossings from dark to light during a 24 hour period. This proved to be a very tedious procedure and suffered from a lack of inter-rater reliability . In addition, a great deal of valuable information was lost because we could not observe the animals when they were in the dark, and there was no good reliable measure of activity on either the light or dark side of the alley. Therefore, we sought to circumvent these problems by developing an infrared monitoring system that would interface with a computer and capture movement of our animals over small distances thus eliminating the human observer and increasing reliability.ABSTRACT
Reliable monitoring of the movement of small aquatic animals presents some particularly unique problems. In the case of the larval salamander, the animal may be less than an inch long and move in sporadic short bursts. A device is described that utilizes infrared emitters and wide-band sensors interfaced to a computer for monitoring location and movement of animals between light and dark environments over extended periods of time. The system employs a multiplexed digital input, is low cost and can easily be expanded to deal with a range of monitoring problems that may occur with a wide range of both aquatic and terrestrial species.
The sensor circuit employs a General Instrument MTH360 Phototransistor, and the sensor threshold is set by a three transistor amp. using 2n3094's which drive the corresponding bit on the hex tristate inverter. Threshold adjustment is provided for each sensor circuit and can be determined by observing a corresponding LED assigned to each circuit. When the LED is on it indicates that the sensor cannot see the opposite emitter. During a normal test run the LED on would indicate the presence of an object between the emitter and the sensor. A schematic diagram of the interface and infrared circuit is shown in Fig. 2.
All of the alleys are tied in parallel back to the computer distribution panel. Each alley decodes its own unique address via one of eight and one of sixteen decoders on the sensor board. This design permits 16 alleys to be connected to one parallel bus. Two decoders are used to specify the alley and sensors within that alley that are to be read by a digital input word sampled by the computer (see below). Each alley decodes its own address via a 1 of 16 decoder, allowing up to 16 alleys to be connected to 1 parallel bus and to be utilized simultaneously. The 2 sets of 8 sensors and the 1 additional sensor in each alley decode their own address via a 1 of 8 decoder, permitting a single 8-bit digital input word to sample sequentially all 17 sensors.
The power supply is an important consideration since each infrared emitter draws approximately 50 milliamps of current times 17 emitters per alley. In addition, there are the power requirements of the sensors and the interface. We used a Power/Mate model EVS-5F switching power supply rated at 100 watts (5 volts @ 20 amps) to run three alleys (POWER/MATE, 514 S. River St., Hackensack, N.J.). However, this power source could safely support 12 alleys. The power supply was placed in a separate enclosure with forced air cooling, using a boxer fan model BS2107FL 1000. The forced air cooling is critical for reliable operation of the switching power supply.
The desired sampling period in milliseconds and the number of samples to be taken during the session are entered on the keyboard. Following a "go" signal from the keyboard, the state (on/off) of each of the 17 sensors is updated during each sampling period in the following manner. A single 8-bit input word is used, so that 3 samples must be taken for each alley during each sampling period (1 bit represents the state of each of the 17 sensors). A single 8-bit digital output word is used to choose the alley and sensors within that alley which are to be sampled. Setting bit 0 specifies sensors 0-7, setting bit 1 specifies sensors 8-15, and setting both bits 0 and 1 specifies sensor 16. Bits 2-5 specify the alley (0001-1000).
For each alley, a masking algorithm codes the state of all 17 sensors in a single variable, called SENSOR, so that the value of SENSOR on each sampling period can be used as the index of counting variables that specify the number of times that various states occur. Each input word is masked so that each bit, corresponding to a sensor, is set if and only if that sensor has its beam interrupted. For sensors 0-7, SENSOR is equated to 1 + the digital value of the 8-bit word input from the digital port, so that SENSOR takes on the value 2N + 1, where N is the number of the sensor (from 0-7). For sensors 8-15, 256 (28) is added to the digital port input value, so that SENSOR takes on the value 28 + 2N-8 + 1, where N again is the number of the sensor. For sensor 16, SENSOR is set equal to 707. Finally, at the end of each sampling period, SENSOR is equated to the sum of the index values. Since SENSOR has a maximum value of 3281 (if all 17 sensors simultaneously have their beams interrupted), the number of times that the state of all 17 sensors specified in SENSOR appears during an entire session can be stored in an array having 3281 elements. Each element of this array, called ALL.COUNT in our implementation, then gives the number of times that each state of the 17 sensors occurs during a given session. A 17-element array called OUT.SINGLE.ALL is constructed from ALL.COUNT and specifies the number of times that the animal was located at each of the 17 sensors. A second array with 3281 elements, called CROSS.COUNT, is updated only if the current state of SENSOR is different from that during the previous sampling period. Thus, CROSS.COUNT contains the number of times that a particular state of the 17 sensors results when the animal moves from its position on the previous sampling period. A 17- element array called OUT.SINGLE.CROSS is constructed from CROSS.COUNT and specifies the number of times that the animal crossed the path of each of the 17 sensors. Finally, variables named DARK.COUNT and LIGHT.COUNT store the cumulative number of SENSOR states that indicate interruption of sensors located in dark and light sides of the alley, respectively.
There are several advantages of this computerized infrared monitoring system. The multiplexed digital input makes it possible to use different numbers and combinations of animal chambers simply by making changes in the software. The availability of cheap, high-level laboratory languages allows rapid, cost-effective development of a variety of configurations of observation units. Different strategies can be employed in order to increase sampling speed or to locate an animal within a large array of sensors, without the necessity of time-intensive assembly-language programming. Our application uses a 4.77 MHz processor and achieves a sampling period of 120 ms for each set of 3 input words (i.e., 3 digital outputs to the multiplexer and 3 digital inputs from the multiplexer during each 120 ms period). A faster computer would provide an increase in sampling speed that is at least proportionate to the difference in processor speeds. More efficient code would also decrease the effective sampling time. For example, the computer program might use the memory of which set of sensors contained a sensor with an interrupted beam on the previous sample in order to select where in a large array the next sample will be taken. An animal's location within a rectangular chamber with sensors on 2 perpendicular walls could be rapidly followed in this manner, precluding the necessity of sampling every sensor.
It is also relatively easy to detect hardware problems using the data-collection software. For example, the availability of information on the number of interruptions and crossings of each sensor beam (ALL.COUNT and CROSS.COUNT) will make apparent a malfunctioning emitter or sensor. Finally, the system as designed is low cost. Although the DACA board that we used is no longer available, a number of low cost data acquisition and control boards are available (e.g. Keithley-Metrabyte, Model PIO-12, $125.00) The IR transmitter and sensor are $5.00 a pair, the power supply is $100.00, and Plexiglas and Lexan are between $5.00 and $6.00 a sq. ft.
\ Statements preceded by a backslash "\" are comments.
\ This program reads digital input bits 0-7 from sensor
\ inputs.
\ It counts the total number of times that a sensor does not
\ receive an infrared beam.
\ It only works for Alley (Track) #2.
\ SAMPLING.PERIOD contains the time in milliseconds between
\ whole-track samples.
\ SAMPLE.COUNT contains the number of whole-track samples.
\ ALL.COUNT is a 3281 element array containing the number of
\ samples of each possible sensor, and sensor combinations.
\ CROSS.COUNT is a 3281 element array containing the number of
\ non-consecutive samples of each possible sensor and of each
\ possible combination of sensors.
\
\ OUT.SINGLE.ALL contains the total number of samples during
\ which each of the 17 sensors read an interrupted beam, and
\ OUT.SINGLE.CROSS contains the number of samples during which
\ each of the 17 sensors read an interrupted beam AND did not
\ have its beam interrupted during the previous sampling period
\ (i.e., actual crossings of the sensor as opposed to both
\ crossings and remaining in place.
\
\ DARK.COUNT and LIGHT.COUNT contain the total number of samples
\ of sensors 0-7, and 9-16, respectively.
\
\ Declare I/O interface hardware.
IBM.DACA
\ Array and scalar variable declarations.
DP.INTEGER DIM[ 3281 ] ARRAY ALL.COUNT
DIM[ 3281 ] ARRAY CROSS.COUNT
DIM[ 17 ] ARRAY OUT.SINGLE.ALL
DIM[ 17 ] ARRAY OUT.SINGLE.CROSS
SCALAR SAMPLING.PERIOD
SCALAR SENSOR
SCALAR LAST.ONE
SCALAR SAMPLE.COUNT
SCALAR FIRST.SAMPLE
SCALAR DARK.COUNT
SCALAR LIGHT.COUNT
SCALAR LIGHT.DARK.INDEX
\
\ #CHECK ensures valid number input.
\
: #CHECK
BEGIN
#INPUT NOT
WHILE
CR ." Not a valid number; reenter: "
REPEAT
;
\
\ ALLEY contains the loop that reads the digital input.
\
0 DIGITAL.TEMPLATE 1ALLEY
BINARY 11111111, DIGITAL.MASK
DECIMAL
: ALLEY
1ALLEY DIGITAL.INIT
SYNCHRONIZE
3 1 DO
SAMPLE.COUNT 2 / 1 + 1 DO
1 SENSOR :=
BINARY
8, WRITE.BITS READ.BITS \ Alley #2, low-order byte.
MASK># SENSOR + SENSOR :=
9, WRITE.BITS READ.BITS \ High-order byte.
MASK># DUP
DECIMAL 0 <> IF 256 + SENSOR + SENSOR :=
THEN
BINARY 10, WRITE.BITS READ.BITS 1, AND \ Top byte.
MASK># DUP
DECIMAL 1 = IF 707 SENSOR + SENSOR :=
THEN
\ SENSOR now contains a number that uniquely specifies
\ the state of all 17 sensors.
\ Update ALL.COUNT, CROSS.COUNT, LIGHT.COUNT and DARK.COUNT.
ALL.COUNT [ SENSOR ] 1 + ALL.COUNT [ SENSOR ] :=
\ There is a crossing if they are not equal.
LAST.ONE SENSOR <>
IF
CROSS.COUNT [ SENSOR ] 1 + CROSS.COUNT [ SENSOR ] :=
THEN
SENSOR DUP LAST.ONE :=
\ Calculate #samples when in light & when in dark.
\ Have any samples in light or dark occurred?
1 FIRST.SAMPLE = IF \ If false, no samples have yet occurred.
SENSOR DUP 194 <= 1 > AND
IF \ If true, we are in the dark.
DARK.COUNT 1 + DARK.COUNT :=
0 LIGHT.DARK.INDEX :=
THEN
SENSOR 259 >=
IF \ If true, we are in the light.
LIGHT.COUNT 1 + LIGHT.COUNT :=
1 LIGHT.DARK.INDEX :=
THEN
SENSOR 1 =
IF \ We are between sensors.
LIGHT.DARK.INDEX 0 =
IF \ If true, we are still in the dark.
DARK.COUNT 1 + DARK.COUNT :=
ELSE
LIGHT.COUNT 1 + LIGHT.COUNT :=
THEN
THEN
THEN \ No samples have been taken.
258 <> IF 1 FIRST.SAMPLE := THEN
SYNCHRONIZE
STACK.CLEAR
LOOP
LOOP
;
\ SALLY is the main routine.
DECIMAL
: SALLY
DECIMAL
STACK.CLEAR
0 FIRST.SAMPLE := 0 DARK.COUNT := 0 LIGHT.COUNT := 0
LIGHT.DARK.INDEX :=
BEGIN
CLS ." Enter desired sampling period (ms) > "
#CHECK SAMPLING.PERIOD :=
CR ." Enter number of samples > "
#CHECK SAMPLE.COUNT :=
CR CR ." It will take "
SAMPLE.COUNT SAMPLING.PERIOD * 1000. / . ." seconds."
CR ." Is this what you want?(Y/N) >"
KEY DUP EMIT 89 =
UNTIL
SAMPLING.PERIOD SYNC.PERIOD
-1 LAST.ONE := \ Initialize variables.
0 ALL.COUNT :=
0 CROSS.COUNT :=
ALLEY
BELL
9 1 DO
ALL.COUNT [ 2 I 1 - ** 1 + ] OUT.SINGLE.ALL [ I ] :=
ALL.COUNT [ 256 2 I 1 - ** + 1 + ] OUT.SINGLE.ALL [ I 8 + ] :=
CROSS.COUNT [ 256 2 I 1 - ** + 1 + ]
OUT.SINGLE.CROSS [ I 8 + ] :=
CROSS.COUNT [ 2 I 1 - ** 1 + ] OUT.SINGLE.CROSS [ I ] :=
LOOP
ALL.COUNT [ 708 ] OUT.SINGLE.ALL [ 17 ] :=
CROSS.COUNT [ 708 ] OUT.SINGLE.CROSS [ 17 ] :=
;
NPN SILICON
Collector - Emitter Voltage 30 V
Emitter - Collector Voltage 7 V
Collector - Base Voltage 70 V
Collector - Emitter (V sat) .4 V
Flat Lens for Wide Acceptance Angle 60 Deg
Light Current 1 mA VCE = 5 V Ee = 5 mV/cm2
Dark Current 100 nA VCE = 10 V Ee = 0 mV/cm2
Ee=Radiant Incidence
Light Source is an Unfiltered Tungsten Lamp at 2870o K Color.
A Ga As Source of 1.7 milliwatt/cm2 is Approx Equivalent to
a Tungsten Source of 5 milliwatt/cm2 at 2870o K. K=deg Kelvin.
Output Flux of 10 mW at 100 mA
Axial Intensity of 35mW/SR at 100 mA
Continuous Forward Current 100 mA
Reverse Voltage 3 Volts
Total Output Power 10 mW If = 100 mA DC
Peak Emission Wavelength 880 nM If = 20 mA
Spectral Line Half Width 40 nM If = 20 mA
Forward Voltage 1.8 V If = 100 mA
Included Angle Between Half Radiant Intensity Points 20 Degrees
