236 lines
12 KiB
Plaintext
236 lines
12 KiB
Plaintext
---
|
|
import ExperienceLayout from "@layouts/ExperienceLayout.astro";
|
|
|
|
import H2 from "@components/H2.astro";
|
|
import H3 from "@components/H3.astro";
|
|
import Li from "@components/Li.astro";
|
|
import CustomCarousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
|
import PageGroup from "@components/PageGroup.astro";
|
|
import Paragraph from "@components/Paragraph.astro";
|
|
import Paragraphs from "@components/Paragraphs.astro";
|
|
import PrintedCircuitBoard from "@components/PrintedCircuitBoard.astro";
|
|
import SkillMatrix from "@components/SkillMatrix/SkillMatrix.astro";
|
|
import Timeline from "@components/Timeline/Timeline.astro";
|
|
import Ul from "@components/Ul.astro";
|
|
|
|
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
|
import { timelineFromPrintedCircuitBoard } from "@interfaces/printed-circuit-board.ts";
|
|
import type { categorySkills } from "@interfaces/skill-matrix.ts";
|
|
import type { timelineEntry } from "@interfaces/timeline.ts";
|
|
|
|
import { dechorionatorPcb } from "./dechorionator.ts";
|
|
import {
|
|
subTitles,
|
|
workingTimeline,
|
|
} from "./osu-sinnhuber-aquatic-research-laboratory.ts";
|
|
|
|
import assembly_internal_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/assembly-internal-overview.jpg";
|
|
import assembly_pcb_connected from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/assembly-pcb-connected.jpg";
|
|
import assembly_pcb_front_on from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/assembly-pcb-front-on.jpg";
|
|
import assembly_pcb_front from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/assembly-pcb-front.jpg";
|
|
import assembly_pcb_rear from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/assembly-pcb-rear.jpg";
|
|
import assembly_surround_front from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/assembly-surround-front.jpg";
|
|
import assembly_surround_rear from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/assembly-surround-rear.jpg";
|
|
import off_front_lid_open from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/off-front-lid-open.jpg";
|
|
import off_front from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/off-front.jpg";
|
|
import on_front_closeup from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/on-front-closeup.jpg";
|
|
import on_front from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/on-front.jpg";
|
|
import rear_water_manifold from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/rear-water-manifold.jpg";
|
|
import rear from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/rear.jpg";
|
|
import top_drain from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/top-drain.jpg";
|
|
import top_holder_closeup from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/top-holder-closeup.jpg";
|
|
import top_lid_open from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/top-lid-open.jpg";
|
|
import top_showerhead from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/top-showerhead.jpg";
|
|
import travel_setup from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/dechorionator/travel-setup.jpg";
|
|
import InlineLink from "@components/InlineLink.astro";
|
|
import PopoverWordDefinition from "@components/PopoverWordDefinition.astro";
|
|
|
|
const headerCarouselGroup: carouselGroup = {
|
|
animation: "slide",
|
|
images: [
|
|
off_front,
|
|
off_front_lid_open,
|
|
on_front,
|
|
on_front_closeup,
|
|
top_lid_open,
|
|
top_showerhead,
|
|
top_drain,
|
|
top_holder_closeup,
|
|
rear,
|
|
rear_water_manifold,
|
|
travel_setup,
|
|
|
|
assembly_surround_front,
|
|
assembly_surround_rear,
|
|
assembly_pcb_rear,
|
|
assembly_pcb_front,
|
|
assembly_pcb_front_on,
|
|
assembly_pcb_connected,
|
|
assembly_internal_overview,
|
|
],
|
|
};
|
|
|
|
const timeline: timelineEntry[] = [
|
|
...workingTimeline,
|
|
...timelineFromPrintedCircuitBoard(dechorionatorPcb),
|
|
];
|
|
|
|
const categorizedSkills: categorySkills[] = [
|
|
{
|
|
category: "Electrical",
|
|
skills: [
|
|
{
|
|
item: "Schematic & PCB Design",
|
|
subItems: [
|
|
{ item: "Mentor Graphics PADS" },
|
|
{ item: "Altium Designer" },
|
|
],
|
|
},
|
|
{
|
|
item: "PCB Assembly & Rework",
|
|
subItems: [
|
|
{ item: "Handheld Soldering" },
|
|
{ item: "Handheld Hot-Air Reflow" },
|
|
{ item: "Oven Reflow" },
|
|
],
|
|
},
|
|
{
|
|
item: "Electrical Diagnostics",
|
|
subItems: [{ item: "Multimeters" }, { item: "Oscilloscopes" }],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
category: "Software & Environments",
|
|
skills: [
|
|
{ item: "Git" },
|
|
{
|
|
item: "Programming",
|
|
subItems: [{ item: "Low-Level Embedded C/C++ (Atmel Studio)" }],
|
|
},
|
|
],
|
|
},
|
|
];
|
|
---
|
|
|
|
<ExperienceLayout title="Dechorionator" subTitles={subTitles}>
|
|
<CustomCarousel carouselGroup={headerCarouselGroup} />
|
|
<PageGroup>
|
|
<Fragment slot="header"><H2>Summary</H2></Fragment>
|
|
<PageGroup>
|
|
<Fragment slot="header"><H3>Timeline</H3></Fragment>
|
|
<Timeline timeline={timeline} />
|
|
</PageGroup>
|
|
<PageGroup>
|
|
<Fragment slot="header"><H3>Key Takeaways</H3></Fragment>
|
|
<Ul>
|
|
<Li
|
|
>Created an all-in-one tool for removing the chorions of zebrafish
|
|
embryos in a controlled and repeatable manner</Li
|
|
>
|
|
<Li
|
|
>Developed custom PCBs to handle motion, pump control, and user
|
|
interaction</Li
|
|
>
|
|
<Li
|
|
>Deployed multiple units to the lab, and one to an east-coast partner
|
|
laboratory</Li
|
|
>
|
|
<Li
|
|
>Cost reduced to roughly 1/5 that of the lab's previous dechorionation
|
|
hardware</Li
|
|
>
|
|
</Ul>
|
|
</PageGroup>
|
|
<SkillMatrix categorizedSkills={categorizedSkills} />
|
|
</PageGroup>
|
|
<PageGroup>
|
|
<Fragment slot="header"><H2>Details</H2></Fragment>
|
|
<Paragraphs>
|
|
<Paragraph>
|
|
Before delving into what was built, some quick context is probably
|
|
needed. A dechorionator is a device that removes <InlineLink
|
|
href="https://en.wikipedia.org/wiki/Chorion">chorions</InlineLink
|
|
> from embryos. Chorions are the outer membranes of an embryo which provide
|
|
protection, and a permeable membrane which can allow gasses and nutrients
|
|
to reach the developing animal inside. As SARL is a toxicology lab, and its
|
|
experiments need to be deterministic, this protective layer can drastically
|
|
skew tests results, and even worse, can can variances embryo to embryo, or
|
|
egg batch to egg batch. To remove this, a special protein is added to a petri-dish
|
|
full of embryos, and then the dish is gently swirled with jerking start and
|
|
stop motions. The goal is to provide light agitation between the embryo, the
|
|
dish, and their neighbors, helping the protein eat away the chorion and sluff
|
|
off into the dish. This can, and has been done by hand, but when I joined
|
|
SARL they already had two machines which which could automatically perform
|
|
this task. However, they were incredibly expensive and massively overcomplicated,
|
|
requiring a whole table's worth of custom shaker units, networked peristaltic
|
|
pumps, and servos. The engineering team was tasked with simplifying this setup
|
|
while reducing both their size and cost.
|
|
</Paragraph>
|
|
<Paragraph>
|
|
We started with a <PopoverWordDefinition key="COTS" /> shaker unit from the
|
|
company ELMI, which had a stepper-motor-based drive system, making it a perfect
|
|
candidate for easy retrofit. After gutting the existing electronics, and taking
|
|
some measurements, I started on a custom PCB design. Basic requirements were
|
|
that the board needed to be able to control the stepper motor, control the
|
|
speed of a liquid pump, provide controls to users, allow for config editing
|
|
from those controls, and provide a screen for cycle progress and editing those
|
|
config values. Since this was one of the first PCBs I'd ever designed and
|
|
hand-assembled, I started with a basic proof-of-concept which was for bench
|
|
use only (revision: 1.1.0). While I worked on the electronics, my co-worker
|
|
and good friend <InlineLink href="https://dylanthrush.com"
|
|
>Dylan Thrush</InlineLink
|
|
> was busy designing a top-plate for the shaker to hold the dishes, shower
|
|
them with water, and drain the pumped-in liquid.
|
|
</Paragraph>
|
|
<Paragraph>
|
|
First tests showed that the overall concept was going to work, just
|
|
needing signal conditioning for the rotary encoder to avoid ghosted or
|
|
missing inputs. A larger problem we found was that the brushed-dc-motor
|
|
driven peristaltic pump was not going to be able to supply the flowrate
|
|
needed to properly shower the four dishes. We'd already chosen one of
|
|
the highest-flowrate pumps which could fit inside the shaker housing,
|
|
and ended up having to pivot to a much more expensive one from TCS
|
|
Micropumps. Luckily, not only did it solve our flowrate problem, but
|
|
also held up much better to the saltwater solution being pumped through
|
|
it than our initial choice.
|
|
</Paragraph>
|
|
<Paragraph>
|
|
With the proof-of-concept design functional, I began a redesign of the
|
|
control PCB to replace the existing control panel and drive circuitry
|
|
from the ELMI shaker (revision: 3.0.0). The existing control circuitry
|
|
had a unique assembly design that I'd not encountered before, using a
|
|
PCB with solderable standoffs as the front panel, and soldered copper
|
|
strips as retention tabs. I was so fascinated by the design that I
|
|
decided to emulate it. Check out the images at the end of the reel above
|
|
to see how this unique assembly was put together! Around the time that
|
|
the PCBs were ready, we'd hired a new engineer, <InlineLink
|
|
href="https://www.linkedin.com/in/aaron-rito-2b754777/"
|
|
>Aaron Rito</InlineLink
|
|
>, who I tasked with writing the firmware while providing input and
|
|
guidance.
|
|
</Paragraph>
|
|
<Paragraph>
|
|
Over the next few months, many revisions were made to the firmware, as
|
|
well as mechanical designs for the showerheads and water manifold. Dylan
|
|
also had a final design for the top-plate milled out that looked
|
|
beautiful. Once those changes were complete, we provided the prototype
|
|
unit to the researchers, along with documentation on how to use the
|
|
tuning values. They then spent a few weeks running the new dechorionator
|
|
alongside the old ones, while tweaking these parameters until the
|
|
performance matched. We then built up four more units, and pre-flashed
|
|
them with this configuration. Three of these went into the lab, where a
|
|
total of four of our new dechorionators sat on the same table where just
|
|
two prior-generation ones used to live. It even had additional space for
|
|
pre and post prep work on the petri-dishes! The last one I installed in
|
|
a partner lab on the east coast after flying there with the head of the
|
|
lab, Robyn Tanguay and deputy director, Lisa Truong.
|
|
</Paragraph>
|
|
</Paragraphs>
|
|
</PageGroup>
|
|
<PageGroup>
|
|
<Fragment slot="header"><H2>Printed Circuit Boards</H2></Fragment>
|
|
<PrintedCircuitBoard pcb={dechorionatorPcb} />
|
|
</PageGroup>
|
|
</ExperienceLayout>
|