This is an example of what a functional pinball machine looks like.
These are the requirements we must meet for the prototype.
These are the requirements we must meet for the Final product.
These are the learning goals for the project.
This is the first prototype of the scoreboard for our custom pinball machine. When pushing the first button the score increases by 500. When you push the second button the number of balls goes down by one.
This is our Scoreboard responding to button presses. The first button raises the score by five hundred and the second button decreases the number of balls by one.
This is the model in Onshape that I created by using measurements from my LCD screen.
This first model is the Onshape file laser-cut onto a piece of cardboard and it didn't exactly fit so I had to make some changes for the wood prototype.
This is the LCD screen mounted to a piece of wood which I laser-cut my model into. It is partially press fitted with metal nuts and bolts to secure all the parts into place.
This is our prototype pinball machine that is made out of plywood and two by fours that we cut using a saw and screwed together.
The scoreboard mount I installed is now attached to the pinball prototype shell using the Holes I laser-cut. Which I then I secured down to the wood with hex screws.
This is our power source being held in place by a mount made of a two by four cut with the band saw.
This is the power switch connected to the power source to turn it on and off. I used a jigsaw to cut a hole into the side of the prototype and placed the switch inside and secured it in place with screws.
Me and my partner individually printed the top and bottom components of this solenoid using a 3d printer. We learned how to export a 3d model out of onshape and slice it using Cura.
This is the light switch mount I designed in on-shape and laser cut out of a piece of basswood plywood.
The first step in order to create my own target is looking into existing models of them and seeing how they work. I watched this video and witnessed how the man in the video created his own target in a 3d design software. The next thing I have to do after my research is create my own CAD model. After printing and testing ill make any changes and iterations to my design then Reprint. I will know my design is finished when I get accurate and repeatable results.
This is the Final CAD model I developed in on-shape during the testing process. This is one of many iterations that I designed. Each iteration I encountered a new problem that I had to work around until I had a functional model.
This was the first iteration, the switch fit into the mount perfectly but I started to encounter problems with the width of the target. After revising and making the target skinnier than the inside box it clicked the switch but would then flip all the way forward requiring a manual reset something you can't do in a standalone pinball machine.
In the final model, I learned from the first design by adding a protrusion with a hole where I added a paper clip to hold the paddle against the switch. Now whenever the switch is clicked it is held in tension and it doesn't fall off of the switch.
This was the first design of my paddle but it was too large and caused clearance issues with the switch clicking it in earlier than it should have
This is the Second Paddle Prototype It is slimmer and allows for a clean press on the button at the right time. The only change i would make would be the thickness on the weakest point of the paddle to reinforce it
This is my first prototype mounted onto a piece of Wood and connected to an Arduino and LCD to display the Score. When the switched is pressed or pushed in by a ball the score will increase by one hundred
The next steps will be increasing the thickness of the weakest point of the paddle to reinforce it and fully wiring it up to my pinball machine. I will also take time to increase the size of the holes inside of On shape to fit screws instead of staples to increase the sturdiness of my design
Iteration #5
Iteration #6
Iteration #7
Iteration #8
Iteration #9
Iteration #10
Iteration #11
This is my LED Neopixel strip being controlled by an Arduino connected to a button.
This is the Neo-Pixel holder I designed in onshape. I used digital calipers to measure the distance between LED nodes and put the measurements into CAD software.
This flipper design is very compact and uses a smaller solenoid to activate the flipper. The mechanical aspect of the design has to do with the way the up-and down-motion of the solenoid is translated into the flipper head
This flipper is 100% mechanical and requires no electronic input. This design would simply my overall pinball machine and freeing up more space on my Arduino to add more stuff. This design uses a lot of metal parts that pivot on each other to translate motion.
This is an Electronnic flipper that uses Arduino and a breadboard to control it. The flipper actuation mechanism is extremely simple
This is the first sketch of my design, it works by using a solenoid to pull on the end off the flipper and rotating it around a pivot point.
Target Face
The Target face is where the ball strikes, and when struck increases the score of the game
Target Bottom
This is where the function of the target takes place. When struck a switch activates and closes a circuit signaling the Arduino
Bumper Top
This is where the ball rolls and is shot out by compressing a wedge on top of it
Bumper Bottom
This is the location of a solenoid that actuates and launches the ball. As well as a switch that detects when the ball is under the flipper
Flipper Front
These are the flippers of the machine that hit the ball and launch it towards targets and bumpers
Flipper Bottom
The flippers are actuated by a solenoid that is connected to buttons on the side of the machine
LCD Screen
The LCD screen displays the score and how many balls you have left
LCD Back
The back of the LCD screen is where the wires are located that lead to the arduino and displays what it tells it to
This is the launcher for the pinball machine it works by propelling the ball using springs
This is where all of the components are housed and where all wires are located
A group of elementary school students came into our class to play our final Pinball Machines. Along with playing our machines the students presented us with machines they made themselves. Watching the kids use my pinball machine made me feel like all the hard work was worth it.
1) How has this project compared to other projects that you have undertaken (in life/in school).
This project has pushed me to points that no other project has in the past. At some points, I felt like completely giving up but at those moments I figured out solutions to my problems and grew as an Engineer
2) How did it feel to complete this project ?
When I finished the project I felt absolutely triumphant and elated.
3) What are you most proud of about your project?
I am most proud of the fact that elementary students were able to play my game and have fun.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Changed these parameters to match our LCD - Mr. Ayers
int buttonPinT1 = 2;
int buttonPinT2 = 3;
int buttonPinT3 = 1;
int buttonPinT4 = 5;
int buttonPinballs = 7;
const int buttonPinS1 = 6;
const int buttonPinS2 = 9;
int solenoid1 = A3;
int solenoid2 = A2;
const int buttonPinSFlip3 = 10;
const int buttonPinSFlip4 = 11;
int solenoidFlip3 = 12;
int solenoidFlip4 = 13;
//int score = 0; // a regular int overflows at 16384. A long counts up to over 2 billion
long score = 0;
int balls = 5;
int solenoidState1 = 0;
int solenoidState2 = 0;
int solenoidStateFlip3 = 0;
int solenoidStateFlip4 = 0;
//led things--------
#include <PinballOutputHandler.h>
OutputHandler outputHandler;
#define NUM_STRIPS 6
Adafruit_NeoPixel pixels[NUM_STRIPS] = {
// Initialize the strips with the number of LEDS, pin number, and init parameters.
// Replace the pin numbers with the pins you are using for your neopixel strips
Adafruit_NeoPixel(5, A0, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(5, A1, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(5, A2, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(5, A3, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(5, 1, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(5, 0, NEO_GRB + NEO_KHZ800)
};
// An array to hold output handlers that correspond to the strips
NeoPixelHandler *handlers[NUM_STRIPS]; // to hold handlers that can control 6 strips
NeoPixelColor red(150, 0, 0);
NeoPixelColor blue(0, 25, 250);
int buttonValueLED = 0;
void setup()
{
Serial.begin(9600);
// analogWrite(6, Con);
lcd.init(); // This line was missing from Alexander's first program -Mr. Ayers
lcd.init(); // I don't know why the example calls this twice - Mr. Ayers
//lcd.backlight();
lcd.begin(16, 2);
pinMode(buttonPinT1, INPUT_PULLUP);
pinMode(buttonPinT2, INPUT_PULLUP);
pinMode(buttonPinT3, INPUT_PULLUP);
pinMode(buttonPinT4, INPUT_PULLUP);
pinMode(buttonPinballs, INPUT_PULLUP);
pinMode(buttonPinS1, INPUT_PULLUP);
pinMode(buttonPinS2, INPUT_PULLUP);
pinMode(solenoid1, OUTPUT);
pinMode(solenoid2, OUTPUT);
pinMode(buttonPinSFlip3, INPUT_PULLUP);
pinMode(buttonPinSFlip4, INPUT_PULLUP);
pinMode(solenoidFlip3, OUTPUT);
pinMode(solenoidFlip4, OUTPUT);
for (int i = 0; i < NUM_STRIPS; i++) {
handlers[i] = outputHandler.add(pixels[i]);
pixels[i].setBrightness(25);
}
}
void loop()
{
//Serial.println("printing score");
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("score: ");
lcd.print(score);
lcd.setCursor(0, 1);
lcd.print("balls left: ");
lcd.print(balls);
lcd.setCursor(0, 2);
// Read the value of the input. It can either be 1 or 0
int buttonValueT1 = digitalRead(buttonPinT1);
int buttonValueT2 = digitalRead(buttonPinT2);
int buttonValueT3 = digitalRead(buttonPinT3);
int buttonValueT4 = digitalRead(buttonPinT4);
int buttonValueS1 = digitalRead(buttonPinS1);
int buttonValueS2 = digitalRead(buttonPinS2);
int buttonValueballs = digitalRead(buttonPinballs);
int buttonValueSFlip3 = digitalRead(buttonPinSFlip3);
int buttonValueSFlip4 = digitalRead(buttonPinSFlip4);
if (buttonValueT1 == LOW) {
Serial.println("T1 hit");
score = score + 100;
delay (300);
}
if (buttonValueT2 == LOW) {
Serial.println("T2 hit");
score = score + 100;
delay (300);
}
if (buttonValueT3 == LOW) {
Serial.println("T3 hit");
score = score + 100;
delay (300);
}
if (buttonValueT4 == LOW) {
Serial.println("T3 hit");
score = score + 100;
delay (300);
}
if (buttonValueS1 == LOW) {
//Serial.println("S1 hit");
score = score + 100;
delay (300);
}
if (buttonValueS2 == LOW) {
//Serial.println("S2 hit");
score = score + 100;
delay (300);
}
if (buttonValueballs == LOW) {
//Serial.println("ball hit");
balls = balls - 1;
delay (300);
}
//Bumper Solenoids---------------------------------
if (buttonValueS1 == LOW) {
digitalWrite(solenoid1, HIGH);
// digitalWrite(solenoid1, LOW);
} else {
digitalWrite(solenoid1, LOW);
}
if (buttonValueS2 == LOW) {
digitalWrite(solenoid2, HIGH);
// digitalWrite(solenoid2, LOW);
} else {
digitalWrite(solenoid2, LOW);
}
//Flipper Solenoids--------------------------------------
if (buttonValueSFlip3 == LOW) {
digitalWrite(solenoidFlip3, HIGH);
} else {
digitalWrite(solenoidFlip3, LOW);
}
if (buttonValueSFlip4 == LOW) {
digitalWrite(solenoidFlip4, HIGH);
} else {
digitalWrite(solenoidFlip4, LOW);
}
}