build-guides
Guide 1: Bench Testing Electronics
Passive bench checks — visual inspection, multimeter basics, voltage divider, GPS NMEA stream, USB battery pack
Build Guide 1: Bench Testing Electronics
Type: Build Guide
Before anything goes on the rover, every electronic component gets tested on the bench. This is the most important guide in the series — it's boring, it's methodical, and it will save you hours of frustration later.
What You Need
Parts:
- Raspberry Pi 4 (4GB)
- MicroSD card (32-64GB)
- USB-C power supply (for bench testing the Pi)
- PCA9685 PWM driver board
- ADS1115 ADC module
- u-blox NEO-6M GPS module
- Raspberry Pi Camera Module 3
- CSI ribbon cable
- 0-25V voltage divider module
- Buzzer module (optional)
Tools:
- Breadboard
- Jumper wires (male-to-female and male-to-male)
- Multimeter
- USB battery pack (Anker or similar, for later Pi power test)
- A monitor + micro-HDMI cable (or SSH — covered in Guide 2)
Step 1: Visual Inspection
Unbox everything and look for obvious problems before powering anything on:
- Pi 4: Check GPIO pins are straight, no bent or missing pins. Check the CSI camera port flap isn't cracked.
- PCA9685: All 16 channel headers present, no cold solder joints on the screw terminals.
- ADS1115: 4 analog input pins visible, I2C header clean.
- GPS module: Antenna connector secure, ceramic patch antenna intact (the square flat piece).
- Camera Module 3: Ribbon cable connector intact, lens not scratched or dusty.
- Voltage divider: Input and output terminals clearly labeled.
Set aside anything that looks wrong. Don't power it up.
Multimeter Basics (skip if you've used one before)
Before Step 2, you need to know how to drive your multimeter. Here's the bare-minimum tour for an Innova 3320 / Astro AI / any basic auto-ranging meter — they're all laid out the same way.
Plug in the leads:
- Black probe → middle jack labeled
COM. This is "common" / ground. Always goes here. - Red probe → right jack (labeled something like
V Ω mA BAT). This is for voltage, resistance, and continuity. Always goes here for what you're doing. - Left yellow jack labeled
DC10Aor10Ais for measuring high current (>200mA). You won't use it in this guide. Leave it empty.
Set the dial:
- For voltages → DCV (top right, usually red zone, marked with
Vand⎓) - For resistance → Ω
- For continuity (beeps when wires are connected) → the speaker icon
)))
The meter is auto-ranging, so you don't need to pick a voltage range — it figures it out.
Sanity check on a known battery:
Grab any battery you have (9V, AA, AAA, C, D — doesn't matter). Battery markings:
- Smaller / round terminal = positive (+)
- Larger / hex terminal (or the flat negative end on a cylindrical battery) = negative (−)
Touch:
- Red probe tip → positive (+)
- Black probe tip → negative (−)
What you should see:
- 9V battery:
9.0–9.6Vhealthy,7.0–8.9Vfading,<7Vdead - AA / AAA / C / D:
1.5–1.6Vhealthy,<1.3Vdying - Negative reading (e.g.
-9.2) → probes reversed. Harmless. Swap them or just ignore the minus sign. 0.00or random noise → probes not making contact, or dial isn't on DCV- Display reads way low on a fresh battery → the battery is actually dead. The meter is fine.
You can't damage anything by touching probes to a battery. The meter has very high internal resistance (10MΩ on this model — see the label on the front), so almost no current flows through it.
Step 2: Test the Voltage Divider
This is passive electronics — no power needed, just your multimeter, the divider, a battery, and two jumper wires.
Why this matters: the divider exists so the Pi's ADC can read your 2S LiPo voltage (up to 8.4V) without frying — the ADC tops out at 3.3V, so the divider scales the input down by a fixed ratio (typically ~5x for the 0-25V module). What you're verifying here: does the output actually scale down proportionally, and does it stay under 3.3V at the highest input voltage you'll feed it.
What you need
- The voltage divider module (small green PCB with two visible large resistors)
- 2× male-to-male jumper wires (skinny rainbow wires with metal pins on both ends, from the parts kit)
- A small flathead screwdriver
- A known DC voltage source. Best options, in order:
- A fresh 9V battery — gives a big, easy-to-read output (~1.8V on a 5x divider)
- Your TRX-4 2S LiPo (~7.4–8.4V) — this is the actual real-world input
- A AA / C / D cell (1.5V) — works as a "does the divider do anything?" check; output is small (~0.3V) but the ratio still confirms
Identify the module's two sides
The divider has:
- A 2-screw terminal block on one side — this is the INPUT (where the battery connects). Holes labeled
VCCandGND(or+and−). - A 3-pin header sticking up on the other side — this is the OUTPUT (what would normally connect to the ADC). Pins labeled
+,−,S(orVCC,GND,S). TheSpin (signal) is the divided voltage.
Wire the input
- Loosen both screws on the input terminal block a few turns with your screwdriver — don't take them all the way out.
- Push one jumper wire into the
VCC(or+) hole and tighten the screw down on it. - Push the second jumper wire into the
GND(or−) hole and tighten that screw.
You now have two wires dangling out of the divider's input side.
Connect the battery
For a cylindrical cell (AA, C, D): the flat raised nub end is positive (+), the flat bottom end is negative (−).
For a 9V: the smaller round terminal is +, the larger hex terminal is −.
- Lay the battery on the table.
- Press the
VCCwire firmly against the (+) terminal with your finger. - Press the
GNDwire firmly against the (−) terminal with another finger. (Awkward but doable. Pinning the wires under your fingers against the battery against the table works.) If you have alligator clips or helping hands, even easier.
You won't damage anything if you mix + and − up — you'll just read a negative voltage.
Measure the output
- Set the multimeter dial to DCV, leads in
COM(black) andV Ω(red). - With your other hand, take the meter probes:
- Red probe tip → the pin labeled
Son the 3-pin output header - Black probe tip → the pin labeled
−(orGND) on the same header
- Red probe tip → the pin labeled
- Read the display.
What you should see
| Battery | Expected output | Notes |
|---|---|---|
| 1.5V (AA/C/D) | ~0.3V (0.28–0.32) | Small but confirms divider works |
| 9V (fresh) | ~1.8V | Easiest to read precisely |
| 8.4V (full LiPo) | ~1.7V | Real-world value, well under 3.3V ✅ |
Sanity-check math: input ÷ output = ratio. So 1.5 ÷ 0.3 = 5x, 9.0 ÷ 1.8 = 5x. That's your divider ratio. As long as it stays consistent and the output stays under 3.3V at your highest expected input, you're good.
Pass / Fail
Pass: Output is proportional to input AND stays under 3.3V at the highest battery voltage you plan to feed it (8.4V for a fully charged 2S LiPo).
Fail:
0.00Vreading → no contact somewhere. Press wires harder against the battery, or check the dial is on DCV.- Output equals input → you're probably probing the wrong pins (you measured the input side), or the wires fell out of the screw terminals. Re-check.
- Output exceeds 3.3V at LiPo voltage → wrong divider for this application. Do not connect to the ADC.
Step 3: Flash the SD Card and Headless First Boot
This is where the build actually starts to feel real, and also where the surprises hide. The official "flash with Imager, set hostname/SSH/wifi/user, boot, ssh in" workflow looks like five clicks but has a few non-obvious gotchas on current Raspberry Pi OS Lite (Bookworm). We'll walk both the GUI path (Raspberry Pi Imager) and the CLI path (xz + dd) since either works, and call out the gotchas as we go.
Pick your OS
Raspberry Pi OS Lite (64-bit) — that's the one. No desktop environment, smaller image, less to maintain, plenty for what we need. The full desktop version is wasted overhead on a vehicle's brain.
Path A — Raspberry Pi Imager (GUI, recommended for first-timers)
- Install Raspberry Pi Imager
- Choose Device →
Raspberry Pi 4 - Choose OS →
Raspberry Pi OS (other)→Raspberry Pi OS Lite (64-bit) - Choose Storage → your SD card (verify the size matches — picking the wrong drive nukes whatever's on it)
- Click Next, then Edit Settings when it asks about OS customisation
- General tab:
- Hostname:
tickslayer - Username:
todd(or whatever) - Password: pick something memorable for now (you'll change it after first login)
- Configure wireless LAN: SSID + password + country
US - Locale: your timezone,
uskeyboard
- Hostname:
- Services tab: Enable SSH → password authentication
- Save → Yes → Yes → wait for write + verify (~5–10 min)
- Eject the card from your Mac
Path B — CLI flash (faster if you're scripting it)
# 1. Download (latest 64-bit Lite, ~500 MB compressed)
mkdir -p ~/tickslayer-pi-flash && cd ~/tickslayer-pi-flash
curl -L -o raspios-lite-arm64.img.xz \
"https://downloads.raspberrypi.com/raspios_lite_arm64_latest"
# 2. Decompress (~2.8 GB)
xz -dk -T 0 raspios-lite-arm64.img.xz
# 3. Find your SD card. macOS example — adjust for Linux.
diskutil list physical
# Look for the "Built In SDXC Reader" entry, note its disk number (e.g. disk14).
# DOUBLE CHECK — picking the wrong disk destroys data.
# 4. Unmount and flash. Use the *raw* device (`rdisk`) on macOS, much faster.
diskutil unmountDisk /dev/disk14
sudo dd if=raspios-lite-arm64.img of=/dev/rdisk14 bs=4m
# (No progress bar by default. Hit Ctrl+T during the run to peek at status.)
# ~90 seconds at ~30 MB/s for a decent SD card.
If you went the CLI route, you now have a flashed but unconfigured card. You need to add the headless config files manually. This is where it gets non-obvious — see the next section.
The headless config gotchas
Several things that "should work" don't, on current Pi OS Lite:
custom.tomldoesn't work on its own. That's a Raspberry Pi Imager-specific mechanism. If you writecustom.tomlby hand to the boot partition without Imager's matchingfirstrun.shandcmdline.txtmodifications, nothing happens. Skip it.- Cloud-init is NOT enabled by default on Raspberry Pi OS Lite Bookworm, even though
meta-data,user-data, andnetwork-configtemplate files are present on the boot partition. Editing them does nothing. (Don't trust online tutorials that tell you to use them — they're for Ubuntu Server on Pi, not Pi OS.) - Pi WiFi is RFKILL soft-blocked until a country code is set. This is regulatory compliance. If no country code is set, the radio never turns on and
wlan0shows asunavailable. Imager handles this for you when you set the WiFi country during setup. If you flash by hand without setting it, you have to set it after first boot (covered below).
The headless config that actually works (CLI path)
After flashing, the FAT32 boot partition mounts automatically (on macOS, at /Volumes/bootfs). Drop these files on it:
bootfs/userconf.txt — creates your user via the legacy raspi-config first-run service. This is the file that actually does the work on current Pi OS:
# Generate password hash on your Mac
openssl passwd -6 'tickslayer-temp'
# Copy the $6$... output
# Write the file (use YOUR username and YOUR hash)
echo 'todd:$6$Tmyaw3JWdNXNg4V2$.Ohrm0...rest-of-hash' > /Volumes/bootfs/userconf.txt
bootfs/ssh — empty file enables SSH on first boot:
touch /Volumes/bootfs/ssh
That's it for the headless config that's actually load-bearing. Notice we're not writing any WiFi config. The reliable way to do WiFi on this image is to first boot via ethernet, then configure WiFi from inside via nmcli (covered in the next step).
Eject the card:
diskutil eject /dev/disk14
