Introduction: Angry Octopus

You've probably seen a large assortment of useless boxes across the internet. Are you interested in changing it up? Not to worry, here's the Angry Octopus.

The Angry Octopus is a pet octopus that hates getting triggered (literally LOL). When one of its switches is flipped on, its arms are quick to switch it back off.

This project was a great way to learn more about circuits and servos and was a fun challenge. I built this project for my SIDE Project, which is a part of Ms. Berbawy's Principles of Engineering class. I got the idea to recreate this box from ROBOTSZU on YouTube. Thank you to Ms. Berbawy and her non-profit organization, BerbawyMakers, for providing the funding, tools, and facilities to create this. Be sure to check the BerbawyMakers website out!

Supplies

Electronics

Other Materials

Tools/Machines Needed

  • Seam Ripper
  • Sewing Machine (or needle & thread if you want to sew by hand)
  • 3D Printers (I used Prusa MK3 for the box's base, Prusa Mini for everything else)
  • Soldering Iron + Soldering Materials
  • Flux (highly recommended)
  • Dremel
  • File Tool Set
  • Laser Cutter - Universal Laser Systems VLS3.5 40W
  • Hot Glue Gun
  • Scissors
  • Ruler/Calliper

Software Used:

Step 1: CAD the Box

Base

  1. I created 2 circles with different diameters, both with the same middle origin point
  2. I extruded the section between the two circles upwards
  3. Next, I created a sketch on the x-plane (on top of the current base made), and created 2 more circles, using the same middle origin point as before
  4. Then, I extruded the section between the two new circles downwards, creating the lip of the box.
  5. From the top view, I sketched a line across the new space across the box opening to act as the base of the box's hinges. I extruded that upwards and downwards so that that section would sit above the top of the box
  6. From there, I measured out how far apart I wanted my hinge hooks to be, and created measurement lines to ensure that both sides of the hooks would be equal.
  7. Using the measurements, I made 2 planes at the lengths I designated. I created a sketch with 2 circles of the same origin point, drawing them so that they are slightly hanging off the lip of the hinge base.
  8. On the bottom of the circles, I drew two lines creating a triangle connecting to the wall of the hinge base for additional support
  9. I used the project function to copy the same design onto the other plane and I extruded it.
  10. I cut out circles for the power source. I initially put mine parallel to the hinges, but this made it difficult because the Arduino's power source comes from the side.
  11. If I were to do this again though, I would put it near the side or find a battery source to put inside the box, and then no holes will be necessary.

Lid

  1. In a separate design file, I created a circle accounting for tolerances so the lid can easily open. Then I extruded that.
  2. Next, I created a circle sketch on top of the previous circle and cut it to make the lid lighter and hollow inside.
  3. To match the lid base, I measured how long and wide the hinge base was and used that amount to cut off the lid. Again, I accounted for tolerances so that the lid and lid base would not interfere with each other.
  4. On the side that was cut, I created a rectangle of the same width/length to extrude into the lid
  5. I replicated the same measurements of the hinges on the hinge base and repeated step 8 from the base instructions.
  6. For the lid, I created the hinges of the measurements I did not do for the base. The pattern of hinges when put together should be lid, base, lid, lid, base, lid.
  7. For the hinges, I created my own hinge pin and hinge cap.
  8. I used the same dimensions as the hinge's inner dimensions and adjusted for tolerances.
  9. I made it a little longer than the length of all my hinges so that it'd be easier to attach the cap.
  10. I made the cap thin and the same dimension as the hinges. I didn't adjust for tolerances as the cap lays on the outside of the hinge system.

Below are the finalized STL files:

Step 2: CAD Servo Holders

Because the servos need to be above the bottom of the box, I created servo holders to help with stability.

  1. Taking the inner dimensions of my box, I recreated that diameter on another sketch.
  2. I used calipers to measure your servo's width, height, and depth.
  3. I decided how thick I wanted my servo holder to be and then, I created another circle with the same origin point.
  4. inner dimension - holder thickness = diameter of the new circle
  5. I cut out a section and extruded it to my desired height.
  6. To conserve space in the box, I cut out a section of the holder below the servo.

Since the servo horn will be moving around a lot, I opted to have a tighter fit for the servos so that they would stay secure. The tolerances for this holder were minimal.

Step 3: Printing and Cutting

Due to the nature of the box's rim, it was important to add enough supports, but just enough so that I was not wasting unnecessary filament.

On PrusaSlicer, I used the paint-on-supports feature to put supports only under the box rim, the holes I cut, and the hinges. It was a slightly tedious process, but completely necessary.

Once I painted on adequate supports, I pressed Slice and used the layer feature to see exactly where my supports are being placed. I went through each later and made sure that my supports were not missing any spots, as this could cause my print to fail.

Finally, I printed my box. I used PolyTerra PLA - Marble White. My print settings are above.

For the servo holders, I opted for PETG filament as it can handle more heat, which the servo will release as it functions.

Next, I created the actual legs that will be flipping off the switches. I laser cut L-shaped pieces of wood as the main arm and smaller rectangular pieces to glue perpendicular to the end of the arm.

Below is my Adobe Illustrator vector file for the laser cutting machine.

Step 4: Creating the Circuit

For the circuit, I opted to use the Arduino R3 as I'm a beginner to Arduinos, but you should be able to adapt this project to various microcontrollers. From there, I used TinkerCAD to create a circuit schematic, which you can reference above.

Before assembling the entire circuit, I soldered all the wires onto my toggle switches' pins.

  • I ensured that my wires were long enough to reach the rim of my box.
  • Soldering Method (I followed a tutorial on YouTube from Pizzey Technology)
  • I dipped the ends of the wires into flux to help the solder stick better on the wire.
  • I tinned the switch's pin terminals and tinned the ends of my wires.
  • Then, without adding any extra solder, I used the iron to melt the solder on the wires to the terminals.

Next, I connected the 5v pin on the Arduino to the positive strip on the breadboard and the GND pin to the negative.

I connected one end of the toggle switches to the PWM pins and connected the other ends to the negative strip.

I connected 3 wires to the TCJ8 connector of each of the servos.

  • I was consistent in the colors I used for each power and GND pin. For the signal pin, I used different colored wires to help me differentiate the servos.

Next, I connected the signal wires to the PWM pins, the power wires to the positive strip, and the ground wires to the negative strip.

  • To make the wires less messy, I connected the wires to the PWM pins alternating between servo and switch wires.

Because this circuit only requires the negative/positive strip of the breadboard, I used a strip that had been detached from the rest of the board. This helped me save space within my box.

Step 5: Code

This was the hardest step for me since I was new to coding with C++, so I modeled my code after viorelracoviteanu's Useless Box tutorial on the Arduino Project Hub.

After trying to understand what the code was actually doing, I began creating mine. I first tried it on my TinkerCAD simulator. This code was fairly simple once I understood the few functions it utilizes.

Here is the code I created:

  • I made sure to include the servo library before I began your code. Here are the instructions I followed regarding servo libraries.
#include <Servo.h>


Servo doorServo; //declare servos
Servo fingerServo1;
Servo fingerServo2;
Servo fingerServo3;
Servo fingerServo4;
Servo fingerServo5;


int swPin1 = 12; //declare switch names                   
int swPin2 = 10;
int swPin3 = 8;
int swPin4 = 6;
int swPin5 = 4;
int pos = 0;                      
int selectedMove = 0;
int selectedMove2 = 0;
int selectedMove3 = 0;
int selectedMove4 = 0;
int selectedMove5 = 0;


void setup() {
  pinMode(swPin1, INPUT_PULLUP);          
  pinMode(swPin2, INPUT_PULLUP);  
  pinMode(swPin3, INPUT_PULLUP);
  pinMode(swPin4, INPUT_PULLUP);
  pinMode(swPin5, INPUT_PULLUP);
  doorServo.attach(13);   //declare servo pins and starting position         
  doorServo.write(0); 
  fingerServo1.attach(11);          
  fingerServo1.write(80);
  fingerServo2.attach(9);
  fingerServo2.write(80);
  fingerServo3.attach(7);
  fingerServo3.write(80);
  fingerServo4.attach(5);
  fingerServo4.write(80);
  fingerServo5.attach(3);
  fingerServo5.write(80);
}


void loop() {
  if (digitalRead(swPin1) == LOW) {   //switch pin 1
    if (selectedMove > 2) {      
      selectedMove = 0;           
    }
    if (selectedMove == 0) {     
    for (pos = 0; pos < 140; pos += 3) { //set the door servo to open the lid (0-140, 3 intervals/sec)
      doorServo.write(pos);               
      delay(20);                          
    }
    for (pos = 0; pos < 200; pos += 6) {  //octopus arm rotates from 0-200 degrees at 6 intervals/sec
      fingerServo1.write(pos);            
      delay(10);                         
    }
    for (pos = 200; pos >= 0; pos -= 4) { //arm retracts from 200-0 degrees at 4 intervals/sec
      fingerServo1.write(pos);             
      delay(20);                          
    }
    for (pos = 140; pos >= 0; pos -= 3) { //door servo closes lid (140-0 degrees, 3 intervals/sec)
      doorServo.write(pos);               
      delay(10);                          
  }    
    }else if (selectedMove == 1) {  //move 2
    }
    selectedMove += 1;
  }
  
if (digitalRead(swPin2) == LOW) {   //switch pin 2
    if (selectedMove2 > 2) {      
      selectedMove2 = 0;           
    }
    if (selectedMove2 == 0) {     
    for (pos = 0; pos < 140; pos += 3) {  
      doorServo.write(pos);               
      delay(20);                          
    }
    for (pos = 0; pos < 200; pos += 4) {  
      fingerServo2.write(pos);            
      delay(10);                         
    }
    for (pos = 200; pos >= 0; pos -= 4) { 
      fingerServo2.write(pos);             
      delay(20);                          
    }
    for (pos = 140; pos >= 0; pos -= 3) { 
      doorServo.write(pos);               
      delay(10);                          
  }    
    }else if (selectedMove2 == 1) {  //move 2
    }
    selectedMove2 += 1;
  }
if (digitalRead(swPin3) == LOW) {   //switch pin 3
    if (selectedMove3 > 2) {      
      selectedMove3 = 0;           
    }
    if (selectedMove3 == 0) {     
    for (pos = 0; pos < 140; pos += 3) {  
      doorServo.write(pos);               
      delay(20);                          
    }
    for (pos = 0; pos < 200; pos += 4) {  
      fingerServo3.write(pos);            
      delay(10);                         
    }
    for (pos = 200; pos >= 0; pos -= 4) { 
      fingerServo3.write(pos);             
      delay(20);                          
    }
    for (pos = 140; pos >= 0; pos -= 3) { 
      doorServo.write(pos);               
      delay(10);                          
  }    
    }else if (selectedMove3 == 1) {  //move 2
    }
    selectedMove3 += 1;
  }  
  if (digitalRead(swPin4) == LOW) {   //switch pin 4
    if (selectedMove3 > 2) {      
      selectedMove4 = 0;           
    }
    if (selectedMove4 == 0) {     
    for (pos = 0; pos < 140; pos += 3) {  
      doorServo.write(pos);               
      delay(20);                          
    }
    for (pos = 0; pos < 200; pos += 4) {  
      fingerServo4.write(pos);            
      delay(10);                         
    }
    for (pos = 200; pos >= 0; pos -= 4) { 
      fingerServo4.write(pos);             
      delay(20);                          
    }
    for (pos = 140; pos >= 0; pos -= 3) { 
      doorServo.write(pos);               
      delay(10);                          
  }    
    }else if (selectedMove4 == 1) {  //move 2
    }
    selectedMove4 += 1;
  }  
  }

Step 6: The Octopus

For this project, I deconstructed the octopus stuffed animal. I used a seam ripper and carefully went through and broke the seams that connected the body and legs. Once I did that, I was left with 3 pieces of fabric:

  • The head with stuffing in it
  • The head that was flipped inside
  • The legs

For the legs, I separated them so that they could cover each servo arm. To do this, I chose to use a sewing machine.

To hide the seams, I removed the stuffing from the legs and flipped the fabric inside out.

Then, my mom taught me how to use the sewing machine. I used a straight stitch and essentially sewed through the fabric where I wanted to separate the legs.

After sewing, I cut off each of my legs and flipped them right side out, so that the fluffy fabric was on the outer side. I did this so that no seams would be visible from the outside.

Now, moving on to the head. With the head stuffed to my liking, I determined where the connecting Velcro strip should be on the lid. Because the head fabric is not flat, I hand-sewed the Velcro strip onto the back of the head. I started off doing this with no stuffing inside, but having some structure inside really helped when hand sewing.

Step 7: Assemble

With all my pieces completed, it was time to assemble.

I first worked on putting together the base and the lid. Using super glue, I attached the hinge pin and the cap. Because of how small my hinge pin was, I had to be very careful when supergluing. I paid close attention to how much glue I was putting onto the pin, to prevent gluing my hinge shut together.

For the legs, I used wood glue to attach the smaller rectangle piece onto each of my arms. Once those dried, I used hot glue to attach my wooden arms onto the servo horns. Because hot glue is not the most secure, I used the thin metal wire to wrap and reinforce the arm. From there, I took each of my octopus arms, added a little bit of stuffing on it and added it the arm into the sleeve.

Then, I put my circuit into the box. To do this, I used a strip of Velcro to secure my Arduino to the base of my box. I took off all the attached wires and servos to make it easier. From there, I wired each of my servos and switches onto the circuit as it was in the box.

Next, I measured where exactly to put my servo holders in my box and then used super glue to secure them inside the box. I found where I needed them to be by having my servos inside the holders and testing out different placements with the switches installed.

For the door servo, I used hot glue to place it at the slope perpendicular to the lid, right at the top so that the servo's arm could reach. For this servo, I used a horn that was not dual-sided so that it would not conflict with the wall.

My Velcro had adhesive on it already, so I just used that to stick it onto the lid. I attached the octopus head onto the lid by the Velcro.

Finally, I looped my power wire through and plugged it into my Arduino. I tested out each of the switches to make sure each switch worked.

Step 8: Adapting Toggle Switches

After putting everything together, I tried it and realized that my servos were not strong enough to flip the switch off. I experimented with my code to change the speed of my servo movements, but nothing worked. I looked at a few more people's Useless Box Instructables and came across one done by krosstoph. In one of his steps, he also found his switches to be too much force to switch off, so he disassembled them and cut off part of the spring.

Before disassembling my switches though, I watched Next Gen Guitar's informational video on what is inside a mini switch and how they work. This video helped me fully understand what to expect when I opened up the switch and how to place all the parts back together.

Using a flat screwdriver head, I pried open the sides of the switch until the entire metal top came loose. I used a needle to pull out the spring from the switch and used pliers to trim off a few windings.

  • The first time I did this, I accidentally cut off too much, which caused the switch to be unusable. So, for the rest of my switches, I was careful to only trim a little bit at a time.

Step 9: Issues + Reflection

As I was testing each of my servos/switch pairs, I tried powering my circuit using battery packs instead because I found that my servos were drawing too much current and the USB was causing my Arduino to trigger the self-resetting fuse. So, my Arduino was not able to handle the amount of power I needed for all my servos when getting its power from the USB. (Thank you to the Redditers on the r/Arduino server who helped answer my questions and let me know what the issue was.) I had to power my Arduino and my servos separately, with two different power sources. I tried using a 6V pack of AA batteries attached to a barrel jack plug to power the Arduino and a 9V battery pack for the servos, but I still had issues with the power supply. Unfortunately, I was not able to get my project to work.

But, I did learn a lot from this project! As I mentioned before, I was a complete beginner to Arduinos and creating circuits. I could not find a single set of instructions on how to create a project exactly like this, so I needed to do lots of research and planning for all the logistics. I did not anticipate having as many issues as I did, and honestly, there were so many moments when I wanted to give up. It felt like once I figured one issue out, another three would reappear and it became more of a stressful project rather than a fun one.

However, this project taught me a lot about my resilience and perseverance. Engineering and creating is not always a linear path of success. But, those moments of failure were key to me becoming a better engineer. I now know what type of issues to account for when creating circuits, 3D printing, and so much more.

If you've made it this far, thank you for taking the time to read through this. I hope, though you can't learn how to make an Angry Octopus from this, that you have gained some knowledge or inspiration from this project. If you have any feedback or suggestions, I'd love to hear from you!