A GPS module on a breadboard will tell you how fast you were a second ago. That is fine on the bench and useless the moment the number should move with your feet. In the video, How To Electronics set out to leave that lag behind. The creator wanted a compact speedometer that treats GPS as the long-term truth and the MPU6050 as the short-term muscle: walk at 3–8 km/h, park the same board next to a car speedometer up to about 80 km/h, and keep the OLED honest when the satellite sentence is late.
That brief does not survive jumper wire. The ATGM336H talks UART. The IMU and the 0.96" SSD1306 share I2C. Acceleration integrates at about 100 Hz, so every millivolt of supply bounce becomes a fake shove. A 2-layer board with local decoupling, a rigid IMU seat, and short bus runs is what turns a fusion sketch into something you can take outside.
GPS Anchors the Number; the IMU Makes It Feel Instant
The earlier Arduino GPS speedometer on the same channel was "not too good." GPS is stable and slow. The MPU6050 is fast and drifts the moment you integrate it. Firmware refuses to pick a winner. A two-state Kalman filter keeps vehicle speed and a residual forward-acceleration bias. GPS is the absolute reference. The IMU only predicts between fixes. If the inertial guess walks away, the filter re-anchors instead of arguing with the satellite.
Figure: ESP32 Speedometer components required
On power-up the board sits still for a few seconds. The ESP32 averages the gyroscope for zero-rate bias and initializes roll and pitch from gravity. For dead reckoning the mechanical rule is stricter: mount the MPU6050 so +X points forward, +Y left, +Z up, and do not let the module rock on header pins. Pitch knocks gravity out of the forward axis. Fast rotations above about 30 dps suppress integration so a yaw flick does not become a phantom sprint.

When GPS speed, gyro rate, and acceleration magnitude all look parked for about 700 ms, a zero-velocity update pulls the estimate to zero and learns the leftover bias. That is why the OLED drops to ~0 km/h when you stop. The display sells the project: a large km/h value on top, then fix, satellites, raw GPS speed, heading, HDOP, and North/East components. Missing sensors print GPS NOT DETECTED or IMU NOT DETECTED. Walking at 3–8 km/h, the fused number tracks pace that raw NMEA smears. Beside a car speedometer the typical gap is 1–2 km/h at lower speeds and 3–4 km/h near 80 km/h.
Two-Layer FR-4 That Matches a 100 Hz IMU, Not an INS Rack
A teaching dead-reckoner needs drill that lands in the header, mask that does not flood a pad, and copper that stays off the router. EasyEDA produced a compact double-sided board with through-hole parts so an evening of soldering is enough.
|
Parameter |
Choice on this project |
|---|---|
|
Layers / material |
2-layer standard FR-4 |
|
Thickness / copper |
1.6 mm class, 1 oz both sides |
|
Finish |
Lead-free HASL for first articles |
|
Layout style |
Through-hole + female headers |
|
Buses |
UART2 GPS TX→GPIO16, RX→GPIO17; I2C GPIO21/22 |
|
Addresses |
MPU6050 0x68, SSD1306 0x3C |
|
Local power |
10 µF bulk + 100 nF at the rails |
All critical modules sit on the front. Female headers keep the ESP32 and OLED removable. Ceramics live on the supply pins. The GPS antenna needs sky. The IMU needs a stiff seat.

When Jumpers Invent Acceleration and Gerbers Ask Awkward Questions
Fusion fails in two boring ways before it fails in math. First, the IMU is not rigid. A module that leans when you tap the OLED changes the gravity estimate and the Kalman bias learns the wrong number. Second, GPS UART and I2C share a small board with an ESP32 radio. Without 100 nF at the pins, a Wi-Fi burst looks like a shove. The creator soldered the electrolytics and ceramics on the supply islands for that reason.
Firmware also refuses heroics. GPS course is noisy when you walk, so heading stays on the OLED. Inertial prediction is capped to a few seconds after the last GPS correction. ZUPT runs only when three sensors agree the board is still.
Then the Gerber raises factory questions. Compact through-hole boards with headers near the outline fill the same EQ queue every week: via tenting on the quote disagrees with the mask layer, header holes never declare PTH or NPTH, and tooling features arrive without a size.
I have watched that pattern on other 2-layer files. On a 4 mm-thick&20 mm-wide panel we reviewed, tented 0.4 mm vias could not hold the aspect ratio, NPTH sizes were missing, and a single-piece note left no locating holes. CAM opened the via drill to 0.6 mm, named the large holes, and added 2.0 mm locating holes plus 0.8 mm stamp holes. Same conversation here: match quote tenting to the mask, open every barrel you intend to wet, and do not leave an antenna hole for the factory to guess from the outline.


How the AIVON PCB Let the Road Test Trust the Number
The Gerbers left EasyEDA and landed at AIVON as a first-article job, not as a science project. Three days later the boards were on the bench: 2-layer FR-4, 1.6 mm class, lead-free HASL, double-sided, clean mask, holes that matched the 3D view. That turnaround is what let How To Electronics leave the jumper phase while the firmware was still being argued with. The walking clip and the dashboard comparison only exist because a finished panel arrived before the idea went cold.

What the AIVON PCB actually unlocked is specific. UART from the ATGM336H no longer hops three jumper colors, so NMEA edges stay on GPIO16/17 instead of on a floating wire. The MPU6050 and the SSD1306 share one I2C pair with a fixed pull-up length, which is why 0x68 and 0x3C keep answering instead of vanishing when the OLED is replugged. Each 3.3 V island has a 10 µF bulk and a 100 nF ceramic where the current loop is small. At 100 Hz that is the difference between acceleration and supply bounce. Female headers on the ESP32 and the display made an evening assembly realistic and still left a path to swap a module. None of those features is exotic. All of them have to be true on the same piece of FR-4 or the Kalman spends the road test learning USB noise.

AIVON's part was not to invent the filter. It was to make the 2-layer file boring enough that the filter could be trusted. Standard FR-4 and 1 oz copper are the right stackup for this brief; six layers would not have made the IMU more honest. Lead-free HASL is the right first-article finish for through-hole headers. Front-side placement kept the assembler looking at one face. CAM still had to do the unglamorous work that first articles live or die on: via covering that matches the quote, silk off the pads, copper held about 0.2 mm off a routed outline, PTH barrels opened so the headers wet.
That last cluster is the same review we run on other 2-layer jobs. Silk is the item people laugh at until a header will not wet. On a 1.0 mm TG170 board we reviewed, legend sat on pads, the notes said 141 × 286 mm while the file with process edges measured 141 × 288 mm, and selected vias asked for copper-paste plug. CAM moved the silk, adopted the file dimension so the 2.0 mm V-cut landed, and locked which vias needed paste. This speedometer does not need paste-plug vias. It needed the same habit: RefDes beside the pad, an outline that matches the notes, and tenting that means the same thing in the quote and in the mask. Once those rules were in the copper, the creator could rigid-mount the MPU6050, point +X down the road, and compare the OLED with a car speedometer instead of debugging a bird's nest.

DFM checklist for ESP32 + GPS + MPU6050 trackers
|
Check |
Why it shows up here |
Pass look |
|---|---|---|
|
100 nF within 2–3 mm of each 3.3 V pin |
IMU supply rejection at ~100 Hz |
Cap pad kisses the module pin |
|
MPU6050 rigid, +X forward |
Gravity leak becomes Kalman bias |
Module does not rock when the OLED is pressed |
|
Quote tenting matches the mask layer |
HASL will fill an open via |
One rule in the fab notes |
|
PTH vs NPTH named; large holes sized |
Headers, antenna, mounting |
Factory does not guess a hole from the outline |
|
Silk off pads |
Ink will not wet |
Ref des sits beside the pad |
|
Copper ≥0.2 mm from routed outline |
Headers and antenna near the edge |
No 3.3 V pour on the router path |
The rigid-IMU row is the one worth stealing first. A pretty Kalman that learns a tilted gravity vector is worse than raw GPS.
A Learning Speedometer That Finally Left the Bench
The build holds together because How To Electronics treated the PCB as part of the instrument, not as a way to hide wires. The ESP32 still does the clever work—TinyGPSPlus, the tilt filter, the two-state speed Kalman, ZUPT—but the AIVON board is what lets a 100 Hz IMU sit next to a UART GPS without inventing acceleration. Short I2C, ceramics on the pins, a stiff MPU6050 seat, and a 2-layer file that CAM will not have to argue with are the habits that make the OLED number worth watching.
The design remains a learning platform, not a certified odometer. Take the fusion and the DFM discipline to the next prototype that has to leave the bench.
FAQ
Q1: Can an ESP32 GPS + MPU6050 dead-reckoner stay on 2-layer FR-4?
A1: Yes. The filter is scalar speed plus bias, not a full INS. Two layers with local ceramics and a rigid IMU beat jumper-length I2C on four layers.
Q2: Why put 100 nF at the MPU6050 instead of one bulk cap on the rail?
A2: Integration turns supply bounce into velocity. A ceramic on the pin keeps the current loop small.
Q3: How should header holes be called out on a module board like this?
A3: Name PTH versus NPTH in the drill chart and open the mask on barrels you intend to solder.
Q4: Does the quote "via tenting" box have to match the Gerber mask?
A4: Yes. If the order says tented and the mask leaves windows, HASL will decide for you.
Q5: Does GPS course belong in the speed Kalman?
A5: Not at walking speeds. Keep heading on the OLED and let GPS speed correct a scalar state.
Q6: Why does factory silk on a through-hole board still matter?
A6: Operators solder what they can read, and ink on a pad will not wet.