build-guides
Guide 1: Bench Testing Electronics
Test every electronic component individually before mounting — Pi, camera, GPS, PWM, ADC, voltage divider
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.
Step 2: Test the Voltage Divider
This is passive electronics — no power needed, just your multimeter.
- Set your multimeter to DC voltage
- Connect a known voltage source (a charged battery, or even a 9V battery) to the input side
- Measure the output side — it should read proportionally lower
- For a 0-25V divider with a ~7.4V LiPo input, expect output around 1.5-2.5V (depends on the specific divider ratio)
- The key thing: the output should be under 3.3V for any input voltage you'll use. If it's not, this divider will fry your ADC.
Pass: Output voltage is proportional and under 3.3V for your expected input range. Fail: No reading, or output exceeds 3.3V for your battery voltage. Check wiring, check divider specs.
Step 3: Power Up the Raspberry Pi
We'll do full Pi setup in Guide 2. For now, just verify it boots:
- Flash Raspberry Pi OS Lite (64-bit) onto the MicroSD card using Raspberry Pi Imager
- During imaging, set hostname, enable SSH, set username/password, configure WiFi
- Insert the MicroSD, connect a monitor (or just SSH in after a minute), and plug in USB-C power
- Wait for the boot sequence — you should see the desktop or a login prompt within 60 seconds
- If using SSH:
ssh your-username@tickslayer.local(or whatever hostname you set)
Pass: Pi boots, you can log in. Fail: No video output, no SSH. Reflash the SD card. If still nothing, try a different USB-C cable (some are charge-only, no data).
Step 4: Test the Camera Module
With the Pi powered off:
- Lift the CSI port flap on the Pi (gently — it's fragile)
- Insert the ribbon cable — blue/contacts side facing the USB ports
- Close the flap to lock it
- Boot the Pi
Test with:
# Quick capture test
rpicam-still -o test.jpg
# If that works, try a preview (requires monitor)
rpicam-hello -t 5000
Pass: test.jpg exists and contains a recognizable image.
Fail: "No camera detected" — reseat the ribbon cable. Make sure the contacts face the right direction. Check that the cable isn't creased or torn.
Step 5: Test the GPS Module
Wire the GPS to the Pi on a breadboard:
| GPS Pin | Pi Pin | Notes |
|---|---|---|
| VCC | 3.3V (Pin 1) | Some modules accept 5V — check yours |
| GND | GND (Pin 6) | |
| TX | GPIO 15 / RXD (Pin 10) | GPS TX → Pi RX |
| RX | GPIO 14 / TXD (Pin 8) | GPS RX → Pi TX |
Before reading data, disable the Pi's serial console so it doesn't interfere:
sudo raspi-config
# Interface Options → Serial Port
# "Login shell over serial?" → No
# "Serial port hardware enabled?" → Yes
sudo reboot
Then read raw NMEA data:
cat /dev/serial0
You should see lines starting with $GPGGA, $GPRMC, etc. streaming in.
Important: GPS needs a clear view of the sky for a fix. If you're testing indoors, you'll see NMEA sentences but the fix fields will be empty (zeros). That's normal. Take it near a window or outside to confirm a real fix — the LED on the module will blink when it has one (solid = searching, blinking = fix acquired).
Pass: NMEA sentences streaming, and a real fix when outdoors (non-zero lat/lon in $GPGGA).
Fail: No data at all — check TX/RX aren't swapped, check baud rate (default is usually 9600).
Step 6: Test the PCA9685 PWM Driver
Wire the PCA9685 to the Pi via I2C:
| PCA9685 Pin | Pi Pin |
|---|---|
| VCC | 3.3V (Pin 1) |
| GND | GND (Pin 6) |
| SDA | GPIO 2 / SDA (Pin 3) |
| SCL | GPIO 3 / SCL (Pin 5) |
Enable I2C on the Pi:
sudo raspi-config
# Interface Options → I2C → Enable
Verify the board is detected:
sudo apt install -y i2c-tools
i2cdetect -y 1
You should see address 0x40 in the grid — that's the PCA9685's default address.
Do NOT connect any servos or the ESC yet. We just want to confirm the board talks to the Pi.
Pass: 0x40 shows up in i2cdetect.
Fail: Nothing detected — check wiring, make sure I2C is enabled, check for bent pins.
Step 7: Test the ADS1115 ADC
Wire the ADS1115 to the Pi (it shares the I2C bus with the PCA9685 — you can have both connected):
| ADS1115 Pin | Pi Pin |
|---|---|
| VCC | 3.3V (Pin 1) |
| GND | GND (Pin 6) |
| SDA | GPIO 2 / SDA (Pin 3) |
| SCL | GPIO 3 / SCL (Pin 5) |
Run i2cdetect again:
i2cdetect -y 1
You should now see two addresses: 0x40 (PCA9685) and 0x48 (ADS1115 default).
Quick read test — connect the voltage divider output to ADS1115 channel A0, apply a known voltage to the divider input:
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
i2c = busio.I2C(board.SCL, board.SDA)
ads = ADS.ADS1115(i2c)
chan = AnalogIn(ads, ADS.P0)
print(f"Voltage: {chan.voltage:.3f}V")
print(f"Raw: {chan.value}")
(We'll install the Python libraries properly in Guide 2. For now, if you want to run this: pip install adafruit-circuitpython-ads1x15)
Pass: Reads a voltage that makes sense for your input. Fail: Import errors (install the library), I2C errors (check wiring), nonsense voltage (check voltage divider connections).
Step 8: Test the USB Battery Pack
This is your Pi's power source on the rover:
- Unplug the USB-C wall power from the Pi
- Connect the Anker battery pack via USB-C (or USB-A to USB-C cable)
- Pi should stay running or boot back up
Key things to verify:
- The Pi runs stable for at least 5 minutes on battery power
- The battery doesn't go into "low current sleep" mode (some packs shut off when current draw is too low — the Pi should draw enough, but verify)
- No random reboots or undervoltage warnings (a yellow lightning bolt on the desktop, or
vcgencmd get_throttledreturns non-zero)
vcgencmd get_throttled
# 0x0 = all good
# Anything else = power issues
Pass: Stable operation for 5+ minutes, no throttling. Fail: Reboots or throttling — try a different USB cable (short, thick cables are better), or a different battery pack.
Helpful Resources
- Adafruit 16-Channel Servo Driver with Raspberry Pi — Adafruit's own guide for the PCA9685. Covers I2C wiring, Python setup, and servo control in detail.
- Adafruit ADS1115 ADC Python & CircuitPython Guide — Official walkthrough for the ADS1115: wiring, gain settings, single-ended vs differential reads.
Checklist
Before moving on, confirm:
- Voltage divider outputs safe voltage (under 3.3V)
- Pi boots and you can SSH in
- Camera captures an image
- GPS streams NMEA data (fix confirmed outdoors)
- PCA9685 detected at
0x40on I2C - ADS1115 detected at
0x48on I2C - Pi runs stable on USB battery pack
Everything passing? On to Guide 2: Raspberry Pi Setup to build out the software environment.
