Modernizing the SX-70 with Bluetooth & BLE

Building a custom Android controller for the legendary Polaroid SX-70.

The Polaroid SX-70 is an engineering marvel. But it's also 50 years old. While the optics are still stunning, the electronics are archaic. My latest project, the SX-70R Controller, bridges this gap using a modern PCB mod and a custom Android app.

The Challenge

Traditional SX-70 cameras have zero manual control. No shutter speed selection, no aperture priority. The auto-exposure is calibrated for film that hasn't existed since 2005.

The OpenSX70 project (and later, the SX-70R PCB from *The Instant Camera Guy*) replaces the old flex PCB with an Atmega-based board that exposes a UART/BLE interface. This was my entry point.

Building the App

I wanted an experience that felt native to the camera—premium, tactile, and reliable.

1. Architecture: Jetpack Compose

I built the Android app using **Jetpack Compose** for a modern, declarative UI. The design language uses a "Dark Mode" aesthetic with silver accents to match the chrome body of the Alpha 1 model.

2. The BLE Interface

The core of the app is the Bluetooth Low Energy (BLE) service. The camera broadcasts a custom service UUID. The app scans for this, connects, and subscribes to notifications.

class BleService : Service() {
    // Scanning for the SX-70R UUID
    val SX70R_SERVICE_UUID = UUID.fromString("6e400001-b5a3-f393-e0a9-e50e24dcca9e")

    fun connectToDevice(device: BluetoothDevice) {
        bluetoothGatt = device.connectGatt(this, false, gattCallback)
    }
}

Handling BLE on Android is notoriously tricky. I implemented a robust Auto-Reconnect logic so that if the camera goes to sleep (to save its 6V battery), the app picks it up immediately upon wake-up.

Features

"An interface that feels responsive and alive encourages interaction. Micro-animations are highly effective."

What's Next?

I'm currently working on a "Journal" feature that uses the phone's GPS to log the location of every shot taken, syncing it with a photo of the developed print later.

Check out the code on GitHub.