For our tech demo 3, Stone and I decided to make a catapult that would launch an object when a sensor notified the servo to move. The sensor detected the distance between itself and a moving object and determined when to shoot. We laser cut a base, 2 walls to hold a metal rod that would allow the catapult to actively and frictionlessly throw the ball, and the catapult (thrower) itself. The spring in the front allows for tension to build as a weight with a string attached keeps the catapult from moving. When the servo moves, however, it pulls the weight from the catapult and the tension takes over and whips the catapult into action.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | // ReadSonar - measure distance using a HC-SR04 or compatible ultrasonic ranger // // With the help of Garth Zieglin ================================================================================ // Define constant values. #include <Servo.h> // The wiring assignment. const int TRIG_PIN = 8; const int ECHO_PIN = 7; const int SERVO_PIN = 9; Servo servo; // The rated distance limit of the sensor, in cm. const int MAX_DISTANCE = 450; // A typical speed of sound, specified in cm/sec. const long SOUND_SPEED = 34000; const long TIMEOUT = (2 * MAX_DISTANCE * 1000000)/SOUND_SPEED; void setup() { // Initialize the serial UART at 9600 bits per second. Serial.begin(9600); servo.attach(SERVO_PIN); servo.write(0); // Initialize the trigger pin for output. pinMode(TRIG_PIN, OUTPUT); digitalWrite(TRIG_PIN, LOW); // Initialize the echo pin for input. pinMode(ECHO_PIN, INPUT); } // ================================================================================ // Run one iteration of the main event loop. The Arduino system will call this // function over and over forever. void loop() { long duration = ping_sonar(); // function is defined below if (duration > 0) { float distance = (duration * 1e-6 * SOUND_SPEED) / 2; if (distance < 10){ servo.write(180); } } else { // if no pulse detected Serial.println( "No ping." ); } // Allow a little extra time for the sonar to recover. delay(30); } long ping_sonar( void ) { // Generate a short trigger pulse. digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Measure the pulse length return pulseIn(ECHO_PIN, HIGH, TIMEOUT); } |
Source: Course Website (for parts of the code)
Leave a Reply
You must be logged in to post a comment.