index: adding outline
Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
parent
bca76cc6d7
commit
369bc564a9
970
index.html
970
index.html
@ -87,866 +87,138 @@
|
|||||||
<div class="slides">
|
<div class="slides">
|
||||||
<section data-background-image="css/theme/lca2019-title-bg-transparent.svg">
|
<section data-background-image="css/theme/lca2019-title-bg-transparent.svg">
|
||||||
<h1>Paying it Forward: Documenting Your Hardware Project</h1>
|
<h1>Paying it Forward: Documenting Your Hardware Project</h1>
|
||||||
<h4>Approaches to documenting a hardware description language</h4>
|
<h4>Approaches to documenting a hardware description language using lxsocdoc</h4>
|
||||||
<p align="right">
|
<p align="right">
|
||||||
<small>Sean Cross - <a href="https://xobs.io/">https://xobs.io/</a> - @xobs</small>
|
<small>Sean Cross - <a href="https://xobs.io/">https://xobs.io/</a> - @xobs</small>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<!--
|
|
||||||
<section>
|
<section>
|
||||||
<h3>Tomu</h3>
|
<h1>Hardware is different</h1>
|
||||||
<img data-src="img/tomu-item.jpg" alt="I'm Tomu!">
|
|
||||||
<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>
|
|
||||||
<h3>Case</h3>
|
|
||||||
<img data-src="img/tomu-case.jpg" alt="I'm Tomu Case!">
|
|
||||||
<aside class="notes">
|
|
||||||
This is the injection molded case, after production. It's clear, which normally costs a bit extra, but since the
|
|
||||||
material we used is so little there was no extra charge. The case is made from polycarbonate, called PC.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section>
|
|
||||||
<h3>Tomu + Case</h3>
|
|
||||||
<img data-src="img/tomu-in-case.jpg" alt="I'm in my case!">
|
|
||||||
<aside class="notes">
|
|
||||||
This is a Tomu in its case. 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>
|
|
||||||
<h3>Tomu + Fomu + Case</h3>
|
|
||||||
<img data-src="img/tomu-fomu-case.jpg" alt="Tomu and Fomu in case">
|
|
||||||
<aside class="notes">
|
|
||||||
And here is Fomu in a Tomu case.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section data-transition="slide-in fade-out">
|
|
||||||
<h3>About Me</h3>
|
|
||||||
<img data-src="img/map-1.png">
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade-in zoomrev-out">
|
|
||||||
<h3>About Me</h3>
|
|
||||||
<img data-src="img/map-2.png">
|
|
||||||
</section>
|
|
||||||
<section data-transition="zoomrev-in fade-out">
|
|
||||||
<h3>About Me</h3>
|
|
||||||
<img data-src="img/map-3.png">
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade-in slide-out">
|
|
||||||
<h3>About Me</h3>
|
|
||||||
<img data-src="img/map-4.png">
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>About Me</h3>
|
|
||||||
<img data-src="img/project-listing.jpg">
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section>
|
|
||||||
<h1>Outline</h1>
|
|
||||||
<ol>
|
<ol>
|
||||||
<li>Manufacturing the Case</li>
|
<li>Massively Parallel</li>
|
||||||
<li>Designing the Case</li>
|
|
||||||
<li>Understanding Plastics</li>
|
|
||||||
</ol>
|
</ol>
|
||||||
</section>
|
</section>
|
||||||
|
This is the Open ISA miniconf, which today tends to mean FPGAs. This means that
|
||||||
|
hardware and software are both extensible, and developers will be able to extend
|
||||||
|
the hardware in addition to making modifications to your software package.
|
||||||
|
|
||||||
<section>
|
Undocumented hardware is bad. There are all sorts of quirks, and even if you have
|
||||||
<section>
|
the source code, it can be very difficult to read. I'm the primary developer for
|
||||||
<h3>Factory Tour!</h3>
|
the Fomu project, and this talk will cover some of the issues I've run into with
|
||||||
<div>
|
respect to documentation. It is most directly related to the LiteX and Migen
|
||||||
<img data-src="img/xkcd-tasks.png" alt="It's hard to know when something is easy and when it's hard">
|
projects, but the concepts will carry over into any other Hardware Description
|
||||||
</div>
|
Language you may use.
|
||||||
<small>
|
|
||||||
<a href="https://xkcd.com/1425/">XKCD 1425</a>
|
|
||||||
</small>
|
|
||||||
<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>Pellets of Plastic</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>Into the Machine</h3>
|
|
||||||
<img id="bunnie-ij-machines" alt="Rows of injection molding machines" data-src="img/bunnie-ij-machines.jpg">
|
|
||||||
<cite for="bunnie-ij-machines"><small>© bunnie@bunniestudios.com</small></cite>
|
|
||||||
<aside class="notes">
|
|
||||||
Here's another shot with a lot more machines. This was taken at a different factory at lunchtime, when the
|
|
||||||
factory floor clears out.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>Into the Machine</h3>
|
|
||||||
<img id="bunnie-ij-machines-2" alt="Rows of injection molding machines" data-src="img/bunnie-ij-machines-2.jpg">
|
|
||||||
<cite for="bunnie-ij-machines-2"><small>© bunnie@bunniestudios.com</small></cite>
|
|
||||||
<aside class="notes">
|
|
||||||
More machines. Believe it or not this was a different factory.
|
|
||||||
</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>Ejectors</h3>
|
|
||||||
<img id="bunnie-ejectors" data-src="img/bunnie-ejector-pins.jpg" alt="Ejectors from another mold, clearly visible">
|
|
||||||
<cite for="bunnie-ejectors"><small>© bunnie@bunniestudios.com</small></cite>
|
|
||||||
<aside class="notes">
|
|
||||||
And just so you get a good idea of what ejectors look like, here's a mold base that's been partially diassembled.
|
|
||||||
You can see just how many ejector pins there are on this relatively large piece.
|
|
||||||
</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>
|
|
||||||
<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>
|
|
||||||
<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>
|
|
||||||
<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>
|
Common approaches today involve comments in the HDL and/or C header files. This
|
||||||
<section>
|
works, but we can do better. We just need to describe the hardware better.
|
||||||
<h1>Designing the Case</h1>
|
```//Hardware definitions of the SoC. Also is the main repo of documentation for the
|
||||||
<aside class="notes">
|
//programmer-centric view of the hardware.```
|
||||||
And with that, let's move on to the creative question: How is the case created in the first place?
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>3D Printing</h3>
|
|
||||||
<img data-src="img/3d-printed-cases.jpg" alt="3D case prototypes">
|
|
||||||
<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>
|
|
||||||
<h3>Reference</h3>
|
|
||||||
<img data-src="img/usb-schematics.png" alt="USB recepticle schematics">
|
|
||||||
<aside class="notes">
|
|
||||||
The USB specification is a five-megabyte PDF. Chapter 6 is the "Mechanical" chapter, and has lots of schematics
|
|
||||||
that are very important to this sort of project. This is a section of the "recepticle" schematic. It's important
|
|
||||||
to know the dimensions of where this connector will fit.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>Reference</h3>
|
|
||||||
<img data-src="img/usb-schematics-plug.png" alt="USB plug schematics">
|
|
||||||
<aside class="notes">
|
|
||||||
And this is a portion of the USB plug. Our goal is to have the case plus the PCB come out to roughly the same
|
|
||||||
shape as this plug, and still be able to fit into the recepticle. How do we do that, you ask?
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>Hardware</h3>
|
|
||||||
<img data-src="img/tools-ruler-calipers.jpg" alt="Ruler and Caliper">
|
|
||||||
<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">
|
|
||||||
ISO 10303-21. 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 PCBs</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 submitted</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 made</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.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>3D Printed Prototype</h3>
|
|
||||||
<aside class="notes">
|
|
||||||
The factory wanted to create a 3D printed prototype. These were very accurate, but were heavier than the final
|
|
||||||
thing. They did this to ensure the PCB would fit. These 3D printers must be super fancy, because they're able to
|
|
||||||
handle the undercuts and weird features of the case.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>Cutting Steel - EDM</h3>
|
|
||||||
<img id="bunnie-edm" src="img/bunnie-edm.jpg" alt="An EDM machine cutting steel">
|
|
||||||
<cite for="bunnie-edm"><small>© bunnie@bunniestudios.com</small></cite>
|
|
||||||
<aside class="notes">
|
|
||||||
Once we approved the 3D printed prototype, they started cutting steel. They use a variety of techniques here, and
|
|
||||||
frequently use EDM. This process involves cutting a soft copper positive with a CNC tool, then passing high
|
|
||||||
current through the copper as it comes near steel. They run dielectric fluid on it both to cool the piece and to
|
|
||||||
help the electrons ablate the steel.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>T0 Shot</h3>
|
|
||||||
<img id="bunnie-pvt-case-outside" data-src="img/bunnie-pvt-case-outside.jpg" alt="Outside of the Novena case">
|
|
||||||
<cite for="bunnie-pvt-case-outside"><small>© bunnie@bunniestudios.com</small></cite>
|
|
||||||
<aside class="notes">
|
|
||||||
After they finish milling, they do a test shot. Usually this is not in the final color you specified, because it
|
|
||||||
helps them to tune features
|
|
||||||
such as how quickly to flow plastic. This T0 shot also lets them test to make sure it fits the final product. The
|
|
||||||
tool is still relatively soft, so changes can easily be made. If they need to remove material, they simply grind
|
|
||||||
it off. If they need to add material, they weld it on and then grind it off.
|
|
||||||
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.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>T0 Shot - Annotated</h3>
|
|
||||||
<img id="bunnie-pvt-case-t0-explained" data-src="img/bunnie-pvt-case-t0-explained.jpg" alt="Outside of the Novena case">
|
|
||||||
<cite for="bunnie-pvt-case-t0-explained"><small>© bunnie@bunniestudios.com</small></cite>
|
|
||||||
<aside class="notes">
|
|
||||||
This is an annotated version of the case. You can see three major problems here: flow lines,
|
|
||||||
where the plastic partially cooled as it was still moving. Knit lines are where two rivers of molten plastic
|
|
||||||
meet. And sink marks, where not enough plastic flowed, and features on the inside can be seen through on the
|
|
||||||
other side. The factory will tune the mold and the flow rate to address these issues.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>Finishing</h3>
|
|
||||||
<img id="moldtech" data-src="img/moldtech-sampleboard1.jpg" alt="Moldtech Sample board">
|
|
||||||
<cite for="moldtech"><small>© Moldtech JP</small></cite>
|
|
||||||
<aside class="notes">
|
|
||||||
They may need to move on to subsequent test shots as they refine the tool. Each step takes a few weeks, so the
|
|
||||||
fewer test shots you need the better. Factories are getting pretty good now in that most of the ones I've worked
|
|
||||||
with get it right on the first or second try. After they're happy with the tool, they harden it, which means it's
|
|
||||||
good for about 100,000 shots before it needs to be refinished. This process usually involves picking a texture,
|
|
||||||
which is usally done out of a book. Textures are easy to add, and can cover up many manufacturing defects.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>Manufactured!</h3>
|
|
||||||
<img data-src="img/manufactured.jpg" alt="Bag of Tomu cases">
|
|
||||||
<aside class="notes">
|
|
||||||
And then you have your final tool, ready to shoot thousands of copies of your model!
|
|
||||||
</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 data-transition="slide-in fade-out">
|
|
||||||
<h3>Clothes peg</h3>
|
|
||||||
<img data-src="img/clothespeg-side.jpg" alt="A clothes peg (side view)">
|
|
||||||
<aside class="notes">
|
|
||||||
This is a clothes peg from my house. It's very cheap.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade-in slide-out">
|
|
||||||
<h3>Clothes peg</h3>
|
|
||||||
<img data-src="img/clothespeg-side-arrows.jpg" alt="A clothes peg (side view)">
|
|
||||||
<aside class="notes">
|
|
||||||
You can clearly see parting lines along the side here.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="slide-in fade-out">
|
|
||||||
<h3>Clothes peg</h3>
|
|
||||||
<img data-src="img/clothespeg-inside.jpg" alt="A clothes peg (inside view)">
|
|
||||||
<aside class="notes">
|
|
||||||
If we open it up, we can see some of the magic on the inside. One clever feature is that both halves of the
|
|
||||||
clothes peg are identical, which means they don't have to match up pairs when manufacturing.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade">
|
|
||||||
<h3>Clothes peg</h3>
|
|
||||||
<img data-src="img/clothespeg-inside-gate.jpg" alt="A clothes peg (inside view)">
|
|
||||||
<aside class="notes">
|
|
||||||
This is a bit of flashing left from the gate. This is where plastic flowed in when it was still molten. Because
|
|
||||||
this is a cheap piece, they didn't care too much about hiding it.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade">
|
|
||||||
<h3>Clothes peg</h3>
|
|
||||||
<img data-src="img/clothespeg-inside-ejectors.jpg" alt="A clothes peg (inside view)">
|
|
||||||
<aside class="notes">
|
|
||||||
These are the ejector pin markings. This is where those steel pegs pushed this piece out of the mold. The bottom
|
|
||||||
ejectors are thicker because this also serves to reinfrce the metal wire that puts a lot of force on this area.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade-in slide-out">
|
|
||||||
<h3>Clothes peg</h3>
|
|
||||||
<img data-src="img/clothespeg-inside-wtf.jpg" alt="A clothes peg (inside view)">
|
|
||||||
<aside class="notes">
|
|
||||||
The pattern down here is effectively free, because this piece is entirely flat. There aren't any fancy tool
|
|
||||||
options here -- no lifters or sliders or anything complicated. The plastic also has a very rough surface,
|
|
||||||
indicating they probably aren't cleaning the tool very often. I'm not sure what's going on here, or why this
|
|
||||||
looks different between the two pieces. Maybe this was modified by an amateur.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>Aircon Remote (Front)</h3>
|
|
||||||
<img data-src="img/examples-aircon-top.jpg" alt="Front of the aircon remote">
|
|
||||||
<aside class="notes">
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="slide-in fade-out">
|
|
||||||
<h3>Aircon Remote (Back)</h3>
|
|
||||||
<img data-src="img/examples-aircon-back.jpg" alt="Back of the aircon remote">
|
|
||||||
<aside class="notes">
|
|
||||||
This is a very important tool in Singapore. It's the air conditioning remote.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade">
|
|
||||||
<h3>Aircon Remote (Back)</h3>
|
|
||||||
<img data-src="img/examples-aircon-back-gate.jpg" alt="Back of the aircon remote">
|
|
||||||
<aside class="notes">
|
|
||||||
This is the gate. You'll see this pattern a lot now. Again, this is where plastic flowed in from the machine, and
|
|
||||||
was clipped off when it was delivered to the manufacturer.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade">
|
|
||||||
<h3>Aircon Remote (Back)</h3>
|
|
||||||
<img data-src="img/examples-aircon-back-text.jpg" alt="Back of the aircon remote">
|
|
||||||
<aside class="notes">
|
|
||||||
They've added some text on the
|
|
||||||
backside here. This text could be a swappable plate, which means they could take this piece of metal out of the
|
|
||||||
core and replace it with another. That would allow them to localize it easily. Also, it's sunken in, which means
|
|
||||||
it's easier to make typo corrections, because all you have to do is file down the tool and try again.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade-in slide-out">
|
|
||||||
<h3>Aircon Remote (Back)</h3>
|
|
||||||
<img data-src="img/examples-aircon-back-slider.jpg" alt="Back of the aircon remote">
|
|
||||||
<aside class="notes">
|
|
||||||
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 data-transition="slide-in fade-out">
|
|
||||||
<h3>Aircon Remote (Front Cover)</h3>
|
|
||||||
<img data-src="img/examples-aircon-cover.jpg" alt="Cover from aircon remote front">
|
|
||||||
<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.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade">
|
|
||||||
<h3>Aircon Remote (Front Cover)</h3>
|
|
||||||
<img data-src="img/examples-aircon-cover-ejector.jpg" alt="Cover from aircon remote front">
|
|
||||||
<aside class="notes">
|
|
||||||
Here are the ejector pin markings again. This piece has three ejectors.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade">
|
|
||||||
<h3>Aircon Remote (Front Cover)</h3>
|
|
||||||
<img data-src="img/examples-aircon-cover-gate.jpg" alt="Cover from aircon remote front">
|
|
||||||
<aside class="notes">
|
|
||||||
And here's the gate.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section data-transition="fade">
|
|
||||||
<h3>Aircon Remote (Front Cover)</h3>
|
|
||||||
<img data-src="img/examples-aircon-cover-text.jpg" alt="Cover from aircon remote front">
|
|
||||||
<aside class="notes">
|
|
||||||
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 data-transition="fade-in slide-out">
|
|
||||||
<h3>Aircon Remote (Front Cover)</h3>
|
|
||||||
<img data-src="img/examples-aircon-cover-lifter.jpg" alt="Cover from aircon remote front">
|
|
||||||
<aside class="notes">
|
|
||||||
They used a
|
|
||||||
slider here, too. In fact, the slider left small marks here.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>Wine bottle opener</h3>
|
|
||||||
<img data-src="img/wine-bottle-overview.jpg" alt="Wine bottle bottle opener">
|
|
||||||
<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.
|
|
||||||
</aside>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h3>Wine bottle opener</h3>
|
|
||||||
<img data-src="img/wind-bottle-flashing.jpg" alt="Some flashing on the wine bottle, plus overmolding">
|
|
||||||
<aside class="notes">
|
|
||||||
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>
|
|
||||||
|
|
||||||
<section>
|
Fomu uses LiteX, which is related to Migen. This is a hardware description language
|
||||||
<section>
|
written in Python. You write Python code and run the program, and it generates
|
||||||
<h3>Summary</h3>
|
a design file -- either Verilog code, or a Yosys netlist. There are many other
|
||||||
<ol>
|
alternatives such as SpinalHDL or Chisel. By writing in Python as opposed to
|
||||||
<li>Understand production process</li>
|
direct Verilog, we get a lot of nice primitives.
|
||||||
<li>Design with open source tools</li>
|
|
||||||
<li>Take baby steps</li>
|
CSRStorage and CSRStatus are two such primitives. These enable trivial access to
|
||||||
<li>Design artifacts are everywhere</li>
|
a hardware device from a CPU softcore. Instead of manually wiring up a crossbar
|
||||||
</ol>
|
and decoding the addresses ourselves, we just need to write `self.regname = CSRStatus(8)`,
|
||||||
</section>
|
and the build system will wire up 8 bits of read-only memory to the target CPU.
|
||||||
<section>
|
Similarly, `self.othername = CSRStorage(8)` will give 8-bits of write-only memory.
|
||||||
<h2>Thank You</h2>
|
|
||||||
<h3>Questions?</h3>
|
This works well, but exposes a new problem: Documentation. As an example, I was
|
||||||
<table>
|
working with the SPI Flash block in litex, and wanted to know how the bitbang
|
||||||
<tr>
|
driver worked. There wasn't any documentation except the source, which looked
|
||||||
<td>Fomu:</td>
|
like this:
|
||||||
<td><a href="https://www.crowdsupply.com/sutajio-kosagi/fomu">t.xobs.io/fomu</a></td>
|
|
||||||
</tr>
|
self.bitbang = CSRStorage(4)
|
||||||
<tr>
|
If(self.bitbang.storage[3],
|
||||||
<td>Case:</td>
|
dq.oe.eq(0)
|
||||||
<td><a href="https://github.com/im-tomu/tomu-hardware/tree/master/case">t.xobs.io/tomu-case</a></td>
|
).Else(
|
||||||
</tr>
|
dq.oe.eq(1)
|
||||||
<tr>
|
),
|
||||||
<td>Tool:</td>
|
If(self.bitbang.storage[1], # CPOL=0/CPHA=0 or CPOL=1/CPHA=1 only.
|
||||||
<td><a href="https://raw.githubusercontent.com/im-tomu/tomu-hardware/master/case/tomu_0.4_case_manufactured_tool.step">t.xobs.io/tomu-tool</a></td>
|
self.miso.status.eq(dq.i[1])
|
||||||
</tr>
|
),
|
||||||
<tr>
|
dq.o.eq(Cat(self.bitbang.storage[0], Replicate(1, spi_width-1)))
|
||||||
<td>Talk:</td>
|
|
||||||
<td><a href="https://raw.githubusercontent.com/im-tomu/tomu-hardware/master/case/tomu_0.4_case_manufactured_tool.step">p.xobs.io/lca2019</a></td>
|
You can kind of understand it, but it does take a lot of mental power to
|
||||||
</tr>
|
work through it. I started by creating aliases for the various elements
|
||||||
</table>
|
in the storage array, but then I thought: There has to be a better way!
|
||||||
</section>
|
|
||||||
</section>
|
This is when I hit upon the idea of `lxsocdoc`. The basic idea is that
|
||||||
-->
|
Python is really good at introspecting Python, so let's add a little bit
|
||||||
|
more information to the CSR objects to make our life easier. So after
|
||||||
|
working with the LiteX creator Florent, we refactored the bitbang
|
||||||
|
definition to this:
|
||||||
|
|
||||||
|
self.bitbang = CSRStorage(4, fields=[
|
||||||
|
CSRField("mosi", description="Output value for MOSI pin, valid whenever ``dir`` is ``0``."),
|
||||||
|
CSRField("clk", description="Output value for SPI CLK pin."),
|
||||||
|
CSRField("cs_n", description="Output value for SPI CSn pin."),
|
||||||
|
CSRField("dir", description="Sets the direction for *ALL* SPI data pins except CLK and CSn.", values=[
|
||||||
|
("0", "OUT", "SPI pins are all output"),
|
||||||
|
("1", "IN", "SPI pins are all input"),
|
||||||
|
])
|
||||||
|
], description="""
|
||||||
|
Bitbang controls for SPI output. Only standard 1x SPI is supported, and as
|
||||||
|
a result all four wires are ganged together. This means that it is only possible
|
||||||
|
to perform half-duplex operations, using this SPI core.
|
||||||
|
""")
|
||||||
|
|
||||||
|
Now the actual bitbang logic looks like:
|
||||||
|
|
||||||
|
If(self.bitbang.fields.dir,
|
||||||
|
dq.oe.eq(0)
|
||||||
|
).Else(
|
||||||
|
dq.oe.eq(1)
|
||||||
|
),
|
||||||
|
If(self.bitbang.fields.clk, # CPOL=0/CPHA=0 or CPOL=1/CPHA=1 only.
|
||||||
|
self.miso.status.eq(dq.i[1])
|
||||||
|
),
|
||||||
|
dq.o.eq(Cat(self.bitbang.fields.mosi, Replicate(1, spi_width-1)))
|
||||||
|
|
||||||
|
This is a little bit easier to understand -- no longer are we looking at indices
|
||||||
|
in an array to determine what field does what. Instead we get actual named fields.
|
||||||
|
But because Python can introspect Python very easily, this is just the beginning.
|
||||||
|
|
||||||
|
After the design is elaborated and the output file is generated, we can iterate
|
||||||
|
through the resulting tree and pick out any CSR objects and using any additional
|
||||||
|
information. We can actually generate a full reference manual, just like one you
|
||||||
|
would receive from a SoC Vendor.
|
||||||
|
|
||||||
|
For example, this is what the start of the Fomu SPI Flash documentation looks like:
|
||||||
|
[Register Listing for LXSPI]
|
||||||
|
|
||||||
|
This is already pretty useful. You can hand this file to someone and show them
|
||||||
|
how your design works. But the title of this talk is called "Paying it Forward",
|
||||||
|
and I can tell you from experience that having such a reference manual for yourself
|
||||||
|
while developing software for your own hardware is still invaluable. Hardware
|
||||||
|
designs are complex things, and not having to decode bitfield offsets in your
|
||||||
|
head or constantly referring to various sections of code to see how it's implemented
|
||||||
|
saves valuable time.
|
||||||
|
|
||||||
|
So now we have register documentation. Can we do better? Of course we can.
|
||||||
|
SoC reference manuals are more than just register definitions. They also include
|
||||||
|
background information on protocols, as well as more elaboration on how the block
|
||||||
|
works.
|
||||||
|
|
||||||
|
lxsocdoc
|
||||||
|
intro to litex/migen
|
||||||
|
concept of mixins
|
||||||
|
concept of documentation sections
|
||||||
|
what the output can look like
|
||||||
|
what's coming in the future
|
||||||
|
documenting interrupts
|
||||||
|
introspecting classes
|
||||||
|
other approaches
|
||||||
|
how you can help
|
||||||
|
why this helps you
|
||||||
|
|
||||||
|
Benefits:
|
||||||
|
* Generating reference manuals
|
||||||
|
* SVD
|
||||||
|
* SVD2Rust
|
||||||
</div>
|
</div>
|
||||||
</div> <!-- class="reveal" -->
|
</div> <!-- class="reveal" -->
|
||||||
<!-- End of main presentation -->
|
<!-- End of main presentation -->
|
||||||
|
Loading…
Reference in New Issue
Block a user