/
subsystems.html
216 lines (194 loc) · 15.2 KB
/
subsystems.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../favicon.ico">
<title>Team aMAZEd | Home</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap-superhero.min.css" rel="stylesheet">
<link href="css/amazed.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="slick/slick.css"/>
<link rel="stylesheet" type="text/css" href="slick/slick-theme.css"/>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">Team aMAZEd</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="index.html">Home</a></li>
<li><a href="concept.html">Concept</a></li>
<li><a href="process.html">Process</a></li>
<li><a href="demo.html">Final Demo</a></li>
<li class="active"><a href="subsystems.html">Subsystems</a></li>
<li><a href="resources.html">Resources</a></li>
<li><a href="aboutus.html">About Us</a></li>
</ul>
</div><!--/.navbar-collapse -->
</div>
</nav>
<div class="container">
<!-- Example row of columns -->
<div class="row">
<div class="col-xs-12">
<h1>Mechanical Subsystem</h1>
<p>The purpose of the 3D Maze, as discussed more elsewhere, is to support a ping pong ball on a column of air so that a user can steer the ping pong ball in 3D space and pilot the ball through a maze. The mechanical system for the 3D Maze has four essential parts - X axis travel (left/right for the user), Y axis travel (forward/back for the user), Z axis travel (up/down), and finally, the obstacles themselves.</p>
<br>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-5">
<p>X axis travel is enabled with a C channel tube and cart made to ride in that C channel. The purpose of both the X and Y axes is to support and transport a vacuum tube that blows air to create the stable air column. The flexible vacuum tube is mounted to the X axis cart, which travels along the C channel, driven by a timing belt drive. Limit switches at either end of the C channel provide a safety limit on the system - when the X axis cart hits a limit switch, the software halts all travel in that direction. The C channel found by the team wasn't large enough for the envisioned game, so 3D printed rails were made to form extensions. It was difficult to print the rails cleanly enough to form a precise C channel, and also difficult to position the 3 printed rails accurately enough to form a nice interface to the existing channel, but eventually rails that provided tolerable performance were made.</p>
</div>
<div class="col-md-6 col-md-offset-1">
<div class="slick">
<div>
<img class="hcenterimg" src="img/x1.jpg" height="400" alt="">
<p class="hcenter">The X axis drives the cart (and its attached funnel) back and forth along the C rail with a timing belt drive.</p>
</div>
<div>
<img class="hcenterimg" src="img/x2.jpg" height="400" alt="">
<p class="hcenter">3D printed rails form extensions to the existing C rail. The transition from metal to RP plastic was a little sloppy, but served the purpose well enough.</p>
</div>
<div>
<img class="hcenterimg" src="img/x3.jpg" height="400" alt="">
<p class="hcenter">Here the back of the X axis cart can be seen from the back - three wheels ride in the C grooves to form a stable sliding motion.</p>
</div>
<div>
<img class="hcenterimg" src="img/x4.jpg" height="400" alt="">
<p class="hcenter">Plastic spacers formed idlers for the timing belt to be routed on, and double X axis limit switches provided 1) a software limit and 2) a physical electrical sutoff in case the software limit failed.</p>
</div>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-6">
<div class="slick">
<div>
<img class="hcenterimg" src="img/y1.jpg" height="400" alt="">
<p class="hcenter">The drive motor transfers torque across the game with a drive shaft, so both sides are driven.</p>
</div>
<div>
<img class="hcenterimg" src="img/y2.jpg" height="400" alt="">
<p class="hcenter">Delrin wheels roll on V rails on both sides of the game to cause a smooth sliding Y axis motion.</p>
</div>
<div>
<img class="hcenterimg" src="img/y3.jpg" height="400" alt="">
<p class="hcenter">The Y axis was driven with a capstan drive - string is wound several times around a drive pulley and the tension keeps the string from slipping.</p>
</div>
<div>
<img class="hcenterimg" src="img/y4.jpg" height="400" alt="">
<p class="hcenter">Like the X axis, double limit switches provide both software and hardware limits.</p>
</div>
</div>
</div>
<div class="col-md-5 col-md-offset-1">
<p>The Y axis travels along extruded aluminum V rails, purchased from OpenBuilds, an open source provider of CNC hardware. The X axis (discussed above) was pulled along the parallel V rails using a double capstan drive. In order to prevent torquing forces on the X axis, which was fairly wide, the drive torque from the motor was transferred equally from one side to the other using a long drive shaft. It was very difficult to get the V rails to line up exactly parallel along the entire length, so a system redesign should definitely include a way to adjust the relative position of the V rails to prevent the X axis from driving off the rails.</p>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-5">
<p>The Z axis height of the ball was controlled by adjusting the airflow through our nozzle. This was done by placing a redirection gate just downstream of our air source, a Bucket Head Wet/Dry vacuum. A servo controlled how much the airflow was redirected, which adjusted the height of the ball.</p>
</div>
<div class="col-md-6 col-md-offset-1">
<div class="slick">
<div>
<img class="hcenterimg" src="img/z1.jpg" height="400" alt="">
<p class="hcenter">The levitating ping pong ball is suspended on a column of air shot out of this funnel. Multiple iterations went into the funnel to get a design with a long range and stable airstream.</p>
</div>
<div>
<img class="hcenterimg" src="img/z2.jpg" height="400" alt="">
<p class="hcenter">The column of air is driven with a vacuum pushing air out. A servo-driven gate blocks a portion of the airstream, allowing the user to reliably asjust the height of the floating ping pong ball.</p>
</div>
<div>
<img class="hcenterimg" src="img/z3.jpg" height="400" alt="">
<p class="hcenter">The flexible vacuum tube allows the funnel to easily move across the large X, Y expanse of the game.</p>
</div>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-6">
<div class="slick">
<div>
<img class="hcenterimg" src="img/obst1.jpg" height="400" alt="">
<p class="hcenter">The final obstacle layout for the game.</p>
</div>
<div>
<img class="hcenterimg" src="img/obst2.jpg" height="400" alt="">
<p class="hcenter">One way of making obstacles was to hang foam core cutouts in open gaps. These cutouts would flap and gyrate in the air column, which could knock the ping pong ball off.</p>
</div>
<div>
<img class="hcenterimg" src="img/obst3.jpg" height="400" alt="">
<p class="hcenter">Another way of making obstacles was to glue two sections of foam core together on either side of the net, then cut out the inner net fibers to create a passageway.</p>
</div>
<div>
<img class="hcenterimg" src="img/obst4.jpg" height="400" alt="">
<p class="hcenter">Finally, a cardboard ramp knocks the ping pong ball off of the airstream when the user drives over it, into the waiting goal area. Landing the ball in this back goal area wins the game.</p>
</div>
</div>
</div>
<div class="col-md-5 col-md-offset-1">
<p>Finally, the obstacles were made from folded string mesh with foam core cutouts for gates. These materials were chosen because they were light, and the mesh was chosen because the user needs to be able to see through the walls so that they can see multiple layers of obstacles. It became clear during gameplay that being able to constantly readjust the maze would make playing more enjoyable, because the course would always be novel, but it is very difficult to physically adjust the obstacles.</p>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<h1>Electrical Subsystem</h1>
<h3>Coin Acceptor</h3>
<p>An off the shelf coin acceptor was bought from Sparkfun in order to interface with the main controller to detect certain coins. The acceptor is powered with a 12V source and outputs a small (40mV) pulse whenever a correct coin is inserted. This pulse is amplified through a comparator and then sent to a digital input on the main microcontroller.</p>
<h3>Joystick</h3>
<p>The x and y axes of the joystick act as variable resistors between 0 and 100k. These resistors are hooked up in a resistor divider configuration with a 3.3V upper rail in order to get a linear* representation of the joystick’s movement. These values are then sent to analog pins on the main microcontroller and used to control the X and Y axis motors. (*we found that the response from the joystick was anything but linear, and it had to be carefully calibrated in order to get an acceptable range of readings from it.</p>
<h3>Air Flow Knob</h3>
<p>The air flow knob is a potentiometer with a 3.3V rail. The voltage from the wiper of the potentiometer is hooked up directly an analog pin. This creates a linear relationship between the wiper voltage and the rotational angle of the potentiometer. This value is used to control the PWM to a servo which controls the airflow.</p>
<h3>Ball Sensors</h3>
<p>Photodiode and red LEDs were used to detect when the ball pasted certain sections of the maze. The photodiodes were connected up to transistors in order amplify the signal and then passed into digital pins of the microcontroller.</p>
<h3>Limit Controls</h3>
<p>There are a number of limit switches that detect when the system reaches the maximum points on the x and y axes. These switches prevent the system from traversing too far and also help zero the system. At each of the 4 maximum points, there are two limit switches - one software and one hardware. The software motor runs back to the main microcontroller, so that the system can intelligently allow the user to drive backwards but no farther forwards. The hardware limit switch is wired directly into the appropriate motor, such that the system cannot move once it has reached that point (and must be manually reset).</p>
<h3>System Wiring</h3>
<p>We designed and fabricated a PCB in order to make the wiring process cleaner. The PCB contains 2 motor controller drivers, 2 op-amp buffers for the joystick, 1 comparator for the coin acceptor, and a spare op-amp buffer. The rest of the wiring is soldered onto protoboards. Wires that need to be routed to the X axis (which itself is moving over the Y axis) run through a cable chain carrier so that they don't become tangled.</p>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<h1>Firmware Subsystem</h1>
For this project, we used a custom Arduino-compatible PIC board as our main firmware components. We used two of these boards - one was for user input and game actuation, and the other was for score detection and user display.
<h3>Main PIC</h3>
<p>The main PIC is primarily responsable for actuation. It gets the user's input from the X and Y axes of the joystick and the Z knob, and adjusts the corresponding axes appropriately. The software limit switches are connected to the main PIC as well so that it can disable motion when a limit switch is triggered. When the game starts, the main PIC must zero the axes so that the user can put a ball on the nozzle.</p>
<h3>Score PIC</h3>
<p>As its name suggests, the score PIC deals with the user's score. It displays the high score and the user's current score (as well as various other snarky ph) on two 7-segment displays. The photodiodes connect to the score PIC in order to detect when the game has ended, and the coin acceptor connects as well to detect when the game should start. Additionally, there is feedback between the two PICs: the score PIC knows when the vacuum turns on via the relay, and the score PIC pulls a dedicated line high / low to indicate that the game is starting / has ended.</p>
<h3>Control Tools</h3>
<p>We recognized that with a project this large, it would be easy to start creating non-DRY code - or worse, spaghetti code. As a result, we encapsulated all of the functions that took input or sent output into a series of reusable libraries that we called Control Tools. This library is included in the codebase of both our main and our score PICs.</p>
<a href="http://github.com/redfern314/amazedWebsite"><h3>Source code on Github</h3></a>
</div>
</div>
<hr>
<footer>
<p></p>
</footer>
</div> <!-- /container -->
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="js/jquery-1.11.3.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="slick/slick.min.js"></script>
<script src="js/slick-init.js"></script>
</body>
</html>