We created a rubber band sentry gun which can rotate to aim, and adjusts the rubber band launch angle. It includes two DC motors for lift and spin, and a solenoid which releases the rubber band.
See a test run of the sentry gun:
Here is a quick run through of the controls:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119// Define the pin numbers on which the outputs are generated.
#define MOT_A1_PIN 5
#define MOT_A2_PIN 6
#define MOT_B1_PIN 9
#define MOT_B2_PIN 10
#define Spin A0
#define Lift A1
#define fire 3
int
to_fire = 7;
long
check = 0;
long
time_fired = 0;
bool
not_print =
true
;
bool
not_fire =
true
;
// ================================================================================
/// Configure the hardware once after booting up. This runs once after pressing
//// reset or powering up the board.
void
setup(
void
)
{
// Initialize the stepper driver control pins to output drive mode.
pinMode(MOT_A1_PIN, OUTPUT);
pinMode(MOT_A2_PIN, OUTPUT);
pinMode(MOT_B1_PIN, OUTPUT);
pinMode(MOT_B2_PIN, OUTPUT);
pinMode(Spin, INPUT);
pinMode(Lift, INPUT);
pinMode(fire, INPUT);
pinMode(to_fire, OUTPUT);
digitalWrite(to_fire, LOW);
// Start with drivers off, motors coasting.
digitalWrite(MOT_A1_PIN, LOW);
digitalWrite(MOT_A2_PIN, LOW);
digitalWrite(MOT_B1_PIN, LOW);
digitalWrite(MOT_B2_PIN, LOW);
// Initialize the serial UART at 9600 bits per second.
Serial.begin(9600);
}
// ================================================================================
/// Set the current on a motor channel using PWM and directional logic.
/// Changing the current will affect the motor speed, but please note this is
/// not a calibrated speed control. This function will configure the pin output
/// state and return.
///
/// \param pwm PWM duty cycle ranging from -255 full reverse to 255 full forward
/// \param IN1_PIN pin number xIN1 for the given channel
/// \param IN2_PIN pin number xIN2 for the given channel
void
set_motor_pwm(
int
pwm,
int
IN1_PIN,
int
IN2_PIN)
{
if
(pwm < 0) {
// reverse speeds
analogWrite(IN1_PIN, -pwm);
digitalWrite(IN2_PIN, LOW);
}
else
{
// stop or forward
digitalWrite(IN1_PIN, LOW);
analogWrite(IN2_PIN, pwm);
}
}
// ================================================================================
/// Set the current on both motors.
///
/// \param pwm_A motor A PWM, -255 to 255
/// \param pwm_B motor B PWM, -255 to 255
void
set_motor_currents(
int
pwm_A,
int
pwm_B)
{
set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);
set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);
}
void
loop(
void
)
{
int
spinMotor = analogRead(Spin);
int
liftMotor = analogRead(Lift);
if
(digitalRead(fire)){
if
(not_fire){
not_fire =
false
;
digitalWrite(to_fire, HIGH);
check = millis();
time_fired = millis();
Serial.println(
"Fire"
);
}
}
if
(millis() - time_fired > 1000){
if
(!not_fire and not_print){
not_print =
false
;
Serial.println(
"Stop Firing"
);
}
digitalWrite(to_fire, LOW);
time_fired = 0;
}
if
(millis() - check > 3000){
not_print =
true
;
not_fire =
true
;
}
spinMotor = constrain(spinMotor, 100, 900);
liftMotor = constrain(liftMotor, 100, 900);
spinMotor = map(spinMotor, 100, 900, -75, 75);
liftMotor = map(liftMotor, 100, 900, -255, 255);
set_motor_currents(spinMotor, liftMotor);
}
Leave a Reply
You must be logged in to post a comment.