This project is a prototype motorised folding wing system for a cosplay costume.
The goal is to build a pair of lightweight wings mounted near the hips that can:
- Sit securely on a belt/harness structure.
- Rotate outward from the hips using vertical hinges.
- Fold open and closed using a cable-and-pulley mechanism.
- Be driven by a 12V DC worm gear motor.
- Be controlled by an Arduino Nano R4 and BTS7960 motor driver.
This is a working prototype, not a finished production mechanism. The electronics are relatively straightforward. The main engineering risk is mechanical: mounting the wings securely, choosing the correct cable attachment point, and preventing the belt/wing structure from twisting under load.
Because this is being built under a short deadline, the priority order is:
- Make the wings wearable.
- Make the wings structurally secure.
- Make the wings rotate outward from the hips.
- Make the wings open and close under motor power.
- Improve neatness, speed, and cosmetics only after the mechanism works.
A functioning prototype is more important than a perfect mechanism.
flowchart LR
Battery[12V Battery] --> Fuse[Fused Positive Line]
Fuse --> Switch[Main Power Switch]
Switch --> ArduinoVIN[Arduino Nano R4 VIN]
Switch --> DriverPower[BTS7960 Motor Power]
ArduinoVIN --> Arduino[Arduino Nano R4]
Arduino --> DriverLogic[BTS7960 Logic Pins]
DriverPower --> Driver[BTS7960 Motor Driver]
Driver --> Motor[JGY-370 12V Worm Gear Motor]
Motor --> Drum[6mm Bore Timing Pulley Used as Drum]
Drum --> Cable[Bike Cable]
Cable --> Pulleys[Guide Pulleys]
Pulleys --> Linkage[Wing Linkage]
Belt[Tactical Belt + Suspenders] --> HipPlate[Outer Rigid Hip Plate]
HipPlate --> Hinges[Vertical Hinges]
Hinges --> WingRoot[Wing Root]
WingRoot --> Linkage
- Existing folding wing frame
- White tube / pipe wing spars
- Metal mending plates / strips
- Bolts, washers, and nuts for pivots
- Nyloc nuts or threadlocker
- EVA foam or costume covering material
- LUUFAN-style tactical MOLLE belt or equivalent
- Shoulder strap / suspenders if available
- BAKI commercial plastic cutting board, 18 x 12 x 0.5 inch, used as rigid HDPE hip-plate material
- Large penny washers
- M5 or M6 bolts
- M5 or M6 nyloc nuts
- Optional smaller inner backing plates
- Optional rear brace:
- aluminium flat bar,
- steel mending strip,
- plywood strip,
- or spare HDPE strip.
- Two small vertical hinges per wing if possible
- Alternatively, one stronger vertical hinge per wing
- Bolts, washers, and nyloc nuts for hinge mounting
- Physical hard stops for open and closed wing positions
- Rubber bumpers or washer stacks for stops if available
- Bike cable / braided steel cable
- Cable ferrules / crimps
- Cable thimbles
- Cable clamps if needed
- 30mm nylon U-groove ball-bearing pulleys
- Heavier steel pulleys for prototyping if already available
- 20T 6mm bore aluminium timing pulley used as temporary motor drum
- Small screws/bolts for pulley mounting
- Arduino Nano R4
- BTS7960 / IBT-2 motor driver
- JGY-370 12V DC worm gear motor, 6 RPM
- 12V battery source
- Fuse holder
- Suitable fuse
- Main power switch
- Push button
- Limit switches
- LEDs for testing
- 220Ω resistors for LED testing
- 22 AWG stranded silicone wire for signal wiring
- Heavier wire for motor power, ideally 18–20 AWG
- Heat shrink tubing
- Terminal blocks or connectors
- Solder
- Soldering iron
- Multimeter
The belt does not directly carry the wing hardware.
The belt holds a rigid structure against the body. The rigid structure carries the hinge, motor, pulleys, and wing load.
The correct structural chain is:
Body / hips
↓
Tactical belt + suspenders
↓
Outer rigid hip plate
↓
Vertical hinge
↓
Wing root bracket
↓
Folding wing frame
The belt is for wearing the mechanism.
The rigid hip plate is what the mechanism actually mounts to.
Use the plastic cutting board as the rigid hip-plate material.
Cut the board into two outer hip plates.
Suggested size per plate:
Height: 200-250mm
Width: 100-150mm
Thickness: 0.5 inch / about 12.7mm
Do not make the plates too small. Larger plates spread the load better and provide more room for:
- hinge mounting,
- motor mounting,
- pulley mounting,
- cable routing,
- belt bolts.
The plates should sit on the outside of the belt.
Outside of body
[ hinge / motor / pulley hardware ]
↓
[ outer plastic hip plate ]
↓
[ tactical belt fabric ]
↓
[ large penny washers or inner backing plate ]
↓
[ nyloc nuts ]
Inside of body
Recommended tool:
Jigsaw
+
fine-tooth wood/plastic blade
Acceptable alternatives:
Hacksaw
Fine-tooth hand saw
Oscillating multi-tool
Avoid:
Stanley knife
Angle grinder
Circular saw unless experienced
Cut rough rectangles first. Do not waste time shaping them elegantly until the mechanism works.
Suggested process:
- Mark two rectangles on the cutting board.
- Clamp the board securely.
- Cut slowly with a jigsaw or hacksaw.
- Round sharp edges with sandpaper or a file.
- Drill holes only after the plates are cut.
Each hip plate should be bolted through the belt.
Use four bolts per hip plate if possible.
Outer hip plate:
┌────────────────────┐
│ O O │
│ │
│ │
│ O O │
└────────────────────┘
Recommended hardware:
M5 or M6 bolts
Large penny washers
Nyloc nuts
Bolt stack:
Outside of body
Bolt head
↓
Outer plastic hip plate
↓
Tactical belt fabric
↓
Large penny washer or inner backing plate
↓
Nyloc nut
Inside of body
A smaller inner backing plate is better than washers alone because it spreads the load over more belt material.
Best version:
Outer large hip plate
↓
Belt
↓
Smaller inner backing plate
↓
Nuts
Minimum acceptable version:
Outer large hip plate
↓
Belt
↓
Large penny washers
↓
Nuts
Do not screw the hinge directly into the belt fabric.
If time allows, connect the left and right hip plates across the back.
Left hip plate ───── rear brace ───── right hip plate
This makes the belt behave more like a rigid waist frame.
Useful materials:
Aluminium flat bar
Steel mending strip
Plywood strip
Spare HDPE strip
This is strongly recommended if the wings are heavy or long, because it reduces twisting and sagging.
The wing should rotate outward from the hip using a vertical hinge.
The hinge pin must be vertical, like a door hinge.
Top view:
Body / hip
│
│ outer hip plate
│
O vertical hinge pin
\
\
wing swings outward
Use two hinges per wing if possible.
Side view:
Outer hip plate:
┌────────────────────┐
│ [ upper hinge ] │
│ │
│ [ lower hinge ] │
│ │
└────────────────────┘
Two hinges resist twisting better than one hinge.
The hinge structure should be:
Outer hip plate
↓
Vertical hinge
↓
Wing root bracket
↓
Folding wing frame
The hinge needs hard stops.
Without stops, the wing can rotate too far and damage the cable, linkage, belt, or wearer.
Minimum stops:
Closed stop:
Prevents the wing folding too far into the body.
Open stop:
Prevents the wing rotating too far outward.
Simple emergency stop options:
Bolt used as a stop peg
Rubber bumper
Washer stack
Small metal bracket
Wood/plastic block
The motor should never be allowed to pull indefinitely against a hard stop. Limit switches should eventually stop the motor before or at the stop point.
The motor does not directly move the wing.
The motor rotates a drum. The drum winds the cable. The cable pulls a moving linkage point on the wing. That movement opens the wing.
flowchart LR
Motor[JGY-370 Motor] --> Drum[Timing Pulley Used as Drum]
Drum --> Cable[Bike Cable]
Cable --> RootPulley[Root Guide Pulley]
RootPulley --> OptionalPulley[Optional Guide Pulley]
OptionalPulley --> AttachPoint[Cable Attachment Point]
AttachPoint --> Linkage[Wing Linkage]
Linkage --> WingOpen[Wing Opens]
The most important rule:
Pulleys guide the cable.
The cable endpoint moves the wing.
Do not attach the cable at every bolt.
Do not put a pulley at every joint just because there is a bolt there.
Use the 20T 6mm bore aluminium timing pulley as a temporary drum.
It should fit the JGY-370 motor shaft if the motor shaft is 6mm.
The timing pulley must be secured to the motor shaft using its grub screws.
Motor shaft
↓
6mm bore timing pulley
↓
Grub screws tightened onto shaft
The grub screws secure the pulley to the motor shaft.
They do not secure the bike cable to the pulley.
The cable must be fixed to the drum so that the drum winds the cable rather than slipping underneath it.
Do not rely on friction alone.
Prototype methods:
Drill small hole in pulley flange
↓
Pass bike cable through hole
↓
Clamp or crimp cable
↓
Wrap cable around pulley
Bike cable
↓
Loop around a small bolt/hole on the drum
↓
Ferrule/crimp secures loop
↓
Cable wraps around pulley
Cable through hole
↓
Zip tie or small clamp
↓
Temporary test only
Hot glue or epoxy can help for a temporary prototype, but it should not be trusted as the only load-bearing cable connection.
Start with the minimum number of pulleys.
Per wing, begin with:
Motor drum on fixed hip plate
↓
Root guide pulley on fixed hip plate
↓
Optional guide pulley if needed
↓
Cable attachment point on moving linkage
Use pulleys only where needed to:
- redirect the cable,
- stop the cable rubbing on the frame,
- improve cable alignment,
- prevent sharp cable bends.
Do not add unnecessary pulleys. Every pulley adds friction, weight, and another possible failure point.
The cable should terminate on a moving inner/root linkage, not automatically on the wing tip.
The likely best area is:
Lower moving linkage near the wing root
However, this must be proven manually.
Use string first.
Manual test:
- Close the wing.
- Tie string to a candidate linkage point.
- Pull the string from the direction the motor/pulley would pull.
- Watch whether the wing unfolds smoothly.
- Try another point if it binds or only moves the wrong section.
- Mark the best point.
- Only then attach the real bike cable.
Correct attachment point:
Pulling it opens the first/root section.
The linkage opens smoothly.
The required force feels manageable.
The wing does not twist badly.
The cable does not rub sharply.
Preferred linkage-side attachment:
Bike cable
↓
Thimble
↓
Crimped loop
↓
Bolt through metal tab/control horn
↓
Moving linkage
If needed, add a small metal tab or control horn to the linkage.
A control horn is simply a small lever or tab that gives the cable a better pulling point.
Do not clamp the moving cable under multiple nuts along the route. The cable must slide freely through guides and pulleys. Only the final cable end should be fixed to the moving linkage.
The Arduino controls the motor driver.
The Arduino does not power the motor directly.
flowchart LR
Button[Button] --> Arduino[Arduino Nano R4]
OpenLimit[Open Limit Switch] --> Arduino
ClosedLimit[Closed Limit Switch] --> Arduino
Arduino --> BTSLogic[BTS7960 Logic Inputs]
Battery[12V Battery] --> Fuse[Fuse]
Fuse --> Switch[Main Switch]
Switch --> BTSMotorPower[BTS7960 Motor Power]
Switch --> ArduinoVIN[Arduino VIN]
BTSMotorPower --> BTS[BTS7960]
BTS --> Motor[JGY-370 Motor]
A separate Arduino battery module is not required for this design.
Use one 12V battery source.
Power split:
12V battery positive
↓
Fuse
↓
Main switch
↓
Split to:
- Arduino Nano R4 VIN
- BTS7960 B+
Common ground:
12V battery negative
↓
Common ground
↓
Connect to:
- Arduino GND
- BTS7960 B- / power ground
- BTS7960 logic GND
Important:
All grounds must be common.
The motor must not be powered from the Arduino.
The BTS7960 handles motor current.
The Arduino only sends control signals.
flowchart TB
BatteryPlus[Battery +] --> Fuse[Fuse]
Fuse --> Switch[Main Power Switch]
Switch --> NanoVIN[Arduino Nano R4 VIN]
Switch --> BTSPlus[BTS7960 B+]
BatteryMinus[Battery -] --> GroundBus[Common Ground]
GroundBus --> NanoGND[Arduino GND]
GroundBus --> BTSMinus[BTS7960 B-]
GroundBus --> BTSLogicGND[BTS7960 Logic GND]
The fuse should be placed on the battery positive line before the circuit splits.
Battery +
↓
Fuse
↓
Main switch
↓
Arduino + motor driver
Do not place the fuse only on the Arduino side. The motor driver and motor are the higher-current parts of the system.
Use a fuse appropriate to the motor current and wire size. Do not automatically use a huge fuse just because it fits the holder.
Typical BTS7960 logic pins:
VCC
GND
RPWM
LPWM
R_EN
L_EN
R_IS
L_IS
Suggested Arduino wiring:
Arduino 5V -> BTS7960 VCC
Arduino GND -> BTS7960 GND
Arduino D5 -> BTS7960 RPWM
Arduino D6 -> BTS7960 LPWM
Arduino D7 -> BTS7960 R_EN
Arduino D8 -> BTS7960 L_EN
Unused for first prototype:
R_IS
L_IS
Motor power side:
Battery + -> BTS7960 B+
Battery - -> BTS7960 B-
Motor wire 1 -> BTS7960 M+
Motor wire 2 -> BTS7960 M-
If the motor direction is reversed, either swap M+ and M- or invert the forward/reverse logic in code.
Use the Arduino internal pull-up resistor.
Button leg 1 -> Arduino D2
Button leg 2 -> Arduino GND
With INPUT_PULLUP:
Button not pressed = HIGH
Button pressed = LOW
Use two limit switches:
Open limit switch
Closed limit switch
Simple prototype wiring:
Open limit switch:
One side -> Arduino D3
Other side -> GND
Closed limit switch:
One side -> Arduino D4
Other side -> GND
Use INPUT_PULLUP.
Logic:
Switch not pressed = HIGH
Switch pressed = LOW
Recommended final improvement:
Use normally-closed limit switch wiring so that a broken wire can be detected as a fault.
For the rushed prototype, normally-open switches using INPUT_PULLUP are acceptable if tested carefully.
Use this before connecting the motor.
const int BUTTON_PIN = 2;
const int LED_PIN = 5;
void setup()
{
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
}
void loop()
{
const bool isPressed = digitalRead(BUTTON_PIN) == LOW;
digitalWrite(LED_PIN, isPressed ? HIGH : LOW);
}Expected behaviour:
Button not pressed -> LED off
Button pressed -> LED on
Use this before connecting the motor to the wing.
const int L_EN = 8;
const int LPWM = 6;
const int R_EN = 7;
const int RPWM = 5;
void stopMotor()
{
analogWrite(RPWM, 0);
analogWrite(LPWM, 0);
}
void runForward(const int speed)
{
analogWrite(RPWM, speed);
analogWrite(LPWM, 0);
}
void runReverse(const int speed)
{
analogWrite(RPWM, 0);
analogWrite(LPWM, speed);
}
void setup()
{
pinMode(L_EN, OUTPUT);
pinMode(LPWM, OUTPUT);
pinMode(R_EN, OUTPUT);
pinMode(RPWM, OUTPUT);
digitalWrite(L_EN, HIGH);
digitalWrite(R_EN, HIGH);
stopMotor();
}
void loop()
{
runForward(128);
delay(3000);
stopMotor();
delay(1000);
runReverse(128);
delay(3000);
stopMotor();
delay(1000);
}Expected behaviour:
Motor turns one direction for 3 seconds
Motor stops for 1 second
Motor turns the other direction for 3 seconds
Motor stops for 1 second
Do not connect everything at once.
Build in this order:
flowchart TB
A[1. Cut hip plates] --> B[2. Bolt hip plates to belt]
B --> C[3. Mount hinges to hip plates]
C --> D[4. Attach wing roots to hinges]
D --> E[5. Check outward wing rotation by hand]
E --> F[6. Mount motor to fixed hip plate]
F --> G[7. Fit timing pulley drum to motor]
G --> H[8. Test motor and drum without wing]
H --> I[9. Route string through pulley path]
I --> J[10. Pull wing open by hand]
J --> K[11. Replace string with bike cable]
K --> L[12. Motorised cable pull test]
L --> M[13. Add limit switches]
M --> N[14. Full off-body open/close test]
- Cut two outer hip plates from the plastic cutting board.
- Smooth sharp edges.
- Put the belt on the wearer or a dummy form.
- Mark where the plates should sit on the hips.
- Drill four mounting holes per plate.
- Drill matching holes through the belt.
- Bolt each plate to the outside of the belt.
- Use large washers or inner backing plates on the inside.
The plates should feel rigid and should not flap around independently.
- Mount two vertical hinges to each outer hip plate if possible.
- Make sure hinge pins are vertical.
- Attach the wing root bracket/frame to the moving side of the hinges.
- Test the wing rotating outward by hand.
- Add a hard stop for the closed position.
- Add a hard stop for the open/outward position.
The hinge should rotate like a door.
If the wing sags or twists badly, increase spacing between the two hinges or add a rear brace between hip plates.
Mount the motor to the fixed outer hip plate, not to the moving wing if possible.
Preferred layout:
Outer hip plate
├── motor + drum
├── root guide pulley
├── vertical hinges
└── cable route to moving linkage
The motor should stay fixed relative to the belt.
The wing should rotate on the hinge.
- Slide the 6mm bore timing pulley onto the motor shaft.
- Tighten the grub screws.
- Check the pulley does not wobble.
- Check the pulley does not slip on the shaft.
- Rotate the motor slowly and watch the pulley.
Do not attach the wing cable yet.
Before using the real wing:
- Attach string or temporary cable to the drum.
- Run the motor briefly.
- Check whether the drum winds the cable.
- Check whether the cable slips.
- Check whether the cable bunches up.
Fix cable slipping before connecting the wing.
This is the most important mechanical test.
Use string first.
String from hand
↓
Root guide pulley
↓
Candidate attachment point on moving linkage
Pull by hand.
The correct attachment point is the one that opens the wing with the least binding.
Do not assume the wing tip is correct.
Likely starting point:
Lower moving linkage near the root
If it does not work, test another nearby moving linkage point.
Once the manual string test works:
- Create a crimped loop on the linkage end.
- Attach the loop to a bolt, tab, or control horn.
- Route the cable through the guide pulleys.
- Attach the motor end to the drum.
- Wind cable onto the drum by hand first if possible.
- Keep the cable path clean and untangled.
Run the motor at low PWM first.
Start with:
PWM speed: 70-100
Increase only if required.
Keep one hand near the power switch.
Stop immediately if:
- cable slips,
- wing binds,
- belt twists badly,
- motor stalls,
- pulley bends,
- hinge pulls away from plate,
- cable starts cutting into plastic or fabric.
Add limit switches after the movement works.
Suggested locations:
Closed limit:
Pressed when the wing is fully folded.
Open limit:
Pressed when the wing reaches the desired open/outward position.
The motor should stop when either limit switch is reached.
Do not rely only on timing.
Final control should use a state machine.
stateDiagram-v2
[*] --> Closed
Closed --> Opening: Button pressed
Opening --> Open: Open limit switch pressed
Open --> Closing: Button pressed
Closing --> Closed: Closed limit switch pressed
Opening --> Fault: Timeout or emergency stop
Closing --> Fault: Timeout or emergency stop
Fault --> Closed: Manual reset
Recommended states:
CLOSED
OPENING
OPEN
CLOSING
FAULT
The motor should stop when:
- the open limit switch is triggered,
- the closed limit switch is triggered,
- the main switch is turned off,
- the motor runs too long,
- the mechanism binds,
- any unsafe condition occurs.
- Fuse the battery positive line.
- Use a main power switch.
- Do not power the motor from the Arduino.
- Use the BTS7960 for motor current.
- Connect Arduino GND and BTS7960 GND together.
- Use thicker wire for motor power than for signal wiring.
- Keep motor wiring and signal wiring tidy.
- Do not use an oversized fuse.
- Test off-body first.
- Keep fingers away from the linkage during powered tests.
- Add hard stops.
- Add limit switches.
- Cover sharp cable ends.
- Use nyloc nuts or threadlocker.
- Check every pivot before powering the system.
- Do not wear the mechanism until it has completed repeated off-body tests.
Before wearing:
- Check the belt does not dig into the wearer.
- Check the hip plates do not have sharp edges.
- Check inner bolts/nuts are covered or padded.
- Check the wings cannot hit the wearer.
- Check the main power switch is reachable.
- Check the battery is secured.
- Check no cables can catch clothing, hair, or skin.
For the 2-day deadline, the minimum viable version is:
Tactical belt + suspenders
↓
Outer HDPE hip plates
↓
Vertical hinges
↓
Wing frame rotates outward
↓
Motor fixed to hip plate
↓
Timing pulley used as drum
↓
Bike cable routed through guide pulley
↓
Cable pulls moving linkage
↓
Arduino controls BTS7960
↓
BTS7960 drives motor
Minimum success condition:
The wings can be worn.
The wings can rotate outward from the hips.
The wings can open and close under controlled motor power.
The system can be stopped safely.
If motorisation fails under the deadline, the fallback is:
Keep the belt, hip plates, hinges, and wing frame.
Use manual cable pull or manual deployment.
Prioritise visual appearance for the costume.
The remaining high-risk areas are mechanical:
- The correct cable attachment point has not been fully proven.
- The wing may require more or less cable travel than expected.
- The belt may twist without a rear brace.
- The wing may sag if the hinge spacing is too small.
- The motor may be too slow for dramatic deployment.
- The timing pulley may work as a temporary drum but is not an ideal final cable drum.
- The cable may slip if not properly fixed to the drum.
- The mechanism may need elastic, spring, or manual assistance to close reliably.
Treat these as prototype risks, not failures.
- Cut two outer HDPE hip plates.
- Smooth plate edges.
- Bolt plates to outside of tactical belt.
- Add inner backing plates or large washers.
- Add rear brace if possible.
- Mount vertical hinges to hip plates.
- Attach wing roots to hinges.
- Add open and closed hinge stops.
- Mount motor to fixed hip plate.
- Fit 6mm timing pulley drum to motor shaft.
- Mount root guide pulley.
- Test cable route with string.
- Identify best linkage attachment point.
- Attach bike cable using crimped loop.
- Confirm wing opens by hand before motorising.
- Test Arduino LED blink.
- Test button input.
- Wire BTS7960 logic pins.
- Wire 12V battery to fuse and switch.
- Wire battery to BTS7960 motor power.
- Wire battery/VIN to Arduino.
- Connect all grounds together.
- Test motor forward and reverse without wing.
- Add limit switches.
- Test open/close state logic.
- Wing opens without binding.
- Wing closes without binding.
- Belt does not twist excessively.
- Hinges do not pull loose.
- Cable does not slip.
- Cable does not rub sharply.
- Motor stops at limits.
- Main power switch works.
- Battery is secure.
- No sharp edges contact the wearer.