Marble Shooter – Yancy Tavares – Andy Garcia
CONTEXT AND SIGNIFICANCE
Our previous group project, where we developed an artifact to regulate device usage through social interaction, played a crucial role in shaping the development of our midterm project. By following a structured process of ideation, sketching, iteration, and revision, we refined our understanding of interaction—focusing on how users engage with the artifact and each other. This iterative approach informed the design methodology of our current project, where we shifted our research toward arcade games, which exemplify interaction as a hands-on, dynamic experience. Arcade games, with their immediate feedback loops and simple mechanics, helped us conceptualize interaction as “a dialogue between an audience and an artistic work through direct engagement and action.”
Our current project, a marble shooter, is inspired by the mechanics of pinball and claw machines, where users control a “shooter” to aim and launch a marble into specific holes. This blend of physical control and strategic play creates a unique and satisfying experience that balances skill and chance. While similar games exist such as those where you have to bowl into certain holes to get points. It combines that concept into a smaller, table game form factor- the project offers a nostalgic yet fresh experience, blending classic gameplay with modern design elements, providing a different form of challenge.
CONCEPTION AND DESIGN
Our understanding of user interaction shaped several key design decisions for our marble shooter. Familiarity with shooter games informed the exposed motors and solenoid valve, making it intuitively clear that the device could move left and right and shoot. The holes at the end provided an obvious goal, while lights at the bottom gave immediate feedback, reinforcing the simplicity of the inputs. We used materials like cardboard, yarn, straws, and popsicle sticks due to their availability, flexibility, and ease of construction. Cardboard formed the base and platform, while popsicle sticks served as rails for the moving mechanism. Although other materials, like wood or plastic, were options, they were rejected due to not being allowed to use it, the cost and the simplicity required for prototyping, as our chosen materials were best suited for a quick, accessible build that emphasized user experience over durability.
rough sketch of different components and parts for “Marble Shooter”
rough circuitry for detecting marbles
FABRICATION AND PRODUCTION
The production process for our marble shooter involved several key steps, balancing both successes and challenges. My primary contributions included developing the code for the back-and-forth mechanism, designing and adjusting the gears to stabilize the string, and assembling the main board while managing the wiring to maintain a clean, functional aesthetic. I also designed the shooting mechanism using a solenoid valve, which I integrated with the motors in the code. This required creating two separate code sequences—one for tracking the sensors, points, and LEDs, and the other for controlling the moving mechanism and solenoid valve. I carefully adjusted the speed of the solenoid valve to ensure the push and retract motions were swift but stable, introducing a slight delay to prevent system instability and spamming from the player side. Constance worked on constructing the moving parts, and together, we combined our efforts to create a cohesive mechanism. I further developed the reloading system, allowing the user to shoot five consecutive marbles, an aspect inspired by arcade games.
During user testing, we encountered issues with our sensors, which failed to detect marble drops in a consistent manner. In response, we deepened the holes to ensure heavier drops that the sensors could register, and refined the device’s appearance by hiding wires and improving the layout. These adjustments proved effective, enhancing both the functionality and presentation of the project. Although challenges like achieving the correct board incline and stabilizing the string required multiple iterations, our approach allowed us to overcome these obstacles. Overall, the collaborative nature of the project and user testing drove many of our design choices and refinements, resulting in a well-rounded product that delivered on both interactive and mechanical goals.
creating the main board
segregating the marbles according to points
reload system and shooter
motor system
a bit of testing
presentation day
CODES
The code we used are pasted below. We referred to the following links when coding.
-
- https://docs.google.com/presentation/d/1TgSlWeWuxajSFGC9FKk-Y5HgK1oOt34_8tlmVTm57oU/edit#slide=id.g2bd96f4d727_0_166
- https://docs.google.com/presentation/d/1KMa3fbUjnLeM27DQ7U4qbzKmG7KkBiazlqmOCaQB08k/edit#slide=id.g3ffe0327f8_0_0
- https://docs.google.com/presentation/d/1XBO8ryWD-bwyNIOtBBRG1x9EoSh9LXLP8fd09J5KY6s/edit#slide=id.g3fef79317c_0_0
USED CODE:
POINT SYSTEM AND LED SENSOR
const int vibrationSensorPin1 = A0;
const int vibrationSensorPin2 = A1;
const int vibrationSensorPin3 = A2;
const int ledPin1 = 13;
const int ledPin2 = 12;
const int ledPin3 = 11;
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
const int threshold = 30;
int totalPoints = 0;
int totalHits = 0;
const int maxHits = 5;
void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
Serial.begin(9600);
}
void loop() {
if (totalHits >= maxHits) {
Serial.print(“Your Final Score Is: “);
Serial.println(totalPoints);
if (totalPoints < 10) {
Serial.println(“You Suck”);
} else {
Serial.println(“Good Job!”);
}
//Reset the game
delay(2000);
totalPoints = 0;
totalHits = 0;
Serial.println(“System Reset. Start Again!”);
}
sensorValue1 = analogRead(vibrationSensorPin1);
sensorValue2 = analogRead(vibrationSensorPin2);
sensorValue3 = analogRead(vibrationSensorPin3);
if (sensorValue1 > threshold) {
digitalWrite(ledPin1, HIGH);
delay(500);
digitalWrite(ledPin1, LOW);
totalPoints += 4;
totalHits++;
}
if (sensorValue2 > threshold) {
digitalWrite(ledPin2, HIGH);
delay(500);
digitalWrite(ledPin2, LOW);
totalPoints += 2;
totalHits++;
}
if (sensorValue3 > threshold) {
digitalWrite(ledPin3, HIGH);
delay(500);
digitalWrite(ledPin3, LOW);
totalPoints -= 1;
totalHits++;
}
Serial.print(“Sensor 1: “);
Serial.println(sensorValue1);
Serial.print(“Sensor 2: “);
Serial.println(sensorValue2);
//Serial.print(“Sensor 3: “);
//Serial.println(sensorValue3);
Serial.print(“Total Points: “);
Serial.println(totalPoints);
Serial.print(“Total Hits: “);
Serial.println(totalHits);
delay(10);
}
MOTOR SYSTEM AND SOLENOID VALVE CODE:
#include <Servo.h>
Servo myServo1;
Servo myServo2;
const int button1Pin = 2;
const int button2Pin = 3;
const int servo1Pin = 9;
const int servo2Pin = 10;
int clockwiseSpeedServo1 = 80;
int counterClockwiseSpeedServo1 = 120;
int clockwiseSpeedServo2 = 60;
int counterClockwiseSpeedServo2 = 110;
void setup() {
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
myServo1.attach(servo1Pin);
myServo2.attach(servo2Pin);
}
void loop() {
int button1State = digitalRead(button1Pin);
int button2State = digitalRead(button2Pin);
if (button1State == LOW) {
myServo1.write(clockwiseSpeedServo1);
myServo2.write(clockwiseSpeedServo2);
} else if (button2State == LOW) {
myServo1.write(counterClockwiseSpeedServo1);
myServo2.write(counterClockwiseSpeedServo2);
} else {
myServo1.write(90);
myServo2.write(90);
}
}
CONCLUSIONS
The goal of our project was to create an interactive marble shooter that blends skill and chance, drawing inspiration from arcade games. In terms of interaction, our results largely aligned with our definition, as users directly engaged with the shooter’s controls, receiving immediate feedback through lights and movement. However, there were areas where interaction could have been more refined. The exposed wires and small buttons limited the ease of control, and the feedback from the LEDs was not always visible, which diminished the intuitive nature of the interaction. Our audience did interact with the project in the intended way, engaging with the physical controls and attempting to shoot marbles into the designated holes, but the experience could have been enhanced with clearer feedback and more immersive elements like sound.
If given more time, we would improve the controls by replacing the two small buttons with three larger ones, making movement and shooting more seamless. We would also reposition the LEDs to make feedback more apparent and add sound to create a richer, more engaging experience. A visible scoreboard and additional aesthetic details would further contribute to the arcade atmosphere we sought to emulate. From our setbacks, particularly the incomplete finish and sensor issues, I’ve learned the importance of balancing both form and function to ensure a polished, interactive experience. Despite these challenges, our project successfully introduced meaningful interaction, and our accomplishments have given us valuable insights into designing user-friendly, engaging mechanisms.
DISSASEMBLY/MATERIALS/PARTS: