Introduction: The Jumping Atlas

This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)

Project title inspired by the Titan Atlas punished to hold up the planet Earth for eternity but instead this project will forever bounce a ball.

This dynamic perpetual-like motion desk bounces a dropped ball at a constant rate based on the time interval seen between the first two impacts. No matter what ball mass or drop height initiates the code, the system will adjust and account based on its initial inputs.

This project's purpose would be a fun object to have on your office desk to take your mind off of work for half a moment.

All moving parts and wiring was intentionally packaged within the box to keep the aesthetics as simple and clean as possible especially if this goes onto a office desk.

Step 1: Arduino and Components Purchased

This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)

What is needed? The Makecourse offered at the University of South Florida included majority of the Arduino set that was used for this project. Other items were either purchased (links provided) or found in a machine shop or a laboratory inventory.

Materials Required:

(1x) Arduino Uno

(1x) Breadboard

(1x) Tilt Sensor

(2x) 220 Ohms Resistors

(1x) Green LED

(1x) Yellow LED

(21x) Jumper Wires

*(2x) Futaba S3003 Standard Servo (approx. cost $12.67) = $25.34

*(1x) Bouncy Ball (approx. cost $3.55, 20/pack) = $0.17

*(2x) Acrylic Panels (approx. cost $5.07) = $10.14

*(2x) Ball Bearings (approx. cost $5.94) = $11.88

(1x) Super Glue, Gel

(5x) Zipties (~5inch) Aluminum FIller Rod

Suggested material:

(4x) Cotter pins

(4x) Washers

(4x) Socket Bolts

Approximate total cost of linked items only: $47.53
**only considered in total cost

Step 2: 3D Printing

This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)

Parts were modeled using SolidWorks.

These are printed because of there unique geometries and do not see large loading conditions. All STL file are uploaded for you to print yourself. All parts were printed out of PLA material; no requirements for infill density or infill shape; default wall thickness is sufficient.

Parts:

(1x) Makecourse Housing Box

(1x) Lid- fits onto bin and has openings for the linkages, sensor, LCD screen, LED lights, and mounting bolts.

(1x) Bin- contains grooves for better Arduino fitment and mounting holes

(2x) Bearing Housing- sized to fit purchased ball bearings

(1x) Servo Stand- sized to fit purchased servos

(1x) Platform

(4x) Pins (Optional: Can use any 0.2" dia pin alternative)

Step 3: Laser Cutting

This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)

Parts were modeled using SolidWorks.

Using a laser cutter, these components were cut to precise dimensions from a 0.125" wood and acrylic panels.

1:1 PDF projection drawings are uploaded for you to laser cut yourself.

Notice: Maximize acrylic use when laser cutting as there is only enough for one attempt. If concerned with messing up the laser cut, order extra acrylic material.

Parts:

(10"x10") Wood panel (0.125" thickness)

(4x) Gear

(4x) Linkage

(4x) Acrylic Column (1/8")

(2x) Side 1

(2x) Side 2

(1x) Square Axle Rod (Optional: Alternative substitute for Aluminum Filler Rod)

Step 4: Circuit Schematic

This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)

The LED lights, the servos, and the LCD screen are wired to take a commands from the Arduino. The tilt sensor will send its disturbance into the Arduino.

The top row on the breadboard acts as the systems GND and the row just below acts as the voltage supply.

Note:

In the circuit schematic, my LCD screen has a YwRobot Arduino soldered onto it making simplifying the circuit to 4x connections.

Also, I used the Arduino Tilt Sensor (blue color) and not the SparkFun (red color) sensor.

Step 5: Arduino Code

This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)

All comments within code describe the functionality of the code logic. Code is organization and labeled to better understand the intention of each line and its relation across the project.

//This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)
//Date: December 2017

#include <Wire.h>  //include the I2C library, this one is a standard Arduino package library
#include <LiquidCrystal_I2C.h> 
#include <Servo.h>
#define NOT_AN_INTERRUPT -1
// CONSTANTS AND SETUP
//SERVOS & LCD SCREEN
Servo servo1;                     //defining first servo
Servo servo2;                     //defining second servo 
bool cwRotation, ccwRotation;     //the states of rotation 
LiquidCrystal_I2C lcd(0x27,16,2); //initiate LCD object named 'lcd'
//LED PINS AND SENSOR <br>int ledPin1 = 9;                                            // Connect LED to pin 9   INDICATES POWERED
int ledPin2 = 10;                                           // Connect LED to pin 10   INDICATES IMPACTS 
int switcher = 2;                                           // Connect Tilt sensor to Pin 2 
int i = 0;                                                  //integer initialization
float timearray[4] = {0,0,0,0};				    //array initialization						
float t;				                    //defining t as a floating value
void setup() {   <br>Serial.begin(9600);
//LED LIGHTS 
pinMode(ledPin1, OUTPUT);      // Set digital pin 9 to output mode 
pinMode(ledPin2, OUTPUT);      // Set digital pin 10 to output mode
//TILT SENSOR 
pinMode(switcher, INPUT);       // Set digital pin 8 to input mode 
//SERVO 
servo1.attach(12);                 //servo 1 pin 12 
servo2.attach(13);                 //servo 2 pin 13 
servo1.write(118);                 //center (calibrated) pin 12; 118 is full stop   //for servo1: 10-117(CW), 119-543 (CCW), 543-900 (CW) 
servo2.write(10);                  //center (calibrated) pin 13; 10 is full stop   //for servo2: -600-9(CW), 100-700 (CWW), 640 is full stop 
//setup for LCD screen
lcd.begin();   
lcd.backlight();    		   //this turns the backlight ON 
lcd.setCursor(1,0);                
//LCD Screen logic 
lcd.clear(); 
lcd.print("Waiting for ball"); }
void loop() { <br>float timer = micros();                      //logging time from code initialization <br>float timerr=timer/1000000;                  //converting to microseconds to seconds
//LOGIC FOR LED LIGHTS 
if (digitalRead(switcher) == LOW){ 
digitalWrite(ledPin2, HIGH);                 //turn ON GREEN LED for IMPACTS 
} 
else { 
digitalWrite(ledPin2, LOW);                  //turn OFF GREEN LED for mid-air 
  } 
//LOGIC FOR TIME INTERVAL 
if ((digitalRead(switcher) == LOW)&&(i<4)){      //if sensor triggered and when the array is less than 4, continue...     digitalWrite(ledPin1, HIGH);                   //turn ON YELLOW LED for POWER, keep on 
timearray[i]=timerr;                             //build array when logic is true 
if (sizeof(timearray[i] == 2)){                  //only convert the time interval when we built enough of the array 
t=timearray[1]-timearray[0];                     //time interval 
float f=1/t;                                     //conversion to frequency 
servo1.write(1);                                 //CW 
servo2.write(300);                               //CCW             
delay(t);                                        //oscillation of platform based on time interval of ball bounce 
lcd.setCursor(1,0);                              //LCD Screen logic 
lcd.clear(); 
lcd.print("Frequency:"); 		         //Writing to LCD screen. Any visual text can be entered here.
lcd.print(f); 						
lcd.print("Hz:"); 				 //Writing to LCD screen. Any visual text can be entered here.
} 
i++;                                           //prepare the next array value 
} 
delay(10);
//LOGIC FOR TURNING POWER LED OFF 
if ((digitalRead(switcher) == HIGH)&&(timerr>120)&&(t>0)){  //if nothing impacts the platform and the timer exceeds 120 seconds and the array has been created, continue... 
digitalWrite(ledPin1, LOW);                                 //turn OFF YELLOW LED for POWER 
lcd.clear(); 
lcd.print("2min no activity"); 
lcd.setCursor(1,1); 
lcd.print("RESET REQUIRED");                                //the arudino will need to be restarted to reinitialize the code 
delay(1000);                                                //to remove flashing on LCD screen 
 }
}

Attachments

Step 6: Assembly

This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)

This step requires some care as there are a lot of finicky components that interact with one another.

Steps:

1.) Press ball bearings into 3D printed housing.

2.) Glue LED lights onto lid and gently fold them flushed to avoid LED legs from falling off. Avoid excessive bending of the legs or risk yielding the leg off.

2a.) Optional step: Drill hole on back face of bin to hard ziptie the arduino port to avoid reopening/reclosing lid for arduino connection.

3.) Glue 3D pins into gears with linkage on. Make sure the linkage does not get glued with the gear.

4.) Check aluminum filler rod (or square axle) fits into ball bearings.

5.) Glue gears onto the aluminum filler rod and mount onto the bearing housings.

6.) Ziptie the servos onto the 3D servo stand.

7.) Align servos with the gears on the bearing housing axle.

Note: Before final glue of the servo stand and the bearing housing onto the bin, double check gear engagement.

8.) Secure electrical components onto left side of bin. Keep it organized to prevent wires from contacting the gears.

9.) Connect the servos, the LED pins, and LCD screen appropriately.

Note: Before closing the lid, test run the servo at a low speed to ensure gears are still engaging and all wires are clear of moving parts.Take care the linkages do not suspend or risk damage.

10.) Close lid and check the gear and linkage clearance against the lid. If satisfactory, bolt lid down and mount platform to linkages.

11.) Carefully add the acrylic column within the platform and fully latch platform to linkages. Do not glue down until test run to check clearance against the linkages.

12.) Run servo test at low rpm to check for clearance. If loud noises or items halt motion occur, unplug connector and check for conflicting part.

Step 7: Conclusion

This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)

This is the first project where I learned Arduino over the last few months and that I built something with moving parts. The code and build were not particularly complicated individually but when assembled together revealed an assortment of tolerance stackups. With an alternative driver such as a solenoid to provide the actuation would have led to less components and ultimately led to a faster final product.

Lots were learned over the course of this project.

Hope you enjoyed it.

If you have any advice or suggestions, please leave a comment for future improvements.