Skip to the content
PCBKitNew board
2 layers50.4 × 75 mmOpen-01-pcb, the printed circuit board in 3D

OPEN-01 - Omnidirectional Perception & Embedded Navigation. An open-source, low-cost ROS2 robot platform.

Size
50.4 × 75 mm
Copper layers
2
Thickness
1.6 mm
Parts
64
Nets
73
Pads
288
Tracks, vias
434, 276
Pours
13
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
25 Mar 2026
Updated
9 Apr 2026

Overview

Open-01-pcb is an open-source printed circuit board by RonishNadar, from the RonishNadar/open-01 repository on GitHub, published under the Apache-2.0 licence. It is a 2-layer board of 50.4 × 75 mm with 64 parts on 73 nets, routed with 434 tracks and 276 vias.

It is built around the ESP32-S2-SOLO-N4R2, MP2393GTL-P and AMS1117-3.3, with the FSM8JH, MH3 and MH4 among its other parts. Its parts include 20 resistors, 18 capacitors, 12 connectors, 3 ICs and 3 diodes. It belongs with the robots and motor control boards and the ESP32 boards of this library.

Main components

7

README

README.md

OPEN-01

OPEN-01 is an open-source, low-cost differential drive robot platform focused on embedded sensing, motion control, and autonomous navigation.

This repository contains the full stack:

  • ESP-IDF firmware for the ESP32-S2 robot controller
  • ROS2 serial bridge and bringup for Raspberry Pi 3B
  • URDF robot description with STL meshes
  • RViz2 visualization stack for the dev laptop
  • robot_localization EKF for sensor fusion
  • Linux setup scripts for both machines

What this repo is

OPEN-01 is designed as a low-cost, replicable alternative to the TurtleBot3. It is built around proven hardware and a clean layered architecture — embedded-first, with ROS2 as the autonomy layer on top.

The platform is structured around two compute nodes:

  • ESP32-S2 — handles all real-time firmware: sensors, motors, odometry, and UART telemetry
  • Raspberry Pi 3B — runs ROS2 Humble, bridges ESP32 telemetry to ROS2 topics, and relays lidar data
  • Laptop — runs EKF, SLAM, Nav2, and RViz2 visualization over WiFi

Current capabilities

Firmware (ESP32-S2)

  • Motor control — FIT0441 brushless DC motors, 25kHz PWM, encoder feedback, startup kick
  • IMU — MPU6500 (WHO_AM_I=0x70), dedicated I2C bus, accel + gyro
  • ToF ranging — 3x VL53L0X (left, right, back), XSHUT-based address assignment
  • Odometry — wheel encoder integration, kinematics
  • Battery monitoring — 3S Li-Ion voltage via ADC with voltage divider
  • UART telemetry — custom binary protocol at 460800 baud with CRC16-CCITT

ROS2 Stack (Raspberry Pi 3B — ROS2 Humble)

  • Serial bridge node — parses ESP32 binary protocol, publishes all sensor topics
  • Lidar node — LDS-02 lidar via USB2LDS adapter, publishes /scan (in progress)
  • robot_state_publisher — broadcasts full TF tree from URDF
  • Systemd autostart — open01.service brings up the full stack on boot

ROS2 Stack (Laptop — ROS2 Jazzy)

  • RViz2 visualization — CAD model, TF frames, odometry, lidar scan
  • robot_localization EKF — fuses /odom + /imu/data → /odometry/filtered at 30Hz
  • SLAM Toolbox — (planned)
  • Nav2 — (planned)

Published ROS2 Topics

TopicTypeSource
/odomnav_msgs/OdometrySerial bridge
/imu/datasensor_msgs/ImuSerial bridge
/battery_statesensor_msgs/BatteryStateSerial bridge
/tof/leftsensor_msgs/RangeSerial bridge
/tof/rightsensor_msgs/RangeSerial bridge
/tof/backsensor_msgs/RangeSerial bridge
/scansensor_msgs/LaserScanLidar node
/joint_statessensor_msgs/JointStateSerial bridge
/odometry/filterednav_msgs/OdometryEKF node
/cmd_velgeometry_msgs/TwistNav2 / teleop

Hardware

ComponentPart
MicrocontrollerESP32-S2
Companion computerRaspberry Pi 3B
MotorsFIT0441 brushless DC with encoders
IMUMPU6500
ToF sensors3x VL53L0X
LidarLDS-02 (via USB2LDS adapter, CP210x)
Battery3S Li-Ion (12.6V full, 9.0V cutoff)

Pin Map (ESP32-S2)

FunctionGPIO
I2C Bus 0 SDA (ToF)GPIO14
I2C Bus 0 SCL (ToF)GPIO13
I2C Bus 1 SDA (IMU)GPIO5
I2C Bus 1 SCL (IMU)GPIO4
XSHUT Left (0x30)GPIO12
XSHUT Back (0x31)GPIO11
XSHUT Right (0x32)GPIO10
UART TXGPIO19
UART RXGPIO20
Motor Right PWMGPIO15
Motor Right DIRGPIO16
Motor Right FGGPIO17
Motor Left PWMGPIO21
Motor Left DIRGPIO33
Motor Left FGGPIO34
Battery ADCGPIO2

Repository structure

text
open-01/
├── robot_firmware/              # ESP32-S2 firmware (ESP-IDF v5.4)
│   └── main/
│       ├── config/              # GPIO, timing, robot geometry constants
│       ├── common/              # Shared robot state
│       ├── drivers/             # MPU6500, VL53L0X, motor drivers
│       ├── hal/                 # Hardware abstraction layer
│       ├── services/            # PID, kinematics, odometry, comms
│       └── tasks/               # FreeRTOS tasks (IMU, ToF, motor, comms)
├── robot_ros2/
│   └── ros2_ws/
│       └── src/
│           ├── open01_serial_bridge/   # ESP32 <-> ROS2 bridge + lidar node
│           ├── open01_bringup/         # RPi launch files
│           ├── open01_description/     # URDF + STL meshes
│           └── open01_viz/             # Laptop RViz2 launch + EKF config
├── cad/
│   └── URDFs/                   # SolidWorks URDF export (source)
├── scripts/
│   ├── setup_rpi.sh             # One-command RPi setup
│   └── setup_laptop.sh          # One-command laptop setup
├── tools/
│   ├── launcher.py              # ESP-IDF GUI launcher
│   └── setup.sh                 # ESP-IDF toolchain setup
├── LICENSE
└── README.md

Getting started

RPi setup (Ubuntu 22.04 + ROS2 Humble)

bash
git clone https://github.com/RonishNadar/open-01.git
cd open-01
sudo bash scripts/setup_rpi.sh
sudo reboot

Laptop setup (Ubuntu 24.04 + ROS2 Jazzy)

bash
git clone https://github.com/RonishNadar/open-01.git
cd open-01
sudo bash scripts/setup_laptop.sh
source ~/.bashrc

Firmware setup (ESP32-S2)

bash
chmod +x tools/setup.sh
./tools/setup.sh
python3 tools/launcher.py

Running the robot

On RPi (auto-starts on boot via systemd)

bash
sudo systemctl start open01.service
sudo systemctl status open01.service

Manual launch on RPi

bash
cd ~/open-01/robot_ros2/ros2_ws
source install/setup.bash
ros2 launch open01_bringup bringup.launch.py

Visualization + EKF on laptop

bash
cd ~/open-01/robot_ros2/ros2_ws
source install/setup.bash
ros2 launch open01_viz viz.launch.py

Verify topics

bash
ros2 topic list
ros2 topic hz /odometry/filtered   # should be ~30Hz
ros2 topic hz /odom                # should be ~40Hz
ros2 topic hz /scan                # should be ~5Hz

Verify TF tree

bash
ros2 run tf2_tools view_frames

Architecture

text
ESP32-S2 (firmware)
    |  UART 460800 baud (custom binary protocol, CRC16-CCITT)
    v
Raspberry Pi 3B (ROS2 Humble)
    |-- open01_serial_bridge  ->  /odom /imu/data /battery_state /tof/* /joint_states
    |-- lidar_node            ->  /scan
    |-- robot_state_publisher ->  /tf /tf_static
    |  WiFi (DDS, ROS_DOMAIN_ID=0)
    v
Laptop (ROS2 Jazzy)
    |-- robot_localization EKF  ->  /odometry/filtered
    |-- SLAM Toolbox            ->  /map (planned)
    |-- Nav2                    ->  autonomous navigation (planned)
    |-- RViz2                   ->  visualization

Firmware architecture

config/

Central constants: GPIO assignments, I2C/UART config, task periods, robot geometry, PID defaults.

common/

Shared robot state and data structures accessed across tasks.

drivers/

Low-level device drivers for MPU6500, VL53L0X, and motor control.

hal/

Hardware abstraction layer separating board-specific logic from services.

services/

Reusable robotics logic: PID, kinematics, odometry, motor coordination, UART comms.

tasks/

FreeRTOS task entry points for periodic runtime behavior. All tasks pinned to Core 0 (ESP32-S2 is single-core).


Key implementation notes

  • ESP32-S2 ADC is 13-bit — ADC_BITWIDTH_DEFAULT, BATTERY_ADC_MAX = 8191.0f
  • FIT0441 motors use inverted PWM (255=stop, 0=full speed), require 25kHz PWM and startup kick
  • FG pins need 5kΩ external pull-up to 3.3V (open-collector output)
  • VL53L0X requires full Pololu init sequence (SPAD calibration, 60+ tuning registers)
  • LDS-02 checksum is (~sum(bytes[0:40])) & 0xFF, INDEX_MAX=0xDB
  • Serial port on Ubuntu 22.04 RPi is /dev/ttyS0 (not /dev/ttyAMA0)
  • ROS2 QoS — RPi nodes publish BEST_EFFORT, set RViz2 subscriptions to match
  • EKF — IMU orientation not fused (MPU6500 has no magnetometer), only vyaw, ax, ay used from IMU

Project status

Firmware

  • ESP-IDF firmware scaffold
  • Shared robot state
  • Motor control task + PID
  • IMU task (MPU6500)
  • ToF task (3x VL53L0X)
  • Odometry + kinematics
  • Battery monitoring
  • UART comms task (custom binary protocol)
  • Linux setup script + GUI launcher

ROS2

  • Serial bridge node (ESP32 <-> ROS2)
  • [~] LDS-02 lidar node (in progress — lidar bring-up)
  • URDF robot description
  • TF tree (all frames)
  • RViz2 visualization
  • Systemd autostart
  • Setup scripts (RPi + laptop)
  • robot_localization EKF (fusing /odom + /imu/data)
  • SLAM Toolbox
  • Nav2
  • PID gain tuning

Documentation

  • Hardware wiring guide
  • Full system bring-up docs
  • Demo videos

Contributing

Contributions are welcome. Good areas:

  • hardware abstraction cleanup
  • sensor validation and calibration
  • motion control improvements
  • Nav2 / SLAM configuration
  • documentation and wiring diagrams
  • testing utilities

When contributing:

  1. keep modules focused
  2. avoid hardcoding constants outside config.h
  3. preserve the layered firmware structure
  4. document any hardware assumptions clearly

License

Licensed under the Apache-2.0 License. See LICENSE for details.

Parts

64
QtyValueFootprintReferences
8100nFWCAP-CSGP_0603:WCAP-CSGP_0603_RC2, C4, C6, C8, C14, C16, C17, C18
410kΩResistor_SMD:R_0201_0603MetricR17, R18, R19, R20
422uFWCAP-CSGP_0603:WCAP-CSGP_0603_RC5, C7, C13, C15
45.1kΩERJU03J106V:RES_ERJU03J106VR10, R11, R15, R16
210kΩERJU03J106V:RES_ERJU03J106VR7, R8
210uFWCAP-CSGP_0603:WCAP-CSGP_0603_RC1, C3
2330ΩERJU03J106V:RES_ERJU03J106VR13, R14
27.68kΩERJU03J106V:RES_ERJU03J106VR5, R6
2FSM8JHFSM8JH:SW_FSM8JHS2, S3
110pFWCAP-CSGP_0603:WCAP-CSGP_0603_RC12
115kΩERJU03J106V:RES_ERJU03J106VR3
11kΩERJU03J106V:RES_ERJU03J106VR12
11nFWCAP-CSGP_0603:WCAP-CSGP_0603_RC9
11uFWCAP-CSGP_0603:WCAP-CSGP_0603_RC11
120ΩERJU03J106V:RES_ERJU03J106VR2
121718300012171830001:MOLEX_2171830001J1
13.3kΩERJU03J106V:RES_ERJU03J106VR9
140.2kΩERJU03J106V:RES_ERJU03J106VR4
15.2uHMSS1038-522NLC:IND_MSS1038-522NLCL1
16.8nFWCAP-CSGP_0603:WCAP-CSGP_0603_RC10
1604kΩERJU03J106V:RES_ERJU03J106VR1
1AMS1117-3.3AMS1117-3.3:SOT229P700X180-4NU2
1D+ SELTSW-101-17-T-T:SAMTEC_TSW-101-17-T-TJ3
1D- SELTSW-101-17-T-T:SAMTEC_TSW-101-17-T-TJ2
1DC JackConnector_BarrelJack:BarrelJack_GCT_DCJ200-10-A_HorizontalJ12
1ESP32-S2-SOLO-N4ESP32-S2-SOLO-N4:XCVR_ESP32-S2-SOLO-N4U1
1FIT0441 LB5B-XH-A:JST_B5B-XH-AJ11
1FIT0441 RB5B-XH-A:JST_B5B-XH-AJ10
1I2C0 TOF BB5B-XH-A:JST_B5B-XH-AJ8
1I2C0 TOF LB5B-XH-A:JST_B5B-XH-AJ9
1I2C0 TOF RB5B-XH-A:JST_B5B-XH-AJ7
1I2C1 MPUB4B-XH-A_LF__SN_:JST_B4B-XH-A_LF__SN_J6
1LOGOLogo_Ronnad:Logo_RonnadG***
1MH1MountingHole:MountingHole_2.7mm_M2.5_Pad_ViaH1
1MH2MountingHole:MountingHole_2.7mm_M2.5_Pad_ViaH2
1MH3MountingHole:MountingHole_2.7mm_M2.5_Pad_ViaH3
1MH4MountingHole:MountingHole_2.7mm_M2.5_Pad_ViaH4
1MP2393GTL-Pfootprints:SOT583_MP2393U3
1PWR_LED598-8020-107F:LEDSC160X80X70L45ND2
1RGB_LED1315050930246:WL-ILED_5050_PLCC6D3
1SS34Diode_SMD:D_SMAD1
1UART0B4B-XH-A_LF__SN_:JST_B4B-XH-A_LF__SN_J4
1UART_RPIB4B-XH-A_LF__SN_:JST_B4B-XH-A_LF__SN_J5

Questions

How big is the Open-01-pcb PCB?

It measures 50.4 × 75 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Open-01-pcb use?

64 parts, built around the ESP32-S2-SOLO-N4R2, MP2393GTL-P, AMS1117-3.3 and FSM8JH. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Open-01-pcb KiCad files?

From the RonishNadar/open-01 repository on GitHub, at the commit this page was made from: the board is pcb/open-01-pcb/open-01-pcb.kicad_pcb and its schematic pcb/open-01-pcb/open-01-pcb.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Open-01-pcb design in my own project?

Its repository publishes it under the Apache-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers100.3 × 38.1 mmRelay shield, the printed circuit board in 3D

    Relay shield

    carlos-jenkins/relay-shield

    Relay and current sensor shield for Spark Core

    25 parts10GPL-2.0
  • 2 layers102.5 × 75 mmK PA Protec, the printed circuit board in 3D

    K PA Protec

    F6ITU/K_PA_Protec

    LA2NI OpenHPSDR Power Amplifier Protection board- kicad port

    91 parts1
  • 2 layers275.9 × 117.8 mmReform2-keyboard3, the printed circuit board in 3D

    Reform2-keyboard3

    jackhumbert/reform

    This is the main repository for the MNT Reform open source laptop.

    379 parts1
  • 4 layers58.5 × 50.3 mmF407-mainboard, the printed circuit board in 3D

    F407-mainboard

    adrienles/miniMPE

    a sectioned small and low profile MPE MIDI keyboard

    61 parts
  • 2 layers99.1 × 87.9 mmDigital theremin kicad, the printed circuit board in 3D

    Digital theremin kicad

    ncssrtnvnthm/WATCH2026-theremin

    Theremin project for the 2026 WATCH program

    40 parts
  • 2 layers200 × 101 mmAtmega32, the printed circuit board in 3D

    Atmega32

    talonghtn-rgb/MachATmega32

    Đây là dự án thiết kế và chế tạo bo mạch học tập lập trình nhúng sử dụng vi điều khiển ATmega32, được xây dựng nhằm phục vụ việc học tập, thực hành và nghiên cứu các hệ thống nhúng.

    168 parts