first lca commit
Signed-off-by: Sean Cross <sean@xobs.io>
BIN
img/factory-cases-on-runner.jpg
Normal file
After Width: | Height: | Size: 253 KiB |
BIN
img/factory-entrance-horizontal.jpg
Normal file
After Width: | Height: | Size: 486 KiB |
BIN
img/factory-entrance.jpg
Normal file
After Width: | Height: | Size: 314 KiB |
BIN
img/factory-inject.mp4
Normal file
BIN
img/factory-machine-hopper-horizontal.jpg
Normal file
After Width: | Height: | Size: 283 KiB |
BIN
img/factory-machine-hopper.jpg
Normal file
After Width: | Height: | Size: 486 KiB |
BIN
img/factory-mold-both-halves.jpg
Normal file
After Width: | Height: | Size: 328 KiB |
BIN
img/factory-mold-bottom-half.jpg
Normal file
After Width: | Height: | Size: 504 KiB |
BIN
img/factory-mold-lifter.jpg
Normal file
After Width: | Height: | Size: 568 KiB |
BIN
img/factory-molds-stacked.jpg
Normal file
After Width: | Height: | Size: 186 KiB |
BIN
img/factory-plastic-bags.jpg
Normal file
After Width: | Height: | Size: 196 KiB |
BIN
img/factory-plastic-blurry-contents.jpg
Normal file
After Width: | Height: | Size: 446 KiB |
BIN
img/factory-proe.jpg
Normal file
After Width: | Height: | Size: 324 KiB |
BIN
img/factory-tomu-on-mold.jpg
Normal file
After Width: | Height: | Size: 461 KiB |
BIN
img/factory-tool-model.png
Normal file
After Width: | Height: | Size: 140 KiB |
BIN
img/final-model-spinning.mp4
Normal file
BIN
img/fomu-tool-1.jpg
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
img/fomu-tool-2.jpg
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
img/fomu-tool-3.jpg
Normal file
After Width: | Height: | Size: 121 KiB |
BIN
img/freecad-case-creation-01.png
Normal file
After Width: | Height: | Size: 142 KiB |
BIN
img/freecad-case-creation-01b-makesketch.png
Normal file
After Width: | Height: | Size: 179 KiB |
BIN
img/freecad-case-creation-02-constraints.png
Normal file
After Width: | Height: | Size: 152 KiB |
BIN
img/freecad-case-creation-02b-features.png
Normal file
After Width: | Height: | Size: 198 KiB |
BIN
img/freecad-case-creation-02c-constraints.png
Normal file
After Width: | Height: | Size: 229 KiB |
BIN
img/freecad-case-creation-03-extrude-start.png
Normal file
After Width: | Height: | Size: 145 KiB |
BIN
img/freecad-case-creation-04-extrude-done.png
Normal file
After Width: | Height: | Size: 150 KiB |
BIN
img/freecad-case-creation-04b-extrude-done.png
Normal file
After Width: | Height: | Size: 208 KiB |
BIN
img/freecad-case-creation-05-extrude-angle.png
Normal file
After Width: | Height: | Size: 187 KiB |
BIN
img/freecad-case-creation-06-begin-carve.png
Normal file
After Width: | Height: | Size: 188 KiB |
BIN
img/freecad-case-creation-07-pocket-sketch.png
Normal file
After Width: | Height: | Size: 153 KiB |
BIN
img/freecad-case-creation-08-create-pocket.png
Normal file
After Width: | Height: | Size: 189 KiB |
BIN
img/freecad-case-creation-09-pocket-created.png
Normal file
After Width: | Height: | Size: 183 KiB |
BIN
img/freecad-case-creation-09b-pocket-created.png
Normal file
After Width: | Height: | Size: 212 KiB |
BIN
img/freecad-case-creation-10-pocket-pcb-hidden.png
Normal file
After Width: | Height: | Size: 168 KiB |
BIN
img/freecad-case-creation-10a-pocket-passives-start.png
Normal file
After Width: | Height: | Size: 178 KiB |
BIN
img/freecad-case-creation-11-passives-sketch.png
Normal file
After Width: | Height: | Size: 168 KiB |
BIN
img/freecad-case-creation-12-passives-pocket.png
Normal file
After Width: | Height: | Size: 176 KiB |
BIN
img/freecad-case-creation-13-mcu-sketch.png
Normal file
After Width: | Height: | Size: 162 KiB |
BIN
img/freecad-case-creation-14-mcu-pocket.png
Normal file
After Width: | Height: | Size: 179 KiB |
BIN
img/freecad-case-creation-15-edge-sketch.png
Normal file
After Width: | Height: | Size: 164 KiB |
BIN
img/freecad-case-creation-16-edge-pocket.png
Normal file
After Width: | Height: | Size: 176 KiB |
BIN
img/freecad-case-creation-17-mounting-peg.png
Normal file
After Width: | Height: | Size: 147 KiB |
BIN
img/freecad-case-creation-18-mounting-peg-pad.png
Normal file
After Width: | Height: | Size: 180 KiB |
BIN
img/freecad-case-creation-19-alignment-bump-sketch.png
Normal file
After Width: | Height: | Size: 155 KiB |
BIN
img/freecad-case-creation-20-alignment-bump-pad.png
Normal file
After Width: | Height: | Size: 181 KiB |
BIN
img/freecad-case-creation-21-guiding-slots-sketch.png
Normal file
After Width: | Height: | Size: 154 KiB |
BIN
img/freecad-case-creation-22-guiding-slots-pad.png
Normal file
After Width: | Height: | Size: 180 KiB |
BIN
img/freecad-case-creation-23-case-with-pcb.png
Normal file
After Width: | Height: | Size: 181 KiB |
BIN
img/freecad-case-creation-24-usb-port.png
Normal file
After Width: | Height: | Size: 257 KiB |
BIN
img/freecad-kicad.png
Normal file
After Width: | Height: | Size: 133 KiB |
BIN
img/freecad-sent-to-factory.png
Normal file
After Width: | Height: | Size: 158 KiB |
BIN
img/freecad-start.png
Normal file
After Width: | Height: | Size: 170 KiB |
BIN
img/tomu-tool-4.png
Normal file
After Width: | Height: | Size: 659 KiB |
BIN
img/tomu-tool-5.png
Normal file
After Width: | Height: | Size: 1.4 MiB |
BIN
img/tomu-tool-6.png
Normal file
After Width: | Height: | Size: 1.5 MiB |
723
index.html
@ -1,49 +1,694 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
|
||||||
|
|
||||||
<title>reveal.js</title>
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/reveal.css">
|
<title>Plastic is Forever: Designing Tomu's Injection-Molded Case</title>
|
||||||
<link rel="stylesheet" href="css/theme/black.css">
|
|
||||||
|
|
||||||
<!-- Theme used for syntax highlighting of code -->
|
<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
|
||||||
<link rel="stylesheet" href="lib/css/zenburn.css">
|
<meta name="author" content="Sean "xobs" Cross">
|
||||||
|
|
||||||
<!-- Printing and PDF exports -->
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<script>
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||||
var link = document.createElement( 'link' );
|
|
||||||
link.rel = 'stylesheet';
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
link.type = 'text/css';
|
|
||||||
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
|
<link rel="stylesheet" href="css/reveal.css">
|
||||||
document.getElementsByTagName( 'head' )[0].appendChild( link );
|
<link rel="stylesheet" href="css/theme/black.css" id="theme">
|
||||||
</script>
|
|
||||||
</head>
|
<!-- Theme used for syntax highlighting of code -->
|
||||||
<body>
|
<link rel="stylesheet" href="lib/css/zenburn.css">
|
||||||
<div class="reveal">
|
|
||||||
<div class="slides">
|
<!-- Printing and PDF exports -->
|
||||||
<section>Slide 1</section>
|
<script>
|
||||||
<section>Slide 2</section>
|
var link = document.createElement('link');
|
||||||
</div>
|
link.rel = 'stylesheet';
|
||||||
|
link.type = 'text/css';
|
||||||
|
link.href = window.location.search.match(/print-pdf/gi) ? 'css/print/pdf.css' : 'css/print/paper.css';
|
||||||
|
document.getElementsByTagName('head')[0].appendChild(link);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!--[if lt IE 9]>
|
||||||
|
<script src="lib/js/html5shiv.js"></script>
|
||||||
|
<![endif]-->
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!-- Start of main presentation -->
|
||||||
|
<div class="reveal">
|
||||||
|
<div class="slides">
|
||||||
|
<section>
|
||||||
|
<h1>Plastic is Forever</h1>
|
||||||
|
<h3>45 Minutes: Tomu's Injection-Molded Case</h3>
|
||||||
|
<p>
|
||||||
|
<small>Sean "xobs" Cross</small></small>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h1>[Image of Tomu]</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
This is Tomu. If you attended LCA last year, you will have gotten one. Tomu is a fantastic little device -- it's a
|
||||||
|
computer in your USB port! It's a single printed circuit board, but the thing about USB ports is that they're
|
||||||
|
mostly metal, which shorts out circuit boards. There was a 3D printed case available when I first joined the Tomu
|
||||||
|
project, but it was really more of a slug. The easiest solution for most people to use Tomu was to fold a business
|
||||||
|
card in half.
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h1>[Image of Tomu Case]</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
This is the Tomu case. It is made out of Polycarbonate, usually called PC. It fits very snugly, and even has a
|
||||||
|
satisfying "click" when you insert Tomu. For the next 45 minutes or so, I'll talk about what it took to build
|
||||||
|
this, and the motivation for doing it in plastic. I hope to convince some of you out there that plastic is not out
|
||||||
|
of the question when it comes to projects.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h1>Outline</h1>
|
||||||
|
<ol>
|
||||||
|
<li>Manufacturing the Case</li>
|
||||||
|
<li>Designing the Case</li>
|
||||||
|
<li>Understanding Plastics</li>
|
||||||
|
</ol>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h1>About Me</h1>
|
||||||
|
<ol>
|
||||||
|
<li>Novena</li>
|
||||||
|
<li>Tomu</li>
|
||||||
|
<li>Fomu</li>
|
||||||
|
</ol>
|
||||||
|
<h2>Manufacturing is Fun!</h2>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<section>
|
||||||
|
<h1>Factory Tour!</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
I find the best way to understand something is to take it appart. This is the world of open source, after all.
|
||||||
|
The nice thing about manufacturing is that you're free to inspect all of the ingredients that go into a product,
|
||||||
|
just like how you can inspect the source code. So before starting on a project, I find it a good idea to take a
|
||||||
|
tour of the factory. That way you have a better understanding of what's possible and what's not possible. I'd
|
||||||
|
like to show you some photos of a recent trip I took to our plastics factory in Shenzhen, and I swear this isn't
|
||||||
|
just an excuse to show off my holiday photos.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Front Door</h3>
|
||||||
|
<img data-src="img/factory-entrance-horizontal.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
This is the front door of the factory. Actually, it's the front door to a few factories, the one we're interested
|
||||||
|
in is on the fourth floor. They probably get a discount for it being on the fourth floor. There are a few other
|
||||||
|
factories in this building.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Bags of Plastic Pellets</h3>
|
||||||
|
<img data-src="img/factory-plastic-bags.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
Factories have an "OQC" area, where they inspect parts before they're shipped. They also have an "IQC" area to
|
||||||
|
inspect stuff that comes in. Raw plastic comes from the factory in bags like this. There can be a variety of
|
||||||
|
blends available, such as ABS, PC, PVC, and so on. Talk with your factory to find the right blend for you,
|
||||||
|
they're probably really good at it.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Inside the Bags</h3>
|
||||||
|
<img data-src="img/factory-plastic-blurry-contents.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
This isn't a very good shot, but it gives you an idea of what the pellets look like. This is half black and half
|
||||||
|
white, but once you melt it down it will be entirely black. It's possible to change colors, but they need to
|
||||||
|
waste a lot of material and throw away a lot of parts to flush the previous color. Fun fact: Black is usually
|
||||||
|
what they test with because defects show up really easily. Even if your final design is another color, your
|
||||||
|
prototype plastic shots will all be black to help them tune the machine and refine the steel tool.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Into the Machine</h3>
|
||||||
|
<img data-src="img/factory-machine-hopper-horizontal.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
This is the injection molding machine. Well, the front half. You can see the plastic hopper up on top. You can
|
||||||
|
also see the linear sliders.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Pulling a Shot</h3>
|
||||||
|
<video data-autoplay>
|
||||||
|
<source data-src="img/factory-inject.mp4" type="video/mp4" />
|
||||||
|
</video>
|
||||||
|
<aside class="notes">
|
||||||
|
This is what it looks like when the machine closes to make a shot. You can see the base mold here, and watch it
|
||||||
|
disappear. A single shot takes 30-60 seconds. If the tool is fancy, it will have various pieces that move. If
|
||||||
|
it's just a simple box, it will stay in place.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Factory Mold Bases</h3>
|
||||||
|
<img data-src="img/factory-molds-stacked.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
What does that mold look like? Here are a bunch of carefully-indexed molds. Each one of these is a chunk of
|
||||||
|
nearly-solid steel. Around 1/3 of the cost of a tool is the raw cost of metal. These things are heavy. And steel
|
||||||
|
isn't cheap.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Tomu on its Mold</h3>
|
||||||
|
<img data-src="img/factory-tomu-on-mold.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
And here we have a Tomu, sitting on top of its mold. You can see this is a "Family" mold, so there are four cases
|
||||||
|
that get made with each shot. Inside the base you can see the core. It's actually possible to reuse the base and
|
||||||
|
replace the core. Or as a cheap hack, you can modify the core, plug up some cavities, and do something completely
|
||||||
|
different. In this photo you can also see the gate, where the plastic flows into the mold, as well as the
|
||||||
|
runners, which is where the plastic flows as it makes its way to the cavities.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Both Mold Halves</h3>
|
||||||
|
<img data-src="img/factory-mold-both-halves.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
Here's a different angle, and includes the top and the bottom halves of the mold. When the machine runs, these
|
||||||
|
two pieces come together, and plastic is injected. After it cools, these pieces separate. This is why injection
|
||||||
|
molding has a no-overhangs rule: If there was an overhang, then the halves couldn't separate.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Bottom Half</h3>
|
||||||
|
<img data-src="img/factory-mold-bottom-half.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
This is a closeup of the bottom side of the mold. This shows the texture of the inside of the case nicely. For
|
||||||
|
Fomu, since the shape of the components is different, we're going to replace this half of the core. One thing to
|
||||||
|
note is the texture of the steel. If the steel is rough, your part will be rough. To get it smooth and shiny,
|
||||||
|
they must polish the tool, which is labor-intensive. Then they must re-polish it every few thousand shots. And
|
||||||
|
you still need to have someone polish each piece as it comes out of the machine. Smooth, shiny plastic is very
|
||||||
|
labor intensive manual work, so try to opt for matte finish if you can.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Ejectors</h3>
|
||||||
|
<img data-src="img/factory-mold-lifter.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
Here's a closeup of the base. Interestingly the factory calls it a "USB Case" here. You can also see these giant
|
||||||
|
springs, which are for the ejectors. After the plastic flows in and is cooled, it has to be removed from the mold
|
||||||
|
somehow. Ejector pins slide through the tool and pop the piece out, leaving it clean for another shot.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Cases on Runners</h3>
|
||||||
|
<img data-src="img/factory-cases-on-runner.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
Here is one piece from the machine. You can see four cases come out at once. You can also see the runners, as
|
||||||
|
well as where the plastic flowed in. There's a small bubble, which is fine. Normally the plastics factory will
|
||||||
|
break these off for you. Sometimes there's a small defect where the piece attaches to the runner, which you can
|
||||||
|
pay to have someone manually file off.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Factory Edits</h3>
|
||||||
|
<img data-src="img/factory-proe.jpg">
|
||||||
|
<aside class="notes">
|
||||||
|
And here's the factory working on the Tomu case. Everyone in China uses ProE (Creo Elements Pro). I don't know
|
||||||
|
why. Fortunately there is a well-defined interchange format called STEP, and everyone is able to read and write
|
||||||
|
that format regardless of what they use to create it.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Tool Model</h3>
|
||||||
|
<img data-src="img/factory-tool-model.png">
|
||||||
|
<aside class="notes">
|
||||||
|
This is the 3D model for the steel tool. It's in the Tomu Hardware repo alongside the case. The factory
|
||||||
|
took the model I made, then created this tool around it. They gave me the file when I asked for it. I put it up
|
||||||
|
so you can see what a real 3D tool looks like, since you don't see them very often. There are a few things I'd
|
||||||
|
like to point out here.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<!--<h3>Gate + Ejector Pins</h3>-->
|
||||||
|
<img data-src="img/tomu-tool-4.png">
|
||||||
|
<aside class="notes">
|
||||||
|
Here's a good shot of the gate (in green), where the plastic (in dark grey) flows in. You can also see the
|
||||||
|
ejector pins (in orange), and the big steel plate (pink) that moves when the shot is complete to eject the molded
|
||||||
|
part.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<!--<h3>Lifters</h3>-->
|
||||||
|
<img data-src="img/tomu-tool-5.png">
|
||||||
|
<aside class="notes">
|
||||||
|
Here we have some static lifters. Remember that nice "snap" I mentioned the Tomu case has? That comes from these.
|
||||||
|
Also remember how I said no overhangs? That was a tiny lie. Kind of. These were relatively cheap to add, costing
|
||||||
|
only a few hundred dollars. They don't move, but instead the poke into the case and cause an overhang. These pins
|
||||||
|
have the nice benefit in that they make the case much easier to use, and totally do away with the need to do the
|
||||||
|
heat staking thing. Unfortunately, they make this case impossible to 3D print now, which is why we have the old
|
||||||
|
version in the repo.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<!--<h3>Lifters (Another Shot)</h3>-->
|
||||||
|
<img data-src="img/tomu-tool-6.png">
|
||||||
|
<aside class="notes">
|
||||||
|
This is a good shot to show you just how these don't actually cause an overhang. This was a really clever
|
||||||
|
suggestion that the factory made to me, and I'm super happy with it.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<section>
|
||||||
|
<h1>Designing the Case</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
And with that, let's move on to the creative question: How is the case created in the first place?
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h1>3D Printing</h1>
|
||||||
|
<h3>Almost (but not quite) entirely unline injection molding</h3>
|
||||||
|
<ul>
|
||||||
|
<li>STL vs STEP</li>
|
||||||
|
<li>Overhangs</li>
|
||||||
|
<li>Support structures</li>
|
||||||
|
<li>Flow rate/lines</li>
|
||||||
|
<li>Time taken</li>
|
||||||
|
<li>Family molds</li>
|
||||||
|
</ul>
|
||||||
|
<aside class="notes">
|
||||||
|
Who here has worked with 3D printers before? 3D printers are great. They let you rapidly prototype ideas and are
|
||||||
|
much cheaper to iterate on. The finished product tends to be denser than most plastics. Individual pieces can be
|
||||||
|
relatively expensive, and they are not fast to create in volume. 3D printing is fantastic for prototyping
|
||||||
|
plastics, and even your plastics vendor will have some contacts for 3D printers so you can see your ideas before
|
||||||
|
they cut any steel.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h1>Hardware</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
This PCB ruler is, surprisingly, the most useful ruler I've ever owned. It's great for designing PCBs, but also
|
||||||
|
handy for doing case design. These vernier calipers are also super handy, epsecially when you want to see just
|
||||||
|
how tiny various things are. And it's one thing to read a number on a schematic, but it's another thing entirely
|
||||||
|
to measure it in the real world.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Software: FreeCAD</h3>
|
||||||
|
<img data-src="img/freecad-start.png" alt="FreeCAD Example">
|
||||||
|
<aside class="notes">
|
||||||
|
FreeCAD is an excellent piece of software. It's parametric, which means you define the object as a series of
|
||||||
|
steps. It's great for ensuring what you create in the virtual world closely matches the real world.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h1>FreeCAD can create STEP files</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
STEP is the main interchange format for factories, so you really want to be able to read/write this format.
|
||||||
|
OpenSCAD is also a good piece of software if you're a fan of programming, but you still need to use something to
|
||||||
|
convert its output into a STEP file, which FreeCAD can do.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>FreeCAD can read KiCad files</h3>
|
||||||
|
<img data-src="img/freecad-kicad.png" alt="KiCad PCB inside FreeCAD">
|
||||||
|
<aside class="notes">
|
||||||
|
This is huge for ensuring your PCB fits. FreeCAD will read any STEP models for components that exist. It will
|
||||||
|
also read the PCB thickness from KiCad.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="slide-in fade-out">
|
||||||
|
<h3>1) Open the PCB</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-01.png" alt="First, open the PCB in FreeCAD">
|
||||||
|
<aside class="notes">
|
||||||
|
Open the PCB in FreeCAD. You'll probably have a bunch of errors about missing STEP files, but that's okay it just
|
||||||
|
means you'll be missing components. They're mostly a guideline anyway, and may not be accurately sized. You can
|
||||||
|
hide components by clicking them on the left and pressing "Spacebar".
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>1) Open the PCB</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-01b-makesketch.png" alt="Click 'Create Sketch'">
|
||||||
|
<aside class="notes">
|
||||||
|
We must create a "sketch", which is a 2D drawing. To create a sketch, click on this "Create Sketch" button. It'll
|
||||||
|
ask you which plane you want. Usually I get it wrong, and have to abandon the sketch. But you want it to be on a
|
||||||
|
plane that lets you see the PCB.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>2) Create a sketch</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-02-constraints.png" alt="Creating constraints on the first sketch">
|
||||||
|
<aside class="notes">
|
||||||
|
This is your sketch. You can freely create elements like rectangles and circles, much like in a
|
||||||
|
2D drawing program like Inkscape. The difference here, and this is a big one, is that we must constrain these
|
||||||
|
shapes by defining precise dimensions. These constraints are what makes this a parametric modeler, because you
|
||||||
|
define the parameters for the various elements.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>2) Create a sketch</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-02b-features.png" alt="Creating constraints on the first sketch">
|
||||||
|
<aside class="notes">
|
||||||
|
These are the Elements. They include things like rectangles, circles, ovals, points, tangents, and other basic
|
||||||
|
primitives.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>2) Create a sketch</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-02c-constraints.png" alt="Creating constraints on the first sketch">
|
||||||
|
<aside class="notes">
|
||||||
|
These are constraints. These limit the parameters of the primitives.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>2) Create a sketch</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-02-constraints.png" alt="Creating constraints on the first sketch">
|
||||||
|
<aside class="notes">
|
||||||
|
You can tell that this green box is 12mm x 12.2mm, and that
|
||||||
|
the left and bottom sides are offset from the middle by 6.5mm and 6.1mm. Furthermore, the sides are defined to be
|
||||||
|
parallel, which means we only have to constrain one side. You need to have just enough constraints. Too many, and
|
||||||
|
it's "overconstrained". Too few, and it doesn't have a defined shape. When you're done, and it says "Fully
|
||||||
|
constrained sketch", click "Close".
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>2) Create a sketch</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-03-extrude-start.png" alt="Sketch done, starting pad">
|
||||||
|
<aside class="notes">
|
||||||
|
And here's what it looks like in 3D view. We want to bring this 2D sketch into the 3D world, and we do that by
|
||||||
|
extruding it. Click on the sketch on the left, then click on the "Pad" button.
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>3) Pad the sketch</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-04-extrude-done.png" alt="Done with the pad">
|
||||||
|
<aside class="notes">
|
||||||
|
And here's what it looks like. Note that we have a 3D shape now, and we've defined that it's 2.0mm tall. Note
|
||||||
|
that in this image I've named this box "Board shield" for ease of remembering what it is.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>3) Pad the sketch</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-04b-extrude-done.png" alt="Done with the pad">
|
||||||
|
<aside class="notes">
|
||||||
|
The only setting of interest is the Length field here, which indicates how much padding to add. Since the USB
|
||||||
|
slot is about 2.4 MM thick, and we want to have some tolerance between the case and the PCB, let's make it 2.0
|
||||||
|
mm.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>3) Pad the sketch</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-05-extrude-angle.png" alt="Pad at an angle">
|
||||||
|
<aside class="notes">
|
||||||
|
And finally, here's what it looks like at an angle. And that's it! Repeat steps 2-3 until you're done.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-06-begin-carve.png" alt="Create sketch for pocket">
|
||||||
|
<aside class="notes">
|
||||||
|
Click on the face that you want to add a pocket to, and click "Create sketch"
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-07-pocket-sketch.png" alt="Complete sketch for pocket">
|
||||||
|
<aside class="notes">
|
||||||
|
Create the sketch, ensuring it's fully constrained just like before. Click "Close" once you're done.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-08-create-pocket.png" alt="Create a pocket">
|
||||||
|
<aside class="notes">
|
||||||
|
Create a pocket by clicking the "Create pocket" button.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-09-pocket-created.png" alt="Create a pocket">
|
||||||
|
<aside class="notes">
|
||||||
|
There, a nice pocket.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-09b-pocket-created.png" alt="Create a pocket">
|
||||||
|
<aside class="notes">
|
||||||
|
The length here is 0.8mm, because the PCB is 0.6mm, plus some tolerance.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-10-pocket-pcb-hidden.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
And here's what it looks like if we hide the PCB.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-10a-pocket-passives-start.png" alt="Click on face for sketch">
|
||||||
|
<aside class="notes">
|
||||||
|
Click on the face that we want our sketch...
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-11-passives-sketch.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
Create a sketch for the passives...
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-12-passives-pocket.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
Create a pocket for the passives...
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-13-mcu-sketch.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
Create a sketch for the MCU...
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-14-mcu-pocket.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
Create a pocket for the MCU...
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-15-edge-sketch.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
Create a sketch for the edge LEDs and components...
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-16-edge-pocket.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
Create a pocket for the edge LEDs and components...
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-17-mounting-peg.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
We'd like to create a mounting peg, so create a circle.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-18-mounting-peg-pad.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
And pad the mounting peg sketch.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-19-alignment-bump-sketch.png" alt="Pocket with no PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
Create a sketch for the passives...
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-20-alignment-bump-pad.png" alt="Creating a pad for the alignment bump">
|
||||||
|
<aside class="notes">
|
||||||
|
And now pad the alignment bump to bring it into 3D.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-21-guiding-slots-sketch.png" alt="Creating the sketch for the guiding slots">
|
||||||
|
<aside class="notes">
|
||||||
|
Here are the guiding slots. Note that they're not strictly necessary, and in fact the 0.4mm thickness is
|
||||||
|
bordering on the smallest feature that our 3D printer can create. A good rule of thumb is that injection molding
|
||||||
|
doesn't work so well below 0.5mm, but we're bending that rule a bit here because this piece is very small, and
|
||||||
|
it's not load-bearing.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-22-guiding-slots-pad.png" alt="Finished case without PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
If we turn off the PCB, here's what the finished product looks like.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade">
|
||||||
|
<h3>4) Repeat as necessary</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-23-case-with-pcb.png" alt="Finished case with PCB">
|
||||||
|
<aside class="notes">
|
||||||
|
And here's what the finished product looks like with the PCB enabled.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section data-transition="fade-in slide-out ">
|
||||||
|
<h3>5) Check with reference parts</h3>
|
||||||
|
<img data-src="img/freecad-case-creation-24-usb-port.png" alt="Test with models">
|
||||||
|
<aside class="notes">
|
||||||
|
This is a USB port I got from a vendor. Somewhere off Digikey. They provide STEP files for just this sort of
|
||||||
|
thing. You can move the camera around and make sure the part will actually fit. Of course, 3D printing is
|
||||||
|
generally the best option, but this gives you an idea of hw well it'll fit before printing.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Here's what we sent to the factory</h3>
|
||||||
|
<img data-src="img/freecad-sent-to-factory.png" alt="STEP model we sent to factory">
|
||||||
|
<aside class="notes">
|
||||||
|
Here's what we sent to the factory. FreeCAD generated this STEP file, and we just emailed it to them. They received the file, along with a sample PCB, and we got to talking. They understood roughly what the usecase was, and they had some suggestions. They made some modifications to the STEP file and sent it back to me for approval.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>And here's what they sent back</h3>
|
||||||
|
<video data-autoplay>
|
||||||
|
<source data-src="img/final-model-spinning.mp4" type="video/mp4" />
|
||||||
|
</video>
|
||||||
|
<aside class="notes">
|
||||||
|
I'm really happy with this. You can see the changes they made. They added the lifters on the bottom, which is what causes those holes. You wouldn't normally notice them, but they give those latches that let the PCB snap into place. They also added the grips on the side, which are just kind of a nice touch. Overall they managed to quickly understand the design and make some simple improvements. And then I was able to approve their design decisions, including the extra cost incurred from the additional lifters, and get the tool made.
|
||||||
|
|
||||||
|
From this point, they took a few weeks to do the first draft of the mold, called T0. This is like a beta release: everything should be there, but it needs tuning. There will be flow defects, and it will be unpolished. The tool is still relatively soft at this point, and edits can be made easily. A good plastics vendor will have a functional tool after T0, but it's not at all uncommon to have to do T1, T2, and more. This test shot will usually be in black, because it shows lots of defects very easily.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<section>
|
||||||
|
<h1>Real World Fun</h1>
|
||||||
|
<h2>And the problems you'll face</h2>
|
||||||
|
<aside class="notes">
|
||||||
|
Now that we know the basics of how plastic is made, we can see some of the consequences in the real world. While
|
||||||
|
many of these designs aren't open source, it shouldn't be too difficult to work backwards and imagine how the
|
||||||
|
tool was built.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h1>Clothes peg</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
This is a clothes peg from my house. It's very cheap. You can clearly see parting lines along the side here. The
|
||||||
|
texture is effectively free, because this piece is entirely flat. There aren't any fancy tool options here -- no
|
||||||
|
lifters or sliders or anything complicated. You can see the ejector pin marks on the inside, and there are two of
|
||||||
|
them. You can also tell where the gate was, because there's a little bit of material left over. The plastic also
|
||||||
|
has a very rough surface, indicating they probably aren't cleaning the tool very often. One clever piece is that
|
||||||
|
both halves of the clothes peg are identical.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h1>Aircon Remote (Back)</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
This is a very important tool in Singapore. It's the air conditioning remote. They've added some text on the
|
||||||
|
backside here. Curiously, there's something that seems to violate our "no overhangs" policy. And indeed it does.
|
||||||
|
How do they do that? They use something called a "slider". Basically, a piece that starts out in one position
|
||||||
|
when the plastic flows, and then slides out of the way to let the piece eject. Sliders add a lot of cost, because
|
||||||
|
they quickly complicate the steel tool. You can have multi-stage sliders to get all sorts of complicated
|
||||||
|
features, but it can get very expensive very quickly.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h1>Aircon Remote (Front Cover)</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
Here's the inside of the front cover. It can slide up and down, which means it has a lip on the side. They used a
|
||||||
|
slider here, too. In fact, the slider left small marks here. This particular piece is great because you can see
|
||||||
|
the ejector pin marks, the gate mark, and the slider marks. They were also kind enough to indicate that this came
|
||||||
|
from the second cavity in the mold. They could probably hide some of these marks if they put more effort into it,
|
||||||
|
but it's really very little payoff. Most people won't notice, and it doesn't impact the functionality of the
|
||||||
|
product.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h1>Wine bottle opener</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
This wine bottle opener has one very visible parting line. Interestingly, it's overmolded, which is where one
|
||||||
|
piece gets two shots, and the overmolded piece hides the parting line along the top. You can do some pretty cool
|
||||||
|
thigns with overmolding, because the base doesn't even need to be plastic. You can overmold anything that will
|
||||||
|
fit inside of a plastic tool. That includes circuit boards, if you don't need to worry about heat or debug pins.
|
||||||
|
This is how most cables are made, where they put the wires directly into the injection molding tool.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h1>Kinder joy</h1>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h1>iPhone 3G</h1>
|
||||||
|
<aside class="notes">
|
||||||
|
This one is particularly fun. It's an old iPhone 3G, back before Apple went completely crazy with CNC-milling. In
|
||||||
|
addition to being particularly shiny, which you remember requires polishing after the part comes out of the mold,
|
||||||
|
you'll also notice the lack of parting lines. That's because Apple polished them off.
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<section>
|
||||||
|
<h1>Conclusion</h1>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
</div> <!-- class="reveal" -->
|
||||||
|
<!-- End of main presentation -->
|
||||||
|
|
||||||
<script src="lib/js/head.min.js"></script>
|
<!-- Start of configuration section -->
|
||||||
<script src="js/reveal.js"></script>
|
<script src="lib/js/head.min.js"></script>
|
||||||
|
<script src="js/reveal.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// More info https://github.com/hakimel/reveal.js#configuration
|
||||||
|
Reveal.initialize({
|
||||||
|
controls: true,
|
||||||
|
progress: true,
|
||||||
|
history: true,
|
||||||
|
center: true,
|
||||||
|
controlsTutorial: false,
|
||||||
|
|
||||||
|
slideNumber: 'c/t',
|
||||||
|
|
||||||
|
// The "normal" size of the presentation, aspect ratio will be preserved
|
||||||
|
// when the presentation is scaled to fit different resolutions. Can be
|
||||||
|
// specified using percentage units.
|
||||||
|
width: 960,
|
||||||
|
height: 700,
|
||||||
|
|
||||||
|
// Factor of the display size that should remain empty around the content
|
||||||
|
margin: 0.1,
|
||||||
|
|
||||||
|
// Bounds for smallest/largest possible scale to apply to content
|
||||||
|
minScale: 0.02,
|
||||||
|
maxScale: 5.5,
|
||||||
|
|
||||||
|
transition: 'slide', // none/fade/slide/convex/concave/zoom
|
||||||
|
|
||||||
|
// More info https://github.com/hakimel/reveal.js#dependencies
|
||||||
|
dependencies: [
|
||||||
|
{ src: 'lib/js/classList.js', condition: function () { return !document.body.classList; } },
|
||||||
|
{ src: 'plugin/markdown/marked.js', condition: function () { return !!document.querySelector('[data-markdown]'); } },
|
||||||
|
{ src: 'plugin/markdown/markdown.js', condition: function () { return !!document.querySelector('[data-markdown]'); } },
|
||||||
|
{ src: 'plugin/highlight/highlight.js', async: true, callback: function () { hljs.initHighlightingOnLoad(); } },
|
||||||
|
{ src: 'plugin/search/search.js', async: true },
|
||||||
|
{ src: 'plugin/zoom-js/zoom.js', async: true },
|
||||||
|
{ src: 'plugin/notes/notes.js', async: true }
|
||||||
|
]
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
<script>
|
|
||||||
// More info about config & dependencies:
|
|
||||||
// - https://github.com/hakimel/reveal.js#configuration
|
|
||||||
// - https://github.com/hakimel/reveal.js#dependencies
|
|
||||||
Reveal.initialize({
|
|
||||||
dependencies: [
|
|
||||||
{ src: 'plugin/markdown/marked.js' },
|
|
||||||
{ src: 'plugin/markdown/markdown.js' },
|
|
||||||
{ src: 'plugin/notes/notes.js', async: true },
|
|
||||||
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
|
|
||||||
]
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|