PAWS — Setup, build and calibration guide

PAWS — Setup, build and calibration guide

Last updated: August 12, 2026

Esta página también está disponible en español.


What this is

PAWS is an educational robot controlled over Bluetooth from the PAWS Android app. We provide the precompiled firmware (ready to flash) for the ESP32 board.

Once flashed, the ESP32 advertises itself over Bluetooth as PAWS-ESP32, and you can pair with it and control it from the app.

Supported board: any generic esp32dev module (ESP32-WROOM-32 and compatibles), with 4 MB of flash or more.


Download the firmware

⬇ Download paws-esp32-firmware.zip

A single .zip file containing:

File (inside the .zip) Flash offset Description
paws-esp32.bin 0x10000 The PAWS firmware — the only one you normally need
bootloader.bin 0x1000 Second-stage bootloader (only if the simple flash fails)
partitions.bin 0x8000 Partition table (only if the simple flash fails)
boot_app0.bin 0xe000 OTA partition selector (only if the simple flash fails)

Unzip the .zip before flashing.

In most cases you only need paws-esp32.bin. The other three files are a fallback, for when the simple flash doesn’t work.


Installation — ESPHome Web (the only supported method)

Everything happens in the browser, with nothing to install. You need Chrome or Edge on a computer (WebSerial does not work in Firefox, Safari, or on phones).

  1. Connect the ESP32 to your computer over USB.
  2. Open https://web.esphome.io/ in Chrome or Edge.
  3. Click CONNECT and pick the ESP32’s serial port in the browser dialog.
  4. Click INSTALL and choose the paws-esp32.bin file.
  5. Wait for the installation to finish (a progress bar will appear).
  6. Press the RESET (or EN) button on the ESP32 when it’s done.

At this point you should already see PAWS-ESP32 over Bluetooth.

If the simple flash fails

If after flashing only paws-esp32.bin the board doesn’t boot, reboots in a loop, or doesn’t show up over Bluetooth, your board probably doesn’t have a valid bootloader/partition table. In that case repeat the process on web.esphome.io, but loading all 4 files at their exact offsets:

  • 0x1000bootloader.bin
  • 0x8000partitions.bin
  • 0xe000boot_app0.bin
  • 0x10000paws-esp32.bin

Then press RESET and check again.

If the browser doesn’t detect the port, make sure you have your board’s USB-to-serial driver installed (CP2102 or CH340, depending on the manufacturer) — see serial port drivers below.

If it hangs on Connecting... or the connection fails, hold down the board’s BOOT button (sometimes labeled IO0) as the flash starts, and release it as soon as it begins writing.


USB-serial driver (if your board doesn’t show up)

Most ESP32 boards use one of these two USB-to-serial chips. If your operating system doesn’t recognize the port when you plug the board in, install the matching driver:

  • CP210x (Silicon Labs) — download driver
  • CH340 / CH341 (WCH) — search for “CH340 driver” for your operating system

On Linux you generally don’t need to install anything extra: the driver is already in the kernel.


Building the robot (ESP32 + L298N + 2 motors)

The simplest form of a PAWS is a two-wheeled chassis with:

  • An ESP32 board (esp32dev).
  • An L298N motor driver.
  • Two DC motors (the typical yellow ones with a gearbox, 3–6 V).
  • A battery for the motors: 6–12 V. A 6 × AA battery holder (9 V) or a pack of 2 Li-ion 18650 cells (7.4 V) both work well.
  • A caster wheel at the front or back, to support the chassis.

Golden rule: all grounds — the ESP32’s GND, the L298N’s GND, and the battery’s negative terminal — must be tied together. Without a common GND nothing works reliably, and it’s the number one cause of robots that work “sometimes yes, sometimes no”.

Wiring ESP32 → L298N

These are the default pins that ship with the firmware. If you stick to them, you don’t have to configure anything in the app.

L298N signal Motor ESP32 pin
ENA A (left) GPIO 25
IN1 A (left) GPIO 26
IN2 A (left) GPIO 27
ENB B (right) GPIO 4
IN3 B (right) GPIO 16
IN4 B (right) GPIO 17
  • Remove the ENA and ENB jumpers from the L298N. If you leave them on, the motors only run at full speed and the app’s speed control does nothing.
  • Motor A goes to the L298N’s OUT1/OUT2 outputs; Motor B to OUT3/OUT4. Each motor is just two wires, with no critical polarity: if one spins the wrong way, just swap its two wires (or flip the sign in the calibration, below).

If you prefer different wiring, you can change the pins from the app under Settings (they’re stored on the robot and applied when you restart it) — see Using the app: pins and calibration.

Power

This is the part where things break most easily. Two rules:

  1. Never power the motors from the ESP32. They always run off the battery, through the L298N.
  2. The motor battery goes to the L298N, not to the ESP32 board.

Power connections:

From To
Battery + (6–12 V) L298N +12V (or VCC) terminal
Battery L298N GND terminal
L298N GND ESP32 GND

You have two options for powering the ESP32:

  • Simplest and safest (recommended to start): power it separately over its USB port (a small power bank works). The L298N then only drives motors.
  • From the L298N: with the 5 V jumper in place and a 7–12 V battery, the L298N provides 5 V on its +5V terminal. Run that +5V to the ESP32’s VIN pin (not to 3V3). Below 7 V the regulator won’t hold a stable 5 V, and above 12 V it runs too hot.

Never connect the L298N’s 5 V to the ESP32’s 3V3 pin: you will damage it.

If the ESP32 reboots by itself when the motors start, the battery isn’t supplying enough current or there’s no common GND. Try powering the ESP32 from USB separately first.

Assembly order

  1. Mount the two motors and the caster wheel on the chassis.
  2. Wire the six ESP32 pins to the L298N per the table, plus the grounds.
  3. Connect the motors to OUT1/OUT2 and OUT3/OUT4.
  4. Connect the battery to the L298N (leave it off or unplugged until the end).
  5. Flash the firmware following the steps above.
  6. Power up: the ESP32 first, then the motor battery.
  7. Pair PAWS-ESP32 over Bluetooth and calibrate from the app.

Test the robot with the wheels off the ground the first time. If a motor spins the wrong way, fix it by swapping its wires or flipping the sign of the speed in the app’s Variables.


Checking that it worked

  1. From your phone, scan for nearby Bluetooth devices: PAWS-ESP32 should appear. Pair with it and open the PAWS app to continue.
  2. Optionally, on web.esphome.io you can click LOGS after connecting the board to watch the firmware boot.
  3. Seeing a HEARTBEAT LOST -> STOP message right after boot is normal — it goes away as soon as the app connects.

For motor wiring and other peripherals, check the connection guide shown inside the app.


Using the app: pins and calibration

The PAWS app has two distinct settings, and it’s worth not mixing them up:

Setting Where you edit it Where it’s stored When it takes effect
Pins (GPIO) for each peripheral Menu → Settings On the robot (the ESP32’s NVS) Only after you Restart the robot
Movement Variables (calibration) The editor’s Variables hat On the phone Immediately, on the next run

1. Configuring the motor pins

The pins live on the robot, not in the app. When you connect, the app asks the ESP32 which peripherals it has and on which GPIOs; the status is shown under Settings:

  • The robot hasn’t been asked yet — it hasn’t answered; use Ask the robot again.
  • The pins shown are the ones the robot is using now — all good.
  • There are changes not yet sent to the robot — you edited, but haven’t saved.
  • Saved. Restart the robot to apply them. — press Restart.

Each peripheral appears with a neutral label like 0x21 · 0 (0x21 is the motor class, and the number is the index: 0x21 · 0 is motor A and 0x21 · 1 is motor B). Valid GPIOs run from 0 to 39; a pin out of range or not usable as an output makes the robot respond with an error. The app also warns you when you pick a delicate pin (strapping pins, which are read at boot, or the serial port pins, which leave you without a debug console).

An unconfigured pin is shown as , which is not the same as GPIO 0.

2. Calibrating the movement (the “Variables” hat)

In the block editor, the program hangs off the initial Variables block (the hat with the ESP32 logo). Tap that logo and the calibration panel opens up: one section per movement piece — Forward, Backward, Left, Right — each with three values:

Variable What it is Range Step of the −/+ buttons
Motor A Motor A’s speed, as a signed percentage (the sign is the direction of rotation) −100 … 100 5
Motor B Motor B’s speed, same as A −100 … 100 5
Duration How long the maneuver lasts, in milliseconds 100 … 5000 ms 100

Factory values (two-wheeled chassis):

Piece Motor A Motor B Duration
Forward 60 % 60 % 1000 ms
Backward −60 % −60 % 1000 ms
Left −50 % 50 % 500 ms
Right 50 % −50 % 500 ms

Notice the pattern: to go straight, both motors share the same sign; to turn, they take opposite signs.

How to calibrate, step by step

  1. Put the robot on the floor with clear space ahead, and connect it (the dot next to the ESP32 logo must be green).
  2. Build a program with a single Forward piece and run it.
  3. If it veers to one side: lower the speed of the stronger motor in steps of 5 %. If it drifts to the right, the left motor is pushing harder; lower it until the path comes out straight. No separate trim is needed: the correction is the variable.
  4. If it goes backward when it should go forward: one motor is wired in reverse. Flip the sign of that speed (for example 60−60).
  5. Repeat with Backward, then with Left and Right: there what you adjust is the Duration, until a turn lands on the angle you want (typically 90°).
  6. Adjust Forward’s Duration for the distance you want per block.

Adjust a little and test: calibration is “try, tweak a bit, repeat”. That’s why the panel uses −/+ buttons instead of a slider — the exact number matters.

Where it’s stored

The calibration is stored on the phone, not on the robot: the ESP32 only keeps the pinout. It survives closing the app, so you calibrate once instead of every class — but if you switch phones, or change the robot (motors, wheels, surface), you’ll need to recalibrate.


Support

If flashing fails repeatedly, or the device doesn’t show up over Bluetooth after a successful flash, get in touch:

PAWS Email: [email protected]


See also: Privacy Policy · Terms of Service