<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Alex Bustos</title><description>Alex Bustos&apos;s personal website.</description><link>https://alexbustos.com/</link><language>en-us</language><atom:link href="https://alexbustos.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>Machined Wooden Pencil Case</title><link>https://alexbustos.com/posts/wooden-pencil-case/</link><guid isPermaLink="true">https://alexbustos.com/posts/wooden-pencil-case/</guid><description>Works with pens, too!</description><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;has-this-ever-happened-to-you&quot;&gt;Has this ever happened to you?&lt;/h2&gt;
&lt;p&gt;Recently, I tossed my rOtring 600 mechanical pencil into my bag and headed to a
local coffee shop. All was well, until I got to the coffee shop. I opened my bag
to retrieve my prized writing utensil, and was greeted instead with disaster:
the metal tube at the tip of my pencil was &lt;em&gt;bent&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This actually did happen, and actually is part of the motivation for this
project. Around the same time though, I’d joined a local makerspace and was
searching for a project to get familiar with some of the tools there. So, I
figured I’d kill two birds with one stone, and try to make a case to protect my
pens and pencils from situations like this.&lt;/p&gt;
&lt;h2 id=&quot;design&quot;&gt;Design&lt;/h2&gt;
&lt;p&gt;The design for this project was straightforward: a two-part case with two slots
for rOtring pens or pencils, magnets to hold the case together, and a lip to
align the two parts.&lt;/p&gt;
&lt;p&gt;I iterated on the details a bit via 3D printing and made some small refinements
here and there, but I didn’t significantly change the general shape of the
design from the original concept. The final design is below.&lt;/p&gt;

&lt;h2 id=&quot;manufacturing&quot;&gt;Manufacturing&lt;/h2&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/pencil-case-in-progress.BBjXCae3_Z173Cn1.webp&quot; alt=&quot;a CNC machine milling wood&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot;&gt;&lt;figcaption&gt;Pencil case being milled.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Manufacturing was fairly clear-cut. I machined both halves of the case from a
single piece of maple, using blue tape and super glue for workholding. The
biggest challenge I ran into was just working around the age of the Techno LC
4896 CNC router at the makerspace.&lt;/p&gt;
&lt;p&gt;This machine is probably in the ballpark of 20 years old, which presented some
interesting quirks. Most notably, 2D and 3D adaptive toolpaths don’t work,
presumably due to the specs of the control processor. I ended up just using 2D
pockets for everything.&lt;/p&gt;
&lt;p&gt;I also ran into a problem that I would categorize as probably more of a skill
issue than anything else. The first time I tried milling out the case, I wound
up with this huge gap between the two parts, which are designed to be flush.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/pencil-case-gap.B49PfHYO_23rxwi.webp&quot; alt=&quot;Side profile of a milled wooden pencil case&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1440&quot; height=&quot;1920&quot;&gt;&lt;figcaption&gt;Gap between case parts.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The culprit wound up being a discrepancy between setups in my CAM. This machine
doesn’t have a tool setter, so the way to set different tool heights is to touch
off the tool on the top of the stock. I had two setups for this project: facing
and everything else. For my second setup, I’d set my stock mode in Fusion to
&lt;code&gt;From Preceding Setup&lt;/code&gt; with &lt;code&gt;Continue Rest Machining&lt;/code&gt; checked. I’d interpreted
this as “the stock for the current setup is whatever’s left from the previous
setup”.&lt;/p&gt;
&lt;p&gt;This turned out to be true for toolpaths, but importantly, these settings do
&lt;em&gt;not&lt;/em&gt; update the stock box points, which still come from the original stock
definition. And because I used one of these points as my origin, whatever height
got faced off in my initial setup wasn’t accounted for in later operations.&lt;/p&gt;
&lt;p&gt;Fortunately, the fix for this was easy— I just set the stock dimensions for the
second setup manually. With that out of the way, the rest of the machining went
smoothly.&lt;/p&gt;
&lt;figure&gt;&lt;video autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;source src=&quot;https://alexbustos.com/chamfer-operation.mp4&quot; type=&quot;video/mp4&quot;&gt;&lt;/video&gt;&lt;figcaption&gt;Chamfer operation using 3D printed workholding.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;To machine the chamfers on the exterior of each part, I used a 3D printed jig
for workholding, shown above. The milled parts prior to sanding and finishing
are shown below.&lt;/p&gt;&lt;!-- TODO: this container should be &lt;figure&gt; so &lt;figcaption&gt; is semantically valid --&gt;&lt;div&gt;&lt;div class=&quot;grid grid-cols-2 grid-rows-2 gap-2 pb-2 overflow-clip&quot;&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/pencil-case-unfinished-top.BrR92L5W_Z1UqDYo.webp&quot; alt=&quot;Top of a milled wooden pencil case.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/pencil-case-unfinished-chamfer.5NTNaG1d_Z1rN2Iz.webp&quot; alt=&quot;Bottom of milled wooden pencil case.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/pencil-case-unfinished-side.FnM1-ooy_Z3t68F.webp&quot; alt=&quot;Side of a milled wooden pencil case.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/pencil-case-unfinished-fit.MH2hRwbh_27dlyW.webp&quot; alt=&quot;Milled wooden pencil case.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption class=&quot;border-l border-r border-b border-line hard-shadow&quot;&gt;Machined, unfinished pencil case.&lt;/figcaption&gt;&lt;/div&gt;
&lt;h2 id=&quot;wood-finishing-is-hard-apparently&quot;&gt;Wood Finishing is Hard, Apparently&lt;/h2&gt;
&lt;p&gt;After machining the case, I sanded the parts using progressively finer
sandpaper, up to 320 grit. At this point, I felt like I was almost done with the
project; in hindsight, I realize I was getting ahead of myself.&lt;/p&gt;
&lt;p&gt;I chose Danish oil to finish the case, partly because I’d read it was the most
foolproof option, and partly because an oil-based finish seemed like it would be
easier to apply than a surface finish like wipe-on poly to parts like this with
small channels and crevices.&lt;/p&gt;
&lt;p&gt;The problems I experienced with the finishing process were almost entirely due
to insufficient research. It didn’t occur to me until halfway through the
finishing process— after I’d already applied several coats of oil— to watch a
video demonstrating proper application. Instead, I read a few written
explanations, one of which used the phrase “flood the wood”, which for some
reason really stuck with me. So, for the first few coats I did exactly that: I
poured copious amounts of finish onto the parts, trying my best to flood them
with oil. Some of the aftermath is visible below.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/pencil-case-finishing-setup.D_CeYlp9_Z2a3ly6.webp&quot; alt=&quot;Parts for a wooden pencil case being finished with Danish oil&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot;&gt;&lt;figcaption&gt;Finishing setup.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This mistake seemed to be more messy and annoying than anything else. After
waiting about 15 minutes for the wood to absorb the oil, I would still wipe off
any excess, so— as far as I can tell— these early coats didn’t ruin my parts;
they just made for an unpleasant and tedious application process.&lt;/p&gt;
&lt;p&gt;Eventually I watched a video, figured things out, and applied later coats by
dipping a clean shop rag into the oil and then wiping it onto each part, which
made for a much cleaner experience.&lt;/p&gt;
&lt;p&gt;Between the last few coats, I also used 400 grit sandpaper and #0000 steel wool
on the outside of the case, which gave the exterior a great finish.
Unfortunately, because of the geometric complexity of the inside of the case, I
wasn’t able to give it the same treatment, so the interior is noticeably rougher
than the exterior. This, in my opinion, is the case’s biggest shortcoming. It’s
hard to notice at a distance, but can certainly be felt, and can make the case a
bit hard to open at times. I’m definitely going to be keeping this in mind for
future projects.&lt;/p&gt;
&lt;p&gt;Between testing out finishes, making mistakes, waiting for oil to cure in
between coats, and just generally dragging my feet, this process took me several
weeks to get to a finished product. Finally, I used CA glue to fasten magnets
into each case part. And with that, I called it done.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This was a fun project. Although it’s far from perfect, I use this case daily to
carry my pen and pencil. It works well enough, and I’m happy with what I
learned.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/pencil-case-final-shot.CC7kA_KV_16FluN.webp&quot; alt=&quot;Wooden pencil case on a table.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1920&quot;&gt;&lt;figcaption&gt;Finished pencil case.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</content:encoded><category>CAD</category><category>Woodworking</category><category>Machining</category></item><item><title>The Mountain in the Sea</title><link>https://alexbustos.com/experiments/books/the-mountain-in-the-sea/</link><guid isPermaLink="true">https://alexbustos.com/experiments/books/the-mountain-in-the-sea/</guid><pubDate>Sat, 05 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;premise&quot;&gt;Premise&lt;/h2&gt;
&lt;p&gt;In &lt;em&gt;The Mountain in the Sea&lt;/em&gt;, marine biologist Dr. Ha Nguyen works with
humanity’s only (allegedly) sentient android Evrim and Mongolian mercenary drone
operator Altantsetseg to investigate what they believe to be a civilization of
intelligent octopuses near the Con Dao archipelago off the coast of Vietnam.&lt;/p&gt;
&lt;p&gt;Some chapters focus on two other characters whose storylines loosely intertwine
with the main plot: Rustem, a Tatar hacker contracted to find an exploit in
Evrim’s connectome, and Eiko, a young Japanese man abducted in Vietnam and
forced to work on board an autonomous fishing vessel.&lt;/p&gt;
&lt;h2 id=&quot;the-vibes-are-great&quot;&gt;The Vibes Are Great&lt;/h2&gt;
&lt;p&gt;Something about this book’s setting and atmosphere managed to strike exactly the
right chord for me. From the opening scene:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Night. District Three of the Ho Chi Minh Autonomous Trade Zone. The plastic
awning of the café streamed with rain. Under its shelter, wreathed in kitchen
steam and human chatter, waiters wove between tables with steaming bowls of
soup, glasses of iced coffee, and bottles of beer. Beyond the wall of rain,
electric motorbikes swept past like luminescent fish.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah that rules.&lt;/p&gt;
&lt;p&gt;For me, the core of this, I think, is characters who have access to a ton of
technology but are surrounded mostly by nature. Something about that premise
appeals to me. Well, that, and breakfast.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the makeshift kitchen, Altantsetseg sat eating a hard-boiled egg. The table
was cluttered with the elements of a disassembled rifle, oil rags, several
terminals, and various electronic components…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The smell of fresh coffee managed to push back the scent in the lobby of gun
oil, ozone, mold, and neglect. An overcast early light came through the
windows, along with the salt-flesh smell of the sea. Altantsetseg indicated a
bowl of eggs and a stack of toast near the coffee machine with a flick of her
chin.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;thoughts-on-evrim&quot;&gt;Thoughts on Evrim&lt;/h2&gt;
&lt;p&gt;I suspect maybe this is the point of the character, but at least initially I
expected more out of Evrim. For them to make some superhuman discovery, maybe.
When they were first introduced, I kind of got Jukka Sarasti vibes from Peter
Watts’ &lt;em&gt;Blindsight&lt;/em&gt;, and I assumed Evrim was going to be playing 4D chess the
whole book. Other characters even suspect similarly. For example, from Dr.
Nguyen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How much does Evrim know? Everything all humans know? Or just some things?
How does that work? How smart is that brain?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And there are some scenes where Evrim displays flashes of superhuman skill, but
those moments felt more to me like Evrim being a living calculator rather than a
superhuman strategist. There’s a scene, for example, where they spot something
in a video recording that would’ve required software or specialized tooling for
a human to identify. For the most part, I felt Evrim became more alive and more
relatable as the storyline progressed.&lt;/p&gt;
&lt;h2 id=&quot;point-fives&quot;&gt;Point-Fives&lt;/h2&gt;
&lt;p&gt;Hey look, this book predicted GPT-4o!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“So, it’s a joke, right? Or not exactly a joke. Someone said that people don’t
really want to date other people. They don’t really want equal partnership—
you know, two full people in a relationship. What they want is one-point-five
people in the relationship. They want to be the complete one, the person who
controls the relationship— and they want the other person to be half a
person. You know, someone who gets them, but who doesn’t have their own
demands. Someone who appears complete, with all these personality quirks and
their own opinions and stories about the world— but not in an annoying way.
Not in a way that would demand you change. So six or seven years ago, this big
company in the SF-SD Axis that specializes in AI started cranking these out.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jokes aside, it’s impressive that Nayler nailed AI sycophancy so accurately and
came up with, in my opinion, such a plausible extrapolation of it, especially
considering that this book came out in October 2022—a month before ChatGPT was
released!&lt;/p&gt;
&lt;p&gt;Later in the book there’s a bit of a reveal that Kamran, a character I’d
interpreted as Dr. Nguyen’s long-distance partner, is actually (shocker) a
Point-Five. Dr. Nguyen then has a bit of a monologue where she explains what she
finds harmful about these pseudo-relationships.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“That’s how &lt;em&gt;addictive&lt;/em&gt; this is— the need to feel like there is always
someone there, unconditionally. Someone to talk to. Someone who understands.
To not have to do the work to &lt;em&gt;make myself understood&lt;/em&gt;. Instead, I just keep
on with this self-deception, pretending I had someone when I did not. I know
the doctors who prescribed you to me meant well. They thought they were
helping me through a dark time. But in the end, you aren’t anything but a
prosthesis. You can’t replace real support. You can’t call anyone to help me,
Kamran.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;He had kept her from wanting the things anyone should want— friendship with
others, a relationship with someone who had their own needs: someone who could
be offended, could walk away. That was the key: That ability of the other
person to leave, to disappear. The choice they could always exercise to &lt;em&gt;not&lt;/em&gt;
be there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This all seems like a pretty plausible fixture of the actual near future to me,
if not something that’s already going on to some degree.&lt;/p&gt;
&lt;h2 id=&quot;moravecs-paradox&quot;&gt;Moravec’s Paradox&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;High-maintenance, robots. Susceptible to all sorts of weather damage at sea.
Electricity and salt water are a bad combination. Rust, decay, short circuits.
Expensive. &lt;em&gt;We make better robots. Cheaper to maintain, more expendable.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One of the side characters, Eiko, is abducted and forced to work on board the
&lt;em&gt;Sea Wolf&lt;/em&gt;, an autonomous fishing vessel. A shipboard AI makes all of the
strategic business decisions for the ship: where to go, how long Eiko and the
crew have to work, even how much they get fed. It felt a bit like a paperclip
maximizer for marine protein (and therefore money). As the quote suggests, Eiko
and the rest of the crew are forced to do all the work that robots would be too
expensive to do— mostly hauling catches out of the water, then gutting and
processing the fish. Cool to see a reasoned-through plot that hinges
significantly on Moravec’s Paradox.&lt;/p&gt;
&lt;h2 id=&quot;cool-things-that-actually-exist&quot;&gt;Cool Things That Actually Exist&lt;/h2&gt;
&lt;p&gt;I always enjoy it when books mention interesting facts about the real world. In
this case, Dr. Nguyen and Evrim are discussing the octopus settlement they’re
studying and they compare it with
&lt;a href=&quot;https://en.wikipedia.org/wiki/Octopolis_and_Octlantis&quot;&gt;Octopolis and Octlantis&lt;/a&gt;,
which I was surprised to learn are real locations off the coast of Australia
where gloomy octopuses are known to gather and reside. Wikipedia even calls them
“non-human settlements.” So cool!&lt;/p&gt;
&lt;p&gt;Anyway, I liked this book, especially the atmosphere and setting.&lt;/p&gt;</content:encoded><category>Cyberpunk</category><category>Near-Future</category><category>Cephalopods</category></item><item><title>How much does it cost to change the settings on an Epson TM-T20III?</title><link>https://alexbustos.com/posts/receipt-printer-settings/</link><guid isPermaLink="true">https://alexbustos.com/posts/receipt-printer-settings/</guid><description>Not much, but it is non-zero.</description><pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;
&lt;p&gt;I recently purchased a used Epson TM-T20III thermal receipt printer to tinker
with, and I was surprised to discover that— despite the printer only having a
single button— you can manipulate its settings without having to use some
external app. To do this, the printer prints menus and a user inputs
combinations of button presses to navigate through them and modify settings. For
example, here’s a video of me adjusting the print speed setting.&lt;/p&gt;
&lt;figure&gt;&lt;video controls=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;source src=&quot;https://alexbustos.com/epson-settings.mp4&quot; type=&quot;video/mp4&quot; preload=&quot;none&quot;&gt;&lt;/video&gt;&lt;figcaption&gt;Changing print speed settings.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;And below are scans of each of the menus I navigated through.&lt;/p&gt;&lt;!-- TODO: this container should be &lt;figure&gt; so &lt;figcaption&gt; is semantically valid --&gt;&lt;div&gt;&lt;div class=&quot;grid grid-cols-3 grid-rows-1 gap-2 pb-2 overflow-clip&quot;&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/epson-settings-p1.BVKs-DTx_5c5Cj.webp&quot; alt=&quot;scan of a printed receipt&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;524&quot; height=&quot;1632&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/epson-settings-p2.BKIy1mdD_1SldjC.webp&quot; alt=&quot;scan of a printed receipt&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1117&quot; height=&quot;3478&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/epson-settings-p3.B-445NSG_1obJI3.webp&quot; alt=&quot;scan of a printed receipt&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1124&quot; height=&quot;3500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption class=&quot;border-l border-r border-b border-line hard-shadow&quot;&gt;Thermal printer menu interface.&lt;/figcaption&gt;&lt;/div&gt;
&lt;h2 id=&quot;getting-to-the-point&quot;&gt;Getting to the Point&lt;/h2&gt;
&lt;p&gt;To answer the question posed in the title: I paid $24.99 for a pack of 10
phenol-free thermal paper rolls. So, about $2.50 per roll. At 230’ of paper per
roll, we get a cost per millimeter of
&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;0.00003566&lt;/mn&gt;&lt;mfrac&gt;&lt;mtext&gt;$&lt;/mtext&gt;&lt;mtext&gt;mm&lt;/mtext&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;0.00003566\frac{\text{\textdollar}}{\text{mm}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;I measured the total length of the paper used in the video above to be 680mm.
The cost to change the print speed setting is then:&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mtable rowspacing=&quot;0.25em&quot; columnalign=&quot;right left&quot; columnspacing=&quot;0em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mtext&gt;Cost to change settings&lt;/mtext&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;Length of paper used&lt;/mtext&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mtext&gt;Cost per length of paper&lt;/mtext&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;680&lt;/mn&gt;&lt;mtext&gt; mm&lt;/mtext&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;0.00003566&lt;/mn&gt;&lt;mfrac&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;$&lt;/mi&gt;&lt;mtext&gt;mm&lt;/mtext&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;$&lt;/mi&gt;&lt;mn&gt;0.02425&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\begin{align*}
\text{Cost to change settings} &amp;amp;= \text{Length of paper used} \times \text{Cost per length of paper} \\
&amp;amp;= 680\text{ mm} \times 0.00003566 \frac{\$}{\text{mm}} \\
&amp;amp;= \$0.02425
\end{align*}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;So, at least for this particular setting and paper roll, the cost is around
$0.02.&lt;/p&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap-Up&lt;/h2&gt;
&lt;p&gt;The point of this post isn’t &lt;em&gt;really&lt;/em&gt; to figure out how much it costs to change
settings on this specific thermal printer. I was just surprised by this
interface (which I’ve since learned is standard in most receipt printers) and
thought it was particularly interesting and clever.&lt;/p&gt;
&lt;p&gt;Anyways, here’s &lt;code&gt;fastfetch&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;video controls=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;source src=&quot;https://alexbustos.com/thermal-printer-fastfetch.mp4&quot; type=&quot;video/mp4&quot;&gt;&lt;/video&gt;&lt;figcaption&gt;Thermal printer printing fastfetch.&lt;/figcaption&gt;&lt;/figure&gt;</content:encoded><category>Thermal Printer</category><category>Tinkering</category></item><item><title>3D Printed Spice Rack</title><link>https://alexbustos.com/posts/spice-rack/</link><guid isPermaLink="true">https://alexbustos.com/posts/spice-rack/</guid><description>Shelves.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;im-literally-fighting-entropy&quot;&gt;I’m Literally Fighting Entropy&lt;/h2&gt;
&lt;p&gt;Basically every cabinet in my kitchen is a cluttered mess. In fact, I realized
recently that the cabinet where I store my spices (amongst other things) is so
disorganized that I’ve just been buying duplicate spices instead of checking to
see what I have first.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/old-spice-cabinet.BliVyNsB_ZFEvYJ.webp&quot; alt=&quot;a cabinet with spices and other things&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;2877&quot;&gt;&lt;figcaption&gt;My spice cabinet.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;To stop double-buying, I decided to design some 3D printed shelves to make the
spices I have more visible.&lt;/p&gt;
&lt;h2 id=&quot;design&quot;&gt;Design&lt;/h2&gt;
&lt;p&gt;My plan was to attach a few small shelves to the cabinet door so that I could
have clear visibility and easy access to (most of) my spices. I took a few
measurements and discovered that most of the spice containers I own are in the
ballpark of 45mm on a side. Considering the width of the cabinet door, this
meant I’d be able to fit about 4 spice containers per shelf. Using these
measurements, I sketched out a remarkably crude drawing of what I had in mind.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/shelf-sketch.CCZWloVv_1z5rSy.webp&quot; alt=&quot;a sketch of a small shelf&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1282&quot;&gt;&lt;figcaption&gt;Shelf sketch.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;After some time in Fusion I came up with the design below. I added some cutouts
for command strips to mount the shelves to the cabinet door.&lt;/p&gt;

&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;/h2&gt;
&lt;p&gt;I printed off a single shelf, made a few small tweaks to the design after doing
a test fit, and then printed off the rest of the shelves.&lt;/p&gt;&lt;!-- TODO: this container should be &lt;figure&gt; so &lt;figcaption&gt; is semantically valid --&gt;&lt;div&gt;&lt;div class=&quot;grid grid-cols-2 grid-rows-1 gap-2 pb-2 overflow-clip&quot;&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/printed-shelf-front.s3IZWQTC_ZVPhK3.webp&quot; alt=&quot;front of a 3D printed shelf&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1282&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/printed-shelf-back.DR7s2Eln_3vw1A.webp&quot; alt=&quot;back of a 3D printed shelf&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1282&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption class=&quot;border-l border-r border-b border-line hard-shadow&quot;&gt;3D printed spice shelf.&lt;/figcaption&gt;&lt;/div&gt;
&lt;p&gt;Here’s what the shelves look like installed on the cabinet door. I can store 16
spices on the shelves, which, conveniently, is exactly how many I have right
now. Well, excluding duplicates.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/installed-spice-shelves.ChaJNNaK_Z1ANdYg.webp&quot; alt=&quot;spices on 3d printed shelves&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;2877&quot;&gt;&lt;figcaption&gt;Installed spice shelves.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap-Up&lt;/h2&gt;
&lt;p&gt;Obviously, this isn’t a 100% solution to my problem. Whenever I buy more spices
they’ll just start accumulating in the cabinet again. Still, it’s a welcome
improvement over the non-solution I had before.&lt;/p&gt;
&lt;p&gt;I’m trying to do more of this: small, imperfect projects that solve a problem,
even if it’s a tiny one. Plus, they’re just fun to do, and a great excuse to
bikeshed on new features for my website.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/sunrise-shelves.Bkw1W_n0_bhCik.webp&quot; alt=&quot;spices on 3d printed shelves at sunrise&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1920&quot;&gt;&lt;figcaption&gt;Golden hour spices.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</content:encoded><category>3D Printing</category><category>CAD</category><category>Spice</category></item><item><title>Bézier Curve and Surface Explorer</title><link>https://alexbustos.com/posts/bezier-curves/</link><guid isPermaLink="true">https://alexbustos.com/posts/bezier-curves/</guid><description>A CAD project for school.</description><pubDate>Fri, 28 Apr 2023 00:00:00 GMT</pubDate><content:encoded>
&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This was a project I did for a graduate class, &lt;em&gt;ME 6104: Computer Aided Design&lt;/em&gt;,
which primarily focused on understanding some of the fundamental building blocks
of modern parametric CAD software and implementing some of these concepts (like
Bézier curves and surfaces) with Python.&lt;/p&gt;
&lt;p&gt;For the course’s final project, I worked with a classmate to build a simple web
app (displayed above) with Svelte, Three.js / Threlte, TailwindCSS, and DaisyUI.
The app is designed with the intent of giving some intuition to the way Bézier
curves and surfaces work by allowing users to interact with curves and surfaces
in a 3D environment and visualize how each of the control points of the curve
affect the value of the curve (shown by enabling the &lt;code&gt;Indicator&lt;/code&gt;) at a given
point.&lt;/p&gt;
&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;
&lt;p&gt;I won’t go into a ton of detail about Bézier curves and surfaces here (there’s
some great explanations out there already, like
&lt;a href=&quot;https://www.youtube.com/watch?v=aVwxzDHniEw&quot;&gt;this one&lt;/a&gt; by Freya Holmér). For a
bit of context though, Bézier curves are made up of some number of control
points, and any point along the curve is defined entirely by the values of these
control points. Essentially, if you know the values of each of the control
points, you also know the equation of the Bézier curve composed of those points,
which is given by the following equation.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant=&quot;bold-italic&quot;&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/munderover&gt;&lt;msub&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;bold-italic&quot;&gt;p&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\bm{p}(u) = \sum_{i=0}^n f_i(u) \bm{p}_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Here, &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;f_i(u)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; represent &lt;strong&gt;basis functions&lt;/strong&gt; evaluated at &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;u&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;, which, in the
case of Bézier curves are &lt;strong&gt;Bernstein polynomials&lt;/strong&gt;, defined by the following
equation.&lt;/p&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence=&quot;true&quot;&gt;(&lt;/mo&gt;&lt;mtable rowspacing=&quot;0.16em&quot; columnalign=&quot;center&quot; columnspacing=&quot;1em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;false&quot;&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;false&quot;&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence=&quot;true&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;msup&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;B_{i,n}(u) = \begin{pmatrix}
n \\
i
\end{pmatrix} u^i (1-u)^{n-i}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;In this equation, variables have the following significance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;0 \leq u \leq 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; represents the relative distance between the start and end
point of the Bézier curve (it’s &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; at the end of the curve and &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; at the
end).&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; is an integer that represents the index of the control point, (the
starting point of the Bézier curve would have &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;i = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;, the second point of the
curve would have &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;i = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;, and so on).&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; is an integer that represents the order of the Bézier curve and is simply
equal to the number of control points in the curve - 1 (a curve with 4 control
points would have &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n=3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;, for example).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The app evaluates the value of the user-editable Bézier curve displayed in the
3D window at the &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;u&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; value of the &lt;code&gt;Indicator&lt;/code&gt;. It also preserves the values of
each of the basis functions used to compute the value of the curve at that
point. These values are displayed in the bar graph on the right, which is
intended to show how any point along the curve (with the exception of the start
and end points) is influenced in some part by each of the control points that
define the curve (i.e., any &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;u&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; value except &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;u=0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; or &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;u=1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; will yield non-zero
basis functions at every control point).&lt;/p&gt;</content:encoded><category>CAD</category><category>School</category><category>Svelte</category></item><item><title>Conformal Map Explorer</title><link>https://alexbustos.com/posts/conformal-maps/</link><guid isPermaLink="true">https://alexbustos.com/posts/conformal-maps/</guid><description>A math project for school.</description><pubDate>Tue, 29 Nov 2022 00:00:00 GMT</pubDate><content:encoded>
&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This was a project I did for a graduate class, &lt;em&gt;PHYS 6124: Mathematical Methods
of Physics&lt;/em&gt;. The class covered a wide range of important math topics for
physics, one of which was complex numbers and conformal maps. I’ll be honest,
when I was taking the class, an intuitive understanding of conformal maps eluded
me. And at the time of writing this post, I still can’t say I really understand
them that well. At the very least, I could appreciate that some prominent map
projections — such as the stereographic projection and the Mercator projection
— were conformal.&lt;/p&gt;
&lt;p&gt;At the time, I was just starting to explore frontend web development, and I was
really interested in D3.js, so I decided to try and tailor my final project for
the class to fit in some of these interests.&lt;/p&gt;
&lt;h2 id=&quot;implementation&quot;&gt;Implementation&lt;/h2&gt;
&lt;p&gt;The project page shown above is basically intended to give some sort of greater
understanding to conformal maps by allowing users to see how different maps
transition to each other, and how panning and rotating a map affects its
contents.&lt;/p&gt;
&lt;p&gt;Ultimately, this ended up being more or less a React-based implementation of
some other D3 projects out there
(&lt;a href=&quot;https://observablehq.com/@d3/projection-transitions&quot;&gt;like this one&lt;/a&gt;). And
unfortunately, using React was not a great experience for this particular use
case and probably just overcomplicated things. Based on my (limited)
understanding of React and D3, this is basically because React, with its virtual
DOM, and D3, are both trying to control the DOM, and managing this control
between the two can get tricky. You can check out the implementation on the
&lt;a href=&quot;https://github.com/bustosalex1/phys-6124&quot;&gt;project repo&lt;/a&gt; to see how weird it is
(or at least, how weird I managed to make it).&lt;/p&gt;</content:encoded><category>Math</category><category>School</category><category>React</category></item><item><title>CoreXY 3D Printer</title><link>https://alexbustos.com/posts/corexy-printer/</link><guid isPermaLink="true">https://alexbustos.com/posts/corexy-printer/</guid><description>A small 3D printer build.</description><pubDate>Fri, 05 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;This is a project I’ve been working on for a while. I designed and built my
first 3D printer in high school, but it just wasn’t great. It worked okay and
produced decent prints, but it had a really large footprint and a comparatively
small build volume. It also didn’t have any sort of auto-bed leveling and the
wire management was… bad. I’ve set out to build a few more printers since
then. Some of them didn’t even work, most of them never got finished, and one of
them worked decently, but suffered from similar design issues as the first
printer I designed. There were wires everywhere, the build area was small but
the footprint was not, and the whole thing was not very good looking.&lt;/p&gt;
&lt;h2 id=&quot;work&quot;&gt;Work&lt;/h2&gt;
&lt;p&gt;In the fall of 2019 I decided to give it another shot. I slowly worked through
the design in my free time from about August 2019 to June 2020. As of the
posting of this page (late June 2020), I’ve finally settled on a design that I
would call “finished.” I designed a number of parts for the printer in
SolidWorks. When I was initially working on the design, I used 3D printers
available at Georgia Tech to print these parts out. I also designed the X-axis
to be machined out of aluminum, which I machined on a CNC mill. Once I reached a
point where my printer was able to somewhat function on its own, I started using
it to print upgrades for itself. Here’s a rundown of some of the printer
specifications.&lt;/p&gt;














































&lt;table&gt;&lt;caption&gt;Printer Specifications&lt;/caption&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Spec&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Footprint&lt;/td&gt;&lt;td&gt;250mm x 250mm x 330mm (X x Y x Z)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Build Volume&lt;/td&gt;&lt;td&gt;150mm x 150mm x 180mm (X x Y x Z)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Motion System&lt;/td&gt;&lt;td&gt;CoreXY&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Control Board&lt;/td&gt;&lt;td&gt;32-Bit SKR Mini E3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stepper Drivers&lt;/td&gt;&lt;td&gt;TMC 2209&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bed Leveling&lt;/td&gt;&lt;td&gt;Automatic via Inductive Sensor&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Extruder&lt;/td&gt;&lt;td&gt;Dual-Gear Bowden&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Build Plate&lt;/td&gt;&lt;td&gt;Magnetic&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Linear Motion&lt;/td&gt;&lt;td&gt;Linear Rails on X and Y Axes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The first version of the printer (a partially disassembled version is shown
below), was used to print a bunch of parts for what I would consider the “final”
version.
&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/old-printer.6bOnxU4x_tQ8Hz.webp&quot; alt=&quot;initial version of 3D printer&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1000&quot; height=&quot;1500&quot;&gt;&lt;figcaption&gt;Initial version of printer.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/printer-parts.m-6i6Z1u_Z1sF821.webp&quot; alt=&quot;printed parts for final version of 3D printer&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1000&quot;&gt;&lt;figcaption&gt;Printed parts for final version of printer.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Overall, I am pretty satisfied with the final result. I’ve been running prints
at around 70 mm/s (at 2000 mm/s&lt;sup&gt;2&lt;/sup&gt; acceleration) as a baseline speed
and have gotten good results (you can see some of the prints in the gallery),
but I’ve also successfully run prints at up to 100 mm/s print speed with no
errors and little drop in print quality. I’m happy with the print quality and
parts dimensions come out accurately.&lt;/p&gt;&lt;!-- TODO: this container should be &lt;figure&gt; so &lt;figcaption&gt; is semantically valid --&gt;&lt;div&gt;&lt;div class=&quot;grid grid-cols-2 grid-rows-2 gap-2 pb-2 overflow-clip&quot;&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/printer-front.CPgNvpd-_ZXF5ha.webp&quot; alt=&quot;a picture of the front of a 3D printer&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;a. Front of printer.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/printer-top-angle.Ci_KXWDT_11Wzxq.webp&quot; alt=&quot;3D render of a small wooden box design&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1000&quot; height=&quot;1000&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;b. Top of printer.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/printer-iso-render.C7vXOsA5_16vR0X.webp&quot; alt=&quot;Isometric CAD Render of 3D printer.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;c. CAD render of printer.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/toolhead-render.BrY4lYvv_Z2mTIzi.webp&quot; alt=&quot;CAD render of 3D printer toolhead assembly.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1364&quot; height=&quot;1364&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;d. CAD render of printer toolhead.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption class=&quot;border-l border-r border-b border-line hard-shadow&quot;&gt;Finshed printer and CAD renders of current design.&lt;/figcaption&gt;&lt;/div&gt;
&lt;p&gt;If I were to start over, there would be a few things I would do differently. To
start, the printer has no belt tensioning system. I haven’t had any issues with
belts loosening over time (so far), but I think having a tensioning system would
be valuable to fine-tune the belt tension. Also, the printer currently runs on
12V electronics. I think next time I would’ve gone with 24V electronics for
smaller wires and faster motor speeds. While there’s a number of things I would
change and the printer is far from perfect, I’m very happy with the final result
and I had a lot of fun building it.
&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/sample-print.CbP1GR5Y_Za5mzO.webp&quot; alt=&quot;a 3D printed carabiner&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot;&gt;&lt;figcaption&gt;Sample printed part.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</content:encoded><category>3D Printing</category><category>CAD</category></item><item><title>3D Printed E-Bike Controller Case</title><link>https://alexbustos.com/posts/ebike-case/</link><guid isPermaLink="true">https://alexbustos.com/posts/ebike-case/</guid><description>An actual box.</description><pubDate>Sat, 30 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;
&lt;p&gt;Recently I purchased a kit to turn my regular bike into an electric bike. It
came with a hub-style motor, 1000W controller, a throttle, and a battery. To
secure the controller onto the bike frame, the kit came with a bag, which
worked, but it was kind of… not visually appealing and didn’t really allow for
neat wire management. The photo below shows what my bike looked like with the
bag mount. To solve these problems, I decided to 3D print a case that would
allow for neater wire management and an overall cleaner design. I ended up
designing a 4 part case that used screws and brass heat-set inserts to secure
everything together. It also had anchors for zip-ties to keep cables neatly
stowed away.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;a picture of an e-bike without a 3D printed controller case&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; src=&quot;https://alexbustos.com/_astro/old-bike.Bkbd_VdR_2mGJMH.webp&quot;&gt;&lt;figcaption&gt;Bike prior to 3D printed case.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;work&quot;&gt;Work&lt;/h2&gt;
&lt;p&gt;This project ended up being a great test of my recently upgraded CoreXY 3D
Printer. Up until this point, I had only ever printed relatively small parts. I
was happy to see that all of the case parts (each taking around 8-10 hours to
print) printed successfully. I think the final product came out pretty well, and
I really like the overall look of the bike.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;an exploded view of a 3D printed e-bike controller case&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; src=&quot;https://alexbustos.com/_astro/exploded-case-render.gIMpAGxz_Z1FbIwa.webp&quot;&gt;&lt;figcaption&gt;Exploded case assembly.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;</content:encoded><category>3D Printing</category><category>CAD</category></item><item><title>TARGIT CubeSat Target Subsystem</title><link>https://alexbustos.com/posts/targit-target/</link><guid isPermaLink="true">https://alexbustos.com/posts/targit-target/</guid><description>A CubeSat subsystem.</description><pubDate>Tue, 05 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;For a little background information, The Tethering and Ranging Mission of the
Georgia Institute of Technology (TARGIT) is a CubeSat Mission with the primary
objective of demonstrating a LiDAR imaging system on a CubeSat platform. In
order to test this imaging system, the satellite will deploy a small target with
its own power system, electronics, communications equipment, and sensors, that
will inflate a mylar balloon. This mylar balloon will serve as the target for
the satellite’s imaging operations.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/labeled-exploded-view.Bw3gHg1V_ZOAMHM.webp&quot; alt=&quot;a labeled exploded view of the target subsytem CAD&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot;&gt;&lt;figcaption&gt;Target architecture breakdown.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;system-overview&quot;&gt;System Overview&lt;/h2&gt;
&lt;p&gt;On &lt;a href=&quot;https://alexbustos.com/posts/targit-electronics&quot;&gt;another page&lt;/a&gt;, you can see my work on the
electronics used inside the “target” subsystem. This page mostly contains my
work on the target subsystem structure and its manufacture/assembly. I started
working on the target subsystem during the summer of 2019 and continued working
on it through the spring of 2020. The target structure houses all of the
necessary systems to allow the mylar balloon I mentioned earlier to inflate so
that the main satellite can image it. This includes solar panels,
retroreflectors, batteries, a microcontroller, a pressurized gas reservoir,
valves, a hard mounting point to tether the target to the main satellite, and a
number of other systems. The poster below, which a friend and I presented at the
2019 Symposium on Space Innovations, gives a good overview of the system
operations.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/ssi-poster.CIwX03TY_ahnVk.webp&quot; alt=&quot;a poster presentation for a small cubesat subsystem&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1728&quot; height=&quot;2592&quot;&gt;&lt;figcaption&gt;Target Subsystem SSI poster.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In order to inflate the balloon, pressurized gas must flow from a reservoir
through air channels and valves and into the balloon. Due to the complexity of
these reservoirs and channels, the target structure is almost entirely SLA 3D
printed. The basic idea is that there is a centerbody composed of several 3D
printed parts. These parts incorporate a number of features, including a gas
reservoir, recesses for electronics and a battery, and a series of air channels.
The centerbody structure is surrounded by spring-loaded hinged panels that fold
out once the target is deployed from the main satellite. While the basic
geometric constraints of these parts were established when I began working on
the project, I ended up designing from the ground up much of the structure. The
flight hardware was outsourced to a professional 3D printing company using SLA
technology and a material with high stiffness and temperature resistance. We
actually were able to get my designs manufactured before the end of the spring
2020 semester, which was super exciting. To prototype the structure, I used a
Formlabs Form 2 SLA 3D printer with standard resin. Using the same printing
technology as the professional manufacturers allowed me to see what sort of
features were possible to print and which features would be problematic.&lt;/p&gt;&lt;!-- TODO: this container should be &lt;figure&gt; so &lt;figcaption&gt; is semantically valid --&gt;&lt;div&gt;&lt;div class=&quot;grid grid-cols-2 grid-rows-3 gap-2 pb-2 overflow-clip&quot;&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/assembled-prototype.Cn_r-2ES_7l89y.webp&quot; alt=&quot;A 3D printed and machined prototype of a small satellite subsystem.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1501&quot; height=&quot;1501&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;a. Assembled prototype of target subsystem.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/bottom-render.DyUew1ub_Z101zPR.webp&quot; alt=&quot;CAD render of bottom of small satellite subsystem.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;b. CAD render of bottom of target subassembly.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/deployed-iso-render.w_e72kdz_1AE7vI.webp&quot; alt=&quot;Isometric CAD render of small satellite subsystem in deployed configuration.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;c. CAD render of deployed target assembly.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/internal-chambers.CrWBwY8F_ejhS6.webp&quot; alt=&quot;CAD render highlighting internal geometry of small satellite subsystem.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1501&quot; height=&quot;1501&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;d. Internal gas chambers and passages (highlighted in orange).&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/stowed-iso-render.C0pXN5dz_Z18JhOl.webp&quot; alt=&quot;Isometric CAD render of small satellite subsystem in stowed configuration.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;e. CAD render of stowed target assembly.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/unprocessed-printed-parts.K7jPWHiy_19GuaD.webp&quot; alt=&quot;SLA 3D printed parts for a small satellite subsystem.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;f. Unprocessed SLA 3D printed parts.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption class=&quot;border-l border-r border-b border-line hard-shadow&quot;&gt;Renders and images of target subsystem.&lt;/figcaption&gt;&lt;/div&gt;
&lt;h2 id=&quot;future-work&quot;&gt;Future Work&lt;/h2&gt;
&lt;p&gt;The design phase for the target structure is largely complete. As mentioned
earlier, we’ve ordered the professionally manufactured parts and are in the
process of moving on to assembling flight hardware and testing.&lt;/p&gt;
&lt;h2 id=&quot;a-long-overdue-update&quot;&gt;A Long Overdue Update&lt;/h2&gt;
&lt;p&gt;TARGIT actually launched to the ISS in December 2021 and was deployed from the
ISS in January 2022!&lt;/p&gt;
&lt;p&gt;We also successfully tested the target’s inflation capability wirelessly in a
large vacuum chamber in the High Power Electric Propulsion Lab at Georgia Tech.
The video below is demonstrating capability for a lot of things — wireless
communication, instrumentation of a burn wire keeping the target panels from
deploying, battery power, air-tightness of the 3D printed structure, solenoid
valve actuation, and, obviously, inflation.&lt;/p&gt;
&lt;figure&gt;&lt;video autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;source src=&quot;https://alexbustos.com/vac-chamber-testing.mp4&quot; type=&quot;video/mp4&quot;&gt;&lt;/video&gt;&lt;figcaption&gt;Target inflation testing in vacuum chamber.&lt;/figcaption&gt;&lt;/figure&gt;</content:encoded><category>3D Printing</category><category>CAD</category><category>Research</category></item><item><title>Voyager 1 Trajectory Simulation</title><link>https://alexbustos.com/posts/voyager/</link><guid isPermaLink="true">https://alexbustos.com/posts/voyager/</guid><description>An extra credit problem for school.</description><pubDate>Wed, 01 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;
&lt;p&gt;This was part of an extra credit problem for my Spacecraft Flight Dynamics
class. The prompt was to pick an interplanetary spacecraft and simulate its
orbit using MATLAB and then visualize the results. I had fun with the problem,
so I figured I would share some of the results.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/overall-trajectory.CG1qq6-V_Z1vbiQT.webp&quot; alt=&quot;overall voyager 1 trajectory&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;963&quot;&gt;&lt;figcaption&gt;Overall Voyager 1 trajectory.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;work&quot;&gt;Work&lt;/h2&gt;
&lt;p&gt;After choosing to simulate Voyager 1’s trajectory out of the solar system, I
opted for the patched conics approach and divided the trajectory intermediate
stages, including each of the spacecraft’s planetary flybys and its sun-centered
cruises. For each of the stages, I gathered initial values from
&lt;a href=&quot;https://ssd.jpl.nasa.gov/horizons.cgi&quot;&gt;NASA JPL’s HORIZONS tool&lt;/a&gt;. I supplied
the two body equation with these inital values and simulated each stage using
MATLAB’s &lt;code&gt;ode45&lt;/code&gt; function. The slideshow shows the final result of the
simulations. Some of the graphs may be hard to see, so feel free to click on any
one to get a larger, higher-definition image.&lt;/p&gt;&lt;!-- TODO: this container should be &lt;figure&gt; so &lt;figcaption&gt; is semantically valid --&gt;&lt;div&gt;&lt;div class=&quot;grid grid-cols-2 grid-rows-2 gap-2 pb-2 overflow-clip&quot;&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/saturn-flyby.Bwc41tav_Z1zznm5.webp&quot; alt=&quot;a plot of voyager 1&apos;s flyby at Saturn&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;a. Saturn flyby.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/saturn-flyby-closeup.DGu8Zva0_IGRop.webp&quot; alt=&quot;a closeup plot of voyager 1&apos;s flyby at Saturn&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;b. Saturn flyby closeup.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/jupiter-flyby.ddsh-0Hm_Z1J2WPl.webp&quot; alt=&quot;a plot of voyager 1&apos;s flyby at Jupiter&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;c. Jupiter flyby.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/jupiter-flyby-closeup.Cesh1lhe_Z1zARtQ.webp&quot; alt=&quot;a closeup plot of voyager 1&apos;s flyby at Jupiter&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;d. Jupiter flyby closeup.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption class=&quot;border-l border-r border-b border-line hard-shadow&quot;&gt;Voyager 1 flybys at Jupiter and Saturn.&lt;/figcaption&gt;&lt;/div&gt;</content:encoded><category>MATLAB</category><category>Orbital Mechanics</category><category>School</category></item><item><title>Fahrenheit 406 Hot Sauce</title><link>https://alexbustos.com/posts/hot-sauce/</link><guid isPermaLink="true">https://alexbustos.com/posts/hot-sauce/</guid><description>It&apos;s hot.</description><pubDate>Wed, 15 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;
&lt;p&gt;During my junior year at Georgia Tech I grew habanero peppers in my apartment. I
thought it would be fun to make hot sauce with the peppers I grew and I decided
to get my roommates in on it too. We came up with the name &lt;em&gt;Fahrenheit 406&lt;/em&gt;
since our apartment number for the year was 406. We took pictures of ourselves
and I designed and printed labels for the bottles. While the production value of
the sauce was at a solid level, the sauce itself just didn’t taste great and the
consistency was a little off.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/bottles.DMcmo63R_LpOQD.webp&quot; alt=&quot;bottles of hot sauce&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3125&quot; height=&quot;3125&quot;&gt;&lt;figcaption&gt;Bottles of sauce.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/plant.BDTMWYl6_Z1bie7.webp&quot; alt=&quot;habanero pepper plant&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3125&quot; height=&quot;3125&quot;&gt;&lt;figcaption&gt;Habanero pepper plant.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;a-second-attempt&quot;&gt;A Second Attempt&lt;/h2&gt;
&lt;p&gt;Sometime after our first batch, we made a trip to the DeKalb Farmer’s Market and
picked up some ghost peppers. We settled on a ghost pepper &amp;amp; mango recipe and
set about making Version 2 of the hot sauce. I think it came out great, and a
lot of our friends really enjoyed it. Unfortunately I didn’t take too many
pictures of the new sauce, but I have some images of the labels. I also had the
idea to make laser cut balsa wood crates as packaging. With the help of a friend
I machined a small aluminum crowbar for opening the crate. I’m sure if we ever
get the chance we’ll make some more sauce.&lt;/p&gt;&lt;!-- TODO: this container should be &lt;figure&gt; so &lt;figcaption&gt; is semantically valid --&gt;&lt;div&gt;&lt;div class=&quot;grid grid-cols-2 grid-rows-2 gap-2 pb-2 overflow-clip&quot;&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/box-panels.CtorVkLh_21qw13.webp&quot; alt=&quot;laser cut balsa wood box panels&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1563&quot; height=&quot;1173&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;a. Laser Cut V2 packaging.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/box-render.DPXs5IrN_Z1wQoAl.webp&quot; alt=&quot;3D render of a small wooden box design&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1563&quot; height=&quot;1563&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;b. V2 packaging render.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/crowbar.CwE5Io_t_Z2eJo4F.webp&quot; alt=&quot;a small aluminum crowbar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3125&quot; height=&quot;3126&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;c. Machined aluminum crowbar accessory.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/label-design.CN6LTI-j_Z1nzBq5.webp&quot; alt=&quot;label design for a hot sauce bottle&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3118&quot; height=&quot;1605&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;d. V2 label design.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption class=&quot;border-l border-r border-b border-line hard-shadow&quot;&gt;Fahrenheit 406 V2 design, packaging, and accessories.&lt;/figcaption&gt;&lt;/div&gt;</content:encoded><category>Sauce</category><category>Horticulture</category></item><item><title>Machined Aluminum Carabiner</title><link>https://alexbustos.com/posts/carabiner/</link><guid isPermaLink="true">https://alexbustos.com/posts/carabiner/</guid><description>Learning about CNC.</description><pubDate>Sat, 07 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;This was one of the first projects I made while figuring out the CNC machining
process. With the help of some friends, I first learned how to operate the mill
I would be using — a Series 1 Tormach PCNC 1100. After familiarizing
myself with the basics — workholding, toolchanging, jogging axes, sending
basic GCODE commands, etc. — I moved on to the CAD/CAM process.&lt;/p&gt;
&lt;p&gt;I designed the carabiner in Fusion 360 so that it could be machined mostly on
one side, with just a chamfer operation on the opposite side. Here’s a rundown
of the CAM operations I used:&lt;/p&gt;



























&lt;table&gt;&lt;caption&gt;CAM Operations&lt;/caption&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Operation&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Face stock with 1/2” endmill&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2D adaptive clear with progressively smaller endmills, starting at 1/2”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finishing contour with 1/8” endmill&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2D pocket with 1/16” ball endmill&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Drill holes with 1/16” drill bit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chamfer with 1/4” chamfer bit&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;machined carabiner in progress&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; src=&quot;https://alexbustos.com/_astro/in-progress-carabiner.OFwF7mCg_ZuniRo.webp&quot;&gt;&lt;figcaption&gt;Carabiner after initial machining operations.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Overall I think the carabiner came out pretty nice. It definitely isn’t perfect,
but I had fun making it and definitely learned a lot about CNC machining.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;a machined aluminum carabiner&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; src=&quot;https://alexbustos.com/_astro/finished-carabiner.B-a-akyA_ZFvGpn.webp&quot;&gt;&lt;figcaption&gt;Finished Carabiner.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;</content:encoded><category>Machining</category><category>CAD</category><category>CAM</category></item><item><title>Space Crane Systems Engineering Project</title><link>https://alexbustos.com/posts/space-crane/</link><guid isPermaLink="true">https://alexbustos.com/posts/space-crane/</guid><description>A systems engineering project.</description><pubDate>Thu, 20 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;During summer 2019 I took a systems engineering class. One of the assignments
was a group project involving the development of a reusable lunar access
vehicle. As the name of the class suggests, the project focused on the systems
engineering aspects of such a vehicle — defining the problem through
requirements and goals, creating CONOPS, developing mission timelines, creating
interface diagrams and morphological matrices, etc.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/conops.qyySe6OS_1xrRki.webp&quot; alt=&quot;concept of operations for a reusable lunar lander&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3599&quot; height=&quot;2024&quot;&gt;&lt;figcaption&gt;Space Crane concept of operations (CONOPS).&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I worked with two of my friends to create a concept architecture that we called
the “Space Crane,” which was inspired, at least in design, by the Eagle
Transporter from the &lt;em&gt;Space: 1999&lt;/em&gt; TV show. I created all of the concept
architecture CAD in Fusion 360 and I designed the CONOPS diagram using Adobe
Illustrator and Photoshop. I helped out with writing some of the mission
requirements and the mission morphological matrix. I also developed a project
timeline based on timelines for NASA’s Altair and James Webb Space Telescope
projects.&lt;/p&gt;&lt;!-- TODO: this container should be &lt;figure&gt; so &lt;figcaption&gt; is semantically valid --&gt;&lt;div&gt;&lt;div class=&quot;grid grid-cols-2 grid-rows-1 gap-2 pb-2 overflow-clip&quot;&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/labeled-diagram.BTRpNfIX_Z8QBcq.webp&quot; alt=&quot;a labeled diagram of a concept lunar lander&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2986&quot; height=&quot;2240&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;a. Space Crane architecture.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/modularity.CBxHt0Wv_1vzYVJ.webp&quot; alt=&quot;a labeled diagram of a concept lunar lander&apos;s different configurations&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3747&quot; height=&quot;3060&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;b. Space Crane modularity.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption class=&quot;border-l border-r border-b border-line hard-shadow&quot;&gt;Space Crane architecture and modularity.&lt;/figcaption&gt;&lt;/div&gt;</content:encoded><category>CAD</category><category>School</category><category>Systems Engineering</category></item><item><title>TARGIT CubeSat Mission Electronics Subsystem</title><link>https://alexbustos.com/posts/targit-electronics/</link><guid isPermaLink="true">https://alexbustos.com/posts/targit-electronics/</guid><description>A sub-subsystem for a CubeSat.</description><pubDate>Wed, 01 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;For a little background information, The Tethering and Ranging Mission of the
Georgia Institute of Technology (TARGIT) is a CubeSat Mission with the primary
objective of demonstrating a LiDAR imaging system on a CubeSat platform. In
order to test this imaging system, the satellite will deploy a small target with
its own power system, electronics, communications equipment, and sensors, that
will inflate a mylar balloon. This mylar balloon will serve as the target for
the satellite’s imaging operations. You can read more about the project
&lt;a href=&quot;https://bgunter.gatech.edu/research/targit&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;
&lt;p&gt;When I first started on the project in the fall of 2018, I worked on developing
some of the electronics systems for the target subsystem. The system is centered
around the TinyZero Microcontroller, which is basically just a tiny 32-bit
Arduino-compatible microcontroller. I designed a motherboard for the TinyZero
(shown below) that features power management/distribution features and a circuit
that actuates solenoid valves to inflate the mylar balloon. I also designed a
small shield for the TinyZero that allows it to interface with a radio
transceiver. This radio transceiver is what communicates with the main
satellite.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;https://alexbustos.com/_astro/schematic.D_W81cdy_Z1SyMBv.webp&quot; alt=&quot;a high level schematic of a circuit.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3125&quot; height=&quot;3125&quot;&gt;&lt;figcaption&gt;High level electronics schematic.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;prototyping&quot;&gt;Prototyping&lt;/h2&gt;
&lt;p&gt;Over the course of two semesters, I learned how to use Autodesk EAGLE to design
circuits and PCBs. I used on-campus resources, like the Mechanical Engineering
Electronics Lab, to get single sided PCBs milled to prototype with. After
validating my design, I moved on to a more compact two-sided design that was
professionally manufactured via OSHPark. I sourced all the components for the
board via DigiKey and assembled the board using a soldering iron. You can see
the progression from prototype to completed board in the images below.&lt;/p&gt;&lt;!-- TODO: this container should be &lt;figure&gt; so &lt;figcaption&gt; is semantically valid --&gt;&lt;div&gt;&lt;div class=&quot;grid grid-cols-2 grid-rows-2 gap-2 pb-2 overflow-clip&quot;&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/milled-board.CagHcdbo_25zROt.webp&quot; alt=&quot;a single sided PCB milled from a copper clad board.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;a. Single-sided milled prototype board.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/oshpark-board.yJeEnEG0_XEvBO.webp&quot; alt=&quot;a PCB manufactured by OSHPark.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;b. Professionally manufactured board.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/tinyduino-to-scale.B88sjoCJ_wqD2v.webp&quot; alt=&quot;a stack of TinyZero shields.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;c. TinyDuino stack.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;not-prose h-full w-full relative border border-line hard-shadow&quot;&gt;&lt;img src=&quot;https://alexbustos.com/_astro/board-comparison.Biol4c3L_ZADLYx.webp&quot; alt=&quot;A side by side view of the prototype board with the completed board.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1500&quot; height=&quot;1500&quot; class=&quot;object-cover h-full w-full&quot;&gt;&lt;div class=&quot;absolute left-0 right-0 bottom-0 border-t border-line-secondary bg-secondary-bg text-xs font-mono p-1&quot;&gt;d. Completed prototype board alongside completed professional board.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption class=&quot;border-l border-r border-b border-line hard-shadow&quot;&gt;Progression of board through development cycle.&lt;/figcaption&gt;&lt;/div&gt;</content:encoded><category>PCB Design</category><category>Electronics</category><category>Research</category></item><item><title>Air Mars Engineering Graphics Project</title><link>https://alexbustos.com/posts/air-mars/</link><guid isPermaLink="true">https://alexbustos.com/posts/air-mars/</guid><description>A CAD project for school.</description><pubDate>Thu, 12 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;
&lt;p&gt;In my second semester at Georgia Tech I took a class called Engineering
Graphics, which was basically a course on learning SolidWorks. The class
included a group project where I worked with some friends to conceptualize an
aerial drone to explore Mars. The parts that I designed for the drone can be
seen below. I also was in charge of keeping everyone’s parts organized in a
single assembly and creating various renders for our final presentation.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Parts I designed&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;6250&quot; height=&quot;6250&quot; src=&quot;https://alexbustos.com/_astro/parts.7NpIDmP__Zqjofb.webp&quot;&gt;&lt;figcaption&gt;Parts I designed.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;reflection&quot;&gt;Reflection&lt;/h2&gt;
&lt;p&gt;While I had fun making various parts and learning more about SolidWorks, I think
learning to communicate effectively was by far the most important skill I
developed from this experience. Initially we ran into a lot of problems,
especially having to do with scale. Since everyone’s parts interfaced with at
least one other person’s set of parts, we had to be deliberate in establishing
consistent dimensions across parts. To simplify things, we had everyone work on
a specific subassembly of the drone, so that there would be fewer interfaces
between different people’s parts.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Subassembly I designed&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;6668&quot; height=&quot;3751&quot; src=&quot;https://alexbustos.com/_astro/fuselage-subassembly.aov02YDO_Z1BUnV4.webp&quot;&gt;&lt;figcaption&gt;Subassembly I designed.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;</content:encoded><category>CAD</category><category>School</category></item></channel></rss>