Homemade High Speed Linescan CCD Camera - Need Help

I would like to build my own high speed Line Scan Camera with Arduino Uno board. the commercially available ones are incredibly expensive. Currently my problem with this project isn’t the optics, but the CCD sensor and signal processing part. Please point me to the right direction and tips on building a line scan camera with the following specs detailed in the latter portion of this post. A huge problem is for the past few weeks I couldn’t find the Linear CCD sensors available online. I am a sophomore software engineering major who just stepped into the hardware developing community, I never been into an electronic parts shop/junk yard in my 19 years life.....You don't happen to know a good one around UCSD or the Clairemont / San Diego, CA by any chance? If you do, please post :slight_smile:

What I think I need:

  • Linear CCD Sensor
  • CCD sensor driver board
  • CCD Analog to Digital Image processor/ CCD Microprocessor
  • Arduino Uno Board

My budget limit for this project is around $200 goes to the sensor and processor parts excluding the Arduino Uno Board.

I know some of the older (med to high-end?) flatbed scanners uses linear CCD sensors, the scanner that I have and most modern cheapo scanners use CIS. Does anyone have experience using CIS as the sensor in a Line Scan Camera? I took apart the scanning module on my HP Photosmart C4680 and the CIS is way smaller than I thought, not entirely sure how CIS works. From goolging I found plenty of USB Barcode scanners 100+ scan rate that use CCD sensors (or so they claim) from the low $30, and one Line Scan Camera from Parallax that features 128 pixels for under $50, however they don't seem to have the specs that I am looking for. If you have experience tweaking these devices please help, maybe they do have the specs that I'm looking for and all I need to do is to tweak them, which I don't know how.
And then comes the Mount Everest price gap with the industrial types that cost $1300 upward to $3000+ which supersede my needs. :fearful:

The specification for the Linear CCD sensor/driver that I am looking for: it sounds like I need an older laser fax machine/copier/scanner but instead I want a higher resolution out of it.

  • 8 bit grey scale per pixel, no color needed
  • Adjustable exposure time down to 1 ms or less => want to achieve a scan rate 1000+ scans/second (Eventually I want to achieve 10k rate)
  • Pixel size around 14 micron x 14 micron or less (the physical size is important in my case, I am using laser with this)
  • 1024 pixels horizontal * 1 pixel line, the higher the better (Eventually I want to find a 4096)

Here are the Analog to Digital signal processing part and conversion requirement and then some questions, sorry for the amateurish/quite possibly rubbish wording.

  • So an 8 bit greyscale image processor means 256 grey levels per pixel right? Instead just output a number between 0 – 255, I have an extra objective:
    I want to be able to compare the numbers and then output a number (coefficient) based on which pixel received the highest number (highest light intensity). Let’s say pixel 1 after signal processing received a number of 240 and it is the highest relative to that particular scan, then the processor would output 1. If the highest intensity is at pixel 35, the processor would output 35. In one second, I want the processor to be able to output 1000+ coefficients based on the above logic.
    I want Arduino to do the extra step using the digital 0-255 values from the processor? I imagine Arduino would need some memory for these operations? Is it enough?
  • Processing capability should probably around the same or exceed the scan rate?
  • What is the realistic amount of memory for storing the processed sequential 0-255 values on the processor chip, under my budget?

The last question, is Arduino a best fit for this project? I just want my Arduino to send the digital signal back to my PC, and some light processing

  • Arduino to turn On/Off the components
  • Arduino to receive data from the CCD Image processor
  • Arduino to process the data and assign the corresponding coefficient per scan
  • Arduino to send the resulting coefficients to my computer

Note: I have seen some industrial Linear CCD camera that cost a fortune, that's precisely the reason why I want to challenge myself with this engineering project and help others who'll come into this thread in the future to build the device themselves. So, no corporate product advertising + trolling please, please don't just tell me you can't build it, be so kind to give detailed & logical reasons instead of "just because".

The last question, is Arduino a best fit for this project?

That should've been the first question, and the answer is "probably not".
You'll be able to do some of what you want, but at the higher end of your performance criteria, you're going to be disappointed.

Your call.

he commercially available ones are incredibly expensive.

I wonder why that is.

Arduino to receive data from the CCD Image processor

It only has 2K of memory for everything so nowhere to put the image data.

Does it have to be CCD? Is it for an very low light level system like an astronomical application?

Grumpy_Mike:

Arduino to receive data from the CCD Image processor

It only has 2K of memory for everything so nowhere to put the image data.

Does it have to be CCD? Is it for an very low light level system like an astronomical application?

Thank You for your reply. Well, I wanted to use a CCD instead of CMOS because of its high uniform fill rate (close to 100%), this property makes it suitable for comparing light intensity among the pixels because it has a uniform baseline for comparison. I intended to make this line scan camera for measuring surface depth displacement (like fine textures) using laser triangulation principle. It is actually for a high intensity light environment where I have to be able to control and keep the exposure time to a bare minimum, just enough to sense the laser dot and minimize everything else.

As to the memory issue, is it possible then for Arduino to just "pass along the processed data" from an digital input (image processor), I like the simple the USB interface, or does that also require a lot of memory on Arduino's end? My data throughput need should be 1000 scans * 8 bits * 1024 pixels / second, that's 1000 KB/s or 8.1928192 Kbits/s, if my calculation is correct. I really would love to use Arduino as the MCB.

An update on the CCD sensor and processor if anyone is interested: I found a recent blog post of someone attempting to make a UV light detector/measurement device spectrometer using a linear CCD sensor, I actually checked out this sensor before but I thought the distributors in U.S aren't selling them anymore. The sensor specification is good for this project and the author said its under $20, no idea what is the source of the CCD sensor. Here is the link to the post: http://quantalume.com/wp/?p=197

Just ordered some free sample CCD Analog Front Ends from Texas Instruments to test out, PART # LM98725. Unit price are under $20 but for a big order. Now gotta make the board base on the block diagram and spec sheets. The "Solution Block Diagram" Helped me tremendously in getting to know the parts I need and there are a whole lot or other example solutions, sounded like a troll myself but hey, we don't have to get every part from TI :). Here is the link if people are interested: Analog security camera design resources | TI.com

I'll post the finished board pics once I got the sensor and the front ends, man I need a bigger bread board. Fingers crossed

My data throughput need should be 1000 scans * 8 bits * 1024 pixels / second, that's 1000 KB/s or 8.192 Kbits/s, if my calculation is correct.

Well I get 1000 lines by 1024 pixels, being 1.024 M pixels per second. You have to send out the stuff on the serial port so that is 10 bits per byte. Assuming a pixel is 8 bits that gives you a data rate of 10.24 M baud, a bit much I think for a serial port running on a 16MHz processor.

Grumpy_Mike:

My data throughput need should be 1000 scans * 8 bits * 1024 pixels / second, that's 1000 KB/s or 8.192 Kbits/s, if my calculation is correct.

Well I get 1000 lines by 1024 pixels, being 1.024 M pixels per second. You have to send out the stuff on the serial port so that is 10 bits per byte. Assuming a pixel is 8 bits that gives you a data rate of 10.24 M baud, a bit much I think for a serial port running on a 16MHz processor.

Ah, I see. Thank You again for the crucial info. Then I guess I have to abandon the Uno MCB and go with a faster processor setup. Any recommendations? I also have a Netduino board, is 48Mhz enough?

Beginner question: What is the relationship between Baud and the processor clock frequency?

What is the relationship between Baud and the processor clock frequency?

There is no fixed relationship, which is why a 2.4GHz desktop can talk to a 16MHz Arduino at 9600 bits per second without difficulty.

AWOL:

What is the relationship between Baud and the processor clock frequency?

There is no fixed relationship, which is why a 2.4GHz desktop can talk to a 16MHz Arduino at 9600 bits per second without difficulty.

I guess I should rephrase my question: What factors determine bandwidth and throughput capabilities? Just wanna know if there is a formula of some sort in determining a serial port's capabilities, that's all. Can't seem to find the Arduino Uno board's spec on that end, so I though maybe it is intuitively derived from existing specs, like the clock rate as Grumpy_Mike said?

Just wanna know if there is a formula of some sort in determining a serial port's capabilities

No formula but you can't go faster than the processors clock, or even approaching it. One reason is that you can't get the data in an out fast enough because there are not enough clock cycles to do those operations.

You could use a gameboy camera, cheap plus it has h + v edge detection built in, that's half the job done for you

You could use a gameboy camera,

Except that isn't a linescan.

That it isn't AWOL, but edge detection would work well for mapping textures or physical environment in such cases as LIDAR Lidar - Wikipedia
guess not in this case.