[{"content":" At a glance # Skills: Bare-Metal C, STM32, Interrupts\nWhat: Developed bare-metal embedded C firmware for STM32 to sequence through a finite state machine of lighting modes. How: Configured hardware and timer interrupts via memory-mapped registers for interrupt-driven state transitions. Why: Bare-metal programming shows exactly what abstraction layers do \u0026ldquo;under the hood\u0026rdquo;. This project also forced me to become very familiar navigating the documentation for the STM32F446RE. Details # NUCLEO-F446RE development board used in this project\nThis project is part of the Embedded Software course I took in Fall 2026. For this project, we were tasked with creating a bicycle safety light prototype using a Nucleo development board with an onboard STM32F446RE.\nTypically, an engineer would start by using the CubeMX software to configure the hardware, then implement the state machine and transition logic using ST\u0026rsquo;s pre-packaged Hardware Abstraction Library (HAL). While this approach is the most efficient, it is important for engineers to understand what HAL does behind the scenes and peel back the layers of abstraction, since not all microcontrollers will have a robust HAL. To this end, one requirement for this project was to implement this functionality entirely in bare-metal C, through direct manipulation of memory-mapped registers.\nTo accomplish this, it required me to spend time learning how to use the documentation, including the reference manual, user manual, programming manual, datasheet, and Nucleo schematic. Building the hardware and timer-based interrupts from scratch was an interesting challenge, as it required finding and configuring the correct values for the RCC, GPIO, EXTI, NVIC, and TIM peripherals.\nThe final project cycles through three distinct modes at the press of the onboard button (falling-edge interrupt):\nOff Solid Blink (4Hz) Resources # View source on GitHub\nYouTube demonstration:\n","date":"September 2026","externalUrl":null,"permalink":"/projects/bicycle_safety_light/","section":"Projects","summary":"Developed bare-metal embedded C firmware for STM32 to sequence through a finite state machine of lighting modes.","title":"Bare-Metal Bicycle Safety Light","type":"projects"},{"content":"","date":"September 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"September 2026","externalUrl":null,"permalink":"/tags/embedded-c/","section":"Tags","summary":"","title":"Embedded C","type":"tags"},{"content":"","date":"September 2026","externalUrl":null,"permalink":"/tags/firmware/","section":"Tags","summary":"","title":"Firmware","type":"tags"},{"content":"","date":"September 2026","externalUrl":null,"permalink":"/","section":"Jacob Keller","summary":"","title":"Jacob Keller","type":"page"},{"content":"","date":"September 2026","externalUrl":null,"permalink":"/projects/","section":"Projects","summary":"","title":"Projects","type":"projects"},{"content":"","date":"September 2026","externalUrl":null,"permalink":"/categories/school-project/","section":"Categories","summary":"","title":"School Project","type":"categories"},{"content":"","date":"September 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"August 2026","externalUrl":null,"permalink":"/categories/internship/","section":"Categories","summary":"","title":"Internship","type":"categories"},{"content":" At a glance # Skills: Firmware, Embedded C, Bazel, pytest, gtest, HIL testing, Databricks\nWhat: Embedded Software Engineering Intern at Rivian \u0026amp; Volkswagen Group Technologies, the joint venture between Rivian and the Volkswagen Group. How: Developed firmware in embedded C for Rivian R2 and future VW vehicle platforms. Why: Learned how to develop, test, and ship reliable firmware at scale. Details # My final presentation poster (redacted) at Rivian\u0026rsquo;s Palo Alto office\nThis summer, I landed an internship with Rivian \u0026amp; Volkswagen Group Technologies (RV Tech) as an Embedded Software Engineering Intern. I worked in Palo Alto, CA on the Vehicle Power Modes team to develop firmware in embedded C for Rivian and VW Group vehicles. Overall, I had a fantastic summer, both within and beyond work, and I am sincerely grateful to all the people who made my experience so memorable and fun.\nSitting inside the Rivian R1S\nI can\u0026rsquo;t share too many specifics on the projects I worked on, but some highlights include:\nDefining, building, and launching a brand-new cross-platform software component to monitor the timing of the vehicle\u0026rsquo;s sleep-to-wake pathway Pushing firmware to production that now exists on every Rivian R2 on the road today Collaborating with engineers from VW Group who flew out from Germany to port firmware to VW Group platforms Posing with Gear Guard Gary at the San Francisco Rivian showroom\nOne of my biggest takeaways from this summer was seeing what goes into developing software and firmware at scale. Designing robust firmware for both parent companies (Rivian and VW) across multiple platforms, numerous configurations, and hundreds of thousands of vehicles is a completely different task than working on a single car for FSAE. A 1% edge case may be acceptable for an FSAE car, but at the scale of RV Tech, the same 1% error could impact thousands of vehicles! I learned immensely about the importance of testing and validation, from software-in-the-loop testing, hardware-in-the-loop testing, and vehicle testing. Beyond the number of vehicles, collaborating with hundreds of other developers was an eye-opener. I saw the importance of defining and communicating requirements and the necessity of effective CI/CD. Importantly, I also saw how dramatically progress slows when things like test maintenance and developer tooling fail to perform.\nOverall, I have learned an incredible amount this summer, with the most important takeaways not residing within the specifics of C syntax, but instead with broader ideas in architecting effective firmware and architecting effective teams (these two things are absolutely related!). The insights I have gained this summer have shaped how I think about my role in FSAE and, more broadly, my convictions on what makes teams and companies effective.\nThe Summer 2026 intern cohort\nFor those that know me personally, you likely know how much this internship meant to me. I discovered Rivian as a company all the way back during the COVID-19 pandemic, and ever since starting high school, Rivian has steadfastly remained my dream company to work for. Ask me about my biking misadventures at Rivian HQ if you want to hear more ;) I am immensely grateful for the opportunity to live out this dream, and I could not have asked for a more amazing summer.\nOf course, I owe a huge thank-you to the people who made the experience so incredible. Thank you to my fellow Oliners for connecting me with this role and for the conversations about Olin then and now. Thank you to my mentor, manager, and co-workers for your endless support and patience. Thank you to the other interns (at RV Tech and beyond!) for all the adventures and the fast-formed, yet impossibly authentic friendships.\n","date":"August 2026","externalUrl":null,"permalink":"/projects/rivian_vw2026/","section":"Projects","summary":"Embedded Software Engineering Intern at Rivian \u0026 Volkswagen Group Technologies.","title":"Internship Recap - Rivian and Volkswagen Group Technologies","type":"projects"},{"content":"","date":"June 2026","externalUrl":null,"permalink":"/categories/fsae/","section":"Categories","summary":"","title":"FSAE","type":"categories"},{"content":"","date":"June 2026","externalUrl":null,"permalink":"/tags/pcb-design/","section":"Tags","summary":"","title":"PCB Design","type":"tags"},{"content":" At a glance # Skills: KiCAD, Schematic Design, PCB Layout\nWhat: Designed a new compact PCB to quickly view the status of a Formula SAE electric racecar. How: Used KiCAD to create schematic and layout. Optimized design to protect integrity of CAN and SPI signals and minimize disruptions to the ground plane. Why: Allows team members to instantly see the status of each shutdown node (represented by LEDs) without requiring connecting a laptop. Details # Rendering of final board design in KiCAD\nThis summer, I officially became the Electrical (and Software) Lead of Olin Electric Motorsports, Olin College\u0026rsquo;s FSAE Electric team. Each year, the electrical team designs and fabricates over a dozen unique PCBs for use on our vehicle. While I have been on the team for two years, I have never designed a PCB from start to finish. As such, I thought it would be valuable to dedicate some time over the summer to learn how to use KiCAD and design a useful board for our team. Learning PCB design was important so that I can effectively review other team member\u0026rsquo;s PCB designs and support newer members in the learning process.\nFrom this, the leadership team devised the portable diagnostic PCB project. In addition to myself, all sub-team leads also participated in the same design project to build a sense of accountability and provide fundamental skills for all leads to support their new members. Over the course of about one month, the leadership team spent weekends and afternoons after internships, going from requirements to a final version of the PCB. Design constraints include a 2-layer stack-up, $20 max budget for parts, and must be able to be populated/soldered using the tools that exist at Olin. Additionally, we went through two iterations of both the schematic and layout, which gave us a chance to improve our designs from feedback from our peers.\nKiCAD Schematic for portable diagnostic PCB\nMy general approach to this project was to visually represent each shutdown node on our car with an LED that represented the node\u0026rsquo;s current state (LED on = node closed, LED off = node open). To maximize the pinout of the STM32, I included two additional debug signal LEDs, which can be configured to other fault conditions in firmware. Generally, I am happy with my final schematic design. If I were to do things again, I would consider using an additional IC to control all the LEDs instead of direct GPIO connections.\nKiCAD Layout for portable diagnostic PCB\nIn my layout, I prioritized spacing the LEDs in a logical order, reflecting the actual order of the shutdown nodes on the vehicle. This way, the LEDs provide a logical \u0026ldquo;at-a-glance\u0026rdquo; view of which nodes in our shutdown loop are closed. I focused on arranging the components to minimize interruptions to the ground plane, to ensure the return current path was preserved. I ended up interrupting the ground plane in two places, but ensured that the signals routed on the second layer were low-speed (digital on/off). Additionally, I aimed to reduce the trace length of important and high speed signals (CAN, crystal, SWD programming).\nSince completing this project, I have identified a number of changes I would make to the layout if I ever make another revision. In particular, I would revise the design of the power conversion blocks to more closely follow the datasheet recommendations. Additionally, I would add co-planar GND traces alongside important signal paths to further improve the return current characteristics of the 2-layer stack-up.\n","date":"June 2026","externalUrl":null,"permalink":"/projects/portable_diagnostic_pcb/","section":"Projects","summary":"Designed a new compact PCB (KiCAD) to quickly view the status of a Formula SAE electric racecar without requiring a laptop.","title":"Portable Diagnostic PCB","type":"projects"},{"content":" At a glance # Skills: Embedded C, Python, YAML, Jinja2, STM32\nWhat: Refactored legacy CAN API (C, Bazel) to transition from 8-bit AVR to 32-bit ARM architecture (STM32). CAN API generates send/receive functions for CAN messages and builds a DBC file for our CAN bus. How: Replaced previous memory-mapped registers with STM32 HAL for CAN peripheral configuration and control. Used Jinja2 templates to convert readable YAML description files into CAN send/receive functions. Why: Eliminates repetitive and error-prone individual CAN implementations and supports team-wide transition to STM32. Details # CAN API Software Diagram\nSeveral years ago, Olin Electric Motorsports developed a custom CAN API for use in the team\u0026rsquo;s development of firmware for custom PCBs designed by our team. The project aims to provide a standardized and organized way for individual nodes in our CAN network to interact with each other. The library centralizes interactions with the CAN peripheral on the microcontroller to one place to avoid repetitive and error-prone code across our repository.\nThe CAN API does the following:\nA DBC file can be generated from the individual YAML files All message collisions are detected at compile-time A .c and .h file are generated for each YAML file that include send and receive functions for each of the messages sent and received by the MCU as specified by the YAML file This year, our team decided to undergo a complete transition to a STM32 microcontroller architecture, replacing the ATmega16M1, which (as far as I can tell) we have used since the team was founded. In spring of 2026, I took on the complete rebuild of the CAN API from the ground up, replacing memory-mapped registers with STM32 HAL for greater readability and maintainability.\nResources # View source on GitHub\n","date":"May 2026","externalUrl":null,"permalink":"/projects/can_api/","section":"Projects","summary":"Refactored legacy CAN API (C, Bazel) to transition from 8-bit AVR to 32-bit ARM architecture (STM32).","title":"CAN API","type":"projects"},{"content":"","date":"May 2026","externalUrl":null,"permalink":"/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":" At a glance # Skills: electric vehicle systems, design for manufacturing, CAD (OnShape), 3D-printing, welding, system integration\nWhat: EV Engineering Intern at Formosa EV, a California startup enabling modern and user-friendly electric vehicle conversions. How: Advanced Formosa EV’s mission through mechanical design, fabrication/assembly, and system integration. Why: Developed my mechanical and systems engineering skill set. Furthered my knowledge in the sustainable mobility industry and the startup world. Details # Working underneath Formosa EV\u0026rsquo;s demonstration vehicle: a 1965 Chevrolet Corvair\nThis summer, I accepted an internship with Formosa EV, a newly founded startup aiming to revolutionize electric vehicle conversions. Driven by the idea that EV conversions can (and should!) be both modern and user friendly, Formosa EV is developing an advanced system of components to convert any vehicle to electric.\nRear of the company demonstration car, with the mount I designed and fabricated supporting the radiator\nIn my role as an EV Engineering Intern, I widened my engineering skill set, diving into mechanical and systems engineering projects critical to Formosa EV\u0026rsquo;s success. Entering this internship with an electrical/computer engineering background, I was confronted with many unfamiliar challenges, forcing me to learn and adapt on the fly.\nUsing a handheld laser welder to weld sheet metal brackets\nAs an early member of the team (employee #6!) and Formosa EV\u0026rsquo;s first intern, I had the unique opportunity to experience what goes into transforming an idea into a business. I worked directly with Formosa EV\u0026rsquo;s CEO, Zack Hwang, to shape the direction of Formosa EV\u0026rsquo;s first products. Along the way, I observed the connected nature of engineering to all other parts of a business. Every engineering decision is a trade-off, and it is crucial to balance time, cost, and risk. Working in a small team provided me a high level of ownership over my projects, allowing me to oversee projects from ideation, to design, to fabrication.\nCollection of sheet metal parts I designed\nSome highlights from my summer at Formosa EV include:\nTP130 High Voltage Relocation Lid: Designed, procured, and validated custom parts to physically relocate the high voltage connectors of an off-the-shelf electric motor. Used OnShape to design high voltage bus bars and a 3D-printed replacement lid. Accelerator Pedal Position Sensor: Adapted the accelerator pedal on the company\u0026rsquo;s demonstration vehicle from a mechanical linkage to an electronic sensor. Designed a low-cost, 3D-printed enclosure for the accelerator pedal position sensor to protect sensor components from road debris. Created an adapter to connect the pedal to a low-cost and widely available OEM throttle cable. VCU Test-bench: Established a test-bench for our prototype Vehicle Control Unit PCB and corresponding mobile app. Uploaded and validated firmware and software updates, identifying and documenting bugs present in the system. Corvair Brackets: Designed, fabricated, and installed a system of sheet metal brackets to mount EV conversion components in Formosa EV\u0026rsquo;s demonstration vehicle, a 1965 Chevrolet Corvair. Oversaw the project from start-to-finish across eleven unique brackets, including welding the brackets with a handheld laser welder. Created brackets to secure the rear batteries, EV motor, power distribution module, and radiator. Check out my final presentation to see more details from my projects. Also check out this video to see the shop!\nThe Formosa EV California team: Zack, Justin, Indy (four-legged friend), and me\n","date":"August 2025","externalUrl":null,"permalink":"/projects/formosa2025/","section":"Projects","summary":"Advanced Formosa EV’s mission through mechanical design, fabrication/assembly, and system integration on a classic 1965 Chevrolet Corvair.","title":"Internship Recap - Formosa EV","type":"projects"},{"content":"","date":"August 2025","externalUrl":null,"permalink":"/tags/mechanical-design/","section":"Tags","summary":"","title":"Mechanical Design","type":"tags"},{"content":" At a glance # Skills: C, SPI, CAN bus, reading datasheets, SMT soldering\nWhat: Created firmware for the power distribution unit, a board that manages low voltage power on Olin College\u0026rsquo;s Formula SAE Electric vehicle. How: Developed C code from scratch to create hardware timers, send and receive CAN messages, read ADC inputs, control a 7-segment display, and interface with an IO expander via SPI. Why: Enables team to instantly view vehicle status through visual indicators (LEDs and 7-segment display), allowing the team to identify and address issues faster. The firmware also controls the cooling loop, keeping electrical components at a safe operating temperature. Details # Power Distribution Unit (PDU) board before populating and soldering components\nIn my second semester at Olin College, I continued as an Integration Engineer on Olin Electric Motorsports. This semester, I developed C firmware for the vehicle\u0026rsquo;s Power Distribution Unit (PDU).\nThe PDU is responsible for managing power for the vehicle\u0026rsquo;s low voltage system, visually communicating the status of the car, and controlling the cooling loop. The PCB was designed by another engineer, so I was tasked with populating and soldering all electrical components, and writing C firmware for the ATmega16M1 microcontroller.\nPower Distribution Unit (PDU) board after populating and soldering components (plus a big dog!)\nTo be specific, my firmware had to accomplish the following tasks:\nSend and receive messages on the vehicle\u0026rsquo;s CAN bus. Communicate (via SPI) with an IO expander IC to control LED status lights Communicate (via SPI) with an analog to digital converter (ADC) IC to measure current draw across vehicle Communicate (via SPI) with a display driver IC to show voltage of high voltage system on a 7-segment display Control the indicator light for the high voltage system Manage the cooling loop by powering the fan and controlling the coolant pump with PWM Early whiteboard diagram of Power Distribution Unit (PDU) functions and layout\nThis project was equally challenging and rewarding. A number of factors made this project difficult:\nThe PDU project was brand new to our team, meaning that I had to design all code from the ground up. Without any existing code to build off of, I had to read through the (very long!) technical datasheets to understand how to interface with the ICs on the board. With over 50 unique electrical components in the bill of materials, this was the largest board our team had ever produced, in terms of both physical size and number of parts. Populating and soldering all the components was time-consuming, but provided lots of SMT soldering practice! I also learned to use an oscilloscope to identify and isolate bugs in the system. This was my first time writing code in C, which meant I had to learn the C syntax, bitwise operations, and memory management principles as I went. Only having 3 months before the vehicle would compete in the national competition forced me to learn quickly! Overall, I am satisfied with how the final product turned out. Our electrical system (including the PDU) passed electrical inspection at competition, certifying that we had met all rules requirements. Some of the board\u0026rsquo;s functions that communicate vehicle status require further refinement and debugging, but as a whole, the firmware allows the vehicle to drive safely and reliably. This project developed my skills in firmware design with C, SMT Soldering, reading technical datasheets, and debugging electrical systems.\nResources # Digital Whiteboard of PDU system GitHub Source Code ","date":"May 2025","externalUrl":null,"permalink":"/projects/pdu_firmware/","section":"Projects","summary":"Developed C firmware from scratch for an ATmega16M1 microcontroller to manage low-voltage power distribution, CAN communication, and thermal management.","title":"Power Distribution Unit Firmware","type":"projects"},{"content":" At a glance # Skills: Python, CAN bus, serial (UART), radio frequency (RF) technology\nWhat: Designed Python software to enable wireless telemetry for Olin College\u0026rsquo;s Formula SAE Electric vehicle. How: Wrote Python code on vehicle\u0026rsquo;s onboard RaspberryPi computer to serialize messages from the CAN bus and transmit to a ground station via UART radios. Why: Enabled wireless telemetry for the first time in team history, allowing for real-time vehicle diagnostics while the vehicle is in motion. Details # Radios used: Holybro SiK Telemetry Radio V3\nIn my first semester at Olin College, I joined Olin Electric Motorsports, a team of undergraduate engineers designing, building, and racing an electric race car for the Formula SAE Electric competition.\nAs a member of the Integration sub-team, wireless telemetry was the first project I was assigned. This project had been attempted several times before on the team, but never made it on the vehicle since it was not mission-critical. The goal of the project is to allow the car to communicate with a computer-based ground station wirelessly. This enables real-time vehicle diagnostics while the car is driving, allowing the team to diagnose and resolve drive-time issues.\nFlowchart of telemetry system\nThe team had already purchased USB UART radios, so it was my job to implement the necessary software. I developed Python code for both the vehicle\u0026rsquo;s onboard computer (a RaspberryPi) and the laptop ground station.\nThe software on the car reads all messages that are sent on the CAN bus, converts the message into a serial object for transmission, then sends the message via serial to the UART radio for transmission. The software uses Python\u0026rsquo;s pickle library for serialization.\nThe software on the ground station runs within our team\u0026rsquo;s existing CAN viewer app, so that the same app can be used for both wired and wireless diagnostics. The software reads serial data from the UART radio, deserializes the message, decodes the CAN message, and displays the message in our visual CAN dashboard.\nMkVII, built by Olin Electric Motorsports in the 2024-2025 academic year\nIn my second semester at Olin Electric Motorsports, I focused on developing firmware for the power distribution unit, which you can read about here.\nResources # Full Coda Documentation ","date":"December 2024","externalUrl":null,"permalink":"/projects/wireless_telemetry/","section":"Projects","summary":"Designed Python software on Raspberry Pi to serialize CAN bus telemetry and transmit live vehicle diagnostics via UART radios.","title":"Wireless Telemetry","type":"projects"},{"content":" At a glance # Skills: MATLAB, computer vision, principal component analysis\nWhat: Created a pedestrian detection algorithm using Principal Component Analysis (PCA). How: Implemented algorithm in MATLAB to determine whether a pedestrian was close by in an image with a 78% accuracy rate. Utilized PCA to reduce the dimensionality of the input images, increasing computational efficiency. Why: Pedestrian detection for vehicle safety features must function in resource constrained systems, making efficient algorithms crucial. Details # Research poster presenting our methodology and results\nFor my final project in Quantitative Engineering Analysis 1 (Linear Algebra) I worked with a partner to create a pedestrian detection algorithm using principal component analysis (PCA).\nOur algorithm, implemented in MATLAB, determined whether a pedestrian was close by in an image with a 78% accuracy rate. Our model was trained and tested on a subset of images from the Caltech pedestrian detection dataset.\nResources # View the full research poster (PDF) ","date":"December 2024","externalUrl":null,"permalink":"/projects/pedestrian_detection/","section":"Projects","summary":"Created a pedestrian detection algorithm in MATLAB using Principal Component Analysis (PCA) achieving a 78% accuracy rate.","title":"Pedestrian Detection Using PCA","type":"projects"},{"content":"","date":"August 2024","externalUrl":null,"permalink":"/tags/breadboard-prototyping/","section":"Tags","summary":"","title":"Breadboard Prototyping","type":"tags"},{"content":" At a glance # Skills: electronic prototyping, soldering, Python\nWhat: Designed and built a low-cost solar-powered device to measure carbon cycling. How: Prototyped and refined electronic design through breadboard testing and final soldered assembly. Programmed ESP32 microcontroller firmware with MicroPython. Why: Developed to be a low-cost open-source alternative to expensive commercial equipment used to measure carbon flux cycles in scientific research. Published project relied upon depreciated electronic components, prompting me to adapt the design. Details # Final carbon dioxide sensor device soldered on a circuit board\nResources # This project was closely inspired by the research paper, \u0026ldquo;Fluxbots: A Method for Building, Deploying, Collecting and Analyzing Data From an Array of Inexpensive, Autonomous Soil Carbon Flux Chambers\u0026rdquo;, Elizabeth Forbes et al. (June 2023). The paper and accompanying source code were extremely useful throughout the design.\nPublished Research Paper Source Code on GitHub ","date":"August 2024","externalUrl":null,"permalink":"/projects/co2sensor/","section":"Projects","summary":"Designed and built a low-cost solar-powered device to measure carbon flux cycles in scientific research using an ESP32 and MicroPython.","title":"Carbon Dioxide Measurement Station","type":"projects"},{"content":"","date":"August 2024","externalUrl":null,"permalink":"/categories/personal-project/","section":"Categories","summary":"","title":"Personal Project","type":"categories"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"You can download my resume as a PDF or view it below:\nYour browser does not support PDFs. Please download the PDF to view it.\n","externalUrl":null,"permalink":"/resume/","section":"Jacob Keller","summary":"","title":"Resume","type":"page"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]