Friday, June 10, 2011

Update on Arduino imaging - Processing Sketch + Video!!!

Hi all,

As promised in this post, I am posting an update on the video acquisition for Arduino. Well so based on the constructive comments on the different spots this blog was highlighted, I coded a simple Processing Sketch.

Here you can see a couple of images taken from the Processing Sketch

Me in Processing (3 bits, 128x96 SCALE 5)

My Fluke MultiMeter in the same format

Including Arduino, Processing and LabVIEW drivers, images and the hardware schematics

WARNING: It is the first code I write in Processing. So it is super inefficient.

Keep in mind the following limitations
a) It takes about 8 seconds to acquire a single image.
b) The target of the image needs to be still, othewise each little level change will come from a different image and the result will be messed up.

This code needs optimization in the following items
a) Make the arduino pack the data in bytes (it currently wastes room by sending a bit per byte, but there is a story about why I do that, I'll post the solution when I get to it in the future).
b) Modify the processing sketch to read that format.
c) Currently the code acquires an image, idles for 1 second and loops. It might be wise to have some trigger event, but that is up to your application.

Video (shot with my Ipod Touch so hence the funny aspect ratio).

Down the road, my plans are
- Making the optimizations mentioned above
- Trying the flash/SD temporary storage approach
- Others

Leave comments if you guys do something related to this!!

Wednesday, June 8, 2011

Successful first couple of days!!!

Hey world,

Thanks for visiting. I am personally positively surprised that my last post got so much attention. So far (less than 48 hours after) the stats are impressive:

- More than 2500 visits to the site
- More than 1800 unique visitors
- People visited from all the continents
- People visited from more than 50 countries

Here is a map of the last 500 visits as of noon of June 8 (I cannot graph more than 500 with my service).

Anyway it is all in part because I submitted it to some of the most active websites for electronic hacking. I am proud that I made it to

- Hackaday -check it out  here
- Make Magazine's blog - check it out  here
- Dangerous prototypes - check it out  here

If somebody actually reproduces my experiment please let me know!!!

Thank you all for reading my post!!!

Monday, June 6, 2011

Acquiring images from an Analog Camera using Arduino

Incredible but true, I managed to acquire images from an analog camera using an Arduino!!!! I had the inestimable help of Mike from Nootropic Design, who helped me modifying hardware and software from the video experimenter shield.

If you are interested (I bet you are) you will get the chance of doing it yourself because I am giving all the code so that you can do that at home (at your lab or for your favorite robot!!).

Feel free to skip the sections you want to skip, but I though a little bit of background is important for the whole understanding of the project.

 This project is based on the video experimenter shield by nootropic design. The idea behind this project is to be able to capture images from an Analog Video source and send them to a computer.
Big challenges
- Memory limitation on the Arduino
- Speed (perfomance) of the 8 bit microcontroller
- Dynamically changing the threshold on the board.

 - The images acquired are low  resolution (128*96)
- The bit depth is adjustable. BUT THERE IS A TRADEOFF... the higher the bit depth the longer it takes to take an image.
- The code provided acquires images of 3 bits depth (8 levels). Getting more levels is pretty straighforward.
- The code is provided as is, you can use it as long as you quote me on your sources/publications. You can also contact MoviMED to get my 'professional'  services (not for free).
- For the time being the PC side is coded in LabVIEW (easiest option I had available). A Processing code is on the way.

The idea behind this project was to modify the assembly code provided by Nootropic Design to
- Send thresholded images back to a PC via serial
- Dynamically change the threshold so that different thresholds give different images that can be reassembled back in the computer. That is because the arduino does not have memory enough to store more than one thresholded image.
- Initially the idea was to software control the threshold but the wise advise from Mike led me to use an external DAC (resistor ladder) to externally force thresholds.

This means that the code does the following
- Wait for a serial character to trigger the acquisition
- Set the threshold for an image
- Acquire that image
- Re set the threshold for another level and iterate
- Once all levels have been acquired (8 in the example) idle

The counter part (PC)
- Sends a character
- Waits for the images to come
- Reconstructs the image

The images
Here are some images of the  MoviMED crew (me, John, Jesi and Dave) so that you can see the kind of resolution and bit depth images you can achieve. See below

What do you need?
 Here is the list
- Arduino - I used the uno, it should work on the diecimila but my diecimila does not like it. My board is old (2006) though. Might try it though. It will not work on the Mega, see why.
- Video Experimenter Shield -  I do not work for Nootropic Design but I recommend you buying this because it will open up lots of possibilities for your Arduino projects!!!
- 1% Resistors - Yes 1% is important. I used 95.38K resistors but any value should do. It is relevant that they are acurate for the kind of conversion needed.
- A potentiometer -  The value should be in the ballpark of the resistors mentioned above.

Hardware Rig
Here is a picture of the eagle schematic of what you need to assemble on top of the video experimenter shield

You can also download this image and the eagle schematic from this link. See comments on the file behind the link below.

Arduino Code and LabVIEW counterpart
Find all the code you need to run this in the same link as before. Some comments on that though

LabVIEW front panel of the image acquisition

LabVIEW code

- The code is provided as is. No guarantees and I will not support it, but I can provably give you some guidelines.
- Performance - It takes about 1 second to acquire an image, so 8 level images take about 8 seconds. I can get it better by packing more info per serial packet (I am only sending a bit per byte). I will do that when I get some extra time. So far I wanted to prove the concept.
- I am planning to code the same thing in Processing. I do not program in processing but I know several other languages so I guess it is not going to take long. 
- The LabVIEW code requires LabVIEW 2009 and NI Vision.
- Thanks Mike for your help!!!

Where to go from here

Personally I am going to work on the processing side of things so that this code is useful for the none labview guys too. 
Adding more levels should be straight forward. But keep in mind, more levels, more time to acquire an image. If you move while acquiring you might get funny pics.

Great projects from here (I am already planning to do them, I will post the results here, let me know if you get there before I do).
- Store your images in a flash chip (from microchip for instance).
- Store your images in a SD card
- Do image processing, such as filters, line profiles, edge detection, etc with multi level images
- Make your little pan and tild track an object based on vision.
- Get a Maple from LeafLabs to acquire a multilevel image (major project).
- Other

-Thanks to Mike from Nootropic Design for the help on the technical side of things
-Thanks to MoviMED, I used the cameras from work to test this code out. Check out our website and consider our AF-150x for your next RIO project!!! Consider us for any Machine Vision project!!

Initial Post

Hello world!,

Well maybe I should say

"println("Hello world")"  as this is should mainly be a blog about hacking electronics with Arduino.

I guess it is one of the thousand blogs about electronics and Arduino out there but I somehow wanted a spot to display to the world some of the interesting projects I am doing.

Mainly this blog is going to contain hardware and electronic circuits I sort of put together (hack) so that I can do interesting stuff.

A little bit more about myself can be found on my website back at Grad School at UC Irvine. It is all outdated but there are some interesting (basic and outdated) and useful tutorials on Arduino, AGVs, Matlab, Google Maps and Google Earth etc.
As far as my personal info, the description on my website is pretty accurate for my pre-industry experience, but anyhow that should give you a little bit of background on where I come from.

I am currently working for MoviMED ( mainly on Image Processing and Machine Vision solutions for the industry. I am lucky enough to get to hack with electronics on my job so I can call myself fortunate.

The professional bias (as you will see in the blog) points me to develop either automation or vision projects as that is what I would say my main interest is focused on. So expect Arduino, LabVIEW, image processing, electronics hacking and cameras to be the usual vocab on this blog.

Thanks for reading, I assure there will be not many frequent updates because I do not usually get free time to do my things, but I will definitely post the projects I think they are worth pursuing.

Give some feedback (that is always positive) so that I can improve/modify my posting.

Thanks in advance for reading.