---
title: Positioner Build Guide
description: Build the ESP32 dual-axis antenna positioner
---
import { Steps, Aside } from '@astrojs/starlight/components';
## Bill of Materials
| Qty | Component | Notes |
|-----|-----------|-------|
| 1 | ESP32 DevKit | Any variant with enough GPIO |
| 2 | TMC2209 stepper driver | UART mode, StallGuard support |
| 2 | NEMA 17 stepper motor | 0.9° or 1.8° step angle |
| 1 | 24V power supply | 3A+ for motors |
| 1 | 5V regulator or USB | For ESP32 |
| - | Wire, connectors | See wiring diagram |
## Mechanical Assembly
The positioner needs two axes of rotation:
1. **Theta axis** (polar, 0-180°): Tilts the antenna from zenith to nadir
2. **Phi axis** (azimuth, 0-360°): Rotates the antenna around vertical axis
### Design Considerations
- **Cable routing**: Ensure cables can handle full rotation without tangling
- **Balance**: Center of gravity should be on the rotation axes
- **Rigidity**: Minimize wobble for accurate measurements
- **Range limits**: Mechanical stops for homing reference
### Mounting Options
| Approach | Pros | Cons |
|----------|------|------|
| 3D printed | Custom fit, cheap | Strength limits |
| Aluminum extrusion | Strong, adjustable | Heavier, more complex |
| PVC pipe | Very cheap, easy | Less precise |
## Electronics Assembly
1. **Mount TMC2209 drivers**
Install both drivers on a breakout board or custom PCB. Ensure proper heatsinking—these drivers can get hot under load.
2. **Wire motor connections**
| TMC2209 Pin | Motor Wire |
|-------------|------------|
| A1 | Coil A+ |
| A2 | Coil A- |
| B1 | Coil B+ |
| B2 | Coil B- |
3. **Wire UART connections**
Both drivers share the same UART bus but have different addresses:
- Theta driver: Address 0x00
- Phi driver: Address 0x01
See [Wiring Diagram](/hardware/wiring/) for full pinout.
4. **Power connections**
- 24V to driver VMOT pins (motor power)
- 5V/3.3V to driver VIO pins (logic power)
- ESP32 powered via USB or separate 5V regulator
5. **Test before mounting**
Flash the firmware and verify both motors respond before final assembly.
## Firmware Setup
See [Firmware](/hardware/firmware/) for build and flash instructions.
## Calibration
After assembly:
1. **Home both axes**: Run `positioner_home(axis="both")`
2. **Verify range**: Move to extremes and check for binding
3. **Tune StallGuard**: Adjust `STALL_VALUE` in `config.h` if homing is unreliable
4. **Set motion parameters**: Use `positioner_config()` to tune speed/accel
## Troubleshooting
### Motor doesn't move
- Check power supply voltage (should be 24V)
- Verify UART communication (TX/RX wiring)
- Check TMC2209 address configuration
### Homing fails (doesn't detect stall)
- Increase motor current in `config.h`
- Decrease homing speed
- Adjust `STALL_VALUE` threshold
### Motors get hot
- Reduce motor current (if torque allows)
- Add heatsinks to TMC2209
- Reduce holding current when idle
### Position drift
- Check mechanical coupling (loose setscrews)
- Verify microstepping is consistent
- Check for missed steps (reduce speed/accel)