Rather than 3D print the original part, we've opted to go the simpler route and use a PVC Wye joint to load the ping pong balls in from the top. A servo motor is mounted to the tube to only allow one ball in at a time. From there, a solenoid valve opens to release air pressure built up in a 2L bottle.
We got a little bored and coded in a shot counter, too. We're going to try to work out a few kinks before we head to the expo. Hopefully we'll have it completely functional when we get there!
#include <Servo.h> Servo Bolt; const int buttonPin = 2; const int valvePin = 4; const int latchPin = 8; const int clockPin = 12; const int dataPin = 9; int fireState = LOW; int buttonState; int previousButtonState = LOW; int ammo=9; unsigned long lastDebounceTime = 0; unsigned long debounceDelay = 50; byte digits[11]= {0x77, 0x44, 0x6B, 0x6E, 0x5C, 0x3E, 0x3F, 0x64, 0xFF, 0x7E, 0x00}; void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); Bolt.attach(11); pinMode(buttonPin, INPUT); pinMode(valvePin, OUTPUT); digitalWrite(valvePin,LOW); reload(); } void loop() { guage(ammo); int x = digitalRead(buttonPin); if (x != previousButtonState) { lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { if (x != buttonState) { buttonState = x; if (buttonState == HIGH) { fireState = 1; } } } if (fireState == 1){ if (ammo == 0){ for (int j=0; j<5; j++){ guage (0); delay (250); guage (10); delay (250); fireState = 0; } } else { digitalWrite (valvePin, HIGH); delay (300); digitalWrite(valvePin,LOW); delay (1500); reload(); delay (500); ammo--; fireState = 0; } } previousButtonState = x; } void reload (){ Bolt.write(0); delay(55); Bolt.write(20); } void guage(int y){ digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, digits[y] ); digitalWrite(latchPin, HIGH); }
It's long. But so far, so good!
No comments:
Post a Comment