Embedded firmware engineer
Write the code that runs inside devices, close to the chip, where timing and memory matter.
What it is day to day
- Write C and C++ that runs on a microcontroller with kilobytes of memory and no operating system, or a small real-time one.
- Bring up new hardware: get the clocks, pins and peripherals working on a board for the first time.
- Talk to sensors and chips over I2C, SPI and UART, reading the datasheet to get the details right.
- Debug with a debugger, a logic analyzer and an oscilloscope, often at the same time.
- Work closely with hardware engineers on schematics, and with testers on what the device must do.
The courses, in order
Each course builds on the one before. Every lesson runs in your browser, free, with nothing to install.
- Step 1
Embedded on the Arduino Uno
One board, twenty pins and a C++ sketch. From a lamp you switch to a game you can play.
- Step 2
Interactive devices on the Uno
Read people and sensors without blocking, control an output, then finish with two playable builds.
- Step 3
Talk to chips: I2C, SPI and UART
The three buses every sensor, screen and radio speaks, on the Uno: serial between two boards, I2C scans and shared buses, SPI screens and an SD card, the logic analyzer, and a weather station that uses them all.
- Step 4
Motors and motion
DC motors on a driver, the H bridge inside it, servos, a stepper on an A4988, an encoder that measures what the motor did, and a 2WD robot car with ultrasonic eyes and line sensors.
- Step 5
Embedded on the ESP32-C3
A 32 bit RISC-V board at 160 MHz. Its own peripherals, its own 3.3 V rules, and a console at the end of it.
- Step 6
Embedded on the Raspberry Pi Pico
A dual core Cortex-M0+ at 125 MHz. PWM on every pin, a 64 bit clock, and pins that do not forgive 5 V.
- Step 7
MicroPython on the Pico
Real Python on a Raspberry Pi Pico: blink and the REPL, buttons and if, loops and PWM, a knob on the ADC, lists and functions on an LED bar, an OLED on I2C, and a reaction game boss.
- Step 8
Connected devices
WiFi, APIs, a web server, MQTT, ESP-NOW and BLE on the ESP32, and a device that keeps going when the network does not.
- Step 9
Embedded on the STM32F411
A Cortex-M4 at 84 MHz, where a pin is a port and a number and every peripheral starts with its clock switched off.
- Step 10
Debug like an engineer
The multimeter, the oscilloscope, the logic probe and analyzer, Serial done right, and a method that finds any fault. Ends with a boss: three bugs in one circuit.
- Step 11
Under the hood
Take the Arduino wrapper off: DDR, PORT and PIN, Timer 1 by hand, the vector table and interrupts, cycle-counted delays in a .S file, a bug read off a halt in the debugger, and a UART drawn by hand on a pin.
- Step 12
Read datasheets and schematics
The skill every hardware job asks for: schematic symbols, a first page, absolute maximum ratings, timing diagrams, register maps and pinouts, each checked on real parts. Ends with a sensor brought up from its datasheet alone.
- Step 13
Control systems: PID
Feedback control on real physics: open and closed loops, P, I and D one at a time, tuning by the numbers, encoders, a balancing robot, and a motor that holds its speed whatever you throw at it.
- Step 14
Scheduling and RTOS
From a scheduler written by hand to FreeRTOS on the Uno: tasks and priorities, time slicing on the logic analyzer, queues, mutexes and priority inversion, starvation and the watchdog, and a four-task device.
- Step 15
Low power products
Make a battery last years: where an Uno’s current goes, sleep modes and wake sources, a power budget on a bare chip, measuring with a meter and an INA219, battery life checked against a draining cell, and a coin cell node.
- Step 16
Firmware architecture
How a whole device is put together on the Uno: a scheduler and state machines, ISRs that only record, drivers behind interfaces, checked settings in EEPROM, error codes and the watchdog, safe updates, and a layered multi-sensor boss.
- Step 17
Portfolio and interviews
Turn finished projects into a job search: choose and document portfolio pieces, share links that run, read job posts and answer technical questions out loud.
Your skills checklist
- Digital and analog I/O, timing and a sketch from scratchEmbedded on the Arduino Uno
- Non-blocking code: millis(), state machines and debouncingInteractive devices on the Uno
- I2C, SPI and UART, read from a datasheetTalk to chips: I2C, SPI and UART
- PWM, motor drivers, servos and steppersMotors and motion
- A 32-bit board and its 3.3 V rulesEmbedded on the ESP32-C3
- Clocks and peripherals that start switched offEmbedded on the STM32F411
- Debugging with a meter, a scope and a logic analyzerDebug like an engineer
- Registers, interrupts and reading assemblyUnder the hood
- Tasks, priorities and deadlines on an RTOSScheduling and RTOS
- Firmware structured into layers that can be testedFirmware architecture
Projects to build and show
Open one, run it, change it, then share your version as a link that runs. The last course in this guide shows how to write each one up.
Temperature and light on one I2C bus
Two chips at their own addresses on one bus, read from their datasheets.
Alarm clock
A real-time clock chip, a display driver and a state machine for the alarm.
Kalman filter tilt angle
Sensor fusion: an accelerometer and gyro combined into a steady angle.
Rocket flight computer
A self-test, flight states, a filtered apogee and a log on an SD card.
After Mokxi, in the real world
Mokxi teaches the skills; employers, schools and licensing boards set their own rules. These are the common routes, and they vary by place.
Training and education
- Most embedded engineers have a degree in electrical engineering, computer engineering or computer science. Some move in from electronics technician roles or from software with strong hardware projects.
- A community college associate program in electronics or computer engineering technology is a common first step, and some credits can transfer to a bachelor's.
- Buy a cheap development board and a logic analyzer, and build the same projects on real hardware. Interviewers often ask what went wrong on a real bench.
Certifications
- No certification is expected for most firmware jobs; projects and a degree carry more weight.
- Some fields have their own safety standards (cars, medical devices, aircraft). Employers in those fields usually train you on them.
Entry-level titles to search
- Junior embedded software engineer
- Firmware engineer I
- Embedded systems engineer
- Associate firmware developer
- Embedded software intern
- Hardware test engineer
Questions you may be asked
Short answers drawn from the courses. Say each one out loud, then check it on a circuit.
What does volatile mean, and when do you need it?
It tells the compiler the value can change outside the code it can see, for example in an interrupt or a hardware register, so it must read it every time instead of keeping a copy.
What should an interrupt handler do?
As little as possible: record what happened, set a flag or copy data into a buffer, and return. The main loop does the slow work. Long handlers delay other interrupts.
Why is delay() a problem in larger programs?
It blocks: nothing else runs while it waits. Checking millis() against a saved time lets one loop handle many tasks, each at its own rate.
Compare I2C, SPI and UART.
I2C uses two shared wires and addresses for many devices, at modest speed. SPI uses separate select lines and is faster. UART is two wires point to point, with no clock, so both ends agree on a baud rate.
What is a pull-up resistor for?
It holds an input at a known high level when nothing drives it, so it does not float. A button then pulls the pin low when pressed.
What is debouncing?
A mechanical switch bounces for a few milliseconds when pressed. Debouncing ignores changes inside a short window so one press counts once.
What is PWM, and what is it used for?
Switching a pin on and off fast with a set on-time fraction, the duty cycle. The average power sets LED brightness or motor speed.
How do you set a bit in a register without changing the others?
OR it with a mask: reg |= (1 << n). Clear it with AND and the inverted mask: reg &= ~(1 << n).
The board resets at random. Where do you start?
Check power first with a scope (a dip on the supply when a motor starts is common), then look for a watchdog, a stack overflow or a bad pointer. Reproduce it before changing anything.
What is the difference between a microcontroller and a microprocessor?
A microcontroller has its processor, memory and peripherals on one chip and runs one program. A microprocessor needs external memory and usually runs an operating system.
Step 1 is Embedded on the Arduino Uno
One board, twenty pins and a C++ sketch. From a lamp you switch to a game you can play.