Microcontrollers in Circuits
Basic Electronics
Course 1 · Chapter 10 · Microcontrollers in Circuits
Nine chapters have built the parts of a robot’s electronics one at a time: voltage and current, passive parts, semiconductors, logic, motors and power. A microcontroller board is where they meet. Seen as a circuit part, it is a small chip that can read voltages (logic levels and analogue levels) and produce voltages (logic levels and PWM), with all the limits of any other part: a supply voltage it must stay inside, a few milliamps per pin, an input that expects a certain impedance and a certain range. This chapter is about those limits and about connecting the board to the circuits of Basic Electronics 1 to Basic Electronics 9 without damaging either side. It is not a programming course: each program is short, explained line by line only where the electronics matters, and every circuit is given twice, once for a real breadboard and once for a free browser simulator, with the readings you should expect.
Four boards are used, each where it is the most suitable one, and each time the reason is stated. The Arduino Uno (5 V logic, 10-bit ADC) is the board for 5 V sensors and for learning, and the one that Tinkercad Circuits simulates well. The Raspberry Pi Pico (3.3 V, 12-bit ADC, flexible 16-bit PWM on any pin, MicroPython) is the board for clean 3.3 V work and motor PWM. The ESP32 (3.3 V, Wi-Fi and Bluetooth, many ADC channels and PWM channels) is the board when the robot must be commanded wirelessly. The Raspberry Pi (a Linux computer with GPIO pins and no ADC) is the board when the job is software-heavy (a camera, a network service, a screen) and the electronics is simple. Basic Electronics 11 compares them side by side and wraps up the course.
1. The board as one part in a circuit
Every board shows the same four faces to the outside world, whatever its name:
- Power in. A USB socket, a barrel jack or a pin (VIN, VSYS), feeding an onboard regulator (Basic Electronics 9) that makes the 5 V or 3.3 V the chip actually runs from. The regulator’s spare current is what you may take from the 5 V or 3.3 V pin for sensors: a few tens to a few hundred milliamps, never motors or servos.
- Ground. Several GND pins, all one net. Every external supply that talks to the board by a signal must share this ground (the common ground of Basic Electronics 7 and Basic Electronics 9).
- GPIO pins. General-purpose input and output pins that are configured as a digital input, a digital output, an analogue input (ADC), a PWM output or a special function (serial, I2C, SPI).
- Reset and boot behaviour. At power-on and reset, GPIO pins are inputs (floating or pulled) until the program configures them, for tens to hundreds of milliseconds. Any circuit that must not act in that interval, such as a motor driver, needs a defined default (section 8).
The numbers that matter for each board
These are typical datasheet and manufacturer figures from memory; the exact limits depend on the exact chip, the exact board and the pin, so confirm them on the datasheet before you rely on them (Basic Electronics 11 returns to this).
| Arduino Uno (ATmega328P) | Raspberry Pi Pico (RP2040) | ESP32 dev board | Raspberry Pi (e.g. Pi 4) | |
|---|---|---|---|---|
| Logic level | 5 V | 3.3 V | 3.3 V | 3.3 V, not 5 V tolerant |
| Current per output pin | 20 mA recommended, 40 mA absolute maximum; about 200 mA for the whole chip | 4 mA by default, selectable up to 12 mA; about 50 mA total (check the datasheet) | About 20 mA recommended, 40 mA absolute maximum (varies with the pin and the pad setting) | 16 mA per pin, about 50 mA across all pins (the commonly quoted figures) |
| ADC | 10-bit, 6 channels, reference 5 V (or 1.1 V internal) | 12-bit, 3 pins plus an internal temperature sensor; reference is the 3.3 V supply; effective resolution closer to 9 or 10 bits because of noise | 12-bit, many channels; ADC2 cannot be used while Wi-Fi runs; nonlinear near 0 V and near full scale; needs attenuation set for a 0 to about 3.1 V range | None: add an external ADC chip (for example an MCP3008 over SPI, 10-bit) |
| PWM | 6 pins, 8-bit, 490 or 980 Hz by default (timer registers change this) | 16 channels on any pin, 16-bit counter with an adjustable frequency | LEDC peripheral: 16 channels, any output pin, resolution trades against frequency | 2 hardware channels (4 pins), plus software PWM that jitters |
| Interrupt inputs | External interrupts on D2 and D3 only; pin-change interrupts on all pins | Any GPIO | Any GPIO | Any GPIO, through the operating system (latency tens to hundreds of microseconds, not guaranteed) |
| Internal pull-up | 20 to 50 kΩ | about 50 to 80 kΩ (typical) | about 45 kΩ (typical) | about 50 kΩ (typical) |
2. Digital outputs and the pin-current budget
An output pin is a pair of tiny switches: one to the supply (drives the pin high) and one to ground (drives it low). It behaves as a voltage source with a small series resistance (about 25 to 40 Ω on an AVR pin), so it holds its voltage only while the current stays small. The first design rule is therefore a current budget: the current taken from any one pin, and from all pins together, stays within the figures of the table in section 1. The second is that the pin is a signal source: anything that needs more than a few milliamps is switched by a transistor or driver (Basic Electronics 6 and Basic Electronics 9) and the pin supplies only the base or gate current.
3. Digital inputs, pull-ups and pull-downs
An input pin is a very high impedance (about 1 µA leakage or less) that decides “high” above a threshold VIH and “low” below VIL, as in Basic Electronics 8. The point of an input is that, left unconnected, it floats: it picks up mains hum and your hand, and reads at random. A switch that connects the pin only to ground leaves it floating while open, so a resistor must hold it at a defined level. A pull-up resistor to the supply makes the pin read high when the switch is open and low when it is closed (the pin is “active low”). Every board has an internal pull-up that the program can turn on (INPUT_PULLUP on an Arduino, Pin.PULL_UP in MicroPython), which saves the external resistor.
4. The ADC: turning a voltage into a number
An analogue-to-digital converter compares the input voltage with a reference voltage Vref and returns a whole number from 0 to 2N − 1 for an N-bit converter. The step size, one LSB (least significant bit), is the smallest change it can report. The two formulas you need are the code for a given input and the voltage for a given code.
Fitting a larger voltage into the ADC: the divider
The ADC input must stay between 0 V and Vref (and never above the board’s supply, or the chip is damaged). A battery pack is higher, so a resistive divider (Basic Electronics 1) scales it down. Design it in three steps: choose the ratio from the full-charge voltage, then pick resistors so the source impedance the ADC sees is not too high, then add a small capacitor.
5. PWM: duty cycle, average voltage and resolution
Basic Electronics 8 built PWM from a 555 and Basic Electronics 9 used it for a motor. A microcontroller makes it with a hardware timer: a counter running from the chip’s clock fclk counts from 0 up to a top value and the output is high while the counter is below a compare value. The frequency is the clock divided by the number of steps; the duty cycle is the compare value divided by the top.
Mapping a command onto a motor
Two corrections from Basic Electronics 9 belong in any motor program: a dead zone (the motor will not move below about 18 % duty, so a command of 1 % must map to 0, and a command of 100 % to 100 %, with the rest spread linearly between 18 % and 100 %) and a ramp (the duty rises at a limited rate, such as 2 % every 20 ms, so a change from 0 to 100 % takes 1.0 s and the start-up current is not a stall pulse). For a command c between 0 and 1 above a small threshold, the duty is 18 + 82 × c per cent: half way (c = 0.5) is 59 %, which on a 4.8 V battery is an average of 0.59 × 4.8 = 2.83 V.
6. Interrupts: reacting to an edge without polling
A program that checks a pin in a loop (polling) can miss a pulse shorter than the loop. An interrupt makes the hardware stop the main program the instant a pin changes, run a short interrupt service routine (ISR), and return to exactly where it left off. It is the right tool for a pulse you must not miss: a wheel encoder, a bumper switch, a fast echo or a stop button. The cost is paid in the ISR’s run time, and in three rules: keep it short, share data through a variable declared volatile (Arduino C++) or a plain global (MicroPython), and do not print or wait inside it.
7. Level shifting: mixing 3.3 V and 5 V
Basic Electronics 8 introduced level shifting. In the other direction (5 V output to a 3.3 V input) you can use a resistive divider, which is the cheapest shifter and works for any signal slower than a few megahertz.
8. Driving a motor from a board, safely
A motor driven by a board adds three new ways to fail: the board may start up with the motor pins in an undefined state, the program may hang with the motor on, and the motor’s own supply may dip enough to reset the board mid-move (Basic Electronics 9). The remedy is not clever code but a short list of habits, each of which costs a resistor or a line of code.
- A default of off, in hardware. Put a 100 kΩ pull-down resistor on every driver input (the PWM pin, the direction pins, and the standby pin held low means asleep), so that while the board is booting and its pins float the motor is not driven.
- Separate supplies, common ground. The motor runs from its own battery through the driver; the board runs from USB or a regulator; the only electrical link between them is the common ground and the signal lines.
- Start low and ramp. Power up the program with the duty at 0, and raise it by a few per cent per cycle.
- A watchdog. Most boards have a timer that resets the chip if the program has not “fed” it recently. If the program hangs, the watchdog resets the board and the pull-downs switch the motor off. (In MicroPython:
WDT(timeout=2000), thenwdt.feed()every time round the loop.) - Watch the battery. A divider into an ADC pin (section 4) lets the program cut the motor when the pack falls below its safe limit, and a fuse in the pack lead covers what the program cannot.
- Watch the current. A motor that stalls draws V/R (Basic Electronics 9). A small sense resistor in the motor’s ground return turns that current into a voltage the ADC can read: a 0.22 Ω resistor gives 0.22 V per amp, so the 1.09 A stall of motor M1 reads 0.24 V (297 counts on a Pico) against 0.055 V (68 counts) at the normal 0.25 A, and the program stops the motor if the reading stays above about 0.8 A (0.176 V, 218 counts) for half a second. The resistor wastes up to 0.24 V of the motor’s supply and dissipates 0.22 × 1.092 = 0.26 W at stall: use a 0.5 W part.
- A physical way to stop. A switch in the battery lead (a mechanical relay or a plain toggle) beats any software when something goes wrong.
9. The right board for each job
| Job | Best board | Why (and what the others lack) |
|---|---|---|
| Reading a 5 V analogue sensor (TMP36, a 5 V line sensor array) and flashing outputs; the first board to learn on | Arduino Uno | 5 V logic and 5 V ADC range match 5 V sensors without shifting; 6 ADC pins; Tinkercad Circuits simulates it well; a mistake rarely destroys it, since a 40 mA pin and a socketed chip are forgiving. The Pico and the ESP32 would need level shifting on 5 V sensors, and a Raspberry Pi has no ADC. |
| Motor PWM at 20 kHz with 3.3 V drivers and a clean ADC measurement of a battery | Raspberry Pi Pico | PWM at 20 kHz on any pin with 12-bit resolution (an Uno needs register tricks to leave its 490 Hz default); 3.3 V matches the TB6612 and DRV8833 logic; low cost; MicroPython and Wokwi make it quick to test. Not the best choice if you need wireless or lots of ADC channels. |
| A robot driven from a phone, with Wi-Fi or Bluetooth built in | ESP32 | Radio on the chip, two cores (one for networking), many ADC and PWM channels. Its limits: ADC2 is unavailable while Wi-Fi is running; the ADC is noisy and nonlinear near the ends; 3.3 V only. |
| A camera, a screen, a database or an AI model, with a few simple switches or LEDs | Raspberry Pi | A full Linux computer: Python libraries, networking, USB devices. Not good at hard timing (an encoder at 1000 pulses per second) or at analogue input (no ADC), so a Pico or an Arduino usually handles the motors and sensors beside it. |
10. Build it: four circuits, each on a breadboard and in a simulator
Each circuit below names its board and the reason, then gives the parts, the wiring (as pin-to-pin connections, because the hole positions on your own breadboard will differ), the program and the simulator steps. Menu names in the simulators change from time to time; where I am less sure of an exact name the text says so, and searching the part list by name always works.
Circuit 1 — Arduino Uno: a TMP36 temperature reading, a debounced interrupt button and an LED
Why the Uno: the TMP36 is a 5 V analogue sensor, which suits the Uno’s 5 V supply and 5 V ADC range directly; D2 is a true interrupt pin; Tinkercad simulates this circuit with the sensor’s temperature adjustable by hand.
Parts: Arduino Uno, TMP36 (TO-92 package), push button, red LED, 330 Ω resistor, 100 nF capacitor, breadboard and jumpers.
Simulator, Tinkercad Circuits (tinkercad.com, free account): create a new Circuit; from the component list drag in an Arduino Uno, a breadboard (small), a Temperature Sensor [TMP36], a pushbutton, a red LED and a resistor (set it to 330 Ω in the part’s properties). Wire as above (the sensor’s pins are labelled when you hover; the pushbutton has four legs joined in pairs, so use two diagonally opposite legs). Open Code, choose Text, paste the program, press Start Simulation and open the Serial Monitor. Click the sensor and drag its temperature slider (the range is wide, from about −40 to 125 °C) to 25 °C; click the button in the simulation.
Circuit 2 — Raspberry Pi Pico: a battery monitor, a speed knob and 20 kHz motor PWM, with a watchdog
Why the Pico: the TB6612FNG accepts 3.3 V logic, the Pico makes 20 kHz PWM on any pin with 12-bit resolution, and its ADC measures a 5 V-class battery through a divider of two equal resistors. The program is the short list of habits of section 8: an off default, a ramp, a dead-zone map, a low-battery cut-off and a watchdog.
Parts: Raspberry Pi Pico with headers, TB6612FNG module, a small 6 V hobby motor (M1 of Basic Electronics 9), 4 × AA NiMH cells in a holder (4.8 V), 2 A fast-blow fuse in the pack’s positive lead, two 10 kΩ resistors (divider), 100 nF, 100 µF, 10 kΩ potentiometer, four 100 kΩ resistors (pull-downs), a switch in the pack lead, breadboard.
Simulator, Wokwi (wokwi.com, free): start a new project for the Raspberry Pi Pico with MicroPython (the starter list names may differ slightly) and replace the sample main.py with the program above. Wokwi has no TB6612 that I can count on (check the part list; if one is offered, wire it as above), so represent the driver input by an LED: from GP15 through a 330 Ω resistor to an LED and to GND, and use two potentiometers (the + button opens the parts list; the Wokwi potentiometer part has three pins, a signal pin SIG and the two ends): one on GP27 as the speed knob, one on GP26 as the divider midpoint (with the ends on 3V3 and GND, the wiper reads 0 to 3.3 V, which stands in for the 0 to 6.6 V a 10 k / 10 k divider would pass). Start the simulation and watch the terminal text under the editor. Turn the GP27 pot and the LED’s brightness follows the duty (the LED averages the 20 kHz pulses, as your eye would). If your Wokwi version offers a logic analyzer part, connect it to GP15 to see the pulse widths.
Circuit 3 — ESP32: a potentiometer commanding a hobby servo
Why the ESP32: the same circuit works with a pot today and a command from a phone over Wi-Fi tomorrow, without a second board; the 16-channel LEDC peripheral can make the 50 Hz servo pulse on almost any pin. The pot goes on an ADC1 pin (GPIO34), not an ADC2 pin, because ADC2 stops working when Wi-Fi is on. The servo’s own supply is separate, as in Basic Electronics 9.
Parts: ESP32 dev board (30- or 38-pin), SG90 or similar 9 g servo, 4 × AA NiMH holder (4.8 V), 470 µF electrolytic, 220 Ω resistor, 10 kΩ potentiometer, breadboard.
Simulator, Wokwi: start a new ESP32 project with MicroPython (the project templates may change names), add a servo and a potentiometer from the parts list, wire the servo’s signal to GPIO18, its supply pins to 5V and GND (the simulator does not need the separate pack; the real circuit does) and the potentiometer’s wiper to GPIO34, its ends to 3V3 and GND. Paste the program, start the simulation and drag the pot slider: the servo horn follows. At the middle of the pot the program calls angle_to_duty(90).
Circuit 4 — Raspberry Pi: a button, an LED and an HC-SR04 echo through a divider
Why the Raspberry Pi: it is the right board when the job needs an operating system (a web page, a camera, a screen) and a handful of simple signals. It is the wrong board for an analogue sensor (no ADC) or a precise pulse train (the operating system can delay code by a fraction of a millisecond). Its GPIO pins are 3.3 V and not 5 V tolerant, so the HC-SR04’s 5 V echo signal goes through the 1 k / 2 k divider of section 7.
Parts: any Raspberry Pi with the 40-pin header and Raspberry Pi OS, push button, red LED, 330 Ω resistor, HC-SR04 ultrasonic sensor, 1 kΩ and 2 kΩ resistors, breadboard.
Simulator note: I do not know of a free browser simulator that runs Raspberry Pi OS with its GPIO, so the code is tested on the real Pi. The circuit (the divider and the LED) can be checked in Falstad (below) and the logic of the button and LED in Wokwi, which also provides a Pico and several Arduino-compatible boards, with the equivalent MicroPython calls (Pin(17, Pin.IN, Pin.PULL_UP) and Pin(27, Pin.OUT)). Do not rely on a simulator’s sensor part for the echo timing.
Falstad: the divider, the LED and the PWM filter
Falstad Circuit Simulator (falstad.com/circuit) has no microcontroller, but it checks every circuit-level calculation of this chapter. Part names are in the Draw menu (menu names may differ a little between versions; the right-click menu on a part offers its settings). Level-shift divider: a voltage source set to a square-wave (a 2-terminal source from Inputs and Sources; set the waveform to square, amplitude 2.5 V and DC offset 2.5 V, so it swings from 0 to 5 V), a 1 kΩ resistor, a 2 kΩ resistor to ground and the scope on the junction: the high level reads 3.33 V. Change 2 k to 1 k and the high level falls to 2.50 V. LED: a 3.3 V DC source, a 330 Ω resistor and a LED (Diodes group, or Outputs and Labels, depending on version): the current reads about 3.9 mA with a 2.0 V LED model (Falstad’s default LED model may drop a little more than 2.0 V, so expect 3.5 to 3.9 mA). PWM filter: a square-wave source (0 to 5 V, 490 Hz, 50 % duty, which the source’s duty setting provides), a 10 kΩ resistor, a 1 µF capacitor to ground, and the scope on the capacitor: the average is 2.5 V with a ripple of about 0.26 V peak to peak; change the frequency to 31.37 kHz and the ripple falls to about 4 mV.
Expected readings
| Measurement | Calculated | Real (typical) | Simulator |
|---|---|---|---|
| 1: TMP36 output at 0 / 25 / 50 °C | 0.500 / 0.750 / 1.000 V | Within about ±2 °C (the TMP36 is accurate to about ±2 °C at 25 °C) | Same |
| 1: ADC code at 0 / 25 / 50 °C (5 V reference) | 102 / 153 / 204 | ±2 counts, and the real reference may be 4.7 to 5.1 V | 102 / 153 / 204 |
| 1: temperature printed at those codes | −0.2 / 24.7 / 49.6 °C | ±2 °C of the true temperature; the digits jump by 0.5 °C (one LSB) | Same |
| 1: D2 idle / pressed | 5 V / 0 V (internal pull-up gives 0.1 to 0.25 mA when pressed) | 4.9 to 5.0 V / under 0.1 V | 5 V / 0 V |
| 1: LED current, D8 high | 9.1 mA (3.0 V across 330 Ω) | 8 to 9.5 mA | About 9 mA |
| 1: presses counted per press | 1 (the 20 ms debounce) | 1; two if the contacts are very noisy: raise the delay to 50 ms | 1 |
| 2: divider output at 5.6 / 4.8 / 4.4 V pack | 2.80 / 2.40 / 2.20 V; ADC counts 3475 / 2978 / 2730 | Within 20 counts (the Pico’s ADC has noise and an offset error) | Whatever the pot gives |
| 2: duty at knob 0.5 | 59 % (18 + 82 × 0.5); duty_u16 = 38 665 | Printed target 59 %; speed ramps up in 0.5 s | LED at about 59 % brightness |
| 2: motor average volts at knob 0.5 on 4.8 V | 0.59 × 4.8 = 2.83 V, minus the driver’s small drop | 2.6 to 2.8 V on the motor terminals (a DC range, meter averages) | (no driver) |
| 2: PWM frequency on GP15 | 20 000 Hz; period 50 µs | 20 kHz on a frequency meter | Logic analyzer: 20 kHz (if the part is offered) |
| 2: battery below 4.4 V | Target 0 %, the duty ramps down to 0 in under 1 s | Same | Set the stand-in pot below the 2.2 V point |
| 3: servo pulse at pot 0 / 0.5 / 1.0 | 1.0 / 1.5 / 2.0 ms; duty_u16 3277 / 4915 / 6554 | 0 / 90 / about 180 degrees ± 10 (servos vary) | Horn at about 0 / 90 / 180 degrees |
| 3: a 1.72 ms pulse | 129.6 degrees; duty_u16 5636 | — | — |
| 3: ADC reading near full scale (3.3 V on the pot) | Clamped by the program at 180 degrees | May read 3.1 to 3.2 V at the top because of the ADC’s attenuation; the horn may stop a few degrees short | Reaches full scale |
| 4: V(GPIO24) with a 5 V echo through 1 k / 2 k | 3.33 V | 3.2 to 3.4 V | 3.33 V in Falstad |
| 4: V(GPIO24) with 1 k / 1 k | 2.50 V (only 0.2 V above the 2.3 V threshold) | 2.4 to 2.55 V: works, with little margin | 2.50 V |
| 4: LED current | 3.9 mA | 3.5 to 4.0 mA | 3.5 to 3.9 mA |
| PWM filter ripple, 10 k / 1 µF, D = 0.5, 5 V | 0.255 V p-p at 490 Hz; 3.98 mV p-p at 31.4 kHz | Within 20 % | 0.25 V, 4 mV |
Real readings spread because the resistors, the sensor and the supplies are all loose-tolerance parts and the ADC reference is only as steady as the supply. The structure does not vary: the code follows the pin voltage to within one or two LSB; the duty determines the average to within the driver’s drop; a pull-up holds an input high until the switch pulls it low; and a resistive divider gives the ratio of its resistors whatever the signal.
11. Challenges
analogWrite(pin, 90). Find the duty cycle and the average voltage on a 5 V pin and on a 6 V motor supply. (b) For PWM at 25 kHz, find the number of steps and the resolution in bits of a Pico (125 MHz) and an ESP32 (80 MHz), and the frequency of the Uno’s Timer 1 in 8-bit phase-correct mode (16 MHz, 510 steps). (c) A PWM output at 5 V and D = 0.5 feeds an RC filter of 4.7 kΩ and 2.2 µF. Find the time constant, the ripple at 490 Hz and at 31.4 kHz, and the time to settle within 1 part in 256. (d) A motor at 9000 rpm has a 7-pulse-per-revolution encoder on its shaft and a 30:1 gearbox. Find the pulse rate, the CPU load of a 12 µs ISR, the number of counts in a 50 ms window, the motor speed represented by one count, and the output shaft speed.Quick reference
- Pins: a pin is a small voltage source and a high-impedance sensor; budget the current per pin and in total; switch anything above a few milliamps with a transistor or driver; LED R = (Vpin − VLED)/I
- Inputs: never leave one floating; pull-up Rp 4.7 to 10 kΩ (external) or about 50 kΩ (internal); rise time about 2.2 RpC; debounce in software or hardware
- ADC: LSB = Vref/2N; code = floor(Vin/Vref × 2N); error ±½ LSB; Uno 4.88 mV, Pico 0.806 mV; a smaller reference gives finer steps for a small signal; source impedance 10 kΩ or less and a 100 nF at the pin
- Divider into an ADC: k = R2/(R1 + R2), k × Vmax at most Vref; Vbat = code × LSB / k; TMP36 = 0.5 V + 10 mV/°C
- PWM: Vavg = D × V; steps = fclk/fPWM, bits = floor(log2 steps); 20 kHz is silent; RC filter ripple V D(1 − D)/(R C f); dead zone about 18 %; ramp the duty
- Interrupts: for pulses you must not miss; ISR short, shared variable
volatile, copy with interrupts off on an 8-bit chip; load = rate × ISR time; speed = counts × 60 / (pulses per rev × window) - Level shifting: 5 V to 3.3 V by a divider (1 k / 2 k gives 3.33 V); 3.3 V to 5 V usually fine into an Uno (VIH about 3.0 V) or use a MOSFET module; never 5 V on a 3.3 V pin
- Safe motors: 100 kΩ pull-downs on driver inputs (default off); separate supply and common ground; ramp from zero; watchdog; low-battery cut-off through a divider; current sense (0.22 Ω gives 0.22 V/A); fuse and a hard switch
- Boards: Uno for 5 V sensors and learning; Pico for 3.3 V work and motor PWM; ESP32 for wireless; Raspberry Pi for software-heavy jobs (no ADC, loose timing)
Next, Basic Electronics 11 compares the Arduino, Raspberry Pi Pico, ESP32 and Raspberry Pi and others side by side (logic level, speed, I/O, power, price, wireless, ease of use), gives a table recommending the best board for each robot job, shows how to read a datasheet, covers test equipment and soldering, and wraps up the course with a recap and the path on to Robotics Fundamentals and Programming for Robotics.