-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
349 lines (327 loc) · 12.9 KB
/
index.html
File metadata and controls
349 lines (327 loc) · 12.9 KB
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
---
layout: landing
---
<!-- Banner -->
<section id="banner">
<div class="inner">
<h2>{{ site.title }}</h2>
<p><b>This machine can solve the 4x4x4 Rubik’s Cube !</b></p>
<p>---</p>
<p><i>Ce robot peut résoudre le Rubik's Cube 4x4x4 !</i></p>
</div>
<a href="#one" class="more scrolly">Learn More</a>
</section>
<script src="/js/jquery.min.js"></script>
<script>
function setVideo(language) {
let youtubeId;
switch (language) {
case "fr":
youtubeId = "{{ site.id-video-fr }}";
break;
case "ca":
youtubeId = "{{ site.id-video-ca }}";
break;
default:
language = "en";
youtubeId = "{{ site.id-video-en }}";
}
["fr", "en", "ca"].map((curLanguage) => {
let btn = document.getElementById("btn_" + curLanguage);
btn.classList.remove("disabled");
if (language == curLanguage) btn.classList.add("disabled");
});
document.getElementById("ytplayer").src = "https://www.youtube.com/embed/" + youtubeId + "?modestbranding=1&rel=0&autoplay=0";
if (language == "en") {
document.getElementById("intro_en").style.display = "inline";
document.getElementById("intro_fr").style.display = "none";
document.getElementById("txt-read-more").innerText = "Read more...";
}
else {
document.getElementById("intro_fr").style.display = "inline";
document.getElementById("intro_en").style.display = "none";
document.getElementById("txt-read-more").innerText = "Lire d'avantage...";
}
}
document.addEventListener("DOMContentLoaded", () => {
if (navigator.language) {
if (navigator.language == "fr-CA") setVideo("ca");
else if (navigator.language.startsWith("fr")) setVideo("fr");
else setVideo("en");
}
else {
setVideo("en");
}
var $el, $ps, $up, totalHeight;
$("#btn-read-more").click(function () {
totalHeight = 0
$el = $(this);
$p = $el.parent();
$up = $p.parent();
$ps = $up.find("p:not('.read-more')");
// measure how tall inside should be by adding together heights of all inside paragraphs (except read-more paragraph)
$ps.each(function () {
totalHeight += $(this).outerHeight();
});
$up
.css({
// Set height to prevent instant jumpdown when max height is removed
"height": $up.height(),
"max-height": 9999
})
.animate({
"height": totalHeight
});
// fade out read-more
$p.fadeOut();
// prevent jump-down
return false;
});
});
</script>
<section id="one" class="special">
<div class="wrapper style1" style="padding:20px 0 0 0">
<iframe id="ytplayer" type="text/html"
style="width: 100vw;height: 56.25vw;max-height: 80vh;max-width: 142vh;margin: auto;background: transparent;"
src="https://www.youtube.com/embed/{{ site.id-video-en }}?modestbranding=1&rel=0&autoplay=0" frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen><img
src="/assets/ballcuber-overview.png" />
</iframe>
<div style="width:100%;max-width:1000px;margin:auto;padding:5px 0 5px 0;">
<ul class="actions fit small">
<li><a href="javascript:void(0)" onclick="setVideo('en');" id="btn_en" class="button fit disabled"
style="padding:0;font-size:0.7em;text-overflow:clip;"><img src="/assets/en.png"
style="vertical-align:middle;opacity:0.5;" />English</a></li>
<li><a href="javascript:void(0)" onclick="setVideo('fr');" id="btn_fr" class="button fit"
style="padding:0;font-size:0.7em;text-overflow:clip;"><img src="/assets/fr.png"
style="vertical-align:middle;opacity:0.5;" />Français</a></li>
<li><a href="javascript:void(0)" onclick="setVideo('ca');" id="btn_ca" class="button fit"
style="padding:0;font-size:0.7em;text-overflow:clip;"><img src="/assets/ca.png"
style="vertical-align:middle;opacity:0.5;" />Québécois</a></li>
</ul>
</div>
<div class="sidebar-box">
<div style="text-align: justify;width: 100vw;max-width: 177.78vh;margin:auto;">
<p>
<span style="display: none" id="intro_fr">
Le <b>BallCuber</b> est un robot capable de résoudre le Revenge Rubik's Cube de taille
4x4x4.<br />
Il dispose d'une mécanique brevetée, rapide et innovante qui permet à chaque mouvement de moteur
de
tourner
une couche. Le robot est entièrement imprimé en 3D.<br />
Le Rubik's Cube 4x4x4 est situé à l'intérieur d'une sphère (d'où le nom BallCuber ;) ). Des
pièces
intermédiaires sont situées entre le cube et la sphère. Des moteurs pas-à-pas animent la machine
via
un
réducteur et un mécanisme à croix de malte. Lorsqu'un moteur tourne, il entraine le glissement
d'une
rangée
de pièces intermédiaires sur la paroi intérieur de la sphère, ce qui propage le mouvement à une
couronne
du
cube.<br />
Un logiciel de supervision sur PC ainsi qu'un logiciel embarqué permettent de piloter le robot.
Le
coffret
électronique est composé de cartes Arduino, de driver de moteur pas-à-pas, de moteurs, de
codeurs
d'angles
magnétiques et de beaucoup de câbles.<br />
L'état initial du cube est obtenu par un dispositif à part muni d'une caméra. Le logiciel de
supervision
traite les images et un algorithme calcule les mouvements nécessaires à la résolution. Une fois
que
l'utilisateur dépose le Rubik's Cube 4x4x4 dans le robot et ferme le capot, le cube est manipulé
et
ressort
résolu en environ 3:20s !<br />
Dans une prochaine version, nous espérons disposer de 9 moteurs brushless ainsi que d'une
mécanique
plus
précise pour battre le record du monde qui est de 1:18s.<br />
Soyez libre de parcourir le site web ou de nous contacter pour plus d'information.
</span>
<span id="intro_en">
The <b>BallCuber</b> is a robot able to solve the Revenge Rubik's Cube 4x4x4.<br />
It has a patented, fast and innovative mechanics that allows each motor movement to turn a
layer.
The
robot
is fully 3D printed.<br />
The Rubik's Cube 4x4x4 is located inside a sphere (hence the name BallCuber ;) ). Intermediate
parts
are
located between the cube and the sphere. Stepper motors animate the machine via a gearbox and a
geneva
drive
mechanism. When a motor rotates, it causes a row of intermediate parts to slide on the inner
wall of
the
sphere, which spreads the movement to a layer of the cube.<br />
The robot is controlled by PC-based supervision software as well as embedded software. The
electronic
cabinet is composed of Arduino boards, stepper motor drivers, motors, magnetic angle encoders
and a
lot
of
cables.<br />
The initial state of the cube is obtained by a separate device equipped with a camera. The
supervision
software processes the images and an algorithm calculates the movements necessary for the
resolution.
Once
the user puts the Rubik's Cube 4x4x4 into the robot and closes the hood, the cube is manipulated
and
comes
out solved in about 3:20s!<br />
In a future version, we hope to have 9 brushless motors as well as more precise mechanics to
beat
the
world
record which is 1:18s.<br />
Feel free to browse the website or contact us for more information.
</span>
</p>
</div>
<p class="read-more"><a href="javascript:void(0)" id="btn-read-more" class="button"><span
class="icon fa-chevron-down"></span><span id="txt-read-more">Read More...</span></a></p>
</div>
{% include 3dModel.html %}
</div>
</section>
<!-- Two -->
<section id="two" class="wrapper alt style2">
<section class="spotlight">
<div class="image"><img src="/assets/patent/preview.png" alt="Balccuber patent" /></div>
<div class="content">
<h2>Patent</h2>
<p>The BallCuber mechanism is patented.</p>
<p><a href="/patent">Read more...</a></p>
</div>
</section>
<section class="spotlight">
<div class="image"><img src="/assets/kinematic/KinematicCrossSectionFast.gif" alt="" /></div>
<div class="content">
<h2>How it works</h2>
<p>The machine is made of :</p>
<ul>
<li>1 x 3D printed sphere</li>
<li>9 x stepper motors NEMA 17</li>
<li>9 x magnetic encoders</li>
<li>9 x 3D printed planetary gears</li>
<li>54 x 3D printed internal parts</li>
<li>Magnets, screws, small pieces, ...</li>
</ul>
<p><a href="/mechanical-design">Read more...</a></p>
</div>
</section>
<section class="spotlight">
<div class="image"><img src="/assets/electronic-cabinet.jpg" alt="" /></div>
<div class="content">
<h2>Hardware</h2>
<p>The hardware cabinet is made of :</p>
<ul>
<li>2 x Arduino Mega (using Multistepper and Sharer libraries)</li>
<li>2 x Ramps 1.4</li>
<li>9 x stepper drivers</li>
<li>Sub-D50 wire and connectors</li>
<li>a lot of wires !</li>
<li>Power supply</li>
<li>USB hub</li>
</ul>
<p><a href="/electronics">Read more...</a></p>
</div>
</section>
<section class="spotlight">
<div class="image"><img src="/assets/cube-manual-definition.gif" alt="" /></div>
<div class="content">
<h2>Software</h2>
<p>A .NET Winforms desktop software drives the robot :</p>
<ul>
<li>Image processing to get cube initial state</li>
<li>Real time 3D visualization with twisty.js & alg.js</li>
<li>4x4x4 cube solver (Three Phase Reduction Solver)</li>
<li>Runner that sequences the resolution</li>
<li>Sharer.NET to communicate with Arduino boards</li>
</ul>
<p><a href="https://github.com/ballcuber/ballcuber-source-code" target="_blank"><span
class="icon fa-github"></span>Sources on GitHub</a></p>
<p><a href="/supervision-software">Read more...</a></p>
</div>
</section>
<section class="spotlight">
<div class="image"><img src="/assets/scan-tower.png" alt="" /></div>
<div class="content">
<h2>Camera scanner</h2>
<p>The scan tower allows to get images from the cube. A custom algorithm that uses OpenCV allows to identify
facets color.</p>
<p><a href="/color-detection">Read more...</a></p>
</div>
</section>
<section class="spotlight">
<div class="image"><img src="/assets/3d-print.png" alt="" /></div>
<div class="content">
<h2>3D printing</h2>
<p>Most parts are 3D printed with an Ultimaker 3D printer and PLA material.</p>
<p><a href="/3d-print/">Read more...</a></p>
</div>
</section>
</section>
<!-- Three -->
<section id="three" class="wrapper style3 special">
<div class="inner">
<header class="major">
<h2>Next Steps !</h2>
<p>To claim the world record, we have to solve the cube faster than <strong>00:01:18s</strong> !</p>
<p>Current average resolution time is about</p>
<p
style="text-align:center;font-size:3em;margin-top: 1em;margin-bottom:1em;color:crimson;font-weight: bold;">
00:03:20s</p>
<p>Here is what we need to improve it :</p>
</header>
<ul class="features" style="margin:0">
<li class="icon fa-cubes">
<h3>More accurate 3D printing</h3>
<p>Our current prototype has too much cutting clearance which sometimes causes collision. For next
version, parts should have a 0.05mm print precision.</p>
</li>
<li class="icon fa-gears">
<h3>Faster motors</h3>
<p>The resolution time is about 3min30s. The limit is due to the slow stepper motors. To be fast, we
would like to use industrial brushless motors.</p>
</li>
<li class="icon fa-reddit">
<h3>Comment on Reddit</h3>
<blockquote class="reddit-card" data-card-created="1588325664"><a
href="https://www.reddit.com/r/Cubers/comments/g6k1j5/4x4x4_rubiks_cube_solving_robot/">4x4x4
Rubik's Cube solving robot</a> from <a href="http://www.reddit.com/r/Cubers">r/Cubers</a>
</blockquote>
<script async src="//embed.redditmedia.com/widgets/platform.js" charset="UTF-8"></script>
</li>
<li class="icon fa-pencil">
<h3>Article on Arduino blog</h3>
<p style="text-align: center;"><a href="https://blog.arduino.cc/2020/08/24/the-ballcuber-is-a-robotic-device-capable-of-solving-a-4x4x4-rubiks-cube/"
target="_blank"><img src="/assets/arduino.svg" style="width: 50%"/></a></p>
<p>Rubik’s cubes are traditionally 3x3x3, and have been solved by robotic systems in a variety of
different ways. But what about a 4x4x4 variant? Such a device presents expanded solving challenges,
which creators Thibault and Florent were able to address with their BallCuber contraption...</p>
<p><a href="https://blog.arduino.cc/2020/08/24/the-ballcuber-is-a-robotic-device-capable-of-solving-a-4x4x4-rubiks-cube/"
target="_blank">[Read more]</a></p>
</li>
</ul>
</div>
</section>
<!-- CTA -->
<section id="cta" class="wrapper style4">
<div class="inner">
<header>
<h2>We need you !</h2>
<p>If you are interested in this project, or want to help us, do not hesitate to contact us !</p>
</header>
<ul class="actions vertical">
<li><a href="/contact-us" class="button fit special">Contact us</a></li>
</ul>
</div>
</section>