Robotic Camera Dolly System
![main1.jpg](/proxy/?url=https://content.instructables.com/FYW/OPO8/HRTKJ49B/FYWOPO8HRTKJ49B.jpg&filename=main1.jpg)
Recently I received the opportunity to try out Servo City's Actobotics build system. While I could have used it to build a great many things, I ultimately decided to make a programmable camera dolly system. This device allows me to create time lapse films with complex movements as well as program repeatable automated real-time camera movements. In other words, this rig allows you to smoothly film complex camera movements in time lapse and real-time.
Features
![main3.jpg](/proxy/?url=https://content.instructables.com/F9R/77F7/HRTKJIBG/F9R77F7HRTKJIBG.jpg&filename=main3.jpg)
![main2.jpg](/proxy/?url=https://content.instructables.com/FPP/1QAT/HRTKJ49C/FPP1QATHRTKJ49C.jpg&filename=main2.jpg)
The Robotic Camera Dolly System has these key features:
- The ability for real-time filming and stop motion photography.
- It is ontrollable via an easy-to-use touch screen.
- The system can pan, tilt and drive at the same time.
- All actions are repeatable thanks to servo motors and a DC drive motor with a rotary encoder.
- Thanks to the dynamic Actobotics build system and open source Arduino-based hardware, it is fully customizeable to meet your own needs.
Materials
You will need:
(x1) Motor with rotary encoder
(x1) HS-785HB winch servo assembly
(x1) HS-5485HB winch servo assembly
(x3) Dolly Free Wheel Idler Plates (pair)
(x12) 90° Quad Hub Mount D
(x10) 90° Quad Hub Mount C
(x5) 90° Quad Hub Mount B
(x8) 2.975” Low Friction Skate Wheels
(x16) 8mm Non-Flanged Ball Bearings
(x4) Center Hole Adaptors (4 pk)
(x7) 8mm Flanged Standoff
(x1) Dolly Drive Wheel Plates (pair)
(x1) Motor Mount D (3mm screws included)
(x1) 6mm to 1/4” Set Screw Coupler
(x1) 2.5” Stainless Steel D-Shaft
(x1) Drive Wheel Adaptor Kit B
(x1) 1/4” ID (1/2” OD) Flanged Ball Bearing
(x5) 12" aluminum channel
(x1) 3.75" aluminum channel
(x1) 4.5" aluminum channel
(x1) 6" aluminum channel
(x8) Attachment blocks (1 pack)
(x1) Dual flat channel bracket
(x1) 0.25" hub spacer
(x1) 90 degree hub to hub mount
(x1) 3" power servo single gearbox arm
(x1) 3" x 3" x 1/8" santoprene rubber
(x2) 24" x 36" x 1/4" plywood
(x2) 3/4" x 8' rods
(x1) Heavy Duty ON/OFF switch
(x1) DC power jack
(x1) DC power plug
(x1) 12V Ni-MH rechargeable battery
(x2) 1.5K resistors
(x1) 1K resistor
(x1) 5V SPST relay
(x1) SPST momentary pushbutton switch
(x1) Mono audio cable
(x1) TIP120 transistor
(x1) 1N4004 diode
(x1) 3/32" mono plug (or appropriate camera trigger plug)
(x2) Arduino Uno
(x1) Arduino 2.8" touch shield
(x2) Arduino proto shield
(x1) 36" x 24" x 1/8" acrylic
(Some of the links on this page contain Amazon affiliate links. This does not change the price of any of the items for sale. However, I earn a small commission if you click on any of those links and buy anything. I reinvest this money into materials and tools for future projects. If you would like an alternate suggestion for a supplier of any of the parts, please let me know.)
Assemble the Idler Wheels
![27A.jpg](/proxy/?url=https://content.instructables.com/FHP/GI5E/HS8FUA9N/FHPGI5EHS8FUA9N.jpg&filename=27A.jpg)
![27B.jpg](/proxy/?url=https://content.instructables.com/FLW/D0WR/HS8FUA9O/FLWD0WRHS8FUA9O.jpg&filename=27B.jpg)
![27C.jpg](/proxy/?url=https://content.instructables.com/FAA/E6KT/HS8FUA9R/FAAE6KTHS8FUA9R.jpg&filename=27C.jpg)
![27D.jpg](/proxy/?url=https://content.instructables.com/FVX/7BE0/HS8FUA9S/FVX7BE0HS8FUA9S.jpg&filename=27D.jpg)
![27E.jpg](/proxy/?url=https://content.instructables.com/FU0/Y63H/HS8FUA9T/FU0Y63HHS8FUA9T.jpg&filename=27E.jpg)
Insert the non friction ball bearings into one of the low friction skate wheels.
Pass the 8mm flanged standoff through the bearing.
Take a 90 degree quad hub mount D and insert center hole adapters on each side.
Pass a bolt through the two center hole adapters and fasten it firmly in place.
Repeat this process 6 more times.
Idler Wheel Assemblies
![28A.jpg](/proxy/?url=https://content.instructables.com/FYV/5E2J/HS8FUBKL/FYV5E2JHS8FUBKL.jpg&filename=28A.jpg)
![28B.jpg](/proxy/?url=https://content.instructables.com/FCJ/IJDQ/HS8FUBKP/FCJIJDQHS8FUBKP.jpg&filename=28B.jpg)
![28C.jpg](/proxy/?url=https://content.instructables.com/F77/A948/HS8FUBKT/F77A948HS8FUBKT.jpg&filename=28C.jpg)
![28D.jpg](/proxy/?url=https://content.instructables.com/FFY/41JN/HS8FUBKU/FFY41JNHS8FUBKU.jpg&filename=28D.jpg)
Take two of the idler wheel assemblies and affix them to one of the dolly wheel idler plates.
Also attach a 90 degree quad hub mount B to the same dolly wheel idler plate.
Once all of these are attached, connect the other dolly wheel idler plate to the other side.
Build 3 of these assemblies in total.
Attach a Connection Bracket
![29B.jpg](/proxy/?url=https://content.instructables.com/FD6/SWTX/HS8FUD0N/FD6SWTXHS8FUD0N.jpg&filename=29B.jpg)
![29C.jpg](/proxy/?url=https://content.instructables.com/F93/0F9A/HS8FUD0Q/F930F9AHS8FUD0Q.jpg&filename=29C.jpg)
![29D.jpg](/proxy/?url=https://content.instructables.com/F99/CBNT/HS8FUD0T/F99CBNTHS8FUD0T.jpg&filename=29D.jpg)
Attach a 90 degree quad hub mount C centered upon the outside of one of the dolly drive wheel plates on all 3 of the assemblies.
Rotary Encoder
![2A.jpg](/proxy/?url=https://content.instructables.com/F4X/C0EU/HOVUBRGO/F4XC0EUHOVUBRGO.jpg&filename=2A.jpg)
![2B.jpg](/proxy/?url=https://content.instructables.com/FDL/F5TP/HOVUBRGP/FDLF5TPHOVUBRGP.jpg&filename=2B.jpg)
![2C.jpg](/proxy/?url=https://content.instructables.com/F8K/S3O2/HOUG7ARR/F8KS3O2HOUG7ARR.jpg&filename=2C.jpg)
![2D.jpg](/proxy/?url=https://content.instructables.com/F9P/HJA6/HOUG930E/F9PHJA6HOUG930E.jpg&filename=2D.jpg)
![2E.jpg](/proxy/?url=https://content.instructables.com/FJ0/C48F/HOUG7ARS/FJ0C48FHOUG7ARS.jpg&filename=2E.jpg)
![2F.jpg](/proxy/?url=https://content.instructables.com/FY9/GJAT/HOUG0S0I/FY9GJATHOUG0S0I.jpg&filename=2F.jpg)
![2G.jpg](/proxy/?url=https://content.instructables.com/FNR/0QOR/HOVUBRGR/FNR0QORHOVUBRGR.jpg&filename=2G.jpg)
![2H.jpg](/proxy/?url=https://content.instructables.com/FAK/47U5/HOUFY8VF/FAK47U5HOUFY8VF.jpg&filename=2H.jpg)
The rotary encoder needs to be attached the DC drive motor.
Start by peeling the adhesive cover from the plastic encoder frame and center this on the backside of the motor.
Next, press the encoder disk onto the thin shaft sticking out the back of the motor.
Finally, snap the plastic cover with the encoder attached to the plastic base.
Wire the Motor
![20A.jpg](/proxy/?url=https://content.instructables.com/F27/FI7R/HS80FQRB/F27FI7RHS80FQRB.jpg&filename=20A.jpg)
Attach a red wire to the DC motor's positive terminal and a black wire to the negative terminal.
Attach Mount
![21A.jpg](/proxy/?url=https://content.instructables.com/F3O/9IE2/HS80FQZE/F3O9IE2HS80FQZE.jpg&filename=21A.jpg)
![21B.jpg](/proxy/?url=https://content.instructables.com/F6N/NUUC/HS8FU82K/F6NNUUCHS8FU82K.jpg&filename=21B.jpg)
![21C.jpg](/proxy/?url=https://content.instructables.com/F2U/KG9X/HS8FU82M/F2UKG9XHS8FU82M.jpg&filename=21C.jpg)
Affix the motor mount D securely to the motor.
Coupler
![22A.jpg](/proxy/?url=https://content.instructables.com/FCF/DQ2W/HS80FQZJ/FCFDQ2WHS80FQZJ.jpg&filename=22A.jpg)
![22B.jpg](/proxy/?url=https://content.instructables.com/FKP/ZJ2H/HS8FU839/FKPZJ2HHS8FU839.jpg&filename=22B.jpg)
![22C.jpg](/proxy/?url=https://content.instructables.com/FUV/GHQA/HS8FUW0K/FUVGHQAHS8FUW0K.jpg&filename=22C.jpg)
Attach the 6mm to 1/4” Set Screw Coupler to the motor shaft.
Assemble the Drive Wheel
![23A.jpg](/proxy/?url=https://content.instructables.com/FMX/RL09/HS8FU8OM/FMXRL09HS8FU8OM.jpg&filename=23A.jpg)
![23B.jpg](/proxy/?url=https://content.instructables.com/FSA/PO2G/HS8FU8ON/FSAPO2GHS8FU8ON.jpg&filename=23B.jpg)
![23C.jpg](/proxy/?url=https://content.instructables.com/F62/T0GO/HS8FU8OO/F62T0GOHS8FU8OO.jpg&filename=23C.jpg)
![23D.jpg](/proxy/?url=https://content.instructables.com/FT7/ZCPD/HS8FU8OP/FT7ZCPDHS8FU8OP.jpg&filename=23D.jpg)
![23E.jpg](/proxy/?url=https://content.instructables.com/FE3/ZKA5/HS8FU8OS/FE3ZKA5HS8FU8OS.jpg&filename=23E.jpg)
Install the drive wheel adapter kit B into one of the low friction skate wheels along with the 2.5" stainless steel D-shaft.
On the side of the wheel opposite the mounting screw for the adapter kit, slide on a center hole adapter, followed by a quad hub mount D bracket.
Connect
![24A.jpg](/proxy/?url=https://content.instructables.com/FGW/W4AK/HS8FU8YN/FGWW4AKHS8FU8YN.jpg&filename=24A.jpg)
![24B.jpg](/proxy/?url=https://content.instructables.com/F3B/2XRJ/HS8FU8Z0/F3B2XRJHS8FU8Z0.jpg&filename=24B.jpg)
![24C.jpg](/proxy/?url=https://content.instructables.com/FOG/H8QY/HS8FU8Z1/FOGH8QYHS8FU8Z1.jpg&filename=24C.jpg)
![24D.jpg](/proxy/?url=https://content.instructables.com/FSB/9LTM/HS8FU8ZF/FSB9LTMHS8FU8ZF.jpg&filename=24D.jpg)
Connect the 2.5" D shaft to the motor shaft using the coupling set screw.
Attach a Connector
![26A.jpg](/proxy/?url=https://content.instructables.com/FV6/Y11R/HS8FU9H1/FV6Y11RHS8FU9H1.jpg&filename=26A.jpg)
![26B.jpg](/proxy/?url=https://content.instructables.com/FCS/GT37/HS8FU9H2/FCSGT37HS8FU9H2.jpg&filename=26B.jpg)
Attach a quad hub mount C centered upon one of the dolly drive wheel plates.
Build a Drive Assembly
![25A.jpg](/proxy/?url=https://content.instructables.com/FSI/S8SG/HS8FU9QX/FSIS8SGHS8FU9QX.jpg&filename=25A.jpg)
![25B.jpg](/proxy/?url=https://content.instructables.com/FL1/Y6VY/HS8FU9R3/FL1Y6VYHS8FU9R3.jpg&filename=25B.jpg)
![25C.jpg](/proxy/?url=https://content.instructables.com/F1Z/3QZ4/HS8FU9R4/F1Z3QZ4HS8FU9R4.jpg&filename=25C.jpg)
![25D.jpg](/proxy/?url=https://content.instructables.com/FHV/1SNT/HS8FU9R5/FHV1SNTHS8FU9R5.jpg&filename=25D.jpg)
![25E.jpg](/proxy/?url=https://content.instructables.com/F92/C03M/HS8FU9R8/F92C03MHS8FU9R8.jpg&filename=25E.jpg)
Attach the motor and drive wheel to the drive wheel plate along with an idler wheel and a quad hub mount B.
Install the other drive wheel plate on the other side once completed.
Wheel Channels
![30A.jpg](/proxy/?url=https://content.instructables.com/FS0/6ACT/HS8FUDQA/FS06ACTHS8FUDQA.jpg&filename=30A.jpg)
![30B.jpg](/proxy/?url=https://content.instructables.com/FNL/CV2V/HS8FUDQE/FNLCV2VHS8FUDQE.jpg&filename=30B.jpg)
![30C.jpg](/proxy/?url=https://content.instructables.com/F8B/SWSC/HS8FUDQF/F8BSWSCHS8FUDQF.jpg&filename=30C.jpg)
![30D.jpg](/proxy/?url=https://content.instructables.com/F7C/RLAO/HS8FUDQI/F7CRLAOHS8FUDQI.jpg&filename=30D.jpg)
![30E.jpg](/proxy/?url=https://content.instructables.com/FBZ/EW4R/HS8FUDQJ/FBZEW4RHS8FUDQJ.jpg&filename=30E.jpg)
Attach two idler wheel assemblies to the outside of a 12" aluminum channel.
Attach an idler wheel assembly and the motor drive assembly to the outside of another 12" aluminum channel.
Structural Channels
![31A.jpg](/proxy/?url=https://content.instructables.com/FS2/8HXS/HS8FUEAQ/FS28HXSHS8FUEAQ.jpg&filename=31A.jpg)
![31B.jpg](/proxy/?url=https://content.instructables.com/FXE/GXI8/HS8FUEAR/FXEGXI8HS8FUEAR.jpg&filename=31B.jpg)
![31C.jpg](/proxy/?url=https://content.instructables.com/F4W/S13C/HS8FUEAS/F4WS13CHS8FUEAS.jpg&filename=31C.jpg)
![31D.jpg](/proxy/?url=https://content.instructables.com/FAD/ESY8/HS8FUEAT/FADESY8HS8FUEAT.jpg&filename=31D.jpg)
Take three 12" aluminum channels and install a 90 degree quad mount C connector on each end.
Assemble the Base
![32A.jpg](/proxy/?url=https://content.instructables.com/FU7/9PPP/HS8FUERX/FU79PPPHS8FUERX.jpg&filename=32A.jpg)
![32B.jpg](/proxy/?url=https://content.instructables.com/F4M/LZ0O/HS8FUERZ/F4MLZ0OHS8FUERZ.jpg&filename=32B.jpg)
![32C.jpg](/proxy/?url=https://content.instructables.com/FPJ/GDCE/HS8FUES2/FPJGDCEHS8FUES2.jpg&filename=32C.jpg)
![32D.jpg](/proxy/?url=https://content.instructables.com/FUT/GU4J/HS8FUES3/FUTGU4JHS8FUES3.jpg&filename=32D.jpg)
![32E.jpg](/proxy/?url=https://content.instructables.com/FPI/WD2E/HS8FUES4/FPIWD2EHS8FUES4.jpg&filename=32E.jpg)
Connect the two aluminum wheel channels together with the three structural channels.
Make certain that there is 3" between each structural channel.
3.75" Channel
![33A.jpg](/proxy/?url=https://content.instructables.com/F98/QJD8/HS8FUF82/F98QJD8HS8FUF82.jpg&filename=33A.jpg)
![33B.jpg](/proxy/?url=https://content.instructables.com/FG9/L6TG/HS8FUF83/FG9L6TGHS8FUF83.jpg&filename=33B.jpg)
![33C.jpg](/proxy/?url=https://content.instructables.com/F1E/Y0TH/HS8FUF88/F1EY0THHS8FUF88.jpg&filename=33C.jpg)
Attach a 90 degree quad hub mount B to the end of a 3.75" aluminum channel.
Attach
![34A.jpg](/proxy/?url=https://content.instructables.com/F01/9JO0/HS8FUFKF/F019JO0HS8FUFKF.jpg&filename=34A.jpg)
![34B.jpg](/proxy/?url=https://content.instructables.com/FUT/N5BB/HS8FUFKG/FUTN5BBHS8FUFKG.jpg&filename=34B.jpg)
![34C.jpg](/proxy/?url=https://content.instructables.com/F7E/LKY8/HS8FUFKH/F7ELKY8HS8FUFKH.jpg&filename=34C.jpg)
![34D.jpg](/proxy/?url=https://content.instructables.com/FSY/VWXC/HS8FUFKI/FSYVWXCHS8FUFKI.jpg&filename=34D.jpg)
Center the 3.75" aluminum channel perpendicular to the base and fasten it in place with mounting bolts.
In other words, center it on end upon the center support chanel.
Acrylic Base Supports
![35A.jpg](/proxy/?url=https://content.instructables.com/FEZ/G9OB/HS8FUG53/FEZG9OBHS8FUG53.jpg&filename=35A.jpg)
![35B.jpg](/proxy/?url=https://content.instructables.com/FSN/EELW/HS8FUG54/FSNEELWHS8FUG54.jpg&filename=35B.jpg)
![35C.jpg](/proxy/?url=https://content.instructables.com/F71/O320/HS8FUG55/F71O320HS8FUG55.jpg&filename=35C.jpg)
Connect attachment blocks to the inside of each support channel such that they are all aligned and 7.82" apart legnthwise.
Top Panel
![7A.jpg](/proxy/?url=https://content.instructables.com/F64/R8MB/HP0CMBOK/F64R8MBHP0CMBOK.jpg&filename=7A.jpg)
![7B.jpg](/proxy/?url=https://content.instructables.com/FH6/4D5C/HP0CUJMK/FH64D5CHP0CUJMK.jpg&filename=7B.jpg)
![7C.jpg](/proxy/?url=https://content.instructables.com/FTG/22V0/HP0CPTP6/FTG22V0HP0CPTP6.jpg&filename=7C.jpg)
Use the attached file as a guide to cut the top panel out of 1/8" acrylic.
Install
![8A.jpg](/proxy/?url=https://content.instructables.com/F5S/BIMJ/HP0CUKAO/F5SBIMJHP0CUKAO.jpg&filename=8A.jpg)
![8B.jpg](/proxy/?url=https://content.instructables.com/FDM/5MPV/HP0CHORT/FDM5MPVHP0CHORT.jpg&filename=8B.jpg)
![8C.jpg](/proxy/?url=https://content.instructables.com/FXZ/AF95/HP0CPU5U/FXZAF95HP0CPU5U.jpg&filename=8C.jpg)
Install the SPST on/off switch and M-type power jack into the appropriate holes in the acrylic top panel.
Wire It Up
![9A.jpg](/proxy/?url=https://content.instructables.com/FE1/ZRO3/HP0CPU64/FE1ZRO3HP0CPU64.jpg&filename=9A.jpg)
![schematic1.png](/proxy/?url=https://content.instructables.com/FFC/1V89/HSVGF44E/FFC1V89HSVGF44E.png&filename=schematic1.png)
Wire the power jack to the DPDT power switch as specified in the schematic.
Acrylic Base
![10A.jpg](/proxy/?url=https://content.instructables.com/F2S/AUV4/HP0CR1PX/F2SAUV4HP0CR1PX.jpg&filename=10A.jpg)
Cut the base pieces out of 1/8" acrylic using the attached template.
Prep the Battery
![11A.jpg](/proxy/?url=https://content.instructables.com/F6Q/89A4/HP0CRD9L/F6Q89A4HP0CRD9L.jpg&filename=11A.jpg)
![11B.jpg](/proxy/?url=https://content.instructables.com/F4C/32NU/HP0CRD9M/F4C32NUHP0CRD9M.jpg&filename=11B.jpg)
![11C.jpg](/proxy/?url=https://content.instructables.com/FUO/90RA/HP0CRD9N/FUO90RAHP0CRD9N.jpg&filename=11C.jpg)
![11D.jpg](/proxy/?url=https://content.instructables.com/FB2/AQZD/HP0CRD9O/FB2AQZDHP0CRD9O.jpg&filename=11D.jpg)
![11E.jpg](/proxy/?url=https://content.instructables.com/F2V/PS86/HP0CRDBL/F2VPS86HP0CRDBL.jpg&filename=11E.jpg)
Zip tie the battery to the acrylic base with the set of four 0.2" holes in the center.
Trim away the plastic connector from the battery, leaving as much wire connected to the battery as possible.
Connect the Battery
![12A.jpg](/proxy/?url=https://content.instructables.com/FGZ/G5C5/HS18C62W/FGZG5C5HS18C62W.jpg&filename=12A.jpg)
![schematic1.png](/proxy/?url=https://content.instructables.com/FFC/1V89/HSVGF44E/FFC1V89HSVGF44E.png&filename=schematic1.png)
Connect the battery wires to the appropriate terminals on the power jack as specified in the schematic.
Solder
![4A.jpg](/proxy/?url=https://content.instructables.com/F0O/2W98/HOUFY9AZ/F0O2W98HOUFY9AZ.jpg&filename=4A.jpg)
![4B.jpg](/proxy/?url=https://content.instructables.com/FJP/XZCQ/HOUFY9B0/FJPXZCQHOUFY9B0.jpg&filename=4B.jpg)
![4C.jpg](/proxy/?url=https://content.instructables.com/FOC/W0QP/HOUG0SOK/FOCW0QPHOUG0SOK.jpg&filename=4C.jpg)
![4D.jpg](/proxy/?url=https://content.instructables.com/FU4/9NGM/HOUG939W/FU49NGMHOUG939W.jpg&filename=4D.jpg)
![4E.jpg](/proxy/?url=https://content.instructables.com/FUP/3AD6/HOUG2SMY/FUP3AD6HOUG2SMY.jpg&filename=4E.jpg)
Flip the proto shield over and insert the female header pins upwards into the appropriate slots on the shield.
Next, plug the touch screen shield into the female header sockets to ensure the pins are all being held straight.
Finally, quickly solder all of the pins in place. Avoid heating up any of the pins for too long to prevent any damage to the touch shield.
Attach Wires
![5A.jpg](/proxy/?url=https://content.instructables.com/FUE/TZ52/HP0CR7OA/FUETZ52HP0CR7OA.jpg&filename=5A.jpg)
![5B.jpg](/proxy/?url=https://content.instructables.com/FOR/3E5E/HP0CNYLH/FOR3E5EHP0CNYLH.jpg&filename=5B.jpg)
![schematic1.png](/proxy/?url=https://content.instructables.com/FFC/1V89/HSVGF44E/FFC1V89HSVGF44E.png&filename=schematic1.png)
Start building the circuit as specified in the schematic.
Extend wires for the servos, the DC motor and rotary encoder from the proto shields, but do not yet connect them. Additionally, connect a shielded mono cable to the proto shield for the trigger plug, but also, do not yet wire the plug into place.
Program the Arduinos
![50A.jpg](/proxy/?url=https://content.instructables.com/FHH/QZ9S/HSBSLABJ/FHHQZ9SHSBSLABJ.jpg&filename=50A.jpg)
Upload this code to the Arduino controlling the touch shield:
// Camera Rig Touch Screen Controller #include <Wire.h> #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_TFTLCD.h> // Hardware-specific library #include <TouchScreen.h> #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif #ifndef USE_ADAFRUIT_SHIELD_PINOUT #error "This sketch is intended for use with the TFT LCD Shield. Make sure that USE_ADAFRUIT_SHIELD_PINOUT is #defined in the Adafruit_TFTLCD.h library file." #endif // These are the pins for the shield! #define YP A1 // must be an analog pin, use "An" notation! #define XM A2 // must be an analog pin, use "An" notation! #define YM 7 // can be a digital pin #define XP 6 // can be a digital pin #ifdef __SAM3X8E__ #define TS_MINX 125 #define TS_MINY 170 #define TS_MAXX 880 #define TS_MAXY 940 #else #define TS_MINX 150 #define TS_MINY 120 #define TS_MAXX 920 #define TS_MAXY 940 #endif // For better pressure precision, we need to know the resistance // between X+ and X- Use any multimeter to read it // For the one we're using, its 300 ohms across the X plate TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); #define LCD_CS A3 #define LCD_CD A2 #define LCD_WR A1 #define LCD_RD A0 // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define LBLUE 0x65FF Adafruit_TFTLCD tft; int oldcolor, currentcolor; bool pan = 1; int panPosition1 = 20; int panPosition2 = 20; bool tilt = 0; int tiltPosition1 = 20; int tiltPosition2 = 20; bool drive = 0; int drivePosition1 = 20; int drivePosition2 = 20; bool time = 0; int timePosition1 = 20; int timePosition2 = 20; int startSend = 0; int x; void setup(void) { Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); tft.reset(); uint16_t identifier = tft.readID(); if(identifier == 0x9325) { Serial.println(F("Found ILI9325 LCD driver")); } else if(identifier == 0x9328) { Serial.println(F("Found ILI9328 LCD driver")); } else if(identifier == 0x7575) { Serial.println(F("Found HX8347G LCD driver")); } else { Serial.print(F("Unknown LCD driver chip: ")); Serial.println(identifier, HEX); return; } tft.begin(identifier); tft.setRotation(1); tft.fillScreen(BLACK); drawMenu(); tft.drawRect(0, 0, 58, 40, WHITE); //set initial slider states tft.drawRect(19, 89, 272, 6, WHITE); tft.fillRect(20, 90, 270, 4, YELLOW); tft.drawRect(panPosition1, 71, 17, 42, WHITE); tft.fillRect((panPosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect(19, 169, 272, 6, WHITE); tft.fillRect(20, 170, 270, 4, YELLOW); tft.drawRect(panPosition2, 151, 17, 42, WHITE); tft.fillRect((panPosition2 + 1), 152, 15, 40, MAGENTA); currentcolor = RED; pinMode(13, OUTPUT); } #define MINPRESSURE 10 #define MAXPRESSURE 1000 void loop(){ digitalWrite(13, HIGH); Point p = ts.getPoint(); digitalWrite(13, LOW); // if sharing pins, you'll need to fix the directions of the touchscreen pins pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); // we have some minimum pressure we consider 'valid' // pressure of 0 means no pressing! if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { // scale from 0->1023 to tft.width p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0); p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0); //**************************** // TOP MENU SELECTION CODE!!!! //**************************** if (p.x > 300) { oldcolor = currentcolor; if (p.y < 58) { currentcolor = RED; tft.drawRect(0, 0, 58, 40, WHITE); pan = 1; tilt = 0; drive = 0; time = 0; drawSliders(); } else if (p.y < 140) { currentcolor = LBLUE; tft.drawRect(58, 0, 82, 40, WHITE); pan = 0; tilt = 1; drive = 0; time = 0; drawSliders(); } else if (p.y < 180) { currentcolor = BLUE; tft.drawRect(140, 0, 96, 40, WHITE); pan = 0; tilt = 0; drive = 1; time = 0; drawSliders(); } else if (p.y < 240) { currentcolor = GREEN; tft.drawRect(236, 0, 82, 40, WHITE); pan = 0; tilt = 0; drive = 0; time = 1; drawSliders(); } } //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //DO I NEED THIS AT ALL???????????????? //CAN IT JUST READ DRAW MENU?????????????? if (oldcolor != currentcolor) { if (oldcolor == RED) drawMenu(); if (oldcolor == LBLUE) drawMenu(); if (oldcolor == GREEN) drawMenu(); if (oldcolor == BLUE) drawMenu(); } //**************************** // START SELECTION CODE!!!! //**************************** if (p.x < 40) { if (p.y > 180) { tft.drawRect(220, 200, 96, 40, WHITE); startSend = 1; } } //**************** //SLIDER CODE!!!!! //**************** //TOP SLIDER if (p.x > 180 && p.x < 260) { if (p.y < 350) { if(p.y >= 20){ // or so... for first black square... //need bottom remap and top remap!!! p.y = map(p.y, 0, 240, 0, 300); tft.fillRect(10, 71, (p.y - 10), 50, BLACK); } tft.drawRect((p.y - 1), 71, 17, 42, WHITE); tft.fillRect(p.y, 72, 15, 40, MAGENTA); tft.fillRect((p.y + 16), 71, (282 - p.y), 50, BLACK); tft.drawRect((p.y + 15), 89, (272 - p.y), 6, WHITE); tft.fillRect((p.y + 16), 90, (270 - p.y), 4, YELLOW); tft.drawRect(19, 89, (p.y - 19), 6, WHITE); tft.fillRect(20, 90, (p.y - 20), 4, YELLOW); if (pan == 1){ panPosition1 = p.y; // Serial.println(panPosition1); } else if(tilt == 1){ tiltPosition1 = p.y; } else if(drive == 1){ drivePosition1 = p.y; } else if(time == 1){ timePosition1 = p.y; } } } //BOTTOM SLIDER if (p.x > 80 && p.x < 160) { if (p.y < 350) { if(p.y >= 20){ // or so... for first black square... //need bottom remap and top remap!!! p.y = map(p.y, 0, 240, 0, 300); tft.fillRect(10, 151, (p.y - 10), 50, BLACK); } tft.drawRect((p.y - 1), 151, 17, 42, WHITE); tft.fillRect(p.y, 152, 15, 40, MAGENTA); tft.fillRect((p.y + 16), 151, (282 - p.y), 50, BLACK); tft.drawRect((p.y + 15), 169, (272 - p.y), 6, WHITE); tft.fillRect((p.y + 16), 170, (270 - p.y), 4, YELLOW); tft.drawRect(19, 169, (p.y - 19), 6, WHITE); tft.fillRect(20, 170, (p.y - 20), 4, YELLOW); if (pan == 1){ panPosition2 = p.y; Serial.println(panPosition2); } else if(tilt == 1){ tiltPosition2 = p.y; } else if(drive == 1){ drivePosition2 = p.y; } else if(time == 1){ timePosition2 = p.y; } } } //************************** //TRANSMITS TO OTHER ARDUINO //************************** if(startSend == 1){ transmitValues(); startSend = 0; delay(2000); drawMenu(); if (pan == 1) tft.drawRect(0, 0, 58, 40, WHITE); if (tilt == 1) tft.drawRect(58, 0, 82, 40, WHITE); if (drive == 1) tft.drawRect(140, 0, 96, 40, WHITE); if (time == 1) tft.drawRect(236, 0, 82, 40, WHITE); } } } void transmitValues(){ Wire.beginTransmission(2); // transmit to device #2 x = panPosition1; Wire.write("a"); // sends five bytes Wire.write(x); Wire.endTransmission(); // stop transmitting delay(100); Wire.beginTransmission(2); // transmit to device #2 x = panPosition2; Wire.write("b"); // sends five bytes Wire.write(x); Wire.endTransmission(); // stop transmitting delay(100); Wire.beginTransmission(2); // transmit to device #2 x = tiltPosition1; Wire.write("c"); Wire.write(x); Wire.endTransmission(); // stop transmitting delay(100); Wire.beginTransmission(2); // transmit to device #2 x = tiltPosition2; Wire.write("d"); Wire.write(x); Wire.endTransmission(); // stop transmitting delay(100); Wire.beginTransmission(2); // transmit to device #2 x = drivePosition1; Wire.write("e"); // sends five bytes Wire.write(x); Wire.endTransmission(); // stop transmitting delay(100); Wire.beginTransmission(2); // transmit to device #2 x = drivePosition2; Wire.write("f"); // sends five bytes Wire.write(x); Wire.endTransmission(); // stop transmitting delay(100); Wire.beginTransmission(2); // transmit to device #2 x = timePosition1; Wire.write("g"); Wire.write(x); Wire.endTransmission(); // stop transmitting delay(100); Wire.beginTransmission(2); // transmit to device #2 x = timePosition2; Wire.write("h"); Wire.write(x); Wire.endTransmission(); // stop transmitting delay(100); Wire.beginTransmission(2); // transmit to device #2 x = startSend; Wire.write("i"); Wire.write(x); Wire.endTransmission(); // stop transmitting } void drawSliders(){ if (oldcolor != currentcolor) { tft.fillRect(10, 60, 300, 200, BLACK); } if(pan == 1){ tft.drawRect(19, 89, 272, 6, WHITE); tft.fillRect(20, 90, 270, 4, YELLOW); tft.drawRect(panPosition1, 71, 17, 42, WHITE); tft.fillRect((panPosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect(19, 169, 272, 6, WHITE); tft.fillRect(20, 170, 270, 4, YELLOW); tft.drawRect(panPosition2, 151, 17, 42, WHITE); tft.fillRect((panPosition2 + 1), 152, 15, 40, MAGENTA); } else if(tilt == 1){ tft.drawRect(19, 89, 272, 6, WHITE); tft.fillRect(20, 90, 270, 4, YELLOW); tft.drawRect(tiltPosition1, 71, 17, 42, WHITE); tft.fillRect((tiltPosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect(19, 169, 272, 6, WHITE); tft.fillRect(20, 170, 270, 4, YELLOW); tft.drawRect(tiltPosition2, 151, 17, 42, WHITE); tft.fillRect((tiltPosition2 + 1), 152, 15, 40, MAGENTA); } else if(drive == 1){ tft.drawRect(19, 89, 272, 6, WHITE); tft.fillRect(20, 90, 270, 4, YELLOW); tft.drawRect(drivePosition1, 71, 17, 42, WHITE); tft.fillRect((drivePosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect(19, 169, 272, 6, WHITE); tft.fillRect(20, 170, 270, 4, YELLOW); tft.drawRect(drivePosition2, 151, 17, 42, WHITE); tft.fillRect((drivePosition2 + 1), 152, 15, 40, MAGENTA); } else if(time == 1){ tft.drawRect(19, 89, 272, 6, WHITE); tft.fillRect(20, 90, 270, 4, YELLOW); tft.drawRect(timePosition1, 71, 17, 42, WHITE); tft.fillRect((timePosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect(19, 169, 272, 6, WHITE); tft.fillRect(20, 170, 270, 4, YELLOW); tft.drawRect(timePosition2, 151, 17, 42, WHITE); tft.fillRect((timePosition2 + 1), 152, 15, 40, MAGENTA); } } void drawMenu(){ tft.fillRect(236, 0, 82, 40, GREEN); tft.fillRect(140, 0, 96, 40, BLUE); tft.fillRect(58, 0, 82, 40, LBLUE); tft.fillRect(0, 0, 58, 40, RED); tft.drawChar(2, 10, 'P', WHITE, RED, 3); tft.drawChar(20, 10, 'A', WHITE, RED, 3); tft.drawChar(38, 10, 'N', WHITE, RED, 3); tft.drawChar(64, 10, 'T', WHITE, LBLUE, 3); tft.drawChar(82, 10, 'I', WHITE, LBLUE, 3); tft.drawChar(100, 10, 'L', WHITE, LBLUE, 3); tft.drawChar(118, 10, 'T', WHITE, LBLUE, 3); tft.drawChar(144, 10, 'D', WHITE, BLUE, 3); tft.drawChar(162, 10, 'R', WHITE, BLUE, 3); tft.drawChar(180, 10, 'I', WHITE, BLUE, 3); tft.drawChar(198, 10, 'V', WHITE, BLUE, 3); tft.drawChar(216, 10, 'E', WHITE, BLUE, 3); tft.drawChar(242, 10, 'T', WHITE, GREEN, 3); tft.drawChar(260, 10, 'I', WHITE, GREEN, 3); tft.drawChar(278, 10, 'M', WHITE, GREEN, 3); tft.drawChar(296, 10, 'E', WHITE, GREEN, 3); tft.fillRect(220, 200, 96, 40, BLUE); tft.drawChar(224, 210, 'S', WHITE, BLUE, 3); tft.drawChar(242, 210, 'T', WHITE, BLUE, 3); tft.drawChar(260, 210, 'A', WHITE, BLUE, 3); tft.drawChar(278, 210, 'R', WHITE, BLUE, 3); tft.drawChar(296, 210, 'T', WHITE, BLUE, 3); } <br>
Upload this code to the Arduino that will be controlling the motor:
// Camera Rig Motor Controller #include <Servo.h> #define ENC_A 14 #define ENC_B 15 #define ENC_PORT PINC Servo panServo; Servo tiltServo; int distance = 0; bool stateChange = 0; int motorPin = 3; // LED connected to digital pin 9 float driveX = 0; float tiltX = 0; float panX = 0; float timeX = 0; float driveZ = 0; float tiltZ = 0; float panZ = 0; float picZ = 0; int distanceToGo = 0; //for program int progStart = 0; //for testing //int progStart = 1; int motorSpeed; float totalTilt; float totalPan; float totalDrive; float panIncrement; float tiltIncrement; float driveIncrement; float picsPerPanIncrement = 1; float picsPerTiltIncrement = 1; float picsPerDriveIncrement = 1; int panSteps = 0; int tiltSteps = 0; int driveSteps = 0; char dataRx[20]; #include <Wire.h> void setup() { Wire.begin(2); // join i2c bus with address #2 Wire.onReceive(receiveEvent); // register event Serial.begin(9600); // start serial for output panServo.attach(4); tiltServo.attach(5); tiltServo.writeMicroseconds(1100); panServo.writeMicroseconds(1500); delay(10000); pinMode(8, OUTPUT); pinMode(ENC_A, INPUT); digitalWrite(ENC_A, HIGH); pinMode(ENC_B, INPUT); digitalWrite(ENC_B, HIGH); } void loop(){ if(progStart == 1){ tiltX = map(tiltX, 0, 255, 750, 1450); tiltZ = map(tiltZ, 0, 255, 750, 1450); panX = map(panX, 0, 255, 600, 2200); panZ = map(panZ, 0, 255, 600, 2200); Serial.println(panX); Serial.println(panZ); if(timeX < 5){ motorSpeed = 150; driveX = (driveX, 0, 255, 0, 180); timeX = 0; } else{ motorSpeed = 75; driveX = (driveX, 0, 255, 0, 360); } totalPan = (panX - panZ); totalPan = abs(totalPan); totalTilt = tiltX - tiltZ; totalTilt = abs(totalTilt); totalDrive = driveX; Serial.println(totalPan); //*************************************************** //figure out how far to advance before taking pics //alternately, how many pics to take before advancing //*************************************************** //! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! //THESE NEED TO BE FUCKING FLOATS AND SHIT! //! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! panIncrement = totalPan / picZ; if(totalPan < picZ){ picsPerPanIncrement = 1 / panIncrement; panIncrement = 1; } tiltIncrement = totalTilt / picZ; if(totalTilt < picZ){ picsPerTiltIncrement = 1 / tiltIncrement; tiltIncrement = 1; } driveIncrement = totalDrive / picZ; if(totalDrive < picZ){ picsPerDriveIncrement = 1 / driveIncrement; driveIncrement = 1; } //************************************** //move servos into the initial positions //************************************** tiltServo.writeMicroseconds(tiltX); panServo.writeMicroseconds(panX); delay(10000); //************************************** //take some pictures and move some stuff //************************************** for (int takingPictures = 0; takingPictures < picZ; takingPictures++) { if(panSteps >= picsPerPanIncrement){ if(panX > panZ){ panServo.writeMicroseconds(panX - panIncrement); panX = panX - panIncrement; }else if(panX < panZ){ panServo.writeMicroseconds(panX + panIncrement); panX = panX + panIncrement; }else{ panServo.writeMicroseconds(panX); } panSteps = 0; } if(tiltSteps >= picsPerTiltIncrement){ if(tiltX > tiltZ){ tiltServo.writeMicroseconds(tiltX - tiltIncrement); tiltX = tiltX - tiltIncrement; }else if(tiltX < tiltZ){ tiltServo.writeMicroseconds(tiltX + tiltIncrement); tiltX = tiltX + tiltIncrement; }else{ tiltServo.writeMicroseconds(tiltX); } tiltSteps = 0; } if(driveSteps >= picsPerDriveIncrement){ analogWrite(motorPin, motorSpeed); while(distance < distanceToGo){ callEncoder(); } analogWrite(motorPin, 0); driveSteps = 0; } distanceToGo = distanceToGo + driveIncrement; delay(timeX * 500); Serial.println("SHOOT!!!"); //take picture digitalWrite(8, HIGH); // connect the camera trigger delay(500); // wait for a second digitalWrite(8, LOW); // disconnect the camera trigger delay(500); panSteps = panSteps + 1; tiltSteps = tiltSteps + 1; driveSteps = driveSteps + 1; progStart = 0; } } } // function that executes whenever data is requested by master // this function is registered as an event, see setup() void receiveEvent(int holder) { int index = 0; while(1 < Wire.available()) // loop through all but the last { char c = Wire.read(); // receive byte as a character // Serial.print(c); // print the character dataRx[index++] = c; dataRx[index] = '\0'; } int x = Wire.read(); // receive byte as an integer // Serial.println(x); // print the integer if(*dataRx == 'a'){ panX = x; Serial.print("OMG PARSING PANX: "); Serial.println(panX); } else if(*dataRx == 'b'){ panZ = x; Serial.print("OMG PARSING PANZ: "); Serial.println(panZ); } else if(*dataRx == 'c'){ tiltX = x; Serial.print("OMG PARSING TILTX: "); Serial.println(tiltX); } else if(*dataRx == 'd'){ tiltZ = x; Serial.print("OMG PARSING TILTZ: "); Serial.println(tiltZ); } else if(*dataRx == 'e'){ driveX = x; Serial.print("OMG PARSING DRIVEX: "); Serial.println(driveX); } else if(*dataRx == 'f'){ driveZ = x; Serial.print("OMG PARSING DRIVEZ: "); Serial.println(driveZ); } else if(*dataRx == 'g'){ timeX = x; Serial.print("OMG PARSING TIMEX: "); Serial.println(timeX); } else if(*dataRx == 'h'){ picZ = x; Serial.print("OMG PARSING PICZ: "); Serial.println(picZ); } else if(*dataRx == 'i'){ progStart = x; Serial.print("OMG PARSING START: "); Serial.println(progStart); } } /* returns change in encoder state (-1,0,1) */ int8_t read_encoder() { static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; static uint8_t old_AB = 0; /**/ old_AB <<= 2; //remember previous state old_AB |= ( ENC_PORT & 0x03 ); //add current state return ( enc_states[( old_AB & 0x0f )]); } void callEncoder(){ // analogWrite(motorPin, 0); //delay(1000); // // //30Dst @ 150Sp // //60Dst @ 75Sp // //60Dst @ 50Sp // // while(distance < 240){ // analogWrite(motorPin, 75); //} static uint8_t counter = 0; //this variable will be changed by encoder input int8_t tmpdata; /**/ tmpdata = read_encoder(); if( tmpdata ) { // Serial.print("Counter value: "); // Serial.println(counter, DEC); counter += tmpdata; if(counter == 255){ stateChange = 1; } if(counter == 0){ if(stateChange == 1){ stateChange = 0; distance += 1; Serial.print("increments: "); Serial.println(distance, DEC); } } } } <br>
Stack It
![6A.jpg](/proxy/?url=https://content.instructables.com/FHV/LKBW/HP0CT6BW/FHVLKBWHP0CT6BW.jpg&filename=6A.jpg)
![6B.jpg](/proxy/?url=https://content.instructables.com/F3P/4JLT/HP0CT6CY/F3P4JLTHP0CT6CY.jpg&filename=6B.jpg)
Stack the proto shield atop the Arduino, and then the touch screen atop the proto shield.
Attach to Base
![13A.jpg](/proxy/?url=https://content.instructables.com/FP6/MXVJ/HS1RQYU7/FP6MXVJHS1RQYU7.jpg&filename=13A.jpg)
![13B.jpg](/proxy/?url=https://content.instructables.com/FA4/Z90I/HS18C86Y/FA4Z90IHS18C86Y.jpg&filename=13B.jpg)
![13C.jpg](/proxy/?url=https://content.instructables.com/F1S/NJXR/HS18C6V6/F1SNJXRHS18C6V6.jpg&filename=13C.jpg)
Bolt the Arduinos to the mounting holes on the acrylic base.
This may require unplugging and replugging the shields.
Reset Switch
![14A.jpg](/proxy/?url=https://content.instructables.com/F6V/V3MG/HS3GT0P0/F6VV3MGHS3GT0P0.jpg&filename=14A.jpg)
![14B.jpg](/proxy/?url=https://content.instructables.com/F3H/7GG7/HS3GT0PO/F3H7GG7HS3GT0PO.jpg&filename=14B.jpg)
![14C.jpg](/proxy/?url=https://content.instructables.com/F49/1NGJ/HS18F26O/F491NGJHS18F26O.jpg&filename=14C.jpg)
![14D.jpg](/proxy/?url=https://content.instructables.com/F7B/M521/HS3GT0Q9/F7BM521HS3GT0Q9.jpg&filename=14D.jpg)
Insert the reset switch through one of the holes in the outer support channel and fasten it in place with its mounting hardware.
Attach two wire to the switch that make electrical contact when the switch is closed.
Plug
![3A.jpg](/proxy/?url=https://content.instructables.com/F0N/YDTC/HOUFY95G/F0NYDTCHOUFY95G.jpg&filename=3A.jpg)
![3B.jpg](/proxy/?url=https://content.instructables.com/FXO/VS5Y/HOUFY95I/FXOVS5YHOUFY95I.jpg&filename=3B.jpg)
Plug the 4-wire harness into the connector on the rotary encoder.
Wire the DC Motor
![16A.jpg](/proxy/?url=https://content.instructables.com/F6H/44QI/HS8FUH63/F6H44QIHS8FUH63.jpg&filename=16A.jpg)
![16B.jpg](/proxy/?url=https://content.instructables.com/F0Y/U4RE/HS8FUH64/F0YU4REHS8FUH64.jpg&filename=16B.jpg)
![16C.jpg](/proxy/?url=https://content.instructables.com/FLJ/9USO/HS8FUH66/FLJ9USOHS8FUH66.jpg&filename=16C.jpg)
Connect the power from the DC motor to wires coming off of the TIP120 transistor.
Connect the rotary encoder to the motor control Arduino as follows:
- Red to 5V power
- Black to Ground
- Yellow to Pin A0
- Green to Pin A1
Attach the Acrylic
![17A.jpg](/proxy/?url=https://content.instructables.com/FZA/SYKB/HS8FU7C1/FZASYKBHS8FU7C1.jpg&filename=17A.jpg)
![17B.jpg](/proxy/?url=https://content.instructables.com/FWI/HV03/HS8FUT3I/FWIHV03HS8FUT3I.jpg&filename=17B.jpg)
![17C.jpg](/proxy/?url=https://content.instructables.com/FW7/D2S0/HS80FQQS/FW7D2S0HS80FQQS.jpg&filename=17C.jpg)
![17D.jpg](/proxy/?url=https://content.instructables.com/F8U/IAI7/HS8FUT3M/F8UIAI7HS8FUT3M.jpg&filename=17D.jpg)
![17E.jpg](/proxy/?url=https://content.instructables.com/FFE/YTNL/HS8FU7OO/FFEYTNLHS8FU7OO.jpg&filename=17E.jpg)
Attach the assembled acrylic bases to the aluminum drive assembly.
Put on the Cover
![18A.jpg](/proxy/?url=https://content.instructables.com/FVH/47AC/HS8FUT3Q/FVH47ACHS8FUT3Q.jpg&filename=18A.jpg)
![18B.jpg](/proxy/?url=https://content.instructables.com/F8T/D6UU/HS8FUT3R/F8TD6UUHS8FUT3R.jpg&filename=18B.jpg)
![18C.jpg](/proxy/?url=https://content.instructables.com/FTY/3SOG/HS8FUT3S/FTY3SOGHS8FUT3S.jpg&filename=18C.jpg)
![18D.jpg](/proxy/?url=https://content.instructables.com/FQK/BANJ/HS80FQR7/FQKBANJHS80FQR7.jpg&filename=18D.jpg)
Pass the shielded mono wire and the Arduino servo wires up through the center hole of the central 90 degree quad hub mount B, if you have not done so already.
Once the wires are passed through, slide the acrylic top plate down atop the drive assembly and fasten it into place with nuts and bolts.
Plug
![36A.jpg](/proxy/?url=https://content.instructables.com/FVH/1TBV/HS8FUI7P/FVH1TBVHS8FUI7P.jpg&filename=36A.jpg)
Once the shielded mono wire is passed up through the base assembly, attach a 3/32" mono plug on the end (or an adapter appropriate for your DSLR trigger).
First Servo Assembly
![37A.jpg](/proxy/?url=https://content.instructables.com/FJ6/I174/HS8FUIMB/FJ6I174HS8FUIMB.jpg&filename=37A.jpg)
![37C.jpg](/proxy/?url=https://content.instructables.com/FO7/03BY/HS8FUIME/FO703BYHS8FUIME.jpg&filename=37C.jpg)
![19A.jpg](/proxy/?url=https://content.instructables.com/FYV/IES8/HS80FQR9/FYVIES8HS80FQR9.jpg&filename=19A.jpg)
![37B.jpg](/proxy/?url=https://content.instructables.com/FCY/7YUP/HS8FUIMD/FCY7YUPHS8FUIMD.jpg&filename=37B.jpg)
Remove the gear from the HS-5485HB winch servo assembly.
Attach the servo assembly to one end of a 4.5" aluminum channel.
Install a 90 degree quad hub B mount into the other end of the channel.
Make an L-assembly
![38A.jpg](/proxy/?url=https://content.instructables.com/F2D/KPMM/HS8FUJ02/F2DKPMMHS8FUJ02.jpg&filename=38A.jpg)
![38B.jpg](/proxy/?url=https://content.instructables.com/FVV/188H/HS8FUJ03/FVV188HHS8FUJ03.jpg&filename=38B.jpg)
![38C.jpg](/proxy/?url=https://content.instructables.com/FUR/Z6XE/HS8FUJ07/FURZ6XEHS8FUJ07.jpg&filename=38C.jpg)
![38D.jpg](/proxy/?url=https://content.instructables.com/F7O/A0S5/HS8FUJ0D/F7OA0S5HS8FUJ0D.jpg&filename=38D.jpg)
Affix a 6" aluminum channel to the 90 degree quad hub B-mount affixed to the aluminum channel with the servo attached to form an L-shape.
Another Servo
![39A.jpg](/proxy/?url=https://content.instructables.com/F1N/F5GT/HS8FUJEK/F1NF5GTHS8FUJEK.jpg&filename=39A.jpg)
![39B.jpg](/proxy/?url=https://content.instructables.com/FID/JYX7/HS8FUJEL/FIDJYX7HS8FUJEL.jpg&filename=39B.jpg)
![39C.jpg](/proxy/?url=https://content.instructables.com/FT2/TAFQ/HS8FUJEP/FT2TAFQHS8FUJEP.jpg&filename=39C.jpg)
Attach the HS-785HB servo assembly to the end of the 6" aluminum extrusion opposite the connection on the L-bracket.
Affix
![40A.jpg](/proxy/?url=https://content.instructables.com/FOY/A9SI/HS8FUKEP/FOYA9SIHS8FUKEP.jpg&filename=40A.jpg)
![40B.jpg](/proxy/?url=https://content.instructables.com/FV6/ZUKF/HS8FUKER/FV6ZUKFHS8FUKER.jpg&filename=40B.jpg)
![40C.jpg](/proxy/?url=https://content.instructables.com/F5W/ZFNK/HS8FUKF2/F5WZFNKHS8FUKF2.jpg&filename=40C.jpg)
Attach a 90 degree quad hub mount D bracket to the center of the gear on the HS-785B winch servo assembly.
Next, affix the 90 degree quad hub mount D bracket to the inner top of the aluminum extrusion protroduing perpendicular from the base.
Finish Wiring
![41A.jpg](/proxy/?url=https://content.instructables.com/FY6/ELQ0/HS8FUKUO/FY6ELQ0HS8FUKUO.jpg&filename=41A.jpg)
![41B.jpg](/proxy/?url=https://content.instructables.com/F0D/LZBD/HS8FUKUQ/F0DLZBDHS8FUKUQ.jpg&filename=41B.jpg)
![41C.jpg](/proxy/?url=https://content.instructables.com/FEF/9G2T/HS8FUKUR/FEF9G2THS8FUKUR.jpg&filename=41C.jpg)
![41D.jpg](/proxy/?url=https://content.instructables.com/FQ9/AQDQ/HS8FUKUT/FQ9AQDQHS8FUKUT.jpg&filename=41D.jpg)
![41E.jpg](/proxy/?url=https://content.instructables.com/FHW/BBJ9/HS8FUKUU/FHWBBJ9HS8FUKUU.jpg&filename=41E.jpg)
![schematic1.png](/proxy/?url=https://content.instructables.com/FFC/1V89/HSVGF44E/FFC1V89HSVGF44E.png&filename=schematic1.png)
Connect together the servo wires to the extension servo wires from the Arduino.
Make any other loose connections as specified in the schematic.
Bundle and zip tie all of the wires neatly together.
Camera Assembly Base
![42A.jpg](/proxy/?url=https://content.instructables.com/FWR/DLX1/HS8FULTP/FWRDLX1HS8FULTP.jpg&filename=42A.jpg)
![42B.jpg](/proxy/?url=https://content.instructables.com/FIU/X57J/HS8FULTQ/FIUX57JHS8FULTQ.jpg&filename=42B.jpg)
Take a dual flat channel bracket and connect a 90 degree quad hub mount D bracket to one side, and a 0.25" hub spacer to the other side.
Angle Bracket
![43B.jpg](/proxy/?url=https://content.instructables.com/FWH/8Y6A/HS8FUM8J/FWH8Y6AHS8FUM8J.jpg&filename=43B.jpg)
![43A.jpg](/proxy/?url=https://content.instructables.com/FMG/MOMT/HS8FUM8I/FMGMOMTHS8FUM8I.jpg&filename=43A.jpg)
On the other side of the dual flat channel bracket and on the same face as the 0.25" hub spacer, connect a 90 degree hub to hub mount.
Single Servo Arm
![44A.jpg](/proxy/?url=https://content.instructables.com/FZO/O0TY/HS8FUNA7/FZOO0TYHS8FUNA7.jpg&filename=44A.jpg)
![44B.jpg](/proxy/?url=https://content.instructables.com/FLI/WXPA/HS8FUNA8/FLIWXPAHS8FUNA8.jpg&filename=44B.jpg)
Attach the 3" power servo single gearbox arm to the free side of the hub to hub mount.
Attach the Camera Plate
![45A.jpg](/proxy/?url=https://content.instructables.com/F0N/5V9B/HS8FUNQK/F0N5V9BHS8FUNQK.jpg&filename=45A.jpg)
![45B.jpg](/proxy/?url=https://content.instructables.com/F9G/KTMN/HS8FUNQL/F9GKTMNHS8FUNQL.jpg&filename=45B.jpg)
![45C.jpg](/proxy/?url=https://content.instructables.com/F8G/1SW9/HS8FUNQM/F8G1SW9HS8FUNQM.jpg&filename=45C.jpg)
![45D.jpg](/proxy/?url=https://content.instructables.com/FF6/C2KW/HS8FUNQO/FF6C2KWHS8FUNQO.jpg&filename=45D.jpg)
![45E.jpg](/proxy/?url=https://content.instructables.com/FCJ/ZUF8/HS8FUNQQ/FCJZUF8HS8FUNQQ.jpg&filename=45E.jpg)
![45F.jpg](/proxy/?url=https://content.instructables.com/FPH/S6WX/HS8FUNQT/FPHS6WXHS8FUNQT.jpg&filename=45F.jpg)
Place the gear back onto the shaft of the HS-5485HB winch servo assembly. Also place on the 0.77" hub adapter.
Finally, attach the top of the power servo arm to the 0.77" hub.
Mount the Camera
![46A.jpg](/proxy/?url=https://content.instructables.com/FNI/X0EN/HS8FUODL/FNIX0ENHS8FUODL.jpg&filename=46A.jpg)
![46B.jpg](/proxy/?url=https://content.instructables.com/F0K/N7FG/HS8FUODP/F0KN7FGHS8FUODP.jpg&filename=46B.jpg)
![46C.jpg](/proxy/?url=https://content.instructables.com/FA6/SZ7R/HS8FUODQ/FA6SZ7RHS8FUODQ.jpg&filename=46C.jpg)
![46D.jpg](/proxy/?url=https://content.instructables.com/FYB/1NUP/HS8FUODR/FYB1NUPHS8FUODR.jpg&filename=46D.jpg)
Use the attached file as a template for cutting a 1/8" rubber ring to place atop the hub spacer.
Insert a 3/8" bolt up through the quad hub mount and hub spacer to lock the camera in place.
Fasten the camera to the assembly.
Insert Plug
![47A.jpg](/proxy/?url=https://content.instructables.com/FEB/KFDC/HS8FUOTZ/FEBKFDCHS8FUOTZ.jpg&filename=47A.jpg)
Insert the trigger plug into the camera remote trigger jack.
Build the Track
![48A.jpg](/proxy/?url=https://content.instructables.com/F45/4BFD/HS8FUQ6Y/F454BFDHS8FUQ6Y.jpg&filename=48A.jpg)
![48B.jpg](/proxy/?url=https://content.instructables.com/F4K/N5Z5/HS8FUQ6Z/F4KN5Z5HS8FUQ6Z.jpg&filename=48B.jpg)
![48C.jpg](/proxy/?url=https://content.instructables.com/FXD/VSPO/HS8FUQ70/FXDVSPOHS8FUQ70.jpg&filename=48C.jpg)
![48D.jpg](/proxy/?url=https://content.instructables.com/F5T/W8FW/HS8FUQ71/F5TW8FWHS8FUQ71.jpg&filename=48D.jpg)
![48E.jpg](/proxy/?url=https://content.instructables.com/FHT/J4NP/HS8FUQ72/FHTJ4NPHS8FUQ72.jpg&filename=48E.jpg)
![48F.jpg](/proxy/?url=https://content.instructables.com/F6I/FI1D/HS8FUQ73/F6IFI1DHS8FUQ73.jpg&filename=48F.jpg)
![48G.jpg](/proxy/?url=https://content.instructables.com/FL7/IA9W/HS8FUQ74/FL7IA9WHS8FUQ74.jpg&filename=48G.jpg)
![48H.jpg](/proxy/?url=https://content.instructables.com/FR6/P8VZ/HS8FUQ75/FR6P8VZHS8FUQ75.jpg&filename=48H.jpg)
![48I.jpg](/proxy/?url=https://content.instructables.com/F29/MCTR/HS8FUQ76/F29MCTRHS8FUQ76.jpg&filename=48I.jpg)
![48J.jpg](/proxy/?url=https://content.instructables.com/FWK/ST8C/HS8FUQ7A/FWKST8CHS8FUQ7A.jpg&filename=48J.jpg)
![48K.jpg](/proxy/?url=https://content.instructables.com/F72/W7OB/HS8FUQ7B/F72W7OBHS8FUQ7B.jpg&filename=48K.jpg)
![48L.jpg](/proxy/?url=https://content.instructables.com/FYO/7XJ4/HS8FUQ7D/FYO7XJ4HS8FUQ7D.jpg&filename=48L.jpg)
![48M.jpg](/proxy/?url=https://content.instructables.com/FSF/ESS4/HS8FUQ7E/FSFESS4HS8FUQ7E.jpg&filename=48M.jpg)
The track system can be made of any legnth of 3/4" pipe that you would like. It can also be built in most any way so long as the track is 13.5" apart and nothing collides with the wheels.
I used aluminum rods that I found at the hardware store, but you can also use PVC or wooden dowel rods.
To create the frame for the rods, I used the attached 3D model to print connector brackets, and the 2D layout file to create wooden spacers.
Once I had these parts fabricated, I then drilled 1/8" holes in the pipe every 11.5" and used these to build the frame.
Using the Touch Screen
![49A.jpg](/proxy/?url=https://content.instructables.com/FHY/26KR/HSBSLA45/FHY26KRHSBSLA45.jpg&filename=49A.jpg)
The touch screen interface has four menu options:
Pan - Sliders for setting in and out points
Tilt - Sliders for setting in and out points.
Drive - The top slider sets only the stopping point
Start - The top slider sets time interval and the bottom sets number of pictures to take.
![](/proxy/?url=https://content.instructables.com/FP8/ABPR/K9R2LUOD/FP8ABPRK9R2LUOD.jpg?auto=webp&crop=1:1&frame=1&width=320)
Did you find this useful, fun, or entertaining?
Follow @madeineuphoria to see my latest projects.