SKY CAM an Aerial Camera Solution

Published

Introduction: SKY CAM an Aerial Camera Solution

About: GCSE Electronic Products Student Year 11 UK

This Instructable will walk you through how I made a remote control (Semi Autonomous) Cable Cam system for my GCSE Electronic Products Project at School and hopefully enable you to be able to create your own system! This is intended as a rough guide on the principals as each system is different depending on the requirements. For this project you'll need a reasonable understanding of electronics and CAD CAM (Computer Aided Design/ Manufacture) although don't be put off as simplified versions can be made.

The Problem:

  • My client needs a system to get aerial film of a variety of activities and events.
  • The Problem is that where Drones/UAV’s would typically be used to get this footage, it is unsafe and impractical to use these over people, inside, or in typical sporting terrain such as wooded areas or a sports hall, because of the danger of injury should the system fail and limited space can make It impossible to operate such systems.

Based on this I set a Design Brief:

  • Design and make a product to capture aerial footage using a safe and cost effective system that can be remote controlled and move between two fixed points.

As most Commercially available Cable Camera systems come in at about the $4,000 plus mark. I wanted to make a system that would make this kind of advanced camera work available to more creators and hobbyists on a tighter budget.

What you'll need to complete this project :

Access to a 3D Printer (Housings)

Access to a Laser Cutter (Main Body of the rig and for the Control panel cutting and etching)

Be able to make PCB's as almost all of them in this project are custom designed.

Additionally these are the main specialist components that I used:

Electronics:

Illuminated Green PTM switches x3

Switch Covers for the above x3

4 Axis Microswitch Joystick

Membrane Switch (The ENT menu scroll Button)

Hardware:

Wheels x3

Dyneema Cable (Choose Length depending on where you plan to use the system)

Yellow Flight Case ( For the controller, although any enclosure could be used)

Step 1: Overview

The Cable Cam consists of three main parts:

The Actual Rig (The part that carries the cameras and drives along the cable)

The Controller (Contains a Microcontroller and an RF Transmitter)

The Cable (Supports the rig and allows it to be run between any two reasonably sturdy points)

Step 2: How It Works

As you can see in the pictures above the Rig Relies on friction in order to transfer drive from the wheel onto the cable (Green Line). It can be difficult to achieve the right balance of friction so I used the below methods to achieve optimal tension and friction.

Primarily the arrangement of the the wheels forces the cable down and over the drive wheel as seen in the diagram above. This is a very good method as it allows the two outer wheels to take the full load of the rig onto the cable (Meaning you can mount reasonably heavy cameras or equipment onto the rig) be sure to READ STEP 7 before trying to use your own system!

However the three wheel arrangement relies heavily on the cable be at a very high tension which is ideal and easy to achieve with my rigging method however it may not always be at the optimal tension. To cope with this the load bearing wheels both sit in a slot system that allows them to be moved up and down to vary the tension in the rig. It also acts as a basic safety system- If the cable becomes over tensioned for any reason then the out rigger wheels slide up to reduce pressure on the rig and drive wheel, hopefully preventing damage to the motor.

So when you're designing your own rig using the tri arrangement of wheels is an excellent method for ensuring drive onto the cable.

Step 3: Controller

To make the Controller you need to start off by getting the measurements with some digital callipers and making a rectangle in CAD (Fusion 360), I then laser cut it in card. This will allow you to get the measurements correct as well as letting you position all your components before you cut in your final material.

For My control panel i cut it in 3mm Dual Layer Laser plastic which is how I got the engraving's to be white. one issue with this 3mm plastic is that it's pretty flexible. To counteract this I used 5mm black acrylic with large cut outs in the support the back of the panel as can be seen above. Then in each of the four corners I drilled a 3mm diameter hole and put a machine screw through the two plastics and secured it with an M3 Dome Nut on the top of the panel which holds it together nicely. It also adds to the rugged aesthetic of the control panel.

One advantage of using a flight case similar to the above is that your panel can be a friction fit. Just push it in tightly and it will stay in, however if you need to remove it for any reason you can still click it out with a bit of force!

Step 4: Electronic Systems

There are two main Systems in this project which are outlined below. You can also get an understanding of how they integrate with the flowchart above.

The Rig Side:

  • RF Reciever
  • Microcontroller Board
  • Motor Driver

The Controller Side:

  • Control PCB
  • RF Transmitter

The Motor driver is a Transistor Based H Bridge that works by switching on alternate pairs of the four transistors that allows the motor to be run: Forwards, Backwards and also act as a break by feeding back EMF into the motor. Instead of using relays I used an Optocoupler (16 Pin 4 gate) to interface the PICAXE Microcontroller with the transistors ensuring that the Microcontroller isn't damaged by the higher current of the motor driver.

On the rig at each end there is a micro switch that allows for the rig to know its position along the cable at all times, allowing for autonomous features and also stops it from hitting the end of the line. It can determine it's location because during the start up procedure it runs the maximum length of the cable and records the end and start points. Then it can calculate its position at any time based on how long it been moving along the cable

Step 5: Drive System

In oder to be able to drive the rig at high tensions and at reasonable speed you'll need to use a high torque geared motor. I used an electric screwdriver motor and designed a housing for it in CAD (Autodesk Fusion 360) works really well for me. Above you can see that I included cable ducting and air vents, as well as mounting holes.

TIP
The measurements need to be extremely precise otherwise you may experience gear box failure. (I did in my initial testing phases, there was some excess space inside the housing that allowed the gearbox to come loose and fail so watch out!)

Step 6: Motor Driver

I decided that i would build a custom motor driver for my project that would enable me to interface the motor with my Microcontroller and run it forwards and backwards. Additionally in my final system I was also able to use back EMF to act as a brake on the motor. See above for the Motor Driver research and incremental development. After my research I finally used FET's interfaced with an Optocoupler as the pictures explain!

Step 7: Rig

Step 8: Software

The system has two Microcontrollers one on the rig and one in the control panel.

The Code for all the systems is written in BASIC on the PICAXE program editor

see below for all of the source code:

main:

let dirsB = 112

let dirsC = 72

Cell_7_3:

serin B.7, N2400, varA

if varA < 2 then

goto Cell_10_4

end if

if varA = 9 then

goto Cell_10_5

end if

if varA = 3 then

goto Cell_10_6

end if

if varA = 4 then

goto Cell_10_7

end if

if varA = 7 then

goto Cell_10_10

end if

if varA = 8 then

goto Cell_10_11

end if

if pinB.2=1 then

goto Cell_10_12

end if

if pinB.3=1 then

goto Cell_10_13

end if

let varA = 0

goto Cell_7_3

Cell_10_13:

sound C.6, ( 103, 87 )

gosub prc_ENDDETEC

goto Cell_7_3

prc_ENDDETEC:

low B.4, B.5, B.6

sound C.6, ( 144, 249 )

return

Cell_10_12:

sound C.6, ( 103, 87 )

gosub prc_ENDDETEC

goto Cell_7_3

Cell_10_11:

sound C.6, ( 103, 87 )

gosub prc_TLAPSE_GO

goto Cell_7_3

Cell_46_1:

prc_TLAPSE_GO:

if varC > 0 then

goto Cell_46_3

end if

gosub prc_RIG_SETUP_

goto Cell_46_1

prc_RIG_SETUP_:

Cell_34_3:

low B.5, B.6

high B.4

if pinB.3=1 then

goto Cell_34_3

end if

low B.4, B.5, B.6

low B.4, B.6

high B.5

Cell_34_7:

inc varB

pause 1000

if pinB.2=1 then

goto Cell_34_10

end if

goto Cell_34_7

Cell_34_10:

low B.4, B.5, B.6

let varD = varB - 4

low B.4, B.6

high B.5

pause 2000

low B.4, B.5, B.6

inc varC

return

Cell_46_3:

let varD = varB / 2

Cell_46_4:

low B.5, B.6

high B.4

if pinB.2=1 then

goto Cell_49_5

end if

inc varE

if varE = varD then

goto Cell_46_12

end if

pause 2000

low B.4, B.5, B.6

pause 2000

goto Cell_46_4

Cell_46_12:

low B.4

high B.5

if pinB.3=1 then

goto Cell_49_13

end if

inc varF

if varF = varD then

goto Cell_46_20

end if

pause 2000

low B.4, B.5, B.6

pause 2000

goto Cell_46_12

Cell_46_20:

let varE = 0

let varF = 0

goto Cell_46_1

Cell_49_13:

gosub prc_RIG_SETUP_

goto Cell_46_20

Cell_49_5:

gosub prc_RIG_SETUP_

goto Cell_46_12

Cell_10_10:

sound C.6, ( 103, 87 )

gosub prc_BOUNCE_GO

goto Cell_7_3

Cell_58_1:

prc_BOUNCE_GO:

if varC > 0 then

goto Cell_61_2

end if

Cell_58_3:

low B.5, B.6

high B.4

if pinB.2=1 then

goto Cell_61_4

end if

goto Cell_58_3

Cell_61_4:

low B.4, B.5, B.6

pause 2000

Cell_61_7:

low B.4, B.6

high B.5

inc varF

if varF = varD then

goto Cell_61_12

end if

if pinB.3=1 then

goto Cell_64_10

end if

pause 1000

goto Cell_61_7

Cell_64_10:

gosub prc_RIG_SETUP_

Cell_61_12:

low B.5, B.6

high B.4

inc varG

if varG = varD then

goto Cell_61_18

end if

if pinB.2=1 then

goto Cell_64_15

end if

pause 1000

goto Cell_61_12

Cell_64_15:

gosub prc_RIG_SETUP_

Cell_61_18:

let varF = 0

let varG = 0

goto Cell_61_4

Cell_61_2:

gosub prc_RIG_SETUP_

goto Cell_58_1

Cell_10_7:

sound C.6, ( 103, 87 )

gosub prc_RIG_SETUP_

goto Cell_7_3

Cell_10_6:

sound C.6, ( 103, 87 )

gosub prc_REV

goto Cell_7_3

prc_REV:

low B.4, B.6

high B.5

pause 500

return

Cell_10_5:

sound C.6, ( 103, 87 )

gosub prc_FWD

goto Cell_7_3

prc_FWD:

low B.5, B.6

high B.4

pause 500

return

Cell_10_4:

sound C.6, ( 49, 87 )

gosub prc_STOP_

goto Cell_7_3

prc_STOP_:

low B.4, B.5, B.6

pause 200

return

#no_data 'reduce download time

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

main:

let dirsB = 255

let dirsC = 8

Cell_7_4:

serout B.4, N2400, (254, 128, " CABLE CAM ")

serout B.4, N2400, (254, 192, " INITIALISING ")

pause 2000

serout B.4, N2400, (254, 128, " PERFORMING ")

serout B.4, N2400, (254, 192, "START UP CHECKS ")

gosub prc_FLASH

low B.5

pause 200

high B.5

pause 100

high B.6

pause 100

high B.7

pause 100

Cell_7_13:

serout B.4, N2400, (254, 128, " CABLE CAM HOME ")

serout B.4, N2400, (254, 192, "PRESS ANY BUTTON")

if pinB.3=1 then

goto Cell_10_14

end if

if pinB.2=1 then

goto Cell_13_15

end if

if pinB.1=1 then

goto Cell_10_16

end if

if pinC.1=1 then

goto Cell_13_17

end if

if pinC.0=1 then

goto Cell_10_18

end if

if pinC.7=1 then

goto Cell_13_19

end if

goto Cell_7_13

Cell_13_19:

gosub prc_JOYSTICK_START

goto Cell_7_13

prc_JOYSTICK_START:

if varE = 1 then

goto Cell_34_2

end if

serout B.4, N2400, (254, 128, " ALERT!: ")

serout B.4, N2400, (254, 192, "RIG NOT CONFIG ")

Cell_31_5:

pause 2000

serout B.4, N2400, (254, 128, "PRESS 1 TO SETUP")

serout B.4, N2400, (254, 192, " OR ")

pause 2000

serout B.4, N2400, (254, 128, " ENT TO ENGAGE ")

serout B.4, N2400, (254, 192, "MANUAL OVERRIDE!")

if pinB.3=1 then

goto Cell_34_7

end if

if pinC.1=1 then

goto Cell_34_10

end if

goto Cell_31_5

Cell_34_10:

serout B.4, N2400, (254, 128, "KEY IN TO BEGIN ")

serout B.4, N2400, (254, 192, "MANUAL OVERRIDE!")

pause 5000

serout B.4, N2400, (254, 128, "TO OVERRIDE LIFT")

serout B.4, N2400, (254, 192, "COVER AND PRESS!")

pause 3000

Cell_34_14:

bintoascii varF, varTEMPBYTE1, varTEMPBYTE2, varTEMPBYTE3

serout B.4, N2400, (254, 128, "YOU HAVE ", varTEMPBYTE1,varTEMPBYTE2,varTEMPBYTE3,"s ")

serout B.4, N2400, (254, 192, "TO OVERRIDE ")

inc varG

dec varF

if pinC.6=1 then

goto Cell_34_18

end if

serout B.4, N2400, (254, 128, "MANUAL OVERRIDE ")

serout B.4, N2400, (254, 192, " AI DISABLED ")

inc varE

gosub prc_FLASH

gosub prc_DRIVE

return

Cell_61_4:

prc_DRIVE:

if pinC.7=1 then

goto Cell_64_5

end if

if pinC.0=1 then

goto Cell_64_6

end if

return

Cell_64_6:

gosub prc_REV

goto Cell_61_4

prc_REV:

serout B.0, N2400, (3)

return

Cell_64_5:

gosub prc_FWD

goto Cell_61_4

prc_FWD:

serout B.0, N2400, (2)

return

prc_FLASH:

low B.5

low B.6

low B.7

pause 100

high B.7

pause 100

high B.6

pause 100

high B.5

pause 100

low B.7

pause 100

low B.6

pause 100

low B.5

return

Cell_34_18:

if varA = 5 then

goto Cell_34_19

end if

goto Cell_34_14

Cell_34_19:

serout B.4, N2400, (254, 128, "OVERRIDE FAILED ")

pause 2000

goto Cell_31_5

Cell_34_7:

goto Connector_3

Connector_3:

inc varE

gosub prc_RIG_SETUP

serout B.4, N2400, (254, 128, "NOW WAIT UNTIL ")

serout B.4, N2400, (254, 192, "RIG STOPS MOVING")

pause 3000

return

prc_RIG_SETUP:

serout B.0, N2400, (6)

return

Cell_34_2:

gosub prc_DRIVE

return

Cell_10_18:

gosub prc_JOYSTICK_START

goto Cell_7_13

Cell_13_17:

gosub prc_MENU

goto Cell_7_13

prc_MENU:

Cell_37_3:

serout B.4, N2400, (254, 128, " MAIN MENU ")

serout B.4, N2400, (254, 192, "ENT to Scroll ")

if pinC.1=1 then

goto Cell_37_5

end if

goto Cell_37_3

Cell_37_5:

serout B.4, N2400, (254, 128, "1 For Rig Setup ")

serout B.4, N2400, (254, 192, "2 For Panel Test")

if pinB.3=1 then

goto Cell_40_6

end if

if pinB.2=1 then

goto Cell_40_7

end if

if pinC.1=1 then

goto Cell_37_9

end if

goto Cell_37_5

Cell_37_9:

serout B.4, N2400, (254, 128, "3 For AI Setup ")

serout B.4, N2400, (254, 192, "2 For Home ")

Cell_37_10:

if pinB.1=1 then

goto Cell_40_9

end if

if pinB.2=1 then

goto Cell_40_11

end if

goto Cell_37_10

Cell_40_11:

gosub prc_FLASH

return

Cell_40_9:

gosub prc_M_SETUP

goto Cell_37_3

prc_M_SETUP:

goto Cell_31_5

Cell_40_7:

goto Connector_2

Connector_2:

goto Cell_7_4

Cell_40_6:

gosub prc_M_SETUP

goto Cell_37_3

Cell_10_16:

gosub prc_MENU

goto Cell_7_13

Cell_13_15:

gosub prc_T_LAPSE_START

goto Cell_7_13

prc_T_LAPSE_START:

Cell_25_3:

serout B.4, N2400, (254, 128, "TIMELAPSE MODE: ")

bintoascii varD, varTEMPBYTE1, varTEMPBYTE2, varTEMPBYTE3

serout B.4, N2400, (254, 192, "Confirmed in ", varTEMPBYTE1,varTEMPBYTE2,varTEMPBYTE3)

if pinC.1=1 then

goto Cell_28_4

end if

inc varC

dec varD

pause 1000

if varC = 5 then

goto Cell_25_9

end if

goto Cell_25_3

Cell_25_9:

serout B.4, N2400, (254, 128, "TIMELAPSE MODE: ")

serout B.4, N2400, (254, 192, " ACTIVE ")

gosub prc_FLASH

pause 2000

serout B.4, N2400, (254, 128, "TIMELAPSE MODE: ")

serout B.4, N2400, (254, 192, " PRESS ENT STOP ")

if pinC.1=1 then

goto Cell_25_14

end if

gosub prc_FLASH

pause 1000

goto Cell_25_9

Cell_25_14:

gosub prc_STOP

return

prc_STOP:

serout B.0, N2400, (4)

return

Cell_28_4:

return

Cell_10_14:

gosub prc_BOUNCE_START

goto Cell_7_13

prc_BOUNCE_START:

Cell_19_3:

serout B.4, N2400, (254, 128, " BOUNCE MODE ")

bintoascii varB, varTEMPBYTE1, varTEMPBYTE2, varTEMPBYTE3

serout B.4, N2400, (254, 192, "Confirmed in ", varTEMPBYTE1,varTEMPBYTE2,varTEMPBYTE3)

if pinC.1=1 then

goto Cell_22_4

end if

inc varA

dec varB

pause 1000

if varA = 5 then

goto Cell_19_9

end if

goto Cell_19_3

Cell_19_9:

serout B.4, N2400, (254, 128, " BOUNCE MODE: ")

serout B.4, N2400, (254, 192, " CALIBRATING ")

gosub prc_BOUNCE_SETUP

Cell_19_11:

pause 2000

serout B.4, N2400, (254, 128, " BOUNCE MODE: ")

serout B.4, N2400, (254, 192, " ACTIVE ")

pause 2000

gosub prc_FLASH

serout B.4, N2400, (254, 128, " BOUNCE MODE: ")

serout B.4, N2400, (254, 192, " PRESS ENT STOP ")

if pinC.1=1 then

goto Cell_19_16

end if

goto Cell_19_11

Cell_19_16:

gosub prc_STOP

pause 1000

return

prc_BOUNCE_SETUP:

serout B.0, N2400, (1)

gosub prc_FLASH

return

Cell_22_4:

return

#no_data 'reduce download time

Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

main:

Cell_7_2:

let dirsB = 255

let dirsC = 8

if pinC.0=1 then

goto Cell_10_3

end if

if pinC.7=1 then

goto Cell_10_4

end if

if pinC.1=1 then

goto Cell_10_5

end if

goto Cell_7_2

Cell_10_5:

serout B.4, N2400, (254, 128, "pin 1 ")

serout B.4, N2400, (254, 192, "is inputting ")

goto Cell_7_2

Cell_10_4:

serout B.4, N2400, (254, 128, "pin seven ")

serout B.4, N2400, (254, 192, "is inputting ")

goto Cell_7_2

Cell_10_3:

serout B.4, N2400, (254, 128, "pin 0 ")

serout B.4, N2400, (254, 192, "is inputting ")

goto Cell_7_2

#no_data 'reduce download time

Step 9: Finishing Details

  • To give the product a professional finish I was able to use a Roland Sticker Cutter (Dr Stika) to cut Vinyl Sheet into text for branding.
  • Additionally you can use strips of tape to indicate the correct orientation for the power packs on the power unit. This lets you easily switch out the battery packs without getting them the wrong way up.
  • I Polished the Aluminium spacing tubes on a bufffing wheel to add the the sleek aesthetic of the device. this only takes a couple of minutes and gives a really nice finish

TIP

  • Try to polish the Aluminium tubing before you cut it too length as it will save your fingers from the buffing wheel!

Step 10: FILES:

Microcontroller Contest

This is an entry in the
Microcontroller Contest

Share

    Recommendations

    • Woodworking Contest

      Woodworking Contest
    • Microcontroller Contest

      Microcontroller Contest
    • Casting Contest

      Casting Contest
    user

    We have a be nice policy.
    Please be positive and constructive.

    Tips

    You should be able to build a similar program for Arduino or other system if you look at the system flowcharts!

    Questions

    5 Comments

    Thanks, Ive just replaced the video at the start with a new promo so be sure to check it out if you like it!

    This is amazing! Thanks for including the design files! I like the use of K'Nex for prototyping!

    This gets my vote....great project by a great man

    1 reply