0%

About Me

You found me! I am Annie Li. My research focuses on Reinforcement Learning and Bayesian Optimization in Large Language Models (LLMs) and machine control, and I am especially interested in how humans collaborate with AI in areas such as prosthetics and fabrication, where machines extend human ability.

This site documents my progress in MAS.836 How to Make (Almost) Anything taught by Neil Gershenfeld through 14 weekly projects and a final project, with notes written to be clear enough to fully reproduce my work step by step. I am reachable through email: annieliy@mit.edu.

feature 1 feature 2


“Run toward the hardest problems. This approach has helped me to learn a tremendous amount from both success and failure.”
“We're so excited about technology. We can help turn the impossible into the possible.”
—— Lisa Su
“The people who are crazy enough to think they can change the world are the ones who do.”
—— Steve Jobs

Week 1 — Computer-Controlled Cutting

Vinyl Cutting

Quick stickers to celebrate MAS.863! I traced the course marks and icons, tuned stroke weights for vinyl, and cut them as high-contrast decals.

I experimented with ChatGPT to generate initial vinyl sticker mockups PNGs. Then I vectorized them and adjusted paths in inkscape in Inkscape, and prepare them for the vinyl cutter. Through this process, I learned the importance of clean outlines, kerf considerations, and simplifying shapes for weeding.

Vinyl sticker reference artwork
Reference artwork used for the vinyl traces.
Vinyl stickers after cutting
Final cut & not yet weeded stickers.

Process of tracing and preparing the design in Inkscape.

Process

  1. Software & Setup. Import the design into the vinyl-cutter software; connect the cutter to power and your computer.
  2. Load Vinyl. Feed the roll; choose Roll on the machine; align so the pinch rollers sit on the grit rollers.
  3. Adjust Blade. Set blade depth so it cuts the vinyl but leaves the paper backing intact.
  4. Send Design. Send the job from software. Set pixels to 200 (≥ 72; adjust as needed), click Calculate, then Connect to the cutter and start the cut.
  5. Unload & Apply. Remove the sheet, weed the excess, apply application tape, then transfer to the surface.

Learning from Mistakes

In the bottom left corner, I made a vinyl cutter beginner mistake during designing the sticker "Parametric Design". To get the final product, I have to remove the little squares inside the net like structure bit by bit... Therefore, use simple shapes & straight lines for vinyl cutter design.

And there you have it; the final weeded product!

Final vinyl stickers after cutting and weeding
Final cut & weeded stickers (ready for transfer).

Files

Laser Cutting

w1 pic 1 w1 pic 2 w1 pic 3

Laser Cut — Idea

Mid-Autumn Festival Style Lantern

Laser Kerf Characterization

We tested power/speed and measured kerf; our press-fit offset was +0.18 mm.

Parametric Press-fit Kit

  • Material: 3 mm cardboard
  • Parameters: thickness, tab_width, angle
  • Multiple assemblies: cube, lantern, lantern without handle
  • Extra: living-hinge arc panel (not flat) (didn't get to it this time; will try next time!)

Project Demo

Week 1 laser-cut design layout from Fusion 360

My laser-cut design layout design notes.

Week 1 laser-cut design layout from Fusion 360

Laser-cut design layout with parameters labeled from Fusion 360.

Design Process

I parameterized all pieces around thickness, tab_width, and the overall panel width. The side panels are mirrored; the front and back share geometry; and all slots subtract 2 × thickness from the internal clearances. Tabs are evenly spaced and sized to press-fit with the measured kerf offset (+0.18 mm).

I iterated through test cuts to tune slot_clearance for cardboard springiness, then finalized the handle, base, and top.

Project Demo — design → cut → assembly (Week 1)

First Time Laser Cutting - Bringing 2D Designs into 3D Reality

I have some previous experience designing 3D shapes in CAD, but I had never actually built them in real life. This was my first time using a laser cutter, and I was instantly hooked—I couldn’t stop wanting to learn more. (Shout out to Jesse for his amazing teaching style; I didn’t zone out for a single moment!) I’m officially addicted now.

I initially set my slot width to slightly more than 2 mm (2.94 mm), based on recommendations from my research[2]. But when I went to the makerspace and measured the actual cardboard thickness, I become concerned that the slots might not fit properly with the tabs.

I joined Tushar and Mariam for my first time laser cutting. We helped each other in the laser cut process (such as Tushar’s magnificent use of the Blue laser engraving) and in CAD (such as slot width, cardboard thickness, and kerf)!

First Time Reaction

I was fascinated by how the laser cutter decided its path—it seemed to cut here and there instead of following one continuous line. Small fires and little bursts of smoke appeared from time to time, yet the cutter moved with incredible precision. It was mesmerizing to watch!

Laser Cutting

Big shout out to J e s s e , for walking me through the laser cutter & safety training detail by detail, and watching me do the whole process while giving instructions!

Quick Steps

  1. Wear safety glasses.
  2. Plug in the USB drive.
  3. Open the USB and locate your .svg or .dxf file.
  4. Open InkscapeNew document.
  5. File → Import… and choose the file from the USB.
  6. Select all (/Ctrl + A) and scale to fit the page. Use /Ctrl + mouse wheel to zoom.
  7. Set stroke color by intent:
    • Red — Cut through
    • Blue — Engrave / score
  8. Print (/Ctrl + P) → click More settings.
    Material: Cardboard
  9. Set Power and Speed (Please see Test Result Notes below). Hit Apply and OK, then Print.
  10. Put material in laser cutter. Set XY home by bringing the icon to the edge of pattern, check inside the laser cutter to see if the laser is out of material margin.
  11. Optional Focusing: Place focal tool on the material. Manually lower the laser head or raise the machine's bed until the nozzle gently touches the top of the focus tool by pressing Ʌ/V on laser cutter to adjust for Z-Axis Height(If there are people using the laser cutter before you, no need to adjust Z Height). Remove the focus tool from under the nozzle.
  12. Last Check: Gas Assist and Laser Cutter is turned on.
  13. Initiate Cutting: Start the cutting job from the control panel.
  14. Finishing: Remove Parts, clean the area. Apply any necessary finishing touches, such as cutting, painting, or assembly.
First Test Cut

Test Results

Setting Value Observation
Power Red 100%
Blue 100% First layer of cardboard cut through
Blue 75% Engraving color too light
Blue 85% Perfect
Speed Red 30% First cut: did not cut through. Second cut: smokes & small fires, still incomplete; needed knife.
Red 20% Mostly cut through, but second layer needed knife. Result resembled perforated Amazon box.
Red 15% or lower Recommended to test
Blue 100%
Set Power and Speed
Set XY Home
w1 pic 5 w1 pic 6 w1 pic 6

Learning from Mistakes

My second attempt at laser cutting did not work for my final product, because my dimensions and ratios are off once I imported and adjusted them in the laser cutter computer.

I reused the card board which has some of it cut out. In my second cut, the pattern over lapped with the cut out part from trial 1, causing the laser to shoot through the honeycomb structure underneath the material. I will make sure to aviod next time, and I have to do a second cut to get the shape!

Kerf

In my test trial, my tabs & slots are a lose fit due to kerf from cutting a second time.

In my actual laser cutting session, my tabs are too big (all the bad thoughts of having to go back to fusion, my life flashed before my eyes), but luckily it is cardboard, I start pinching the tabs until they fit into my slots!

Engraving in Laser Cutting

Engraving vs. cutting in Inkscape and the lab software: I follow the lab convention Blue = Engrave, Red = Cut, and set power/speed based on the table above.

Steps

  1. Separate geometry by operation. Select paths you want to engrave (fills, hatch, logos) and those you want to cut (outer profiles).
  2. Assign stroke colors:
    • Blue (#0000FF) = Engrave
    • Red (#FF0000) = Cut
    In Inkscape: Object → Fill and Stroke → Stroke paint. Set Fill = None. In Stroke style, use a thin width (e.g., 0.1 mm) for clarity.
  3. Check real size. File → Document Properties to confirm page units (mm/in). With your artwork selected, verify W/H on the toolbar. Lock proportions and type exact dimensions if needed.
  4. Export for the laser. Save as Plain SVG (or PDF if your lab prefers). Keep colors intact.
  5. Map colors to processes in the laser software.
    • Blue (Engrave): set Speed high / Power lower for surface mark.
    • Red (Cut): set Speed lower / Power higher for through-cut.
    Use the lab’s recommended values from the table above, then run a small test square.
  6. Focus, frame, test. Check focus height, run a frame pass, and do a 10–20 mm test to confirm mark depth and cut-through without charring.
Engraving setup & color-layer mapping workflow.
Engraved lantern tab showing mismatch
Engraving mistake: tab dimensions mismatch with the front panel.

What Went Wrong (and Fix)

The engraved tab should match the front tab dimensions, but they differ here because I didn’t re-check sizes in Inkscape before cutting. Fix: verify units and W/H for both parts, use Align and Distribute to compare, and run a paper print check before sending to the laser.

Quick Pre-Flight Checklist

  • Units correct (mm or inches) and page size set.
  • All cut paths = Red, all engrave paths = Blue, fill = none.
  • No duplicate/stacked paths (Edit → Select Same → Stroke color, then Path → Combine as needed).
  • Dimensions match your sketch/CAD; do a paper print at 100% to confirm fit.
  • Test swatch for power/speed per the table; adjust if edges char or don’t go through.

Final Assemblying

My Assemblying Video

Finished Product

Finished Lantern

Mid-Autumn Festival Lantern

w1 pic 9 w1 pic 10 w1 pic 11
Effect in Dark Room
Silhouette Light Effects

Files

References

[1] Alfonso's Fusion 360 Tutorial: https://alfonso.pages.cba.mit.edu/recitations/parametric_design.html

[2] Laser Cut Slot Dimension: https://www.reddit.com/r/lasercutting/comments/16yn0e9/laser_cutting_slot_sizetolerance_recommendation/

[3] CAD Parameterization Tutorial: https://www.youtube.com/watch?v=tx89UXMeqwQ

Week 2 — Embedded Programming

Week 2 · Embedded Programming

Seeed XIAO RP2040 · LEDs · Capacitive touch on a copper PCB · I²C OLED · Serial plotting

RP2040 LED Test (Arduino)

              
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// LED pins #define PIN_RED 17 #define PIN_GREEN 16 #define PIN_BLUE 25 void setup() { pinMode(PIN_RED, OUTPUT); pinMode(PIN_GREEN, OUTPUT); pinMode(PIN_BLUE, OUTPUT); digitalWrite(PIN_RED, HIGH); // LEDs are active-low on this board digitalWrite(PIN_GREEN, HIGH); digitalWrite(PIN_BLUE, HIGH); } void loop() { digitalWrite(PIN_GREEN, LOW); delay(500); digitalWrite(PIN_GREEN, HIGH); digitalWrite(PIN_BLUE, LOW); delay(500); digitalWrite(PIN_BLUE, HIGH); digitalWrite(PIN_RED, LOW); delay(500); digitalWrite(PIN_RED, HIGH); delay(500); }
Serial plotter: capacitance spikes when touching the copper pads.
Blink LED
Serial Monitor

OLED Scrolling Text (Arduino)

              
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED width (px) #define SCREEN_HEIGHT 64 // OLED height (px) #define SCREEN_ADDRESS 0x3C // 0x3C or 0x3D Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); void setup() { // initialize Serial port Serial.begin(9600); delay(50); // initialize display if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for(;;) { } // halt } display.clearDisplay(); // text settings display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 25); display.print("Labubu"); display.display(); // ---- enable hardware scrolling (pick ONE) ---- display.startscrollright(0x00, 0x0F); // scroll entire screen to the right // display.startscrollleft(0x00, 0x0F); // scroll to the left // display.startscrolldiagright(0x00, 0x0F); // diagonal right // display.startscrolldiagleft(0x00, 0x0F); // diagonal left } void loop() { // Nothing needed here; the OLED handles scrolling. }
Uses Adafruit SSD1306 hardware scroll; set direction by swapping the startscroll* call.

OLED Sketch (snippet)

              
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_ADDRESS 0x3C Adafruit_SSD1306 display(128, 64, &Wire, -1); void setup() { Serial.begin(9600); delay(50); display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); } void loop() { display.clearDisplay(); display.setCursor(28, 25); display.print("Labubu!"); display.display(); delay(250); }

Assignment Goals

  • Browse the RP2040 datasheet.
  • Write & test programs that interact with local I/O (LEDs, touch, OLED).
  • Communicate data to the computer (serial + live plotting).
  • Extra: I have made plans to try PlatformIO and ESP32, but I don't know where to start yet.

Local Input & Output

1) LEDs

According to Quentin Bolsée's example, it defined pins for red, green, and blue LEDs and blinked them in sequence to verify digital GPIO control.

2) Touch Sensing on Copper Board

The copper pads on my custom board act as capacitive sensors. When a finger touches a pad, the effective capacitance increases. The RP2040 measures this by timing charge/discharge cycles; the measurement rises on touch, and plotting those values yields a real-time graph of touch intensity.

3) OLED Display (I²C)

Using the Adafruit SSD1306 library, I initialized a 128×64 display and printed text (e.g., “Labubu!”). This validates I²C communication between the microcontroller and display.

Communication with the Computer

The sketch streams touch values over Serial. In the IDE’s plotter, touches show up as spikes, satisfying the “interact + communicate” requirement.

Physics Rationale (Why Numbers Rise When I Touch)

A capacitor stores charge: Q = C · V. The copper pad and ground form a capacitor with air (and board materials) as the dielectric. Your body behaves like a large conductive object near ground; touching the pad increases the pad’s capacitance C. The microcontroller senses this via timing, so the reported value increases—what you see as rising numbers and peaks in the plot.

Reflection

This week tied together sensing (capacitive touch), processing (RP2040), and output (LEDs/OLED) with simple physics. Arduino made it straightforward to connect hardware effects to visual feedback.

Week 3 — 3D Scanning and Printing

3D Printing

玲珑球 inspiration

Inspiration

My Week 3 3D printing project is inspired by the traditional 玲珑球 (Línglóng Ball/Nested Ball), an extraordinary hand-crafted artifact from the Qing Dynasty. These intricate puzzle balls, carved from a single piece of ivory, often contain multiple concentric spheres nested inside each other, each freely rotating. They reflect the pinnacle of Chinese artisanship: precision, patience, and the pursuit of impossibility.

What fascinates me is how these artifacts parallel the challenge of non-subtractive design in digital fabrication. Just like artisans achieved the impossible by hand, 3D printing allows us to create nested and interlocked geometries that machines cannot carve subtractively. My design takes direct inspiration from this tradition, reimagined through modern additive manufacturing.

I also drew inspiration from Lingdong, an alumnus of this class, who created a modern reinterpretation of the 玲珑球/Nested Ball in his own Week 6 project.

Fusion 360 Design

Here is my own attempt to reinterpret the Nested Ball using Fusion 360. I modeled nested shells with Voronoi patterned cutouts uisng Meshmixer, capturing the spirit of the original hand-carved puzzle balls, while showcasing what 3D printing makes uniquely possible.

Torus Knot

Torus Knot CAD Model

Finished Torus Knot checking for continuity.

Twisted torus ring render

Inspiration

This piece reinterprets the flowing, braided rhythm of traditional Chinese jade bracelets known as 绞丝 / 麻花镯. The form is a continuous tube that follows a circular path and twists multiple times, creating a braided silhouette that reads as soft silk but is printed as a single body.

This design is inspired by the braided jade bracelets (绞丝纹 / 麻花手镯) of the Qing Dynasty, important artifacts in the Shanghai Museum that exemplify the elegance of rhythmic linework and the technical mastery of jade carving. These bracelets are considered standard forms of Qing court art, with the twisted silk-like pattern representing both aesthetic refinement and extraordinary craftsmanship.

My STL explores the rarer, high-craft variant: the bracelet is effectively hollow and interlocking—the apparent strands weave around each other without being fused inside, echoing museum pieces where carvers created the illusion of independent helices. Additive manufacturing lets me realize this as a single print, while preserving the visual logic of interlaced jade cords.

Files

Specs
  • Ring outer Ø: ~80–100 mm (parametric)
  • Tube Ø: ~2.5–3.5 mm
  • Twist: 720°–1440° (2–4 full turns around the ring)
  • Optional braided look via Circular Pattern (8–16 copies)

Modeling Steps (Fusion 360)

Bracelet Modeling Step 1 Bracelet Modeling Step 2
Full Fusion 360 Tutorial
  1. On the XY plane, sketch a 30 mm diameter circle with its center positioned 100 mm from the origin (this is the base path reference).
  2. On the perimeter of that larger circle, sketch a 10 mm diameter circle (strand profile).
  3. Use Trim to remove the portion of the large circle that lies inside the small circle, leaving two distinct circles.
  4. Open Modify → Move/Copy. Select the entire sketch and set the pivot to the origin. Click Confirm (to lock the pivot at the origin).
  5. Make a copy of the sketch and rotate it –5° about the Y-axis (pivot at the origin).
  6. Repeat the copy/rotate operation to create six additional copies, each rotated by an extra . Stop when you have 8 sketches total evenly distributed around the origin.
  7. For the second sketch (the one at –5° about Y), select only its small circle. In Modify → Move/Copy, set the pivot to the center of its corresponding large circle. Align the pivot by draging rotation manipulator (the small circle by the arrows) to the center of the small circle of the sketch.
  8. Rotate that small circle by 45° about the Z-axis.
  9. Repeat the previous step for the remaining small circles so they are sequentially offset by 90°, 135°, 180°, … relative to the first sketch’s small circle.
  10. Use Trim to remove all remaining large circles. You should now have a ring of small profile circles with progressive angular offsets.
  11. With all profiles complete, select the entire sketch group and open Modify → Move/Copy. Set the pivot at the origin and confirm. Create copies of the group, rotating each by 40° increments until the sequence closes the full 360°.
  12. Use Create → Loft and sequentially select the small circles in 3D to connect them into a smooth, continuous strand around the ring.
    Tip: If a loft fails, check profile order and spacing; adjust angles or add guide profiles as needed.
  13. With the strand body created, open Modify → Move/Copy, set pivot to origin, confirm, and make a copy rotated by 10°.
  14. Create three copies total (original + 3), each offset by 10°, to form four interwoven strands. Inspect continuity, then export as .stl.
    Print note: Lay the ring flat; 0.16–0.20 mm layers, 3 perimeters, 10–20% gyroid infill.

Print Plan

  • Material: PLA / PETG
  • Nozzle: 0.4 mm  •  Layer: 0.16–0.20 mm
  • Perimeters: 3  •  Infill: 10–20% gyroid
  • Supports: Not needed if printed flat; add a 5–8 mm brim
  • Orientation: Lay the ring flat for strength and surface finish

3D Scan Banana

Using Creality Ferret 3D, I scanned a banana I retrieved from the Banana Lounge.

Week 4 — Electronics Design

Coming soon.

Week 5 — Electronics Production

Coming soon.

Final Project — Marauder’s Map of MIT

I don’t have a fully formed idea yet—and I don’t want to butcher it. The theme will be Hogwarts. I’m proudly Gryffindor 🦁 (though, most people at MIT are Ravenclaws, wonder why 🦅). I’ll use the next weeks to prototype and decide.

Gryffindor inspiration photo
Moodboard start: Gryffindor palette & heraldry.

I’m committing to a Gryffindor-flavored Marauder’s Map… of MIT. The campus is perfect for this: numbered buildings (E62, 14, 26), secret tunnels, and legendary hacks. The piece will be a wall map that “reveals” animations and locations when touched—think Lobby 10 glow, tunnels lighting up, and Easter eggs for hacks and routes.

MIT campus outline mockup with numbered buildings
Concept sketch: numbered buildings (e.g., 14, 26, E62) + tunnel routes; touch zones light paths.

Interaction

  • Capacitive touch pads on key buildings (e.g., 14, 26, E62, Lobby 10).
  • Touch a building → LED traces animate along the tunnel/path to the next landmark.
  • Hidden hack icons (Easter eggs) trigger special light/sound sequences.
  • Optional: “I solemnly swear…” phrase sensor (touch strip) to wake the map.

Build Plan

  • Top layer (graphics): laser-engraved veneer/ply or heavy paper with the MIT plan; numbered labels (no names—pure numbers).
  • Middle layer (light guide): laser-cut acrylic channels or vellum diffusers for paths.
  • Electronics layer: addressable LEDs (WS2812/NeoPixel) for routes; capacitive touch pads (copper tape or PCB pads) wired to a microcontroller.
  • Frame: shallow shadow-box to hide wiring and provide diffusion depth.

Electronics & Wiring

  • MCU: ESP32 or Arduino Nano (ESP32 preferred for touch/IO count and animations).
  • Touch sensing: ESP32 built-in capacitive GPIOs, or an MPR121 breakout if needed.
  • LEDs: WS2812B strips or segments; 5V power rail sized for peak current (e.g., 5V/3–5A).
  • Power: wall adapter (5V). Add a large electrolytic (~1000 µF) across +5V/GND near LED in.
  • Protection: 330–470 Ω series resistor on LED data; common ground; star-ground layout to reduce noise.
  • Wiring: ribbon cable or magnet wire along channels; strain-relief at frame; JST connectors for serviceability.

Firmware Features

  • Touch → debounce → play route animation (building A to B, tunnel highlight, pulsing beacons).
  • Idle scenes: slow “constellation” twinkles over the map; night mode dimming.
  • Easter eggs: special sequences for iconic hacks or date-based triggers.

Milestones

  • Prototype (1–2 days): single building touch → short LED path on a cardboard mockup.
  • Layout (3–4 days): finalize vector map; test engraving depth/contrast; plan LED routes and pad locations.
  • Electronics (2–3 days): wire touch pads & LED segments; power distribution; firmware for two routes.
  • Enclosure (1–2 days): cut/assemble frame; add diffusion; cable management.
  • Polish (1–2 days): animations, labels, documentation, and video.

Risks & Mitigations

  • Touch sensitivity through veneer/paper: enlarge pad area; tune thresholds; use MPR121 if ESP32 touch is noisy.
  • LED brightness/bleed: add channel separators; sand/diffuse acrylic; lower PWM brightness.
  • Power drop: inject 5V at multiple points; thicker power traces; test worst-case animations.
  • Time creep: start with 4–6 buildings and 2–3 key routes; modularize to expand if time allows.

If you’re a Ravenclaw and want to debate which spell effect looks best, I accept peer review. 😉