summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/umich/f24_473.md589
-rw-r--r--docs/umich/f24_eecs496.md145
-rw-r--r--docs/umich/f24_wrapup.md8
-rw-r--r--docs/umich/img/f24_wrapup/aux.pngbin0 -> 178218 bytes
-rw-r--r--docs/umich/img/f24_wrapup/auxhack.jpgbin0 -> 136811 bytes
-rw-r--r--docs/umich/img/f24_wrapup/budget.pngbin0 -> 65604 bytes
-rw-r--r--docs/umich/img/f24_wrapup/colon-three.pngbin0 -> 2157 bytes
-rw-r--r--docs/umich/img/f24_wrapup/diffie.jpgbin230067 -> 230288 bytes
-rw-r--r--docs/umich/img/f24_wrapup/do-not-detonate.pngbin0 -> 10431 bytes
-rw-r--r--docs/umich/img/f24_wrapup/fpc.pngbin0 -> 76374 bytes
-rw-r--r--docs/umich/img/f24_wrapup/hey-put-it-back.pngbin0 -> 10935 bytes
-rw-r--r--docs/umich/img/f24_wrapup/lcb.jpgbin0 -> 159274 bytes
-rw-r--r--docs/umich/img/f24_wrapup/lcbpcbrev1.jpgbin0 -> 196911 bytes
-rw-r--r--docs/umich/img/f24_wrapup/lcbpcbrev2.jpgbin0 -> 256556 bytes
-rw-r--r--docs/umich/img/f24_wrapup/pain.pngbin0 -> 4491 bytes
-rw-r--r--docs/umich/img/f24_wrapup/pcbback.pngbin0 -> 96181 bytes
-rw-r--r--docs/umich/img/f24_wrapup/rig.jpgbin0 -> 122394 bytes
-rw-r--r--docs/umich/index.md4
18 files changed, 740 insertions, 6 deletions
diff --git a/docs/umich/f24_473.md b/docs/umich/f24_473.md
new file mode 100644
index 0000000..d8640f2
--- /dev/null
+++ b/docs/umich/f24_473.md
@@ -0,0 +1,589 @@
+# Fall 2024 Course Review: EECS 473
+
+2024-12-28
+
+Course Title: Advanced Embedded Systems
+
+Rating: 4/5
+
+## Instructors (Mark Brehob, Matthew Smith, James Carl)
+
+I commented on Mark in the first semester, regarding [EECS
+370](f23_wrapup.md#instructor-mark-brehob). He hasn't changed. I have.
+I've been working on my social aptitude and interacting more on lectures.
+I also drop by his office hour a lot more frequently than I used to, often
+to discuss our project.
+
+Matt worked with Robert Dick on
+[373](w24_373.md#instructors-robert-dick-matthew-smith) last semester.
+I had less interaction with him than in 373. I spent a lot more time with
+our GSIs though.
+
+James Carl was recently hired to replace Matt once he retires. He has some
+pretty good debugging ideas.
+
+## Course topics
+
+These are topics of significance in my opinion:
+
+- Interface
+ - The Arduino library is an interface
+- RTOS (real-time operating system)
+ - Task scheduling
+ - Semaphores
+- Copyright and copyleft
+ - GPL
+ - Fair use
+- Linux
+ - "Everything is a file"
+ - Device drivers
+ - Kernel modules
+- PCB
+ - Making of PCB
+ - Power integrity
+ - Bypass capacitors and frequencies they can handle
+- Batteries
+ - Choosing a chemistry
+ - Estimating battery life
+- Voltage regulator
+ - LDO (linear regulator)
+ - Switching regulator
+- DSP
+ - "Specialized computing"
+ - Fixed point arithmetic
+ - Common DSP algos
+- Wireless
+ - Hamming code
+ - Keying (ASK, FSK, etc)
+ - Shannon's limit
+ - Antenna range
+
+There are five labs in total, but I was exempt from the last one because
+I knew how to design PCBs already. The labs are super high workload and
+never once did my teammate and I finish them within the three hours of lab
+time. We always worked overtime, sometimes on Saturday.
+
+I'm relieved that we aren't using STM32CubeIDE or dealing with their
+horrid code style anymore.
+
+## Project
+
+When I enrolled in the course, I thought the goal of the project was to
+create the best PCB. It was not. Instead, what we were supposed to create
+is a product — with a use case and a market. It's OK if the PCB is full of
+bodges. Just make it work.
+
+Teams of 4-5. Budget is $200 / person. I'm in a team of 4. Our project is
+the Live Caption Badge. Taken from project report:
+
+> What we made was the Live Caption Badge. At the CoE Design Expo, we
+> demonstrated the device by inviting visitors to wear the badge and talk
+> with us. With the press of a button, the visitor can hear our voice, and
+> we can hear theirs. We also showed the visitor that their speech was
+> transcribed live on the screen.
+
+> The goal of our project is to improve communication in noisy
+> environments, such as convention halls, for hearing-impaired individuals
+> and non-native speakers. Our solution is a live caption badge that
+> records and uploads speech to a server running a transcription API. The
+> badge then displays the text on an e-paper screen. Badges can form
+> a talkgroup, where users can hear each other’s speech.
+
+![An e-paper display in a 3D-printed box. On the screen is the UMich logo,
+Frederick Yin, he/him, they/them, Speaker.](img/f24_wrapup/lcb.jpg)
+
+I will now expand on the subsystems, discuss the work I was involved in,
+and the manmade horrors beyond comprehension.
+
+### E-Paper
+
+When I brought this idea to Mark, he was skeptical, especially about the
+epaper. He thought epaper was slow, but he didn't know the model we picked
+([Waveshare 7.5-inch](https://www.waveshare.com/7.5inch-e-paper-hat.htm))
+supports partial refreshes, which is a feature where a rectangular area
+gets refreshed in only 0.5 seconds. He still was not fully convinced, but
+we went with the epaper anyway because (1) it's readable from a wide angle
+and (2) it's cool and we have the budget.
+
+Waveshare published driver code, which worked as long as you're super
+careful with it. For example, there's a function for partial refreshes,
+which takes an `xStart` variable among others. What's implied, and kinda
+obvious in hindsight, is that `xStart` must be a multiple of 8, because
+each byte is 8 pixels. However, there was nothing in the documentation.
+When I passed an illegal value, it didn't even warn me. It's not a great
+software interface.
+
+I also spotted a data underflow error. They did something like `size_t
+s = (x % 256) - 1`, which might underflow to `(size_t)(-1)` if `x % 256 ==
+0`. It should have been `(x - 1) % 256`.
+
+The coding style is so inconsistent that I didn't even bother fixing it.
+
+When I was designing the PCB (I started late and missed the deadline,
+whoops) I realized there was no time to design the driver circuit for the
+epaper. So I asked Mark if we could just piggy back the breakout board on
+our PCB and he reluctantly said OK.
+
+So:
+
+![PCB with a notch on the bottom](img/f24_wrapup/lcbpcbrev1.jpg)
+
+I actually had three plans to make it work. You'll notice a row of 2.54 mm
+headers and an unmounted clikmate footprint underneath. One of them needs
+to be wired to the breakout board. It can be jumper wires plugged to the
+2.54, or stripped wires soldered to the 2.54, or specialized cables into
+the clikmate.
+
+The breakout board has a clikmate connector, and is shipped along with
+a clikmate-to-2.54 mm cable. These work directly with this board above.
+I looked for clikmate-to-clikmate cables online in hope for a tidier
+wiring, but they don't sell 9-circuit cables anywhere. It goes from 1 to
+8, then directly to 10. Where'd Waveshare even get these?? :floofwhat:
+
+In November I was feeling ambitious, so I decided for another spin of the
+PCB, this time with the epaper circuit in-house. I left out the 2.54 mm
+headers, assuming the FPC connector would work. Problem? It didn't work.
+Reason? No fucking idea.
+
+I tried probing continuity, but when the ribbon cable is fully inserted
+there wasn't any exposed metal. It was days until design expo, so I quit
+the struggle (correct decision). I just stripped the wires and soldered
+them directly to the ESP32.
+
+![A PCB with wires running down to a breakout
+board.](img/f24_wrapup/lcbpcbrev2.jpg)
+
+These wires annoy me. They haunt me even after the semester ended and
+I got my final grades. I must eradicate their existence from the surface
+of the Earth.
+
+One day I was at MESH, and I looked up my LCSC shopping log. And there
+stood what I had sought:
+
+![Screenshot of two FPC connectors, both are Bottom
+Contact](img/f24_wrapup/fpc.png)
+
+They're supposed to be top contacts.
+
+Shaking my head, I ordered a bunch of top contact FPC connectors from
+Mouser. They worked.
+
+![Mosfet (my fursona) standing emotionless in front of
+a datapath](../emote/mosfet/mosfet_lc2k.png)
+
+### Audio
+
+When the project began I was fearless. GSIs and James had proposed that we
+use an I2S microphone module instead, but I, being arrogant, insisted that
+we use an off-the-shelf customer service headset and plug it into the
+board via a 3.5 mm jack. Design-wise, I made the right choice because
+a 3.5 mm is highly compatible. However, the connector caused me
+a ridiculous amount of pain.
+
+![A confusing mechanial drawing of a 3.5 mm audio
+connector](img/f24_wrapup/aux.png)
+
+This is a TRRS (tip-ring-ring-sleeve) audio connector. The datasheet just
+made no sense to me. I never touched an audio connector in the unsoldered
+form, so I don't know which ring goes where. Specifically, I assumed the
+pad labeled 1 on the top right was the tip, because it was the farthest
+away from the hole. I found a similar footprint in the KiCad library,
+which I modified so that pin 1 is the tip.
+
+To get the audio, we used an ADC chip (ES7210), which was picking up
+a really weak signal amongst the noise. After ruling out soldering issues,
+for days I suspected that the ADC has an inadequate input impedance. I did
+calculations I learned in [311](w24_311.md). I even considered a buffer opamp.
+
+I brought the question to Mark. He wasn't too fond of what I proposed, and
+instead propose that I try different resistor values on the drain of the
+electret mic. I went back to the lab to try it out.
+
+Probing the connector with a multimeter in continuity mode wasn't helpful,
+because I didn't have an aux cable with all four contacts. Oddly, probing
+two of the pads sometimes make the multimeter beep, which I didn't think
+too much until I saw something cursed.
+
+I reenacted the PCB circuit upon the headset jack, bypassing the
+connector. __It worked.__
+
+![Alligator clips and probes from signal generator and oscilloscope
+clipped to a 3.5 mm jack and a resistor just rolled onto the
+jack](img/f24_wrapup/rig.jpg)
+
+▲ Valid, totally not shoddy testing rig
+
+Conslusion? The KiCad footprint was right. I was wrong. Pin 1 was the
+sleeve. :floofangry:
+
+Because of the wrong pinout, what it ended up sampling was a headphone
+coil, which _was_ picking up sound but terribly. If there wasn't audio at
+all, I might have come to the conclusion sooner. The beeping from the
+multimeter was because the headphone coils were 32 ohms, lower than the
+threshold of what makes a "short". If I had probed in ohm mode, I could
+have known sooner.
+
+The discovery both relieved me and disappointed me. I knew I wasn't smart
+enough to make mistakes involving input impedance. I felt like a clown.
+
+![Mosfet (my fursona) wearing clown makeup and a shirt that says
+"Clowncy"](../emote/mosfet/mosfet_clown.png)
+
+Hot fix: I unsoldered it and bodged some wires and lived with it until Rev
+2.
+
+![Four wires soldered between footprint and connector pads, leaving the
+audio connector hanging in the air](img/f24_wrapup/auxhack.jpg)
+
+Lesson: always check pinout before proceeding with any troubleshooting
+that requires a brain.
+
+### USB-C
+
+I put three connectors on the PCB (other than 2.54 mm headers). __Every
+single one of them__ had some sort of issue.
+
+I talked about the audio connector. I talked about the FPC connector.
+I also made a mistake with the USB connector. You see, in an attempt to be
+"hip", I insisted on USB-C, and bought some from Mouser. The problem was,
+I missed something on the datasheet again. The area where the metal casing
+goes is not just a keepout — it's a physical notch in the board cutout. So
+in Rev 1 we had to use an FTDI dongle connected to the UART headers via
+jumper wires. Every time we had to flash firmware, we had to:
+
+- Hold Reset and Flash buttons
+- Release Reset
+- Release Flash
+- `idf.py build flash monitor` (aliased as `bfm`)
+- Press Reset
+
+In Rev 2, the USB worked on the board my teammate Angel soldered but not
+on mine. In a fit of rage (in my defense I was tired) I ripped the
+connector off, which did permanent damage to the copper traces, so we had
+to keep using FTDI on my board.
+
+Both of my friends who work in embedded agree that connectors are the
+worst.
+
+### PCB
+
+This PCB is special to me. It is the first time I designed a PCB so large
+(Rev 2 is 170×105 mm, although most of it is empty, which did leave space
+for me to sneak in some artwork).
+
+The board was my first time doing 4-layer. (Middle layers are just 3.3V
+and GND.) James advised me to do so because he feared the signal lines
+dragging across the PCB would pick up interference.
+
+It's also the first time I ordered a stencil for my own design. It's also
+the first time I used an ESP32 that's not on a DevKit.
+
+The size, layers, and stencil combined made PCBs real expensive.
+
+- Rev 1
+ - PCB: $42.61
+ - Stencil: $7.11
+ - Shipping: $42.15
+ - Discount: -$10.00
+ - Tax: $4.92
+ - Total: $86.79
+- Rev 2
+ - PCB: $43.41
+ - Stencil: $7.11
+ - Shipping: $33.28
+ - Tax: $4.67
+ - Total: $82.47
+
+The shipping skyrocketed (basically doubled) once we ordered the stencils.
+In total we spent ~$169 on PCBs, or 21% of our budget.
+
+We spent $225.50 on stuff that go on PCBs, 28% of our budget.
+
+The DAC and ADC audio chips are QFNs with 0.4 mm pitch, the finest I've
+ever soldered.
+
+The three buttons are surprisingly tactile. They're really snappy. Worth
+every penny.
+
+I left a bunch of easter eggs on the PCB.
+
+!["Hey put it back!" under the ESP32](img/f24_wrapup/hey-put-it-back.png)
+
+▲ Inspired by the [Eurofurence 28
+badge](https://github.com/eurofurence/ef28-badge).
+
+![":3" under Q1](img/f24_wrapup/colon-three.png)
+
+▲ Q1 is an N-channel MOSFET.
+
+!["pain" under the audio connector](img/f24_wrapup/pain.png)
+
+▲ This is Rev 2.
+
+!["Do not detonate" next to an electrolytic
+capacitor](img/f24_wrapup/do-not-detonate.png)
+
+▲ It's 68 µF.
+
+![My fursona depicted as the Yippee creature on the
+back](img/f24_wrapup/pcbback.png)
+
+▲ Rev 1 was just the original Yippee creature, but Rev 2 has cat ears and
+a tail
+
+### 3D printing
+
+My teammate Kyle did the 3D modeling and printing all by himself. He has
+a Bamboo at home. He printed two versions for the two PCB revisions, two
+pieces each. They're actually really well-made. Like, from a distance you
+can't even tell they were 3D printed.
+
+Since the FPC didn't work, there had to be a breakout board. Instead of
+going on the PCB as I had intended (it didn't have enough horizontal
+clearance for the big row of headers on the other side I'm not willing to
+remove), it was mounted on a 3D printed piece with M3's, between the
+epaper and the PCB. However, only the case designed for Rev 1 had that.
+So, we used the Rev 2 PCB with the Rev 1 case, which is a couple
+centimeters thicker. No one cared.
+
+The case was black, red and white, with some serious NES vibes. Its hefty
+build also reminded me of lead-acid batteries.
+
+The 3D printed case is a huge, I repeat, HUUUGE part of our success. It
+really made our project look like a product, even when it's just sitting
+there. It attracted many people on the design expo, and even though it
+wasn't central to the course, we got more questions about the case than
+the PCB, because you can see that. We're so lucky to have Kyle.
+:floofheart:
+
+### Firmware
+
+We had a choice between Arduino and ESP-IDF, and we were forced into the
+latter because the audio library on Arduino wasn't working.
+
+Writing an application with ESP-IDF is so. Horrible. How does anyone build
+an entire application with ESP-IDF without losing their mind?
+
+Everything is manual. Everything. The audio library on ESP-IDF is ESP-ADF,
+which emulates audio pipelines, which I'm familiar with (playing with
+Ardour and Pipewire and stuff). It's a neat idea and it works, but our
+code is a mess. An excerpt
+([source](https://github.com/fakefred/live-caption-badge/blob/main/firmware/main/audio.c#L55)):
+
+```c
+ESP_LOGI(TAG, "Create ADC i2s stream");
+i2s_stream_cfg_t adc_i2s_cfg = I2S_STREAM_CFG_DEFAULT_WITH_TYLE_AND_CH(
+ (i2s_port_t)0, AUDIO_SAMPLE_RATE, AUDIO_BITS, AUDIO_STREAM_READER, AUDIO_CHANNELS);
+adc_i2s_cfg.type = AUDIO_STREAM_READER;
+adc_i2s_cfg.out_rb_size = 64 * 1024;
+adc_i2s = i2s_stream_init(&adc_i2s_cfg);
+i2s_stream_set_clk(adc_i2s, AUDIO_SAMPLE_RATE, AUDIO_BITS, AUDIO_CHANNELS);
+audio_pipeline_register(tx_pipeline, adc_i2s, "adc");
+```
+
+All this just to create an I2S reader. It's not even in the pipeline yet.
+
+The rest of our code was also visually redundant and mostly unreadable,
+full of hacks.
+
+I once wanted to try writing an application with ESP-IDF. Now that I've
+done that, I would never try that again unless absolutely necessary.
+
+We were on a sprint in the last two days. Probably half of the visible
+side of the software (user interaction, on-screen UI, etc.) was finished
+in these two days. We sat in the lab, hour after hour, flashing and
+testing firmware roughly every five minutes. It was soul-crushing. I put
+on album after album, mainly twenty one pilots and Radiohead.
+
+My teammate, Rain, suggested we add a feature where we could change the
+username on the badge over HTTP, without having to reflash the badge.
+I was reluctant at first, saying "it isn't a core feature", but he
+insisted. Well, he was __absolutely right__.
+
+It turns out, being handed a thing with your name on it feels different
+than one without. On design expo day, multiple people agreed to have their
+name put on it once we gave them the option, and some of them even took
+photos!
+
+How do we do the HTTP, you ask? Well, we exposed a couple HTTP endpoints
+on the ESP32 and wrote a Python script on my laptop to issue a request
+once asked to. We opened a CSV file in LibreOffice Calc called the
+"Dashboard", and the Python script read from that. It was literally
+written __the night before design expo__.
+
+(The HTTP endpoints also included `/poke`, `/unpoke`, and `/reboot`.
+They're hacks. Don't ask.)
+
+### Vosk server
+
+Another Python script running on my laptop is the server, in charge of
+transcribing text and streaming audio. It's super hacky as well. It's
+adapted from some ESP-IDF example code, and it was built on the super
+low-level BaseHTTPRequestHandler instead of something for humans, like
+Flask or FastAPI. It did allow us to commit many crimes. :floofmischief:
+
+The text transcription was done using
+[Vosk](https://alphacephei.com/vosk/), which I never heard of until Rain
+brought it up as an alternative to Google Cloud, which had been planning
+to use. Vosk had an advantage of being offline. It's just a pre-trained
+model.
+
+The badge-to-badge audio streamed through the server as well, which we
+honestly didn't want. Ideally the audio could just go from an ESP32 to
+another, without the laptop detour doubling latency. However, it was
+impossible.
+
+With our current networking stack (HTTP over Wi-Fi), if an ESP32 were to
+transmit audio to another, the former has to be a client, and the latter
+has to be a server. However, the ESP-IDF HTTP server __does not support
+chunked reads__. Streaming audio is thus impossible without patching the
+library itself, or hacks that violate the ESP-ADF abstraction.
+
+Oh yeah and we can't really stream audio via Bluetooth (A2DP) because we
+bought ESP32-S3's, which don't support classic Bluetooth, only BLE.
+
+### Budget
+
+![Bubble chart of what we spent. ~1/4 is
+epaper.](img/f24_wrapup/budget.png)
+
+The data:
+
+- E-Paper: $195.33
+- PCB Parts: $162.1015
+- PCBs & Stencils: $94.24
+- DevKits: $72.00
+- Headphones: $44.93
+- Misc: $73.73
+- Tax: $40.18
+- Shipping: $91.93
+
+Total: $774.44 (96.8% of budget)
+
+Notable wastes of money:
+
+- The first ESP32 DevKit (LyraT): mic didn't work.
+- The bottom-contact FPC connectors.
+
+Rant: Our second ESP32 DevKit (Korvo-2) worked, but it didn't have
+a headphone connector, only a speaker connector which wasn't 2.54 mm.
+Everytime I needed to hear the output, I had to poke jumper wires into
+that awkward connector hoping I didn't short anything.
+
+This doesn't go on the budget, but about a week before design expo I was
+forced to re-activate Amazon Prime (eww) to buy some lanyards and
+headphones because no one else ships over Thanksgiving. I canceled it
+today.
+
+### Design expo
+
+The instructors required "shirt and tie or equivalent", but I didn't have
+a tie and a couple teammates neither. So we all just did casual. No one
+fucking cared.
+
+We set up the poster and waited for people to pay attention. We had two
+badges. I wore one and offered the other to anyone interested. It was
+pretty effective.
+
+One person who goes by Michael stopped by and complimented our poster
+design, saying we did a good job keeping the information density low, and
+we picked a good font (Fira Code, which was the font we printed on the
+epaper).
+
+He worked in a Japanese-American company or something, and remarked that
+our product had potential for communication if we had a translation
+feature. He mentioned that interpreters at his company needed to translate
+not only what was said, but also how it's said — for example, if
+a Japanese executive yells at an American executive in Japanese, the
+interpreter has to yell again in English.
+
+I found this amusing and replied that, precisely because of this, machines
+will never replace humans in communication.
+
+Before the four-hour-long design expo, I had predicted I would either die
+of fatigue, or of boredom. It wasn't too bad, and in the last hour it was
+closer to the latter. I was almost always there. We consumed a bag of Cool
+Ranch Doritos.
+
+A total of four (4) furries showed up, and I totally did _not_ hand out my
+new stickers in a paper bag like some kind of drug dealer.
+
+### Report
+
+I'm going to spare you from all the pain. Just know that it was Mark's
+favorite report ("so far"). He also liked the Haiku I sneaked in the
+"Lessons Learned" section. It was really validating.
+
+The full thing:
+
+> I am glad that we scheduled a weekly meeting early on. It enabled us to
+> check in each other’s progress (or lack thereof). Another correct
+> decision is to collaborate on our own branches on GitHub.
+>
+> The reason why I fell behind on the PCB schedule was that we didn’t know
+> what we wanted. We had never agreed on the specifics, e.g. where do the
+> buttons go. Audio circuitry was also a whole new experience for me. As
+> I sat in the Fishbowl 24 hours before deadline staring at datasheets,
+> I felt the pressure that one wrong trace will doom our project.
+>
+> As it turned out, I had not one, but five wrong traces, four of which
+> being the headphone jack. Sometimes my own stupidity surprises me.
+> A continuity test with an aux cord would have saved me from days of
+> confusion.
+
+> However, I must
+> Learn from my mistakes and try
+> To let go of them
+
+
+And this is the end of the project. I have to stop writing it. This
+article is getting close to 4K words… :floofmug:
+
+Now, onto closing remarks.
+
+## Arduino is good, actually: a reflection on software interfaces
+
+I once hated Arduino. I thought it "wasn't real embedded systems", merely
+a playground for those who lack the intellect to peruse the MMIO registers
+on a datasheet. There was a time I avoided using it, even on Arduino
+hardware itself, fearing its "overhead" would impede the efficiency of my
+code. I would write firmware that, instead of a `digitalWrite`, did stuff
+like `PORTC |= _BV(2)`. The [373](w24_373.md) curriculum reinforced my
+affinity to bare-metal.
+
+However, I was mistaken. Using Arduino doesn't make you less of an
+embedded systems engineer. I know people who have been working as
+a professional for years, and still prefer Arduino for personal projects.
+This is because it's such a popular interface, so popular that basically
+every tutorial was written for it, in stark contrast to ESP-IDF, which was
+only ever discussed on the official ESP32 forum.
+
+A software interface keeps ugly code to itself and presents clean function
+prototypes to the user. The user just needs to be aware of a few things,
+like thread safety. Most of the time the user just does stuff, and nothing
+goes wrong. The interface does error checking internally to maintain
+invariants.
+
+A mistake I made when designing the epaper interface was to expose
+a FreeRTOS `QueueHandle_t`. Now, my excuse was we were running out of
+time. But over the winter break I've been working on Phase II of the
+Badge, rewriting the firmware in C++ on PlatformIO + Arduino (without the
+audio part). When writing C++, I consider FreeRTOS code "ugly", and hide
+them inside class methods whenever possible.
+
+At this point I'm on the other extreme: To avoid handling raw pointers,
+I've been using the STL as much as I can, and my code looks nothing like
+embedded code. It's full of `std::unique_ptr`s and `std::istream`s. It's
+almost like desktop code. But hey, I've got megabytes of PSRAM and
+megabytes of Flash. I can afford some tiny efficiency loss for more memory
+safety. At least I don't need to `free` a pointer in every early return
+path.
+
+## Conclusion
+
+All that said: 473 is definitely better than 373. Considering this is my
+capstone, I'm even proud of it.
+
+> Four seventy-three
+> Will never defeat me in
+> A way that matters
diff --git a/docs/umich/f24_eecs496.md b/docs/umich/f24_eecs496.md
new file mode 100644
index 0000000..374be06
--- /dev/null
+++ b/docs/umich/f24_eecs496.md
@@ -0,0 +1,145 @@
+# Fall 2024 Course Review: EECS 496
+
+2024-12-21
+
+Course Title: Major Design Experience — Professionalism
+
+Rating: 2/5
+
+EECS 496 takes the form of guest lectures. Almost every week a different
+speaker would take the floor. Some are boring. Some are great. The lecture
+topics are (taken from course schedule):
+
+- Introduction
+- Interview Essentials
+- Startups
+- Achieving Financial Fitness
+- Investments
+- Project management
+- Respect in the Workplace
+- Venture Capital
+- Intellectual Property: Trademarks, patents, and copyrights
+- Introduction to Ethics (I missed this lecture because Whitfield Diffie
+ gave a talk earlier)
+- AI and Ethics: Trust, Cooperation, and Society
+- Technology and Public Policy
+
+## Honorable Mentions
+
+### Venture Capital
+
+You didn't expect me to compliment a venture capitalist, did you? Well,
+"recovering venture capitalist", as Brendan Richardson describes himself.
+He's a funny guy. He wasn't defending VC. He was roasting it, mercilessly.
+Quote unquote:
+
+> True of False?
+
+> The reputation of Venture Capitalists as selfish, arrogant, greedy jerks
+> is DESERVED?
+
+> TRUE!!
+
+His talk almost caused me to have sympathy toward VCs. Takeaways:
+
+- A VC's job is nearly impossible
+ - Like spotting a future Olympics champion in kindergarten
+ - Most startup companies fail
+ - Most VCs fail
+- Most of the money VCs throw into startups isn't theirs, but that of much
+ bigger companies ("Limited Partners") like foundations or insurance
+ companies
+- Because most startups fail, those who succeed must generate explosive
+ returns (10x, 100x, you name it)
+
+And that's why, according to Richardson, VCs sleep like babies, in that
+they wake up every two hours and cry.
+
+Still though, VCs cannot be acquitted of their crimes against humanity and
+the environment.
+
+Lesson learned: I could never be a VC.
+
+### AI and Ethics
+
+Ben Kuipers doesn't believe in the singularity. Machines aren't gonna team
+up and kill us either. As of 2024 (hi archaeologists), when a machine
+kills someone, it is not because it wants to; it's because it wasn't aware
+that it's about to kill someone. Like the Waymo that dragged a pedestrian
+down under. Nobody thought it could happen, but it did. And there wasn't
+a section of code, or a part of the model, that dealt with this scenario.
+
+Kuipers argues that, by the time an AI faces the trolley problem, it's
+already too late. If a car on autopilot is driving on a narrow street, and
+it can either kill a pedestrian or the passenger — the debate should not
+be about whom to kill, but about why the fuck didn't the car slow down in
+the first place.
+
+### Technology and Public Policy
+
+Molly Kleinman believes public policy is necessary, no matter what the
+techbros say. When a technology is said to be for the "public good",
+a good question to ask is always "but _whose_ public good?"
+
+A lot of modern innovations be like:
+
+\> create cool technology
+\> look inside
+\> biases
+
+One example she used was the speeding cameras in Chicago citing more
+tickets in Black neighborhoods. The root cause was that roads there were
+often wider so drivers had less incentive to slow down. Infrastructure
+issue.
+
+### Respect in the Workplace
+
+Taj Williams, DEI person at CSE, talks about allyship. Allyship is when
+you're in the majority but support minorities.
+
+Me, being in several minorities, believe this should be one of the first
+lectures, not the seventh. If it were, I wouldn't have called EECS 496 the
+"torture lecture".
+
+## Dishonorable mentions
+
+These are the lectures that made me coin "torture lecture".
+
+### Investments
+
+He starts from the importance of paying off credit card debt. Forty
+minutes later he's talking about real estate investment. My brother in
+christ that's quite a leap
+
+I asked him if he considers real estate investment ethical under current
+social circumstances, when homeless people exist. He was kinda upset and
+I did not ask any further.
+
+### Achieving Financial Fitness
+
+I wasn't planning to retire in the US, but now I know how 401(k) works so
+thank you I guess??
+
+## Assignments
+
+- Elevator pitch: Try to sell myself to an employer at a career fair
+- Budget: Figure out how much I'm gonna earn and spend when I get a job
+- Executive summary: Try to convince that my MDE (473) project has
+ a market and is profitable (it's not)
+- Microaggressions: Try to deal with bigots in the workplace with
+ Direct/Delay/Delegate/Distract
+- Op-Ed: Write an op-ed about a technology that raises an ethical concern,
+ and another to argue that the concern isn't so threatening
+
+I was deducted two points from the Microaggressions assignment because
+I forgot to include a "Generative AI statement", which, if it did exist,
+would say "nope". I don't have a problem with the deduction, I'm just mad
+that I can't even write an assignment without doing a captcha.
+
+## Verdict
+
+Overall experience is Not Good™. I took this course only because I had to.
+I sure am glad there exist a few good lectures to justify it.
+
+Although most of the knowledge didn't immediately come to use, it might
+prove helpful some time in the future.
diff --git a/docs/umich/f24_wrapup.md b/docs/umich/f24_wrapup.md
index 16a5143..0898167 100644
--- a/docs/umich/f24_wrapup.md
+++ b/docs/umich/f24_wrapup.md
@@ -12,10 +12,10 @@ horror stories, and poetry. If this semester had a tagline, it would be
## Course reviews
-- EECS 473, Advanced Embedded Systems
-- TC 496 (full course code TCHNCLCM 496): Advanced Technical
- Communications
-- EECS 496: Major Design Experience Professionalism
+- [EECS 473, Advanced Embedded Systems](f24_473.md)
+- [TC 496 (full course code TCHNCLCM 496): Advanced Technical
+ Communications](./f24_tc496.md)
+- [EECS 496: Major Design Experience Professionalism](./f24_eecs496.md)
- GERMAN 231: Second-Year German
## Notable gains
diff --git a/docs/umich/img/f24_wrapup/aux.png b/docs/umich/img/f24_wrapup/aux.png
new file mode 100644
index 0000000..4a80d9c
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/aux.png
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/auxhack.jpg b/docs/umich/img/f24_wrapup/auxhack.jpg
new file mode 100644
index 0000000..5961c5d
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/auxhack.jpg
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/budget.png b/docs/umich/img/f24_wrapup/budget.png
new file mode 100644
index 0000000..649085d
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/budget.png
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/colon-three.png b/docs/umich/img/f24_wrapup/colon-three.png
new file mode 100644
index 0000000..5b0fac7
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/colon-three.png
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/diffie.jpg b/docs/umich/img/f24_wrapup/diffie.jpg
index 8f4c371..f67f2e9 100644
--- a/docs/umich/img/f24_wrapup/diffie.jpg
+++ b/docs/umich/img/f24_wrapup/diffie.jpg
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/do-not-detonate.png b/docs/umich/img/f24_wrapup/do-not-detonate.png
new file mode 100644
index 0000000..42dd8f9
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/do-not-detonate.png
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/fpc.png b/docs/umich/img/f24_wrapup/fpc.png
new file mode 100644
index 0000000..dd4230a
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/fpc.png
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/hey-put-it-back.png b/docs/umich/img/f24_wrapup/hey-put-it-back.png
new file mode 100644
index 0000000..cd9c0ea
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/hey-put-it-back.png
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/lcb.jpg b/docs/umich/img/f24_wrapup/lcb.jpg
new file mode 100644
index 0000000..0188b51
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/lcb.jpg
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/lcbpcbrev1.jpg b/docs/umich/img/f24_wrapup/lcbpcbrev1.jpg
new file mode 100644
index 0000000..41fd0d8
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/lcbpcbrev1.jpg
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/lcbpcbrev2.jpg b/docs/umich/img/f24_wrapup/lcbpcbrev2.jpg
new file mode 100644
index 0000000..506ec77
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/lcbpcbrev2.jpg
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/pain.png b/docs/umich/img/f24_wrapup/pain.png
new file mode 100644
index 0000000..92f514b
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/pain.png
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/pcbback.png b/docs/umich/img/f24_wrapup/pcbback.png
new file mode 100644
index 0000000..a7d94cf
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/pcbback.png
Binary files differ
diff --git a/docs/umich/img/f24_wrapup/rig.jpg b/docs/umich/img/f24_wrapup/rig.jpg
new file mode 100644
index 0000000..f52b197
--- /dev/null
+++ b/docs/umich/img/f24_wrapup/rig.jpg
Binary files differ
diff --git a/docs/umich/index.md b/docs/umich/index.md
index 75e57c6..56c58b4 100644
--- a/docs/umich/index.md
+++ b/docs/umich/index.md
@@ -12,7 +12,7 @@ so basically i live in ann arbor now
- [GERMAN 386, Fairy Tales](w24_fairy.md)
- [CEE 265, Sustainable Engineering Principles](w24_sus.md)
- [Fall 2024 Wrapup](f24_wrapup.md)
- - EECS 473, Advanced Embedded Systems
+ - [EECS 473, Advanced Embedded Systems](f24_473.md)
- [TC 496: Advanced Technical Communications](f24_tc496.md)
- - EECS 496: Major Design Experience Professionalism
+ - [EECS 496: Major Design Experience Professionalism](f24_eecs496.md)
- GERMAN 231: Second-Year German