Instructables

Arduino Lens Controller - Synchronized Zoom/Focus with Wii Classic Controller

Featured
Picture of Arduino Lens Controller - Synchronized Zoom/Focus with Wii Classic Controller
My Lumix GH2 Micro Four Thirds camera not only shoots fantastic high definition videos, but with inexpensive adapters I can use it with older manual lenses that are cheap and often very high quality. I shoot a lot of performance videos for my daughter's dance studio, and I use an f3.5 Nikon 28-85mm zoom lens because it provides a good zoom range and a fast aperture for a zoom lens. The problem with this setup is that I have to zoom and focus the lens manually, and though I try to minimize zooming while shooting, there are times when it is essential for maintaining proper framing and for showing off the dancers' skills. I've managed to learn to zoom manually without introducing excessive camera jitter (usually), but since I am also focusing manually, it's a bit of a chore to quickly and smoothly adjust the focus after zooming in or out. To overcome this shortcoming I decided to build a power zoom and focus controller for my camera (which many others have done), with the critical goal of being able to automatically maintain the proper focus as the lens smoothly zooms in and out.  After many months of prototyping I arrived at a great solution that uses an Arduino clone that accepts input from a Wii Classic controller, and which uses 2 hobby servos to move the lens. The total cost of the final product is less than $100.


The design that I eventually implemented has a number of advanced features:
- 2 joysticks provide continuously-variable speed lens control. Moving the right stick forward and back controls synchronized zoom and focus, and moving the left stick side to side controls just focus. The implementation of speed control also helps keep the servo noise down to acceptable levels.
- There are 6 programmable "goto" zoom/focus settings that can be programmed on the fly from the Wii Classic, and that will move the zoom and focus to the desired position just by pushing a button (left shoulder for widest zoom, right shoulder for most zoom, and a, b, x and y for any zoom/focus position).
- The maximum lens movement settings can also be programmed on the fly to ensure that the servos don't try to rotate beyond the limits of the lens's zoom and focus positions.
- D-pad provides single degree movements of zoom (up and down pad) and focus (left and right pad) to make precise adjustments for critical focus/zoom.

Here's a demonstration of how the synchronized zoom - focus works on my GH2 with a Nikon 28 - 85mm zoom lens:


In this instructable I'll cover the basics of how to build your own version of this controller, including the Arduino code and instructions for mounting the servos to a rail-based camera rig. I'll mention how I built my rig, but since I'm not really happy with it, I won't go into detailed steps on that and will leave it to you to figure out your own solution based on the pictures of my rig and some notes about how I made it.

This was my first attempt at building something with Arduino, though I've had some programming experience so it wasn't too difficult for me to learn the basics of Arduino code. However, if you want to tackle this project and you haven't already gained familiarity with setting up and programming an Arduino, I recommend that you go through the tutorials on the Arduino site, especially those for Servos. http://arduino.cc/en/Tutorial/HomePage
 
Remove these adsRemove these ads by Signing Up
1-40 of 43Next »
swatdojo2 years ago
thanks for the instructable! i saw in the comments you had already seen my wireless follow focus at phillipjamesproductions and I wanted to stop by and say that this turned out great. I was looking to try it out myself to implement it into a new project I'm working on, but I'm having trouble getting the controller test program to compile. It says the nunchuck_setpowerpins() was not declared. from what i understood from some research is that is the bit of code that defines the analog pins as power/gnd/data etc. I dug through the code and didnt find it declared anywhere in the libraries or your final code. Did i miss something obvious?

thanks again!
phillip
grp19 (author)  swatdojo2 years ago
Hi Phillip! Thanks for the complement, I've seen your project and I plan to use your xbee wireless implementation when I'm ready to add that capability to my controller. As for the problem with getting the WiiClassicDemo to compile, I had the same problem, and I just commented out the nunchuck_setpowerpins(); line - I don't need it because I wired my WiiChuck adapter directly to VCC (power) and ground on my Arduino, so I didn't need to configure the output pins. If you're wiring your adapter like I did, you can do the same. However if you're plugging the adapter into the Arduino pin headers, then you will need to configure 2 of the pins as power pins. apparently the person who created the demo had added that method to some the WiiChuck library, but it wasn't added to the WiiClassic library. But you can still configure the pins in your sketch. If you're plugging the WiiChuck adapter in to Analog pins 2,3,4 and 5, you can configure 2 and 3 as ground and power, by adding the following to the setup section of your code:

"pinMode(16, OUTPUT);" Sets digital 16 pin (aka Analog 2) as ground pin
"digitalWrite(16, LOW);"

"pinMode(17, OUTPUT);" Sets digital 17 pin (aka Analog 3) as +5V pin
"digitalWrite(17, HIGH);"

Thanks for catching this - I'm updating the instructable with this information for those that are plugging the WiiChuck adapter in. Keep me posted on your progress, and check back here as you work because I've made some improvements to my code that I will post here when I'm done testing it.
Poppy Ann19 days ago

Would it not be easier to just fit the zoom rings and then count the number of teeth it moves from one extreme to the other then just get a gear with double the number of teeth in place of working out the diameter then the degrees of movement etc.

i made one for a cctv camera i was playing around with but i gave up with the zoom rings and just fitted two servo's to a mount i built then just added servo arms and set the maximum movement with the transmitter (to be changed to arduino when i have time) it works great thanks for the idea.

regards Poppy Ann

grp19 (author)  Poppy Ann18 days ago
Counting the teeth is a great idea if you have the gears on hand., but I was trying to figure out what I needed so I could order the gears online. The math is also easier to do than it is to explain - it's a quick calculation, and if, like me, you're buying gears for the project, you don't have them on hand to count the teeth, so being able to work it out based on diameter allows you to get the right sized grears when you're buying gears based only on diameter of the lens gear.
Poppy Ann grp1918 days ago
Hi there,
you did a great job with the instructable i did not know you did not have any of the items on hand, i was lucky as i had all the items except for the focus rings as i had never heard of them and it was your instructable that gave me the idea so i bought a pair but in the end on my lens the focus movement is covered up so it could not take a focus ring that was when i decided to try just a servo which worked so good i went on to just use the same on the zoom control.
now i have two focus rings amongst the spare parts boxes i have.

for me trying to use this idea was just a play item i do not do any real photography it was just to play with and pass the time in the end i built a pan and tilt mounting at the same time but by the time i had it finished it is so large i think i better go back to the start and try again on a smaller scale.
i think i will borrow your code if/when i try setting it up with a arduino to operate it.
thanks again for the great instructable.
regards Poppy Ann.
joerierave1 year ago
Isn't this an option to supply the 5V needed instead;
http://www.ebay.com/itm/121108770419?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1438.l2649
(search term on ebay: 2 IN 1 12V DC USB 5V Rechargeable Li-ion Battery 4 CCTV)

It's a 12V rechargeable battery that has 12V output and also a 5V USB output. To keep things simple. Instead of building a regulator, use the 5V USB from this battery. Or are am i wrong?

Great idea by the way! Thanks for your instructable!

Another question i have; Will it be possible to also add a Nunchuck controller? And maybe only connect the classic controller for programming the lens values such as the focus and zoom rotation limits and backfocus (zoom+focus ratio)?
The nunchuck has two buttons on top, that can be used to zoom in and out and the analog stick can be used for focus. I think this will be a more ergonomic controller for one handed use. Maybe even modified to also serve as a grip for your camera rig.

Thanks again for the instructable!

Greets,
Joerie Rave
awesome project! remember: diameter x 3.14 = circumference, you'll not need a circumference calculator nex time ;-)
grp19 (author)  andrea biffi1 year ago
Ha! Thanks. Yeah, I'm aware that it's easy to calculate a circumference - just an indication of how lazy I am: I had a bunch of different gears to just from so it was easier to use someone else's Javascript calculator than to enter a bunch of values in excel or even using google's built-in calculation.
Yes I understand, all these automations make me become lazy too ;-)
Anyway I love those servos and gears, I wish to have a similar shop in Italy too..
maxtak781 year ago
Dear grp19, your project is awesome and I was thinking to use it with my crane.
I understood that you changed the servo using one at 360°, could you suggest a good servo to use? Thank you
grp19 (author)  maxtak781 year ago
Thanks. The 360 degree servo I tried turned out to be very noisy, and I ended up going back to the servos shown in the project. They provide enough rotation to cover the whole zoom range of the lens and most of the focus range, and since I use this rig only for longer range shots (dance performances and sporting events), I never need the whole focus range of the lens.

If you really do need 360 degree rotation, I recommend searching youtube first, so you can see examples of the servos moving and also understand how noisy they are.

Let me know how your project goes.

Guy
ibm661 year ago
Great project, thanks. I got encouraged to follow up your instructions and build one for my camera. But i'm experiencing some problems, my zoom pin 9 does not seem to respond at all and pin 10 works only when pin 9 is attached. And i see a code:
"const int ratioPin = A1;" what does this line do?
rstruk1 year ago
Nice instructions! What model $20 digital servos did you get and do they work well? Is 10kg torque enough for most lenses if I use a 60 tooth gear? Lastly what work did you have to do on the lathe to fit the gear? Cheers
vmenezes1 year ago
Hello dear friend! First thanks for the fantastic project, their generosity has encouraged me to enter this universe with DIY Arduino. I'm in Brazil, here it does not have the same disclosure therein, I am most excited to try. I already bought my arduino, motors, control and everything else you listed in the materials. But as I am a beginner, I missed a wiring diagram because I could not identify where I connect the cables pins for the control of arduir I bought on ebay.

If you can simplify a fool for beginner like me, I would be immensely grateful.

Again congratulations for the initiative and generosity!
Valter Menezes
grp19 (author)  vmenezes1 year ago
Hi Valter,

Thanks for you comment, and I'm glad you have decided to try this project. At least one other person has successfully built this, so I'm glad to see another person trying it. The text describes where to connect everything, but I think it is not as clear as a wiring diagram would be, and the other builder thought I had one point wrong. I will try to put together a diagram and update the instructable with it.
Brilliant work. This actually solves another problem perfectly. The issue of dual focus anamorphics.
grenho2 years ago
That's a great project! I would just upgrade the servos to be more silent and find a way to hook up an external monitor. It would be awesome to have a "control console" arcade style -> http://hal9k.dk/lib/exe/fetch.php?hash=816af8&w=150&h=122&media=http%3A%2F%2Fvancefry.com%2Fwp-content%2Fuploads%2Fpixelbox-mockup.jpg
grp19 (author)  grenho2 years ago
Thanks! The zoom servo that I have isactually quieter than the focus servo (which is what you hear som prominently in the video), so I'm hoping that the higher quality digital servos that I've ordered will be even quieter. If they aren't then I have a hack in mind for the servos to make them quieter based on what I found by taking apart some zoom drives from old camcorders. And since my GH2 has live HDMI video out, I already use my camera with an external monitor when I'm shooting dance performance videos. However I haven't gone as far as putting it all in a control console, though I've certainly thought about it. One thing's for sure, I'm not done improving this, and look forward to having more feedback.
You can just buy small dc motors and rig up o-ring drive to eliminate the noisy gears, and perhaps some rubber mounting bushings. I was actually thinking about doing this myself, but this takes the work out of figuring out all that mess and gives me a great start point. Thanks a ton!
grp19 (author)  toxictorch2 years ago
Hi toxictorch. I'm glad you're interested in this project, and hope you share whatever improvements you make. I've been through many iterations, and initially avoided servos because of the noise. I also contemplated dc motors and drive belts (since as you correctly note, the noise is from the gears in the servos), but the thing that brought me back to servos is that they provide an easy closed-loop solution, which means that I don't have to count steps (like I would with a stepper) in order to program a position and have the motor go to that position with a simple command. With the solution that you outline, you'd have to add a position sensor to the lens or the motor drive in order to know exactly where the lens is at (I strongly considered this approach, but found it overly complicated to implement and to install on a camera rig). That approach also requires you to handle interrupts, for which the Arduino can only handle two. I do believe I have a solution to the servo gear noise though, and will update my project when I have had a chance to implement it and prove that it works.
Simple solution as well, you just yank the guts out of the servo. Board with a soldered on motor and a pot. You can change up the pot or even modify it for continuous rotation if you want with just some resistors (but then you get the whole counting steps crap). Basically just get the reduction similar and attach the pot to either the final output cog/gear that goes to the lens, or even have a separate pot/gear attached to the lens.

Gears are nice for ensuring proper steps, but you could always go friction drive if you mount the pots really well. Taking out the form factor of the servo would also allow you to make a much more compact unit, but I have way too many vapor projects on the backburner to be going all crazy with this, I will probably stick with simple and quick.

Also, it is 3am after I just got back from watching the Avenger's, late night rants are bound to be horrible.
There's not much point in taking the brains out of a servo, it wouldn't reduce the noise and it would get rid of any advantage the author chose the servos for. Also, using bare DC motors are tricky, especially for such a delicate task like focusing a lens.
Not sure you are thinking all the way through on the idea. You can use the same little dc motor in the servo if you want, but you dont need to use gears for reduction (which is the noise). The whole idea of "delicate" is on one crappy pot in the servo anyways.

But let us make this simple to understand, just take out all the gears for the servo and replace it with two grooved pulleys and an o-ring to drive them. Keep the pot at the end pulley and you have the exact same thing as a servo, with a much quieter output. There are far better solutions to this, but using the cheap servo electronics makes it easy for anyone to do this. An encoded motor is great, but a servo uses a pot for a solution.

The author knew what I meant though.
grp19 (author)  toxictorch2 years ago
Yeah, I knew :), but thanks for clarifying so that others can also follow what you were talking about. I actually might try a hybrid solution to what you outlined, which is inspired by a teardown I did of some old VHS camcorder zoom mechanisms: they have a gear box, but the motor drives the gearbox via a step-down pulley and belt. this not only isolates the gear train from the motor vibration, but it also reduces the overall speed of the gear drive, and the slower they turn, the quieter the gears are. In fact this is one of the reasons that my controller is quieter than some of the commercial ones: my Arduino code gives me speed control over the servos, and I limit it to keep the gear noise down. I've done a couple of other things since posting this to imrprove the performance of my controller: I doubled the resolution of the servos by tweaking the Arduino Servo library, and I've replace the focus servo with another one I had on hand, and which turned out to be a lot quieter. I'm going to upload the new code and will post some new videos demonstrating the noise improvement when I get a chance. Again, thanks again for your suggestions and feedback - keep it coming!
Sounds great, I will most certainly build something within a year when I make a trip to Japan for a month or so. Keep updating this! Thanks a ton for your work.
grp19 (author)  toxictorch2 years ago
Believe me, I've looked at all kinds of different possibilities for the drive system, including using the servo guts with my own motor and drive, as you suggested (and that's very likely to happen with the new servos I just received). There are also 2 open source projects, OpenServo and OpenEncoder that look to be an even more promising path if I decide that I need to build a custom lens servo. In my wildest dreams I'd like to build a truly quiet drive system with all of the required intelligience built into the drive itself, so the arduino doesn't have to do anything other than send the speed and (where necessary) target position, and can easily read the position from the drive system. I'm looking at the OpenServo/OpenEncoder project for that longer term goal, because OpenServo provides much more control over the servo resolution and speed than you get with even digital servos, and the OpenEncoder project replaces the limited turn, limited accuracy potentiometer with an unlimited turn and very precise magnetic encoder.
reptedjess2 years ago
Whoa this is really cool! I'm a photographer and never really had any interest in video, but this is seriously making me consider getting into that side of things. Imagine how awesome it would be to have a shoulder rig with these controls!
Chakazuluu2 years ago
This is really cool and timely because I am designing a camera crane for my shoulder mount Panasonic DVC20P. I was worrying over having to design from scratch a zoom & focus mechanism. Your project takes a lot of the work out of it. Thank you very much.
grp19 (author)  Chakazuluu2 years ago
Thanks Chakazuluu. I found one thing that I missed in the code that I uploaded, and I'm currently working on improving the resolution of the servo control. When I make those changes I will upload updated files, so check back as you work on this. Also, if you're going to use this on a boom you may want to consider adding wireless control, which can be done with a second Arduino and some xbee units. When I get around to doing that I will share it, but if you beat me to it you can share as well. Also, using higher quality servos will give you very quiet operation. I just swapped out the focus servo (which was the noisest of the 2 in the videos) and focusing is now much quieter and even smoother. I used a Hitec with karbonite gears, and added some additional grease to the gearcase. Good luck and have fun!

P.S. Here's the thing I missed:
The WiiClassic.h library contains a DEFINE_ON_HOLD feature that must be uncommented in order to ensure that the button presses are reported just once. To uncomment this, you have to open the ..\arduino-1.0\libraries\MiconoWiiClassic\WiiClassic.h file in Notepad and change the following line:
//#define REPORT_ON_HOLD
to
#define REPORT_ON_HOLD
If you don't do this, you will notice that the D-pad button presses will keep moving the servos as you hold the button, whereas it should only move the servo one step per press. This error may also cause strange behavior from other button presses.
Brian2020202 years ago
I found nicely machined rail mounts that hold servo's. I contacted the dealer to see if they would be willing to sell just the rail mounts without everything else.

http://www.dvcity.com/dvshop/product.php?productid=18089&cat=253&page=1
grp19 (author)  Brian2020202 years ago
Their servo mounts look nice, and it would be cool if they would sell them as a kit part. But looking at their prices I think that they're going to be steep for a DIY solution. As for the rail system, sensoryhouse made a much nicer rail mount system than mine, but you definitely need a drill press and a metal cutting bandsaw to pull it off: http://www.instructables.com/id/DIY-HDSLR-Shoulder-Rig-Follow-Focus/
I have some useful info to add to this topic.  


Here is a link to a PDF with live links.



Wireless Follow Focus.png
Is the Wii Classic controller being used on this set up as well? It doesn't say on the PDF or Phillip James Productions website.
grp19 (author)  Brian2020202 years ago
I looked at Phillip's project, and his just provides focus control and uses an optical encoder to control the focus servo, so there's no Wii controller involved. It would be possible to add a similar feature to my project that could work in conjunction with the Wii controller.
I think adding an accurate repeatable way to mark the focus would be very nice.
lol, i considered the "topic" to be Arduino lens control, not Wii controller hacks.
I think what sets grp19's project above the rest is the zoom/focus syncing. The Wii controller isn't perfect for marking focus and what not, but it has a lot of buttons for programing and it's inexpensive. The ideal situation would be combining the 2 methods like grp19 suggested.
not sure why the image shows up so damn small but the PDF is hi res.
grp19 (author)  sensoryhouse2 years ago
It works fine if you click the link. And thanks for posting it. I especially appreciated the link to the silent (or very quiet) servo in the PDF. At $90 they're pretty expensive, but it's good to know that there's an alternative if the servo hack that I'm working on doesn't work out.
Those servo's do look nice. Silent, strong, and quick. Once I dive into this project I'll probably get those.
1-40 of 43Next »