Build an Origami
Craft Generator
powered by Servos!
A machine that folds paper into origami shapes automatically — using Arduino and servo motors. Art meets engineering! 🦢🤖
Overview
What Are We Making? 🦢
Origami — the ancient Japanese art of paper folding — meets modern robotics! In this project you'll build a servo-powered folding machine that moves a set of paddles and press-arms to fold a square sheet of paper step by step, automatically creating origami shapes.
The machine uses 4 SG90 servo motors controlled by an Arduino UNO. Each servo moves a cardboard arm or paddle that makes a precise fold. You press a button, and the machine works through the entire folding sequence — all by itself! 🎉
What It Creates
Origami Shapes Your Machine Can Fold 📄
The machine is programmable — different button presses trigger different fold sequences stored in your Arduino code. Start with easy shapes and level up!
Shopping List
Components You Need 🛒
All available on Amazon India, Robocraze, Robu.in, or Flyrobo. The cardboard and craft materials you probably already have at home!
| # | Component | Qty | Purpose | Price (₹) |
|---|---|---|---|---|
| 1 | Arduino UNO R3 | 1 | Brain — controls all servos | ₹450 |
| 2 | SG90 Servo Motor | 4 | The folding arms | ₹80 × 4 = ₹320 |
| 3 | Tactile Push Button (6mm) | 3 | Select fold shape (A, B, C) | ₹5 × 3 = ₹15 |
| 4 | 5mm Green LED | 1 | Ready / fold-complete indicator | ₹5 |
| 5 | 5mm Red LED | 1 | Busy / folding-in-progress | ₹5 |
| 6 | Active Buzzer 5V | 1 | Audio cue when fold sequence done | ₹30 |
| 7 | 220Ω Resistor | 3 | LED current limiting | ₹10 |
| 8 | 10kΩ Resistor | 3 | Button pull-down resistors | ₹10 |
| 9 | Half-size Breadboard | 1 | Wiring | ₹60 |
| 10 | Jumper Wires (M-M, M-F) | 25+ | Connections | ₹80 |
| 11 | 5V Power Bank (2A) | 1 | Powers servos separately | ₹150 |
| 12 | USB-A to USB-B Cable | 1 | Upload code to Arduino | ₹50 |
| 13 | Thick Cardboard Strips | 1 pack | Folding paddle arms | ₹20 |
| 14 | Hot Glue Gun + Sticks | 1 | Assemble the frame | ₹80 |
| 15 | A4 Paper (any colour) | – | The origami paper to fold! | ₹10 |
| 💰 Estimated Total | ₹1,100 – ₹1,500 | |||
Electronics: Robocraze.com, Robu.in, Flyrobo.in, or Amazon India. Craft materials (cardboard, hot glue) from any stationery or art supply shop.
Mechanism
How the Folding Machine Works ⚙️
The machine has a flat platform where you place the paper. Four servo-powered paddle arms surround it — one on each side. Each arm can push, press, and hold. By activating them in the right order with the right angles, the paper folds itself!
The 4 Servo Roles
| Servo | Position | Action | Arduino Pin | Rest Angle | Fold Angle |
|---|---|---|---|---|---|
| SV1 | Left side | Pushes paper right → first vertical crease | Pin 9 | 0° | 90° |
| SV2 | Right side | Pushes paper left → second vertical crease | Pin 10 | 180° | 90° |
| SV3 | Top edge | Folds paper downward → horizontal crease | Pin 11 | 0° | 90° |
| SV4 | Centre press | Presses down to hold crease firm | Pin 6 | 90° | 30° |
Triangle Fold — Sequence Visualised
Standard 75 GSM A4 paper works best. Thick cardstock is too stiff for servo motors to fold. Cut your paper into a 15cm × 15cm square for the best results with this machine's reach.
Wiring
Circuit Diagram 🔌
Complete wiring for 4 servo motors, 3 push buttons, 2 LEDs, and a buzzer. Always wire the servo power from the external 5V power bank — never from the Arduino 5V pin!
╔═══════════════════════════════════════════════════════════════════════════╗ ║ MAKEMINDZ — SERVO ORIGAMI CRAFT GENERATOR — WIRING DIAGRAM ║ ╚═══════════════════════════════════════════════════════════════════════════╝ ┌──────────────────────────────────────────────────────┐ │ ARDUINO UNO R3 │ │ │ │ Pin 9 (PWM) ────────── SV1 Signal [Left arm] │ │ Pin 10 (PWM) ────────── SV2 Signal [Right arm] │ │ Pin 11 (PWM) ────────── SV3 Signal [Top arm] │ │ Pin 6 (PWM) ────────── SV4 Signal [Centre press]│ │ │ │ Pin 2 ──── BTN_A (fold shape A — Triangle) │ │ Pin 3 ──── BTN_B (fold shape B — Mountain fold) │ │ Pin 4 ──── BTN_C (fold shape C — Petal fold) │ │ │ │ Pin 7 ──── Green LED (+) ── 220Ω ── GND │ │ Pin 8 ──── Red LED (+) ── 220Ω ── GND │ │ Pin 5 ──── Buzzer (+) │ │ │ │ 5V ───────── (NOT used for servos — too weak!) │ │ GND ──────── Common GND rail on breadboard │ └──────────────────────────────────────────────────────┘ ────────────────────────────────────────────────────────────────────────── ALL 4 SERVO MOTORS (wire identically): ────────────────────────────────────────────────────────────────────────── [Signal wire ORANGE/YELLOW] ──── Arduino PWM pin (9 / 10 / 11 / 6) [Power wire RED ] ──── (+) 5V Power Bank rail [Ground wire BROWN/BLACK ] ──── (–) GND rail on breadboard GND rail also connected to Arduino GND ← CRITICAL ────────────────────────────────────────────────────────────────────────── PUSH BUTTONS (all 3 wired the same way — pull-down configuration): ────────────────────────────────────────────────────────────────────────── [Pin A ] ──── Arduino input pin (2 / 3 / 4) [Pin A ] ──── 10kΩ resistor ──── GND (pull-down) [Pin B ] ──── 5V rail When button pressed: pin reads HIGH. When released: reads LOW. ────────────────────────────────────────────────────────────────────────── POWER SUPPLY SETUP: ────────────────────────────────────────────────────────────────────────── [5V Power Bank (+)] ──── (+) Servo power rail ← Servos only [5V Power Bank (–)] ──── (–) GND rail ──────── also to Arduino GND [9V Adapter / USB ] ──── Arduino DC jack or USB ← Arduino logic only ────────────────────────────────────────────────────────────────────────── PHYSICAL MACHINE TOP-VIEW: ────────────────────────────────────────────────────────────────────────── [SV3 — Top paddle arm] ↓ [SV1 Left arm] → ┌──────────┐ ← [SV2 Right arm] │ PAPER │ │ GOES │ ← [SV4 Centre press — above, pointing down] │ HERE │ └──────────┘ [BTN A] [BTN B] [BTN C] ← Selection buttons on side [Green LED] [Red LED] [Buzzer] ⚠ NEVER power all 4 servos from Arduino 5V — use the external power bank!
| Component | Connection | Arduino Pin | Notes |
|---|---|---|---|
| SV1 – Left Arm | Signal (orange) | Pin 9 (PWM) | Pushes paper from left |
| SV2 – Right Arm | Signal (orange) | Pin 10 (PWM) | Pushes paper from right |
| SV3 – Top Arm | Signal (orange) | Pin 11 (PWM) | Folds paper downward |
| SV4 – Press Arm | Signal (orange) | Pin 6 (PWM) | Holds & presses crease |
| 🟡 Button A | One leg → Pin 2, Other → 5V, 10kΩ to GND | Pin 2 | Triangle fold |
| 🟡 Button B | Same pattern | Pin 3 | Mountain fold |
| 🟡 Button C | Same pattern | Pin 4 | Petal fold |
| 🟢 Green LED | Anode → 220Ω → Pin 7 │ Cathode → GND | Pin 7 | Ready indicator |
| 🔴 Red LED | Anode → 220Ω → Pin 8 │ Cathode → GND | Pin 8 | Busy indicator |
| 🔔 Buzzer | + → Pin 5 │ – → GND | Pin 5 | Fold complete chime |
Construction
Step-by-Step Build Guide 🔨
-
Build the Paper Platform 📋
Cut a 20cm × 20cm piece of stiff cardboard as your folding platform. Mark the centre with a pencil cross. This is where you'll place the 15cm × 15cm origami paper before each fold. Glue the platform onto a larger piece of foam board (30cm × 30cm) as a base — this gives you room to mount the servo arms around the edges.
-
Build the 4 Paddle Arms 🦾
Cut 4 cardboard strips: two measuring 16cm × 3cm (for left/right arms SV1 & SV2) and two measuring 14cm × 3cm (for top arm SV3 and press arm SV4). Fold the last 2cm of each strip at 90° to create a "foot" that attaches to the servo horn. Hot-glue each strip firmly onto its servo horn. Let it dry for 5 minutes before testing.
-
Mount the Servos Around the Platform ⚙️
Hot-glue SV1 on the left edge of the base and SV2 on the right edge — both facing inward with their arms at 0° pointing away from the paper. Mount SV3 on the top edge facing downward. Mount SV4 on a small cardboard gantry above the centre of the paper (use two vertical cardboard pillars about 6cm tall). Make sure all servo arms can swing freely without hitting each other!
-
Wire All 4 Servos to Arduino 🔌
Use M-F jumper wires to connect each servo's signal (orange), power (red), and ground (brown) wires. Signal wires go to Arduino pins 9, 10, 11, and 6. ALL power (red) wires go to the (+) rail of your breadboard — connect this rail to your 5V power bank's positive. ALL ground (brown) wires go to the (–) rail — connect this rail to both the power bank's negative AND the Arduino's GND pin.
-
Wire the Buttons, LEDs & Buzzer 🔘
Place the 3 push buttons on the breadboard. Wire each button with one leg to its Arduino pin (2, 3, 4) and the other to 5V. Add a 10kΩ pull-down resistor from each button's input leg to GND. Connect the green LED through 220Ω to pin 7, the red LED through 220Ω to pin 8, and the buzzer directly to pin 5.
-
Upload the Code & Calibrate 💻
Connect your Arduino to your PC via USB. Open the Arduino IDE, paste the code below, and click Upload. Once uploaded, open the Serial Monitor at 9600 baud and run the calibration mode (press all three buttons at once) to manually adjust each servo angle using the keyboard. Write down your calibrated angles and update the constants in the code.
-
Place Paper and Run Your First Fold! 🦢
Set a 15cm × 15cm paper square on the platform, aligned with the pencil cross. Power up the Arduino and power bank. The green LED should light up (Ready). Press Button A for a triangle fold! The red LED turns on while folding, the machine works through the sequence, and a beep signals completion. Remove your origami shape — you made a robot artist! 🎉
Programming
The Arduino Code 💻
This code handles button detection, three fold sequences, LED indicators, buzzer feedback, and a calibration mode. Copy it all into the Arduino IDE — no extra libraries needed!
Servo.h — pre-installed with Arduino IDE. No extra installation needed!// ================================================================ // MAKEMINDZ — Servo Origami Craft Generator // 4 Servo Motors fold paper through programmable sequences // Shapes: Triangle Fold (A), Mountain Fold (B), Petal Fold (C) // Hardware: Arduino UNO + 4× SG90 + 3× Buttons + 2× LED + Buzzer // ================================================================ #include <Servo.h> // ── Servo objects ────────────────────────────────────────────── Servo sv1; // Left arm — Pin 9 Servo sv2; // Right arm — Pin 10 Servo sv3; // Top arm — Pin 11 Servo sv4; // Press arm — Pin 6 // ── Pin Definitions ──────────────────────────────────────────── const int PIN_SV1 = 9; const int PIN_SV2 = 10; const int PIN_SV3 = 11; const int PIN_SV4 = 6; const int BTN_A = 2; // Triangle fold const int BTN_B = 3; // Mountain fold const int BTN_C = 4; // Petal fold const int LED_GREEN = 7; const int LED_RED = 8; const int BUZZER = 5; // ── Calibrated angles (adjust after calibration!) ────────────── // SV1 (left): 0=away from paper, 90=fold across const int SV1_REST = 0; const int SV1_FOLD = 90; // SV2 (right): 180=away from paper, 90=fold across const int SV2_REST = 180; const int SV2_FOLD = 90; // SV3 (top): 0=raised, 90=pushed down const int SV3_REST = 0; const int SV3_FOLD = 88; // SV4 (press): 90=raised, 30=light hold, 10=firm press const int SV4_REST = 90; const int SV4_HOLD = 30; const int SV4_PRESS = 10; const int STEP_DELAY = 500; // ms pause between fold steps const int HOLD_TIME = 1200; // ms to hold each crease // ================================================================ // HELPER FUNCTIONS // ================================================================ // Smoothly sweep a servo to a target angle void sweepTo(Servo& srv, int from, int to, int stepDelay = 12) { int step = (to > from) ? 1 : -1; for (int a = from; a != to; a += step) { srv.write(a); delay(stepDelay); } srv.write(to); } // Set BUSY state — red LED on, green LED off void setBusy() { digitalWrite(LED_GREEN, LOW); digitalWrite(LED_RED, HIGH); Serial.println("🟡 Folding in progress..."); } // Set READY state — green LED on, red LED off void setReady() { digitalWrite(LED_RED, LOW); digitalWrite(LED_GREEN, HIGH); Serial.println("✅ Ready — place paper and press a button!"); } // Play completion chime void playChime() { int notes[] = { 150, 100, 80 }; // duty cycle (lower = higher pitch) for (int i = 0; i < 3; i++) { tone(BUZZER, 880 + (i * 220), 150); delay(200); } noTone(BUZZER); } // Move all servos to their rest positions void homeAllServos() { sv1.write(SV1_REST); sv2.write(SV2_REST); sv3.write(SV3_REST); sv4.write(SV4_REST); delay(STEP_DELAY); } // ================================================================ // FOLD SEQUENCE A — TRIANGLE FOLD // Folds paper diagonally (SV1 pushes left-bottom corner up-right) // ================================================================ void foldTriangle() { setBusy(); Serial.println("🔺 Fold A: Triangle — starting..."); // Step 1: Press arm lightly holds paper centre Serial.println(" Step 1 — SV4 lightly holds paper"); sweepTo(sv4, SV4_REST, SV4_HOLD); delay(STEP_DELAY); // Step 2: Left arm sweeps across to fold paper Serial.println(" Step 2 — SV1 folds paper right"); sweepTo(sv1, SV1_REST, SV1_FOLD); delay(STEP_DELAY); // Step 3: Press arm firms down the crease Serial.println(" Step 3 — SV4 presses crease firm"); sweepTo(sv4, SV4_HOLD, SV4_PRESS); delay(HOLD_TIME); // hold for crease to set // Step 4: All servos return home Serial.println(" Step 4 — Returning to home position"); homeAllServos(); delay(STEP_DELAY); Serial.println("🎉 Triangle fold complete! Remove your paper."); playChime(); setReady(); } // ================================================================ // FOLD SEQUENCE B — MOUNTAIN FOLD // Folds paper both left AND right edges to centre // ================================================================ void foldMountain() { setBusy(); Serial.println("⛰️ Fold B: Mountain — starting..."); // Step 1: Both left + right arms fold inward simultaneously Serial.println(" Step 1 — SV1 + SV2 fold inward"); sv1.write(SV1_FOLD); sv2.write(SV2_FOLD); delay(HOLD_TIME); // Step 2: Press arm firms the centre ridge Serial.println(" Step 2 — SV4 presses centre ridge"); sweepTo(sv4, SV4_REST, SV4_PRESS); delay(HOLD_TIME); // Step 3: Top arm adds a top crease Serial.println(" Step 3 — SV3 adds top crease"); sweepTo(sv3, SV3_REST, SV3_FOLD); delay(HOLD_TIME); // Step 4: Home all homeAllServos(); Serial.println("🎉 Mountain fold complete! Remove your paper."); playChime(); setReady(); } // ================================================================ // FOLD SEQUENCE C — PETAL FOLD // Full 4-servo sequence: all 4 arms work together // ================================================================ void foldPetal() { setBusy(); Serial.println("🌸 Fold C: Petal — starting (advanced)..."); // Step 1: Top arm folds top edge down 45° Serial.println(" Step 1 — SV3 half-fold top edge"); sweepTo(sv3, SV3_REST, 45); delay(STEP_DELAY); // Step 2: Left arm folds left edge in Serial.println(" Step 2 — SV1 folds left edge"); sweepTo(sv1, SV1_REST, SV1_FOLD); delay(STEP_DELAY); // Step 3: Right arm folds right edge in Serial.println(" Step 3 — SV2 folds right edge"); sweepTo(sv2, SV2_REST, SV2_FOLD); delay(STEP_DELAY); // Step 4: Press arm holds all layers together Serial.println(" Step 4 — SV4 presses all layers"); sweepTo(sv4, SV4_REST, SV4_PRESS); delay(HOLD_TIME * 2); // extra hold for multi-layer // Step 5: Top arm completes fold Serial.println(" Step 5 — SV3 completes top fold"); sweepTo(sv3, 45, SV3_FOLD); delay(HOLD_TIME); // Step 6: Home all homeAllServos(); Serial.println("🎉 Petal fold complete! Remove your paper."); playChime(); setReady(); } // ================================================================ // CALIBRATION MODE // Press all 3 buttons together to enter calibration // Then type commands in Serial Monitor: "sv1:45" sets SV1 to 45° // ================================================================ void runCalibration() { Serial.println("⚙️ CALIBRATION MODE — type sv1:90 and press Enter"); digitalWrite(LED_GREEN, HIGH); digitalWrite(LED_RED, HIGH); // both LEDs = calib mode while (true) { if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); cmd.trim(); int colon = cmd.indexOf(':'); if (colon > 0) { String name = cmd.substring(0, colon); int angle = cmd.substring(colon + 1).toInt(); angle = constrain(angle, 0, 180); if (name == "sv1") sv1.write(angle); else if (name == "sv2") sv2.write(angle); else if (name == "sv3") sv3.write(angle); else if (name == "sv4") sv4.write(angle); else if (name == "exit") break; // type "exit:0" to leave Serial.print(" → Moved "); Serial.print(name); Serial.print(" to "); Serial.print(angle); Serial.println("°"); } } } setReady(); } // ================================================================ // SETUP // ================================================================ void setup() { Serial.begin(9600); // Attach servos sv1.attach(PIN_SV1); sv2.attach(PIN_SV2); sv3.attach(PIN_SV3); sv4.attach(PIN_SV4); // Button inputs pinMode(BTN_A, INPUT); pinMode(BTN_B, INPUT); pinMode(BTN_C, INPUT); // Outputs pinMode(LED_GREEN, OUTPUT); pinMode(LED_RED, OUTPUT); pinMode(BUZZER, OUTPUT); // Move to rest positions homeAllServos(); delay(800); Serial.println("🦢 MakeMindz Origami Craft Generator READY!"); Serial.println(" Btn A = Triangle | Btn B = Mountain | Btn C = Petal"); Serial.println(" All 3 buttons together = Calibration mode"); setReady(); } // ================================================================ // MAIN LOOP // ================================================================ void loop() { bool a = digitalRead(BTN_A); bool b = digitalRead(BTN_B); bool c = digitalRead(BTN_C); // All three buttons together → calibration mode if (a && b && c) { delay(200); // debounce runCalibration(); return; } // Individual button presses if (a) { delay(50); if(digitalRead(BTN_A)) foldTriangle(); } if (b) { delay(50); if(digitalRead(BTN_B)) foldMountain(); } if (c) { delay(50); if(digitalRead(BTN_C)) foldPetal(); } delay(80); }
Help & FAQ
Got Questions? 🙋
🔧 My servo arm is bending the paper but not creasing it sharply! ▶
Try these fixes:
- Make sure the press arm (SV4) presses after the folding arm has moved — it needs to squish the fold flat
- Increase
HOLD_TIMEfrom 1200ms to 2000ms so the crease has more time to set - Use lighter paper (70–80 GSM). Thicker paper needs more force than SG90 servos can provide
- Add a small hard rubber tip (from a pencil eraser) to your press arm to increase friction
😵 The servos make a buzzing noise and don't move to the right angle! ▶
This is a power issue! SG90 servos need a steady 5V at 500mA+. When all 4 run at once they can draw up to 2A. Check:
- Are all servo power (red) wires connected to the external 5V power bank — not the Arduino 5V pin?
- Is the power bank fully charged and turned on?
- Is the GND of the power bank connected to the Arduino GND on the breadboard?
- Try moving servos one at a time with
delay(200)between each to reduce peak current draw
📏 What's the best paper size for this machine? ▶
A 15cm × 15cm square cut from standard A4 paper (75 GSM) works best with SG90 servos that have 12cm cardboard arms. For bigger paper, you'll need MG995 or MG996R servos which are much stronger. For colourful origami, use origami-specific paper from any stationery shop — it's thinner and creases sharply!
🌸 Can I add more fold sequences / more shapes? ▶
Absolutely! To add a new fold:
- Add a new button (e.g. BTN_D on Pin 12)
- Write a new function like
void foldBoat() { ... } - Map each origami fold step to a servo movement using
sweepTo() - Call the function in
loop()when the new button is pressed
Study basic origami diagrams and map each fold to which servo should move and at what angle!
🚀 How can I make it fold a full origami crane? ▶
A crane needs 25+ individual fold steps — more than this basic 4-servo machine can do in one go. To level up:
- Add a 5th and 6th servo for diagonal fold arms
- Use a PCA9685 16-channel servo driver to control up to 16 servos from one Arduino
- Write a longer sequence function with 25 steps
- Consider adding a stepper motor to rotate the paper between steps
Level Up!
Upgrade Ideas 🚀
Loved building this? Here are four exciting directions to take your Origami Generator further:
Achievement Unlocked!
Skills You've Mastered 🏆
This project blends creativity with engineering in a way very few beginner projects do. Here's what you can now put on your STEM portfolio:

Comments
Post a Comment