Added media for embryo pick and plate, including pcbs, made tweaks to pcb astro component for title and description, new H4 component, enabled zebrafish pnp and mars rover software team pages

This commit is contained in:
2025-12-17 17:37:44 -08:00
parent dac9e80efd
commit 22b6a06b32
43 changed files with 327 additions and 39 deletions

View File

@@ -84,7 +84,9 @@ convert_video_times:
-init_hw_device vaapi=va:/dev/dri/renderD128 \
-filter_hw_device va \
-i $(input) \
-vf 'format=nv12,hwupload,scale_vaapi=-2:720,trim=start=$(start):end=$(end)' \
-ss $(start) \
-to $(end) \
-vf 'format=nv12,hwupload,scale_vaapi=-2:720' \
-c:v h264_vaapi \
-rc_mode CQP \
-qp 28 \

View File

@@ -4,6 +4,7 @@ ASSEM
astrojs
Atmel
barebones
beaglebone
Bitwarden
Candian
caperren
@@ -47,6 +48,7 @@ offroad
Onshape
OSSM
OSURC
panelized
Passthroughs
pcbs
Perren
@@ -71,6 +73,7 @@ Steller
Tanguay
Teamcenter
timelapse
touchoff
triaging
trivago
Truong

Binary file not shown.

After

Width:  |  Height:  |  Size: 1017 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 MiB

5
src/components/H4.astro Normal file
View File

@@ -0,0 +1,5 @@
---
---
<h4 class="md:text-md text-xs sm:text-sm"><slot /></h4>

View File

@@ -2,6 +2,9 @@
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
import Ul from "@components/Ul.astro";
import H3 from "@components/H3.astro";
import H4 from "@components/H4.astro";
import PageGroup from "@components/PageGroup.astro";
import type {
printedCircuitBoard,
printedCircuitBoardRevision,
@@ -19,33 +22,37 @@ const semanticPcbRevisionSort = (
-((a.major - b.major) * 100 + (a.minor - b.minor) * 10 + (a.patch - b.patch));
---
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
{
pcb.revisions?.sort(semanticPcbRevisionSort).map((revision) => (
<div class="border-caperren-green block space-y-2 rounded-lg border bg-black py-2">
<div class="border-caperren-green flex flex-wrap items-center justify-between rounded-none border-b px-4 pb-2">
<div>
<span class="font-black">Revision:</span>
<span>
{revision.major}.{revision.minor}.{revision.patch}
</span>
<PageGroup>
<Fragment slot="header"
><H3>{pcb.name}</H3><H4>{pcb.description}</H4></Fragment
>
<div class="mt-1 grid grid-cols-1 gap-4 md:grid-cols-2">
{
pcb.revisions?.sort(semanticPcbRevisionSort).map((revision) => (
<div class="border-caperren-green block space-y-2 rounded-lg border bg-black py-2">
<div class="border-caperren-green flex flex-wrap items-center justify-between rounded-none border-b px-4 pb-2">
<div>
<span class="font-black">Revision:</span>
<span>
{revision.major}.{revision.minor}.{revision.patch}
</span>
</div>
<div class="text-sm italic">{revision.date.toISODate()}</div>
</div>
<div class="text-sm italic">{revision.date.toISODate()}</div>
<div class="px-4">
<Carousel
class=""
carouselGroup={{ images: revision.images }}
showBorder={false}
/>
</div>
{revision.notes && revision.notes.length > 0 && (
<div class="border-caperren-green border-t p-4 text-sm">
<Ul lineItems={revision.notes} />
</div>
)}
</div>
<div class="px-4">
<Carousel
class=""
carouselGroup={{ images: revision.images }}
showBorder={false}
/>
</div>
{revision.notes && revision.notes.length > 0 && (
<Ul
class="border-caperren-green border-t p-4 text-sm"
lineItems={revision.notes}
/>
)}
</div>
))
}
</div>
))
}
</div>
</PageGroup>

View File

View File

@@ -50,7 +50,6 @@ export const siteLayout: navLink[] = [
placeholderEntry: true,
},
{
enabled: false,
navText: "Zebrafish Embryo Pick and Plate",
isSubItem: true,
path: "zebrafish-embryo-pick-and-plate",
@@ -81,12 +80,10 @@ export const siteLayout: navLink[] = [
],
},
{
enabled: false,
navText: "OSU Robotics Club",
path: "osu-robotics-club",
children: [
{
enabled: false,
navText: "Mars Rover Software Team Lead",
path: "mars-rover-software-team-lead",
},

View File

@@ -19,7 +19,7 @@ import half_assembled_main_top_surround_bottom from "@assets/experience/osu-sinn
export const dechorionatorPcb: printedCircuitBoard = {
name: "Dechorionator",
description:
"Control board which provides motion and water flow control, along with user control and monitoring.",
"Control board which provides motion and water flow control, along with user control and monitoring",
revisions: [
{

View File

@@ -3,11 +3,13 @@ import ExperienceLayout from "@layouts/ExperienceLayout.astro";
import H2 from "@components/H2.astro";
import H3 from "@components/H3.astro";
import InlineLink from "@components/InlineLink.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 PopoverWordDefinition from "@components/PopoverWordDefinition.astro";
import PrintedCircuitBoard from "@components/PrintedCircuitBoard.astro";
import SkillMatrix from "@components/SkillMatrix/SkillMatrix.astro";
import Timeline from "@components/Timeline/Timeline.astro";
@@ -18,7 +20,7 @@ import { timelineFromPrintedCircuitBoard } from "@interfaces/printed-circuit-boa
import type { categorySkills } from "@interfaces/skill-matrix.ts";
import type { timelineEntry } from "@interfaces/timeline.ts";
import { dechorionatorPcb } from "./dechorionator.ts";
import { dechorionatorPcb } from "./dechorionator-pcbs.ts";
import {
subTitles,
workingTimeline,
@@ -42,8 +44,7 @@ import top_holder_closeup from "@assets/experience/osu-sinnhuber-aquatic-researc
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";
import { DateTime } from "luxon";
const headerCarouselGroup: carouselGroup = {
animation: "slide",
@@ -73,6 +74,16 @@ const headerCarouselGroup: carouselGroup = {
const timeline: timelineEntry[] = [
...workingTimeline,
...timelineFromPrintedCircuitBoard(dechorionatorPcb),
{
event: "Project Started",
eventDetail: "Initial Requirements Given",
date: DateTime.fromISO("2014-05-01"),
},
{
event: "Project Finished",
eventDetail: "Delivered Units to Lab",
date: DateTime.fromISO("2016-09-01"),
},
];
const categorizedSkills: categorySkills[] = [

View File

@@ -0,0 +1,91 @@
import { DateTime } from "luxon";
import type { printedCircuitBoard } from "@interfaces/printed-circuit-board.ts";
import control_bottom_1_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/bottom.jpg";
import control_top_1_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/1-0-0/top.jpg";
import control_assembly_bottom_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-bottom.jpg";
import control_assembly_top_beaglebone_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top-beaglebone.jpg";
import control_assembly_top_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/assembly-top.jpg";
import control_bottom_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/bottom.png";
import control_top_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/control/2-0-0/top.png";
import lights_assembly_bottom_1_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-bottom.jpg";
import lights_assembly_top_1_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/1-0-0/assembly-top.jpg";
import lights_assembly_bottom_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-bottom.jpg";
import lights_assembly_top_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/assembly-top.jpg";
import lights_top_panelized_2_0_0 from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pcbs/lights/2-0-0/top-panelized.png";
export const pnpLights: printedCircuitBoard = {
name: "Lighting Board",
description:
"Compact, bright, 24V lighting to provide high-contrast video for the pick and plate",
revisions: [
{
major: 2,
minor: 0,
patch: 0,
date: DateTime.fromISO("2014-09-23"),
images: [
lights_top_panelized_2_0_0,
lights_assembly_top_2_0_0,
lights_assembly_bottom_2_0_0,
],
notes: [
{
item: "First panelized PCB design, with built-in test features",
},
],
},
{
major: 1,
minor: 0,
patch: 0,
date: DateTime.fromISO("2014-04-07"),
images: [lights_assembly_top_1_0_0, lights_assembly_bottom_1_0_0],
notes: [
{
item: "Worked, but couldn't remove heat efficiently long-term",
},
],
},
],
};
export const pnpControl: printedCircuitBoard = {
name: "Driver Board",
description:
"Motion controller, and single-board-computer interface, for the embryo pick and plate machine",
revisions: [
{
major: 2,
minor: 0,
patch: 0,
date: DateTime.fromISO("2014-07-11"),
images: [
control_top_2_0_0,
control_bottom_2_0_0,
control_assembly_top_2_0_0,
control_assembly_bottom_2_0_0,
control_assembly_top_beaglebone_2_0_0,
],
notes: [
{
item: "Functional, but ultimately scrapped due to motion control complexity",
},
],
},
{
major: 1,
minor: 0,
patch: 0,
date: DateTime.fromISO("2013-12-02"),
images: [control_top_1_0_0, control_bottom_1_0_0],
notes: [
{
item: "First printed circuit board I ever designed, which was REALLY bad",
},
],
},
],
};

View File

@@ -1,5 +1,177 @@
---
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 Video from "@components/Media/Video.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 {
subTitles,
workingTimeline,
} from "./osu-sinnhuber-aquatic-research-laboratory.ts";
import {
pnpControl,
pnpLights,
} from "./zebrafish-embryo-pick-and-plate-pcbs.ts";
import installation_and_tuning from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/installation-and-tuning.jpg";
import interface_tuning_and_detection from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/interface-tuning-and-detection.png";
import off_controls_lid_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-lid-overview.jpg";
import off_controls_syringe_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-syringe-overview.jpg";
import off_controls_top_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-controls-top-overview.jpg";
import off_front_working_area_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front-working-area-overview.jpg";
import off_front from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-front.jpg";
import off_left from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-left.jpg";
import off_lighting from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-lighting.jpg";
import off_rear from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-rear.jpg";
import off_right from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-right.jpg";
import off_touchoff from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/off-touchoff.jpg";
import on_dishes_lighting_reflection from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-dishes-lighting-reflection.jpg";
import on_front_dishes_beakers from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-dishes-beakers.jpg";
import on_front_overview from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front-overview.jpg";
import on_front from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-front.jpg";
import on_screen from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-screen.jpg";
import on_touchoff_block_isometric from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/on-touchoff-block-isometric.jpg";
import pick_and_placing from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/pick-and-placing.mp4";
import precision_homing from "@assets/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate/precision-homing.mp4";
import { DateTime } from "luxon";
const headerCarouselGroup: carouselGroup = {
animation: "slide",
images: [
installation_and_tuning,
on_front_overview,
interface_tuning_and_detection,
on_front,
on_front_dishes_beakers,
on_screen,
off_touchoff,
on_touchoff_block_isometric,
off_controls_top_overview,
off_controls_syringe_overview,
off_controls_lid_overview,
off_front,
off_front_working_area_overview,
off_left,
off_rear,
off_right,
off_lighting,
on_dishes_lighting_reflection,
],
};
const timeline: timelineEntry[] = [
...workingTimeline,
...timelineFromPrintedCircuitBoard(pnpLights),
...timelineFromPrintedCircuitBoard(pnpControl),
{
event: "Project Started",
eventDetail: "Initial Requirements Given",
date: DateTime.fromISO("2013-12-01"),
},
{
event: "Project Finished",
eventDetail: "Delivered Units to Lab",
date: DateTime.fromISO("2016-09-01"),
},
];
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)" }],
},
],
},
];
const videos: string[] = [pick_and_placing, precision_homing];
---
<ExperienceLayout title="SARL - Zebrafish Embryo Pick and Plate" />
<ExperienceLayout title="Zebrafish Embryo Pick and Plate" 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>Placeholder</Li>
</Ul>
</PageGroup>
<SkillMatrix categorizedSkills={categorizedSkills} />
</PageGroup>
<PageGroup>
<Fragment slot="header"><H2>Details</H2></Fragment>
<Paragraphs>
<Paragraph> Placeholder </Paragraph>
</Paragraphs>
</PageGroup>
<PageGroup>
<Fragment slot="header"><H2>Videos</H2></Fragment>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
{
videos.map((video) => (
<Video
videoPath={video}
autoPlay={true}
loop={true}
playsInline={true}
/>
))
}
</div>
</PageGroup>
<PageGroup>
<Fragment slot="header"><H2>Printed Circuit Boards</H2></Fragment>
<PrintedCircuitBoard pcb={pnpLights} />
<PrintedCircuitBoard pcb={pnpControl} />
</PageGroup>
</ExperienceLayout>

View File

@@ -53,9 +53,9 @@ const headerCarouselGroup: carouselGroup = {
href="/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler"
>robotic oceanographic surface sampler</InlineLink
>
and an <InlineLink
and a <InlineLink
href="/experience/osu-sinnhuber-aquatic-research-laboratory/zebrafish-embryo-pick-and-plate"
>embryo pick-and-plate machine</InlineLink
>zebrafish embryo pick-and-plate machine</InlineLink
>. One my my proudest moments was when our club's mars rover took first
place at the Candian International Rover Challenge in 2018, for which I
was the <InlineLink