| Schematic | PCBs | Assembly |
The Camera Head (A2056) is a Long-Wire Data Acquistion (LWDAQ) device that reads out a TC255P or similar image sensor. The A2056 supports anti-blooming and fast-move, which we describe below. Our LWDAQ Software provides an interface to the A2056 called the Camera Instrument.
Note: With its default settings, the Camera Instrument does not work well with the A2036, A2047, A2048, and other BCAM Heads, because the instrument tries to use anti-blooming and fast image transfer. To use the Camera Instrument with these other image sensor circuits, you must set daq_anti_blooming and daq_fast_move to zero in the instrument panel.
The A2056A comes with a TC255P image sensor and an adjustable lense. The lens in the example shown above is an 8-mm focal length glass lense with an M12 threaded mounting cylinder, part number CMT821 from Sunex Optics. The lens holder, which we glue to the circuit board, is part number DSL853 from the same company. We adjust the focus of the camera by turning the lense in its holder. The 0.5-mm pitch thread gives fine adjustment. We can focus at short range, to obtain close-up images of electronic components, and long-range, to obtain images of activity in a corridor.

Our Aluminum Camera is an A2056A in a sturdy aluminum case. We can mount the case on an M3 threaded post, or we can use its mass alone to hold it stationary on a table-top. We use the Aluminum Camera in the lab to test multiplexers and drivers. It provides sharp images that make it easy to notice noise or failure in the data acquisition circuits.

The A2056B provides an eight-way flex cable through which you can connect a TC255P through any one of our TC255 Minimal Heads (A2016), in particular the A2016J, which provides space for an M12 lens holder.

One application of the A2056 is as a motion sensor, when combined with the LWDAQ software's Motion Sensor tool.
The TC255P is an image sensor of the type called a CCD, or charge-coupled device. Each pixel in the image sensor can hold a certain number of electrons before it starts to overflow. When a CCD pixel overflows, its electrons spread up and down the pixel's column. A bright star in an astronomical image will look like a vertical stripe. As the pixels above and below the over-flowing pixel also fill with electrons, the electrons can end up moving over into adjacent columns also. The bright star spreads out sideways as well.
The spreading of excess electrons, and the white mark it creates in the image, is called blooming. The TC255P has an anti-blooming gate, or ABG. By toggling the voltage on the anti-blooming gate, we drain excess charge from the sensor's pixels, and so avoid the spread of excess electrons. The Camera Instrument allows us to turn on and off anti-blooming with the daq_anti_blooming parameter.

The A2056 allows the LWDAQ to toggle the TC255P's anti-blooming gate during image exposure. The top-left image above shows an image without anti-blooming. The top-right image shows the same image obtained with the anti-blooming turned on. We obtained both images with the Camera Instrument. As you can see, the anti-blooming operation stops the spread of charge from the brightest pixels.
Careful inspection of the top-right image reveals signs of the over-head lights in the pixels above and below the over-head lights. We can see the rectangular pattern of the over-head lights extended in the columns above and below the over-head light image. The vertical spread of the over-head lights in the top-right image is the result of the manner in which we read images out of a CCD and the fact that our camera has no physical shutter to stop light reaching the image sensor while the image is being read out.
When we read an image from the TC255P, we move it out of the image area area into the storage area by clocking IAG (Image Area Gate), SAG (Storage Area Gate), and SRG (Serial Register Gate) in the right order, as described in the TC255P data sheet. The image area is exposed to light, but the storage area is shielded from light. Once in the storage area, the image will receive no more light, but while image pixel traverse the image area, they continue to receive light. A pixel above the image of our over-head lights will pass through the over-head light image on its way down to the storage area. As it passes through bright spots in the image, the pixel gets brighter.
The movement of the image into the storage area explains the smearing of over-head lights upwards in the image. But the smearing is also downwards. The downward-smearing occurs at the beginning of our exposure, when we clear the image area of pre-existing charge. We clear the image area by moving all its charge downwards and into the storage area. As we move the pixels in the clearing process, they move through the bright spots, they get brighter. At the end of the clearing operation, there are pixels still in the image area that have received light from the bright spots, but have since been moved downwards from those same bright spots.
And so we are left with smearing above and below the bright spots. If we had a shutter to block light during clearing and read-out, there would be no smearing. If we could turn our lights on only during the exposure, we would have no smearing. Another way to reduce smearing is to move the image lines more quickly, so they have less time to gather light during clearing and read-out. The A2056's fast-move accelerates the movement of the image by a factor of ten. We turn on the fast-move with the Camera Instrument's daq_fast_moved parameter.
We see the effect of fast-move in the bottom two images. The bottom-right image is taken with anti-blooming and fast-move. We see no sign of vertical smearing, but the blooming is back. The fast-move operation compromises the operation of the anti-blooming. This compromise is a weakness in the A2056 implementation of the fast move, not a weakness in the anti-blooming. This weakness is one reason why our default setting for daq_fast_move in the Camera Instrument is zero. Another reason is that the Camera Instrument is incompatible with other circuits when fast-move is turned on, but these same circuits either support anti-blooming or at the very least tolerate it.
| Image Sensor Head | Anti-Blooming | Fast-Move |
|---|---|---|
| Camera Head (A2056) | Yes | Yes |
| Inplane Sensor Head (A2036) | No | No |
| Proximity Camera Head (A2047) | No | No |
| Azimuthal BCAM Head (A2048) | Yes | No |
| Polar BCAM Head (A2051) | Yes | No |
| Bar Head (A2044) | No | No |
The table above gives the support for anti-blooming and fast-move for various image sensor heads. The Camera Head is the only one that supports fast-move, but several others support anti-blooming, including the BCAM Heads.
The following table gives the function of each of the sixteen LWDAQ command bits.
| DC16 | DC15 | DC14 | DC13 | DC12 | DC11 | DC10 | DC9 | DC8 | DC7 | DC6 | DC5 | DC4 | DC3 | DC2 | DC1 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| X | X | X | X | X | X | X | X | WAKE | LB | ABGEN | ABGS | IAGS | SAGS | !SRGS | DCEN |
To determine the command word that will implement a particular operation on the A2056, write out sixteen bits in a row, starting with bit sixteen (DC16) on the left, and ending with bit one (DC1) on the right. Set each bit to zero or one as you require. The left-most four bits form the most significant nibble of the sixteen-bit command word. The right-most four bits are the least significant nibble. Translate each nibble into a hex digit, and you have the hex version of the command word. The X's are bits that are unused on the A2056.
The A2056 provides exposure to the TC255P by clocking the image area gates (IAG), storage area gate (SAG), serial register gate (SRG), and anti-blooming gate (ABG). A fast_move function is incorporated into the design of the A2056. When selected, fast_move clears the image area and tranfers the image to the storage area at the maximum clock frequency of 2 MHz which in turn decreases the amount of image smearing (smearing of this type causes the image to appear as though it has a shadow) normally present at slower clock frequencies. The anti-blooming function, when enabled, clocks the anti-blooming gate at 2MHz.
When an image sensor pixel fills up with light-induced charge, the charge tends to flow into neighboring pixels and cause them to saturate as well. A bright spot in an image can turn into a large, bright smear, in a phenomenon called blooming. The TC255P image sensor provides an anti-blooming clock input that you can pulse during an exposure, and which gets rid of excess charge before it can spread into neighboring pixels.
The following TclTk code performs image acquisition from an A2056. The code is taken from the Camera.tcl script that defines the LWDAQ Camera Instrument. The Camera Instrument can capture images from any of our TC255P image sensor circuits, but its default settings daq_anti_blooming = 1 and daq_fast_move = 1 are incompatible with any circuit that does not support anti-blooming and fast transfer of the image into the storage area.
We last updated the following script on 01-APR-08. You can look at the latest version of the code by pressing the Info button in the Camera Instrument Panel and then the Script button in the Info window.
#
# LWDAQ_daq_Camera captures an image from the LWDAQ electronics and places
# the image in the lwdaq image list.
#
proc LWDAQ_daq_Camera {} {
global LWDAQ_Info LWDAQ_Driver
upvar #0 LWDAQ_info_Camera info
upvar #0 LWDAQ_config_Camera config
# Determine the number of bytes in the image we will acquire.
set image_size [expr $info(daq_image_width) * $info(daq_image_height)]
# If we encounter any errors in the data acquisition process, we will
# abort data acquisition, but we will not stop the operation of the
# data acquisition program. That's why we enclose the data acquisition
# steps in a Tcl "catch" command.
if {[catch {
# Open a socket to the LWDAQ driver.
set sock [LWDAQ_socket_open $config(daq_ip_addr)]
LWDAQ_login $sock $info(daq_password)
# Select the device and set the device type.
LWDAQ_set_driver_mux $sock $config(daq_driver_socket) $config(daq_mux_socket)
LWDAQ_set_device_type $sock $info(daq_device_type)
LWDAQ_set_device_element $sock $config(daq_device_element)
# The way we clear the image area depends upon whether
# or not we're using fast-move.
if {$config(daq_fast_move)} {
# Configure the target to toggle IAG, SAG, and SRG when the driver
# toggles the transmit logic level.
LWDAQ_transmit_command_hex $sock 008D
# Execute a fast_toggle_job that will toggle the transmit logic
# level many times more than necessary to clear charge out of
# the image area. In this code, we switch the logic level
# roughly 5000 times, and each logic level persists for half
# a microsecond. The entire clear operation takes only 2.5 ms.
LWDAQ_set_repeat_counter $sock [expr 20 * $info(daq_image_height)]
LWDAQ_set_delay_seconds $sock 0.0000005
LWDAQ_execute_job $sock $LWDAQ_Driver(fast_toggle_job)
# Return the device to is wake state.
LWDAQ_transmit_command_hex $sock 0080
} {
# Execute a couple of image-move jobs to clear the image
# area. The clear operation takes 8 ms.
LWDAQ_execute_job $sock $LWDAQ_Driver(move_job)
LWDAQ_execute_job $sock $LWDAQ_Driver(move_job)
}
# Expose the CCD for specified time.
LWDAQ_set_delay_seconds $sock $config(daq_exposure_seconds)
if {$config(daq_anti_blooming)} {
# We implement anti-blooming wiht the toggle job.
LWDAQ_execute_job $sock $LWDAQ_Driver(toggle_job)
} {
# Without anti-blooming, we just wait.
LWDAQ_execute_job $sock $LWDAQ_Driver(delay_job)
}
# Transfer the image out of the image are and into the
# storage area.
if {$config(daq_fast_move)} {
# We implement fast-move in the same way we implemented
# the image clear with fast-move, but this time we toggle
# the IAG, SAG, and SRG lines only as many times as we need
# get the image into the storage area. The process takes
# 250 us.
LWDAQ_transmit_command_hex $sock 008D
LWDAQ_set_repeat_counter $sock [expr 2 * $info(daq_image_height)]
LWDAQ_set_delay_seconds $sock 0.0000005
LWDAQ_execute_job $sock $LWDAQ_Driver(fast_toggle_job)
LWDAQ_transmit_command_hex $sock 0080
} {
# Without fast-move, we proceed more slowly. The image transfer
# takes 2 ms.
LWDAQ_execute_job $sock $LWDAQ_Driver(alt_move_job)
}
# Transfer the image to local memory and close the socket.
LWDAQ_set_data_addr $sock 0
LWDAQ_execute_job $sock $LWDAQ_Driver(read_job)
LWDAQ_sleep $sock
set image_contents [LWDAQ_ram_read $sock 0 $image_size]
LWDAQ_socket_close $sock
} error_result]} {
if {[info exists sock]} {LWDAQ_socket_close $sock}
return "ERROR: $error_result"
}
if {$info(delete_old_images)} {lwdaq_image_destroy $info(name)\*}
set config(memory_name) [lwdaq_image_create \
-width $info(daq_image_width) \
-height $info(daq_image_height) \
-left $info(daq_image_left) \
-right $info(daq_image_right) \
-top $info(daq_image_top) \
-bottom $info(daq_image_bottom) \
-data $image_contents \
-name "$info(name)\_$info(counter)" ]
return $config(memory_name)
}
For a discussion of image geometry, and how to translate between points in the image sensor and points in the image on our computer screen, see the Image Geometry section of the TC255P Minimal Head (A2016) Manual. For instructions on finding Pin One on a TC255P, see the Pin One section of the same manual.
We discuss the image quality provided by our various TC255P readout circuits in the Image Contrast of the A2036 Manual.
Note: All our schematics and Gerber files are distributed under the GNU General Public License.
Look in A205601D.zip for A205601D.BOM for a bill of materials.