1. How to use this document
You will not read this end-to-end. Use it like a dictionary with a learning path on top.
- Day 1 of your co-op: skim sections 2–4 (Prerequisites, Suggested Path, the Practical 20 list at the end of section 5). That alone puts you ahead of most interns.
- When you hit an unfamiliar term in code or a meeting:
Cmd-Fthe term in section 5. Each entry is self-contained. - When you want depth on a topic: follow the 📚 links at the bottom of the section. Those are the canonical, freely available resources — not random blog posts.
- When you're about to wire a part on your bench: jump to the sister Hardware Quick Reference (link in the navbar) and look up the exact part — it cross-links back to the concepts here.
2. Prerequisites
You don't need an EE degree, but the following mental model is assumed throughout this document. If you don't have it, the Practical 20 in section 4 will catch you up over a week.
Math (intuition, not proofs):
- Algebra: solve for an unknown. Why: every circuit calculation is solving V = IR for one of the three.
- Trig: sine, cosine, frequency, phase. Why: AC analysis, audio, filters, control loops.
- Logarithms. Why: decibels, RC time constants, RC filter cutoff math.
Programming (one of these is enough):
- Python — the default for MicroPython on the Pico and ESP32-S3. You should be comfortable with classes, decorators, async, and type hints.
- C / C++ — for ESP-IDF, Arduino, or any low-level work. Pointers, structs,
volatile,static, bit manipulation. - Shell —
cd,ls,grep,|,>,python -m venv,esptool.py.
Tools to install (do this on day 1):
# Thonny (the friendliest MicroPython IDE — recommended for first month)
sudo apt install thonny # or download from thonny.org
# mpremote — the official MicroPython command-line tool
pip install mpremote
# esptool — for flashing ESP32 / ESP32-S3 boards over USB
pip install esptool
# Arduino IDE 2.x — for Arduino C/C++ projects
# Download from arduino.cc
3. Suggested learning path (5 steps)
Do these in order. Each step is a few evenings of work, not a course.
Step 1 — Build a “Hello World” on every board you own
Blink an LED on the Raspberry Pi Pico W in MicroPython, then on the ESP32-S3-DevKitC-1 in Arduino. The goal isn’t the LED — it’s that you can edit a file, save it, and see the result on hardware twice. The two toolchains are different enough that doing both first will save you hours later. 📚 Pico MicroPython: docs.micropython.org
Step 2 — Read a sensor, print a value
Wire the KY-018 LDR to an ADC pin (a voltage divider with a 10 kΩ resistor). Print the value to the REPL. Then the KY-013 thermistor. Then the MPU-6050 IMU over I²C. The goal: build the mental loop electrons → ADC/I²C bytes → Python number → print. This is the same loop for every sensor you’ll ever use.
Step 3 — Drive an output that isn’t an LED
Drive a SG90 servo with PWM (need a 5 V supply, not the 3.3 V rail). Then a TB6612FNG + N20 gearmotor with PWM + direction. Then an SSD1306 OLED over I²C. The goal: the inverse of step 2 — Python number → PWM/I²C bytes → motion/pixels. By the end of this step you have a complete input → process → output robot on a breadboard.
Step 4 — Talk to a computer
Add UART serial debugging to every project (every ESP32-S3 has USB-serial built in). Then Wi-Fi on the ESP32-S3 — connect to your router, serve a web page that displays the sensor reading. Then MQTT to publish to a broker. The goal: your project is no longer a black box; you can see it from your laptop or phone.
Step 5 — Build a real thing and put it in a box
Take any project from steps 1–4 and make it survive a week on a shelf: OTA updates (so you don’t have to unplug it to reflash), deep sleep (so a battery lasts), 3D-printed enclosure, screw terminals instead of Dupont. The goal: learn the difference between a prototype and a product. This is the difference between a co-op and a junior engineer.
Optional but recommended: the FastLED / NeoPixel guide for the WS2812B strip; the Modern Robotics course if you go into motion. Both linked in section 7.
4. The Practical 20 — read these first
If you only read 20 entries in this glossary, read these. They cover ~90% of what you'll see in your first month on a microcontroller project.
Each entry: a one-line definition, then a practical note in italics that says what it means on the bench. Entries marked 🔥 are the practical-20.
A
7 termsAddress (I²C / SPI)
#i2c.scan() in MicroPython on every new bus; you'll discover 50% of the time a module's address is 0x76 not 0x77, or 0x3C not 0x3D. Don't trust the listing photo — read the chip on the actual board.Ampere (A) / Current (I)
#Amplifier (Op-Amp / Class-D)
#Anode / Cathode
#−. Reverse either and at best it doesn't work; at worst it pops, vents, or bursts. Always check the stripe before applying power.Arduino
#setup() runs once, loop() runs forever. Practical: In 2026 you have three serious choices for an MCU project: Arduino (best library ecosystem, easiest for beginners), ESP-IDF (Espressif's official, more powerful, steeper curve), MicroPython (fastest iteration, weakest on hard real-time). Pick the one that matches the deadline. Don't learn all three at once.Asynchronous vs Synchronous
#B
14 termsBattery (18650 / Li-ion / LiPo)
#Baud Rate
#mojibake (garbled text) in the serial monitor, baud is wrong. Rule: start at 115200 for debug logs, drop to 9600 only for slow peripherals.Bias Resistor (Transistor Base / Gate)
#Bit / Byte / Nibble
#Bleed Resistor
#Bluetooth (BLE / Classic)
#BNC / SMA / USB-C / Barrel Jack
#Bode Plot
#f = 1/(2π·RC) = 159 Hz. That's your cutoff. See also: Low-Pass Filter (LPF), Cutoff Frequency (fc).Boot Mode / Boot Button
#Boost Converter
#Brownout
#Buck Converter
#Buck-Boost Converter
#Bus
#C
12 termsCapacitor (Decoupling / Bypass)
#Capacitor (Electrolytic)
#Capacitor (Ceramic)
#Chip Select (CS) / Slave Select (SS)
#CS̅ or SS̅). Practical: Each SPI device gets its own GPIO for CS. The MAX31855 thermocouple board, the ST7789 TFT, and the SD card on your future breakout each need a unique CS. Tie unused CS lines high (3.3 V) so they ignore bus traffic. See also: SPI (Serial Peripheral Interface), Bus.Clock Stretching
#CMOS vs TTL Logic Levels
#Common-Mode Voltage
#Vcm spec.Controller Area Network (CAN)
#Coulomb (C) / Charge (Q)
#Crystal / Oscillator
#Current Sink vs Source
#Cutoff Frequency (fc)
#fc = 1 / (2π·R·C). Practical: Want to filter PWM into a smooth analog voltage? Set fc ~10× lower than the PWM frequency. Want to filter 50 Hz mains hum? Use fc ≈ 10 Hz (RC: 10 kΩ + 1.5 µF). See also: Bode Plot, Low-Pass Filter (LPF), PWM (Pulse-Width Modulation).D
11 termsDarlington Pair
#Datasheet
#DC vs AC
#Dead Band / Dead Zone
#if abs(error) < 5: output = 0. Mechanical-side: use a spring-preloaded linkage to take up the slack.Debouncing
#Decibel (dB)
#Decoupling Capacitor
#Diode
#Differential Signaling
#DMA (Direct Memory Access)
#Duty Cycle
#brightness = pow(duty, 2.2). See also: PWM (Pulse-Width Modulation), Frequency (Hz), RC Filter.E
7 termsEEPROM
#EMI (Electromagnetic Interference)
#ESD (Electrostatic Discharge)
#ESP-IDF (Espressif IoT Development Framework)
#ESP32 / ESP32-S3 / ESP32-C3
#esptool.py
#esptool.py chip_id (does the USB connection work?), esptool.py erase_flash (clean slate), esptool.py write_flash 0x0 firmware.bin (flash). When flashing fails, the first thing to check is whether the board is in download mode (BOOT held during reset).Ethernet
#F
7 termsFarad (F) / Capacitance (C)
#Ferrite Bead
#Flash Memory
#Flip-Flop
#FPGA
#Frequency (Hz)
#Fuse / PTC Resettable
#G
3 termsGND (Ground) / 0 V
#GPIO (General-Purpose Input/Output)
#Ground Loop
#H
3 termsHall Sensor
#Hardware Abstraction Layer (HAL)
#driver/ is a HAL. STM32CubeMX generates one. Practical: The HAL is the right level for most code: high enough to be portable, low enough to be efficient. Going below the HAL (direct register writes) is occasionally necessary (PIO for WS2812B) but should be your last resort.Hexadecimal (Hex / 0x)
#I
5 termsI²C (Inter-Integrated Circuit)
#I²S (Inter-IC Sound)
#Impedance
#Inductor
#Interrupt (IRQ)
#volatile in C, or use atomic primitives. On the ESP32, the IRAM_ATTR macro places the ISR in IRAM for fast access.J
2 termsJTAG
#openocd or use the Arduino IDE's debug feature, and you can step through C/C++ code on the chip. Invaluable when a bug is “the SPI read returns 0 and I don't know why.” SWD is the ARM equivalent (2 wires, faster). See also: Reset / RESET Pin, Datasheet.Jumper Wire
#L
8 termsLDO (Low-Dropout Regulator)
#LED (Light-Emitting Diode)
#R = (3.3 − 2.0) / 0.015 = 87 Ω — use 100 Ω. For a 5 V Arduino driving the same LED: 150 Ω. See also: RGB LED / WS2812B / NeoPixel, Anode / Cathode, PWM (Pulse-Width Modulation).Level Shifter
#LiPo (Lithium Polymer)
#Load Cell / Strain Gauge
#hx711.read_average(20) for a stable reading.Logic Analyzer
#Low-Pass Filter (LPF)
#LTSpice / SPICE
#M
4 termsMicrocontroller (MCU)
#MicroPython
#MOSFET
#Multimeter
#N
2 termsNoise (Electrical)
#NPN / PNP (Bipolar Junction Transistor)
#O
6 termsOhm (Ω) / Resistance (R)
#Ohm's Law
#Op-Amp (Operational Amplifier)
#Open-Drain / Open-Collector
#Oscilloscope
#OTA (Over-the-Air Update)
#ArduinoOTA library or ESP-IDF's app_update. Practical: For any project that goes in a box on a wall, OTA is the difference between “easy to maintain” and “truck roll.” Always have a fallback in the bootloader: if the new firmware doesn't boot in 10 s, roll back to the previous one. The ESP32's A/B partition scheme handles this. See also: Boot Mode / Boot Button, Flash Memory.P
5 termsPCB (Printed Circuit Board)
#PID Controller
#PIO (Programmable I/O)
#rp2.StateMachine for the Pico; ESP-IDF has pio_program for the S3. Once you've used PIO for one protocol, you'll find excuses to use it for everything.Pull-up / Pull-down Resistor
#PWM (Pulse-Width Modulation)
#Q
1 termQuartz Crystal
#R
9 termsRail-to-Rail
#RC Filter
#Relay Module
#Reset / RESET Pin
#Resistor Color Code
#RGB LED / WS2812B / NeoPixel
#RMS (Root Mean Square)
#RS-232 / RS-485 / UART
#RTC (Real-Time Clock)
#S
14 termsSchmitt Trigger
#Sensor (Analog / Digital / I²C / SPI)
#Serial (UART)
#Servo Motor (SG90 / Standard)
#Shield / Carrier / Breakout
#Signal Integrity
#Sleep / Deep Sleep / Light Sleep
#SMD (Surface-Mount Device)
#Snubber
#Solenoid
#SPI (Serial Peripheral Interface)
#Star Ground
#Stepper Motor (NEMA 11 / NEMA 17)
#Switch (SPST / SPDT / DPDT / Slide / Tactile)
#T
4 termsTantalum Capacitor
#Thermistor (NTC / 10 kΩ)
#TP4056
#Transistor (BJT / MOSFET)
#U
3 termsUART (Universal Asynchronous Receiver/Transmitter)
#Serial.println() in Arduino, print() in MicroPython; (2) module comms — GPS, Bluetooth modules, the DFPlayer in your kit, XBee; (3) MCU-to-MCU — wire two boards' UARTs together (TX→RX, RX→TX, GND→GND). See also: Baud Rate, RS-232 / RS-485 / UART, Serial (UART).USB (Universal Serial Bus)
#USB Cable Trap (Charge-Only vs Data)
#V
3 termsVoltage (V)
#Voltage Divider
#Voltage Regulator
#W
3 termsWatchdog Timer (WDT)
#esp_task_wdt_reset() (in the right task) is the kick. See also: Reset / RESET Pin, OTA (Over-the-Air Update).Wheatstone Bridge
#Wi-Fi (802.11)
#Z
1 termZener Diode
#No matches
Try a different term, or press Esc to clear the search.
6. Quick reference tables
6.1 Bus comparison
| Bus | Wires | Speed | Devices | Best for |
|---|---|---|---|---|
| UART | 2 (TX, RX) | up to ~1 Mbaud | point-to-point | debug, GPS, BT modules, DFPlayer |
| I²C | 2 (SDA, SCL) | 100 kHz / 400 kHz / 1 MHz / 3.4 MHz | up to 127 (7-bit addr) | sensors, OLEDs, RTCs, port expanders |
| SPI | 4+ (MOSI, MISO, SCK, CS per device) | 1–80 MHz | limited by GPIO | displays, SD cards, high-speed ADCs |
| I²S | 3 (BCLK, WS, DATA) | audio rates (44.1 / 48 kHz typical) | point-to-point (or 2-mic share) | digital mics, Class-D amps |
| CAN | 2 (CANH, CANL, differential) | 125 kbps – 1 Mbps | many, message-addressed | automotive, industrial, drones |
| USB | 4 (VBUS, D+, D−, GND) | 12 / 480 / 5000 Mbps | 127 (with hub) | PC peripherals, charging |
6.2 Power budget for a typical ESP32-S3 project
| Subsystem | Current (active) | Current (sleep) | Notes |
|---|---|---|---|
| ESP32-S3 (CPU only) | ~50 mA | ~10 µA (deep sleep) | 240 MHz dual-core |
| ESP32-S3 (Wi-Fi TX) | ~250 mA | ~5 mA (modem sleep) | peaks during TX bursts |
| SSD1306 OLED | ~20 mA | ~10 µA (off) | all pixels on = worst case |
| MPU-6050 IMU | ~3.6 mA | ~5 µA (sleep) | gyro on at full rate |
| INMP441 mic | ~1.4 mA | n/a (always on) | doesn't have a sleep mode |
| N20 motor (TB6612FNG) | ~200 mA / motor stall | ~5 mA idle | add 100 µF bulk cap on motor supply |
| WS2812B LED (per LED) | ~60 mA (white) | ~1 mA | full white is worst case |
6.3 ESP32-S3 pin allocation (the ones you MUST know)
| Pin(s) | Function | Don't use for |
|---|---|---|
| GPIO0 | BOOT strap (must be HIGH at boot) | anything that pulls LOW at boot |
| GPIO3 | BOOT strap (must be FLOAT/HIGH at boot) | outputs that drive LOW at boot |
| GPIO19, GPIO20 | USB CDC (D−, D+) | wired peripherals on most boards |
| GPIO26–GPIO32 | PSRAM data lines (N16R8 only) | anything if you have PSRAM enabled |
| GPIO33–GPIO37 | PSRAM control lines (N16R8 only) | anything if you have PSRAM enabled |
| GPIO43, GPIO44 | default UART0 (debug serial TX/RX) | anything you want to read on USB |
| GPIO45, GPIO46 | BOOT strap (V_SPI_STRAP) | anything at boot |
| GPIO48 | on-board RGB LED (most DevKitC-1 boards) | — |
Rule of thumb: for a sensor on the breadboard, default to GPIO1, GPIO2, GPIO4–GPIO10, GPIO15–GPIO18, GPIO21, GPIO38–GPIO42, GPIO47, GPIO48 — all conflict-free, all 3.3 V tolerant, all bidirectional, all capable of ADC / PWM / I²C / SPI as needed.
6.4 Protocol cheat sheet (one example per bus)
| Bus | Example | Code pattern |
|---|---|---|
| UART | DFPlayer Mini | uart.write(b'\x7E\x03\x00\x01\xEF') to play track 1 |
| I²C | MPU-6050 | i2c.writeto_mem(0x68, 0x6B, b'\x00') to wake, then i2c.readfrom_mem(0x68, 0x3B, 14) for accel+gyro |
| SPI | ST7789 TFT | spi.write(b'\x2A\x00\x00\x00\xEF') to set column range |
| I²S | INMP441 mic | i2s.readinto(buf) into a 32-bit DMA buffer, mask off 24 bits |
| PWM | SG90 servo | pwm.duty_u16(int(angle/180*4000+2000)) (50 Hz, 1–2 ms pulse) |
| ADC | KY-018 LDR | adc.read_u16() returns 0–65535, scale to lux as needed |
| OneWire | DS18B20 temp | ds.convert_temp(); value = ds.read_temp_async() — every 750 ms |
6.5 Units cheat sheet
| Quantity | SI unit | Common in MCUs | Conversion |
|---|---|---|---|
| Voltage | V (volt) | mV, V | 3.3 V = 3 300 mV |
| Current | A (ampere) | µA, mA, A | 1 A = 1 000 mA = 1 000 000 µA |
| Resistance | Ω (ohm) | Ω, kΩ, MΩ | 1 MΩ = 1 000 000 Ω |
| Capacitance | F (farad) | pF, nF, µF | 1 µF = 1 000 nF = 1 000 000 pF |
| Frequency | Hz (hertz) | Hz, kHz, MHz, GHz | 240 MHz = 240 000 000 Hz |
| Time | s (second) | µs, ms, s | 1 ms = 1 000 µs |
| Power | W (watt) | mW, W | P = V × I; P = I² × R; P = V² / R |
| Charge | C (coulomb) | mAh (battery) | 1 mAh = 3.6 C |
| Temperature | K (kelvin) | °C, °F | 0 °C = 273.15 K; °F = °C × 9/5 + 32 |
| Data | bit, byte | KB, MB, GB | 1 byte = 8 bits; 1 KB = 1 024 bytes |
6.6 Debugging checklist (the first 5 things to try)
- Measure the rail. Put the multimeter on 3.3 V and GND at the IC's pins. Is it actually 3.3 V? Brownout is the #1 cause of weirdness.
- Run
i2c.scan(). The device is at 0x76, not 0x77. Always. - Swap the cable. Charge-only USB cables exist. They look identical.
- Print the actual bytes, not what you think they should be.
print(repr(buf))shows escape sequences. Mojibake is almost always baud rate, not the device. - Reduce to minimum. Comment out half the code. Does the bug still happen? If not, you added the bug. If yes, it's in the part you didn't touch.
If those don't fix it, reach for the logic analyzer (set a trigger on CS falling edge, decode as SPI/I²C) and the oscilloscope (set a trigger on the reset line, single-shot capture).
7. Further reading
Start here (free, high quality):
- 🔥 MicroPython docs — docs.micropython.org
- 🔥 ESP-IDF programming guide — docs.espressif.com
- 🔥 Arduino reference — docs.arduino.cc
- 🔥 Raspberry Pi Pico SDK / Pico W docs — raspberrypi.com
- 📚 Practical Electronics for Inventors (Scherz & Monk) — the best all-around intro text
- 📚 The Art of Electronics (Horowitz & Hill) — the canonical reference, get it used
Hands-on tutorials:
- 📚 FastLED library (WS2812B on any platform) — fastled.io
- 📚 Adafruit Learn (hundreds of sensor + project guides) — learn.adafruit.com
- 📚 SparkFun tutorials (I²C, SPI, LiPo, etc.) — learn.sparkfun.com
- 📚 Phil's Lab (YouTube, altium + STM32 + motors) — the best embedded YouTube channel
- 📚 Big Clive (YouTube, teardowns + reverse engineering)
- 📚 EEVblog (Dave Jones, YouTube, general EE + reviews)
Datasheets (keep open in a tab):
- ESP32-S3 — espressif.com
- RP2040 (Pico W) — datasheets.raspberrypi.com
- MPU-6050 — invensense.tdk.com
- A4988 / TMC2209 — on AliExpress listings or the Trinamic / Allegro PDFs
Stay current:
- Hackaday — hackaday.com
- r/embedded, r/esp32, r/raspberrypipico — Reddit
- Espressif forums — esp32.com
- EEVblog forums — eevblog.com/forum
Last updated: July 2026. Maintained as a living document — if a term on your co-op isn't here, add it.