# Next Session: TurboPi UART Setup & Hardware Test

## Context
Raspberry Pi 5 (hostname `pi-car`, 16 GB RAM, Debian Trixie 13) is set up as a
HiWonder TurboPi robot car controller. SSH works (`ssh pi`), Claude Code installed
and authenticated, TurboPi GitHub repo cloned to `~/TurboPi/`.

**Currently powered via USB-C** (bypassing battery switch — switch has no effect).
Battery-powered operation to be figured out separately later.

## The Problem
The STM32 controller board on the TurboPi expansion board does not respond to
serial commands. Raw serial probe on all ports returns 0 bytes. Root cause: **UART
is not enabled** on the fresh Pi OS install.

## What Needs to Be Done

### 1. Enable UART on Pi 5 (3 commands + reboot)

```bash
# Enable serial hardware, disable serial console
ssh pi 'sudo raspi-config nonint do_serial_hw 0'
ssh pi 'sudo raspi-config nonint do_serial_cons 1'

# Add UART overlay to config.txt
ssh pi 'echo -e "\ndtoverlay=pi3-miniuart-bt\nForce_turbo=1" | sudo tee -a /boot/firmware/config.txt'

# Set serial permissions
ssh pi 'sudo chmod 777 /dev/ttyAMA0'

# Reboot
ssh pi 'sudo reboot'
```

### 2. After reboot, verify serial port

```bash
ssh pi 'ls -la /dev/serial*'
# Expected: serial0 -> ttyAMA10 (Pi 5 maps differently from Pi 4)
```

### 3. Run hardware test with correct port

```bash
ssh pi 'cd ~/TurboPi && python3 -c "
import sys
sys.path.append(\"/home/pi/TurboPi/\")
import HiwonderSDK.ros_robot_controller_sdk as rrc
import time

for port in [\"/dev/ttyAMA10\", \"/dev/ttyAMA0\", \"/dev/serial0\"]:
    try:
        board = rrc.Board(device=port)
        time.sleep(0.5)
        print(f\"Connected on {port}\")
        break
    except Exception as e:
        print(f\"{port}: {e}\")
        continue

# Buzzer test
board.set_buzzer(1000, 0.5, 0.5, 1)
time.sleep(1.5)

# Servo pan test
board.pwm_servo_set_position(0.3, [[1, 1800]])
time.sleep(0.4)
board.pwm_servo_set_position(0.3, [[1, 1500]])
time.sleep(0.4)

# Motor test
for i in range(1, 5):
    board.set_motor_duty([[i, 35]])
    time.sleep(0.5)
    board.set_motor_duty([[i, 0]])
    time.sleep(0.3)

print(\"All tests passed!\")
"'
```

### 4. If hardware test passes, install vision deps

```bash
ssh pi 'pip3 install opencv-python-headless mediapipe pyyaml'
```

### 5. Test camera

```bash
ssh pi 'python3 -c "import cv2; cap = cv2.VideoCapture(0); ret, frame = cap.read(); print(f\"Camera: {ret}, Frame: {frame.shape}\"); cap.release()"'
```

## Key Files
- `docs/TURBOPI-SETUP.md` — Full consolidated setup guide (from HiWonder PDFs)
- `~/TurboPi/` on Pi — Cloned HiWonder GitHub repo
- `~/TurboPi/HiwonderSDK/ros_robot_controller_sdk.py` — Controller board SDK
- `/tmp/turbopi-docs/` on laptop — Partially downloaded HiWonder Google Drive docs (~939 MB)
- `/home/pi` on Pi — Symlink to `/home/rajesh` (SDK path compatibility)

## Key Facts
- **Power:** Currently USB-C (battery switch bypassed). Single power source for Pi + controller board.
- **Serial port:** Pi 5 uses `serial0 → ttyAMA10` (NOT ttyAMA0 like Pi 4)
- **Baud rate:** SDK uses 1,000,000 (1 Mbaud) for controller board
- **CH340 on /dev/ttyUSB0:** NOT the controller board (likely ultrasonic sensor). Controller uses GPIO UART pins 8/10.
- **SDK default port:** `/dev/ttyAMA0` — needs override to `/dev/ttyAMA10` on Pi 5
- **SSH alias:** `ssh pi` (192.168.68.61, key auth, no password)
- **Pi Connect:** Enabled (screen sharing + remote shell at connect.raspberrypi.com)
