This semester, we will be working on creating our own functional pinball machine.
These are the parameters our pinball machine will follow, and what we will be graded on.
This is essentially the same descriptor as the slide prior.
This is the standard. This is something that by the end of the project, we should be able to faithfully claim to be true.
This box is the simplest out of the three cardboard designs. Out of the frame, it has a small cardboard controller, which has joysticks connected to the two paddles via string. It contains plenty of space for mechanical components.
This design uses two levers on the sides of the box, which are directly connected to the paddles, allowing you to move them. It is considerably bigger than the other two, and has some interesting designs for obstacles.
This is by far the most unique, and shows that the designer went out of their way to make this their own. It doesn't seem like there is much room for any electronic components, but it could be the camera angle.
This is the dimensional sketch of my pinball Machine. The width is 18'', while the length is 24''. It is 8'' tall to the barrier, and the barrier is around 2-3''. The drawing is not exactly proportional, because I wanted to be able to see the actual gameboard area.
This is the layout of where my flippers and bottom half obstacles will be.
This video shows a man disassembling the mechanical structures of the plunger, and replacing it. This lets us see all of the necessary parts. First, the top of the plunger has a rubber bumper, which is most likely used to make consistently smooth contact with the pinball. Next is a small C retaining ring toward the front which stops the spring from making contact with the rubber piece. Next is the spring, which creates the tension that launches the ball when released. We could use a rubber band for this, likely negating the practical use of the aforementioned buffer between the spring/band and the rubber front. There is also an outer cushioning spring which prevents the handle from being damaged.
This video is relatively similar to the first one. He goes through several different specific plungers that would be used on professionally crafted pinball machines, usually made of metal. One thing I noticed is that as a result of them using higher grade materials, they have to use more protections in order to preserve the quality of the metals and other functional pieces. That will not necessarily be a concern to us, because we are using cardboard. Henceforth, we won't have to worry about metal to metal contact, corrosion, and other problems. However, using lesser quality materials has it's own problems. One of these is mitigating the shock after the plunger is pulled and released. The pressure shoots the plunger back into the surface of the box, which when using cardboard, will damage the machine. We could mitigate this by having no spring or pressure, and by hitting the plunger manually.
This is my ball launcher. It uses pressure generated by a rubber band, and is stopped by a t-shape towards the back of the launcher.
I'd like to incorporate the barriers closest to the flippers. I am also thinking about implementing the three joystick looking pieces in the middle because I think they would give the ball's movement more unpredictability.
I'd like to have the barriers on the gameboard that direct the ball toward the flippers so that the game flows consistently.
There are only three wires required for proper functionality of the neopixel. These are shown above in the diagram.
// a LOGIC-LEVEL CONVERTER on the data line is STRONGLY RECOMMENDED.
// (Skipping these may work OK on your workbench but can fail in the field)
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN 8
// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 5
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
// setup() function -- runs once at startup --------------------------------
void setup() {
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// END of Trinket-specific code.
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
}
// loop() function -- runs repeatedly as long as board is on ---------------
void loop() {
// Fill along the length of the strip in various colors...
colorWipe(strip.Color(255, 0, 0), 50); // Red
colorWipe(strip.Color( 0, 255, 0), 50); // Green
colorWipe(strip.Color( 0, 0, 255), 50); // Blue
// Do a theater marquee effect in various colors...
theaterChase(strip.Color(127, 127, 127), 50); // White, half brightness
theaterChase(strip.Color(127, 0, 0), 50); // Red, half brightness
theaterChase(strip.Color( 0, 0, 127), 50); // Blue, half brightness
rainbow(10); // Flowing rainbow cycle along the whole strip
theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
}
// Some functions of our own for creating animated effects -----------------
// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32_t color, int wait) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, color); // Set pixel's color (in RAM)
strip.show(); // Update strip to match
delay(wait); // Pause for a moment
}
}
// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
// between frames.
void theaterChase(uint32_t color, int wait) {
for(int a=0; a<10; a++) { // Repeat 10 times...
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
strip.clear(); // Set all pixels in RAM to 0 (off)
// 'c' counts up from 'b' to end of strip in steps of 3...
for(int c=b; c<strip.numPixels(); c += 3) {
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
}
strip.show(); // Update strip with new contents
delay(wait); // Pause for a moment
}
}
}
// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
// Hue of first pixel runs 5 complete loops through the color wheel.
// Color wheel has a range of 65536 but it's OK if we roll over, so
// just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
// means we'll make 5*65536/256 = 1280 passes through this outer loop:
for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
// Offset pixel hue by an amount to make one full revolution of the
// color wheel (range of 65536) along the length of the strip
// (strip.numPixels() steps):
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
// optionally add saturation and value (brightness) (each 0 to 255).
// Here we're using just the single-argument hue variant. The result
// is passed through strip.gamma32() to provide 'truer' colors
// before assigning to each pixel:
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
}
strip.show(); // Update strip with new contents
delay(wait); // Pause for a moment
}
}
// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
void theaterChaseRainbow(int wait) {
int firstPixelHue = 0; // First pixel starts at red (hue 0)
for(int a=0; a<30; a++) { // Repeat 30 times...
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
strip.clear(); // Set all pixels in RAM to 0 (off)
// 'c' counts up from 'b' to end of strip in increments of 3...
for(int c=b; c<strip.numPixels(); c += 3) {
// hue of pixel 'c' is offset by an amount to make one full
// revolution of the color wheel (range 65536) along the length
// of the strip (strip.numPixels() steps):
int hue = firstPixelHue + c * 65536L / strip.numPixels();
uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
}
strip.show(); // Update strip with new contents
delay(wait); // Pause for a moment
firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
}
}
}
This video demonstrates the Capacitive Touch Sensor controlling the LED.
This is the circuit diagram for allowing the Capacitive Touch Sensor to trigger the LED.
This video demonstrates the Capacitive Touch Sensor controlling the Servo.
This is the circuit diagram for allowing the Capacitive Touch Sensor to control the servo.
The project brief is the very first part of the design process, and is primarily associated with developing an understanding what you will be doing. Our brief involved receiving our project, understanding it's parameters, and getting ready to start. We began to create an idea in our head of what we wanted our board to look like. This is also when we were introduced to the new engineering concepts that would be utilized in our board, such as programming LCDs and reactive lights.
The purpose of the research stage is to gain inspiration, and understand some of the general practicalities of your assignment, generally, what would be possible and pragmatic for your specific project. It also helps you to gain a deeper understanding of what a good example of your project looks like. For my research, I chose 9 different pinball machines that I found online. Three professionally designed ones, three wooden, and three cardboard. This tier system was very useful, as it showed me that quality can be preserved with a lack of sophisticated materials and tools, and also gave me a basis to work off of. I was able to find these designs by simply doing a broad search for pinball machines, and finding ones that matched my criteria.
The purpose of Idea Development is to take the results of your research, and begin to expand them and lay out your own design. The purpose of this is to begin materializing your project, so you can begin moving towards a prototype. For my idea development, I created a sketch of my board, making sure it fit the sizing parameters from the brief stage. Another part of my idea development was making sure that other requirements were met with my design. One of these was making sure the edges would be high enough to keep a ball on the game board. Another one was elevating the back of the board several inches above the game board, presumably to make space for a scoreboard.
The purpose of the 3D Prototyping is to essentially 'test our hypothesis'. We take what we have drawn, and programmed, and theorized and synthesize it. In my case, I built my board out of cardboard, so that it would match the sizing parameters discussed in the Brief, and written down in the Idea Development section. I used different methods of constructing the board so that it would remain sturdy, like using hinge-style pieces of cardboard on the corners, as well as adding foam to support the game board. This was really important because the entire project really relied on a sturdy and reliable game board. The process of prototyping however, extended farther throughout the project, all the way up to a few weeks before the final product was due, so all of the electronic and mechanical elements that would make up our final products would be considered a part of the 3D Prototyping, a couple of these would be the Capacitive Touch Sensor and the Scoreboard.
The purpose of the evaluation is to assess our prototypes, understand what we did right and wrong, and with this information, work towards our final product. This allows us to perfect the imperfections and create the best product possible. My personal evaluation was a lot more drawn out than most, as I was behind for the majority of the project, and was completing assignments slower than the average pace. Despite this, I was able to get great feedback from my teacher and peers, and use it to work towards my product, which turned out quite well. This speaks to how important of a step this is, because there is a strong possibility that somewhere along the line, you messed up, and it is important to get back on track, and this process gives you the platform and the information you need to course correct. My personal evaluation was alongside a friend, where we both peer reviewed our work, and gave each other feedback. This actually allowed us to essentially complete our project, with a few minor necessities required.
This is the final stage of the design process. This step begins once we have finalized every element of our project, and usually consists of some sort of presentation. My final project was presented on a flipgrid, where I went through a grade sheet provided to us, and listed every benchmark that my board met. This would also consist of a demonstration of some kind, as well as an explanation of certain complex elements. This was definitely the most rewarding part of this project, as we were finally able to show our hard work off, and have the weight of the project off of our shoulders.
My definition of engineering is the skill of utilizing the design process to work towards the completion of a final product, utilizing different types of engineering, such as software and mechanical.
We live in a very imperfect world, and as long as that is the case, then there will be a problem to fix, sometimes a problem that impacts people in a negative way. Engineers are the ones who fix those problems, without them, they'd go unchecked.
The pinball machine was definitely the hardest project throughout the pathway. This is simply due to how complex of a project it was, and how we were forced to do 95% of it at home, with little support. I was able to overcome this by getting help from friends, and putting a lot of effort into it.
My favorite project was the Moire Kinetic Sculpture. This was my favorite really because of the atmosphere when building it, it was before the pandemic, and everyone was kind of working together, and it was just an overall positive environment.
I liked how all of the benchmarks were delivered in bite sized chunks, and that not a ton was laid on us all at once.
I would never have virtual classes ever again.
I'd like to study Aeronautical Science. I think the independent aspect of engineering, and how we've had to do most of the project ourselves, will have an impact on my success in that major.